[dpdk-dev] [PATCH 2/2] net/bonding: enable slave VLAN filter

2016-10-05 Thread Iremonger, Bernard
> -Original Message-
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Eric Kinzie
> Sent: Thursday, August 4, 2016 7:25 PM
> To: dev at dpdk.org
> Cc: Jan Blunck 
> Subject: [dpdk-dev] [PATCH 2/2] net/bonding: enable slave VLAN filter
> 
> SR-IOV virtual functions cannot rely on promiscuous mode for the reception
> of VLAN tagged frames.  Program the vlan filter for each slave when a vlan is
> configured for the bonding master.
> 
> Signed-off-by: Eric Kinzie 

Acked-by: Bernard Iremonger 


[dpdk-dev] [PATCH 2/2] net/bonding: enable slave VLAN filter

2016-08-04 Thread Eric Kinzie
SR-IOV virtual functions cannot rely on promiscuous mode for the reception
of VLAN tagged frames.  Program the vlan filter for each slave when a
vlan is configured for the bonding master.

Signed-off-by: Eric Kinzie 
---
 drivers/net/bonding/rte_eth_bond_api.c |   68 
 drivers/net/bonding/rte_eth_bond_pmd.c |   36 +++
 drivers/net/bonding/rte_eth_bond_private.h |4 ++
 3 files changed, 108 insertions(+)

diff --git a/drivers/net/bonding/rte_eth_bond_api.c 
b/drivers/net/bonding/rte_eth_bond_api.c
index 3c16973..a556f7b 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -166,6 +166,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t 
socket_id)
 {
struct bond_dev_private *internals = NULL;
struct rte_eth_dev *eth_dev = NULL;
+   uint32_t vlan_filter_bmp_size;

/* now do all data allocation - for eth_dev structure, dummy pci driver
 * and internal (private) data
@@ -260,6 +261,27 @@ rte_eth_bond_create(const char *name, uint8_t mode, 
uint8_t socket_id)
goto err;
}

+   vlan_filter_bmp_size =
+   rte_bitmap_get_memory_footprint(ETHER_MAX_VLAN_ID+1);
+   internals->vlan_filter_bmpmem = rte_malloc(name, vlan_filter_bmp_size,
+  RTE_CACHE_LINE_SIZE);
+   if (internals->vlan_filter_bmpmem == NULL) {
+   RTE_BOND_LOG(ERR,
+"Failed to allocate vlan bitmap for bonded device 
%u\n",
+eth_dev->data->port_id);
+   goto err;
+   }
+
+   internals->vlan_filter_bmp = rte_bitmap_init(ETHER_MAX_VLAN_ID+1,
+   internals->vlan_filter_bmpmem, vlan_filter_bmp_size);
+   if (internals->vlan_filter_bmp == NULL) {
+   RTE_BOND_LOG(ERR,
+"Failed to init vlan bitmap for bonded device 
%u\n",
+eth_dev->data->port_id);
+   rte_free(internals->vlan_filter_bmpmem);
+   goto err;
+   }
+
return eth_dev->data->port_id;

 err:
@@ -299,6 +321,9 @@ rte_eth_bond_free(const char *name)
eth_dev->rx_pkt_burst = NULL;
eth_dev->tx_pkt_burst = NULL;

+   internals = eth_dev->data->dev_private;
+   rte_bitmap_free(internals->vlan_filter_bmp);
+   rte_free(internals->vlan_filter_bmpmem);
rte_free(eth_dev->data->dev_private);
rte_free(eth_dev->data->mac_addrs);

@@ -308,6 +333,46 @@ rte_eth_bond_free(const char *name)
 }

 static int
+slave_vlan_filter_set(uint8_t bonded_port_id, uint8_t slave_port_id)
+{
+   struct rte_eth_dev *bonded_eth_dev;
+   struct bond_dev_private *internals;
+   int found;
+   int res = 0;
+   uint64_t slab = 0;
+   uint32_t pos = 0;
+   uint16_t first;
+
+   bonded_eth_dev = _eth_devices[bonded_port_id];
+   if (bonded_eth_dev->data->dev_conf.rxmode.hw_vlan_filter == 0)
+   return 0;
+
+   internals = bonded_eth_dev->data->dev_private;
+   found = rte_bitmap_scan(internals->vlan_filter_bmp, , );
+   first = pos;
+
+   if (!found)
+   return 0;
+
+   do {
+   uint32_t i;
+   uint64_t mask;
+
+   for (i = 0, mask = 1;
+i < RTE_BITMAP_SLAB_BIT_SIZE;
+i ++, mask <<= 1) {
+   if (unlikely(slab & mask))
+   res = rte_eth_dev_vlan_filter(slave_port_id,
+ (uint16_t)pos, 1);
+   }
+   found = rte_bitmap_scan(internals->vlan_filter_bmp,
+   , );
+   } while (found && first != pos && res == 0);
+
+   return res;
+}
+
+static int
 __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
 {
struct rte_eth_dev *bonded_eth_dev, *slave_eth_dev;
@@ -427,6 +492,9 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, 
uint8_t slave_port_id)
activate_slave(bonded_eth_dev, slave_port_id);
}
}
+
+   slave_vlan_filter_set(bonded_port_id, slave_port_id);
+
return 0;

 }
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c
index 25fe00a..0b6caf6 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -1335,6 +1335,9 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
bonded_eth_dev->data->dev_conf.rxmode.mq_mode;
}

+   slave_eth_dev->data->dev_conf.rxmode.hw_vlan_filter =
+   bonded_eth_dev->data->dev_conf.rxmode.hw_vlan_filter;
+
/* Configure device */
errval = rte_eth_dev_configure(slave_eth_dev->data->port_id,