vppinfra: fix issue when copying 16 bytes with clib_memcpy
[vpp.git] / src / vnet / devices / dpdk / device.c
index 0deab6a..1739790 100644 (file)
@@ -60,6 +60,8 @@ dpdk_set_mac_address (vnet_hw_interface_t * hi, char *address)
     }
   else
     {
+      vec_reset_length (xd->default_mac_address);
+      vec_add (xd->default_mac_address, address, sizeof (address));
       return NULL;
     }
 }
@@ -157,7 +159,7 @@ dpdk_validate_rte_mbuf (vlib_main_t * vm, vlib_buffer_t * b,
 
   /* buffer is coming from non-dpdk source so we need to init
      rte_mbuf header */
-  if (PREDICT_FALSE ((b->flags & VNET_BUFFER_RTE_MBUF_VALID) == 0))
+  if (PREDICT_FALSE ((b->flags & VLIB_BUFFER_EXT_HDR_VALID) == 0))
     {
       vlib_buffer_t *b2 = b;
       last_mb = mb = rte_mbuf_from_vlib_buffer (b2);
@@ -166,13 +168,11 @@ dpdk_validate_rte_mbuf (vlib_main_t * vm, vlib_buffer_t * b,
        {
          b2 = vlib_get_buffer (vm, b2->next_buffer);
          mb = rte_mbuf_from_vlib_buffer (b2);
-         last_mb->next = mb;
-         last_mb = mb;
          rte_pktmbuf_reset (mb);
        }
     }
 
-  first_mb = mb = rte_mbuf_from_vlib_buffer (b);
+  last_mb = first_mb = mb = rte_mbuf_from_vlib_buffer (b);
   first_mb->nb_segs = 1;
   mb->data_len = b->current_length;
   mb->pkt_len = maybe_multiseg ? vlib_buffer_length_in_chain (vm, b) :
@@ -183,10 +183,17 @@ dpdk_validate_rte_mbuf (vlib_main_t * vm, vlib_buffer_t * b,
     {
       b = vlib_get_buffer (vm, b->next_buffer);
       mb = rte_mbuf_from_vlib_buffer (b);
+      last_mb->next = mb;
+      last_mb = mb;
       mb->data_len = b->current_length;
       mb->pkt_len = b->current_length;
       mb->data_off = VLIB_BUFFER_PRE_DATA_SIZE + b->current_data;
       first_mb->nb_segs++;
+      if (PREDICT_FALSE (b->n_add_refs))
+       {
+         rte_mbuf_refcnt_update (mb, b->n_add_refs);
+         b->n_add_refs = 0;
+       }
     }
 }
 
@@ -628,7 +635,13 @@ dpdk_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
       f64 now = vlib_time_now (dm->vlib_main);
 
       if ((xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP) == 0)
-       rv = rte_eth_dev_start (xd->device_index);
+       {
+         rv = rte_eth_dev_start (xd->device_index);
+         if (!rv && xd->default_mac_address)
+           rv = rte_eth_dev_default_mac_addr_set (xd->device_index,
+                                                  (struct ether_addr *)
+                                                  xd->default_mac_address);
+       }
 
       if (xd->flags & DPDK_DEVICE_FLAG_PROMISC)
        rte_eth_promiscuous_enable (xd->device_index);