Fix sending GARP/NA on Bonded Interface Active/Backup Link Up/Down
[vpp.git] / src / plugins / dpdk / device / node.c
index 5cc611c..cf8b969 100644 (file)
@@ -114,7 +114,7 @@ dpdk_rx_error_from_mb (struct rte_mbuf *mb, u32 * next, u8 * error)
     *error = DPDK_ERROR_NONE;
 }
 
-void
+static void
 dpdk_rx_trace (dpdk_main_t * dm,
               vlib_node_runtime_t * node,
               dpdk_device_t * xd,
@@ -208,7 +208,13 @@ dpdk_process_subseq_segs (vlib_main_t * vm, vlib_buffer_t * b,
   mb_seg = mb->next;
   b_chain = b;
 
-  while ((mb->nb_segs > 1) && (nb_seg < mb->nb_segs))
+  if (mb->nb_segs < 2)
+    return;
+
+  b->flags |= VLIB_BUFFER_TOTAL_LENGTH_VALID;
+  b->total_length_not_including_first_buffer = 0;
+
+  while (nb_seg < mb->nb_segs)
     {
       ASSERT (mb_seg != 0);
 
@@ -267,6 +273,7 @@ static_always_inline void
 dpdk_buffer_init_from_template (void *d0, void *d1, void *d2, void *d3,
                                void *s)
 {
+#if defined(CLIB_HAVE_VEC128)
   int i;
   for (i = 0; i < 2; i++)
     {
@@ -275,6 +282,18 @@ dpdk_buffer_init_from_template (void *d0, void *d1, void *d2, void *d3,
        *(u8x32 *) (((u8 *) d2) + i * 32) =
        *(u8x32 *) (((u8 *) d3) + i * 32) = *(u8x32 *) (((u8 *) s) + i * 32);
     }
+#elif defined(CLIB_HAVE_VEC64)
+  int i;
+  for (i = 0; i < 4; i++)
+    {
+      *(u8x16 *) (((u8 *) d0) + i * 16) =
+       *(u8x16 *) (((u8 *) d1) + i * 16) =
+       *(u8x16 *) (((u8 *) d2) + i * 16) =
+       *(u8x16 *) (((u8 *) d3) + i * 16) = *(u8x16 *) (((u8 *) s) + i * 16);
+    }
+#else
+#error "Either CLIB_HAVE_VEC128 or CLIB_HAVE_VEC64 has to be defined"
+#endif
 }
 
 /*
@@ -642,6 +661,8 @@ dpdk_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * f)
   foreach_device_and_queue (dq, rt->devices_and_queues)
     {
       xd = vec_elt_at_index(dm->devices, dq->dev_instance);
+      if (PREDICT_FALSE (xd->flags & DPDK_DEVICE_FLAG_BOND_SLAVE))
+       continue;       /* Do not poll slave to a bonded interface */
       if (xd->flags & DPDK_DEVICE_FLAG_MAYBE_MULTISEG)
         n_rx_packets += dpdk_device_input (dm, xd, node, thread_index, dq->queue_id, /* maybe_multiseg */ 1);
       else