dpdk : incorrect rx filter being installed 21/4821/6
authorPavel Kotucek <pkotucek@cisco.com>
Mon, 23 Jan 2017 14:24:49 +0000 (15:24 +0100)
committerDamjan Marion <dmarion.lists@gmail.com>
Fri, 27 Jan 2017 19:55:09 +0000 (19:55 +0000)
When mac address is set prior bringing interface up incorrect rx filter
being installed into the e1000 mac.

Change-Id: If59a2bf16f732e45221b3787d271307d369e54d3
Signed-off-by: Pavel Kotucek <pkotucek@cisco.com>
src/vnet/devices/dpdk/device.c
src/vnet/devices/dpdk/dpdk.h
src/vnet/devices/dpdk/init.c

index 0deab6a..cd32389 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;
     }
 }
@@ -628,7 +630,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);
index 066ec6f..a91e87d 100644 (file)
@@ -232,6 +232,9 @@ typedef struct
   struct rte_eth_xstat *last_cleared_xstats;
   f64 time_last_stats_update;
   dpdk_port_type_t port_type;
+
+  /* mac address */
+  u8 *default_mac_address;
 } dpdk_device_t;
 
 #define DPDK_STATS_POLL_INTERVAL      (10.0)
index 4c040d2..3fa656e 100755 (executable)
@@ -125,6 +125,10 @@ dpdk_port_setup (dpdk_main_t * dm, dpdk_device_t * xd)
     {
       int rv;
       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 (rv < 0)
        clib_warning ("rte_eth_dev_start %d returned %d",
                      xd->device_index, rv);
@@ -199,6 +203,10 @@ dpdk_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hi, u32 flags)
          if (xd->flags & DPDK_DEVICE_FLAG_ADMIN_UP)
            {
              int 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 (rv < 0)
                clib_warning ("rte_eth_dev_start %d returned %d",
                              xd->device_index, rv);