ethdev: save VLAN filter setting
authorGaetan Rivet <gaetan.rivet@6wind.com>
Sun, 9 Jul 2017 01:44:45 +0000 (03:44 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Sun, 9 Jul 2017 22:46:38 +0000 (00:46 +0200)
In order to be able to replicate a configuration onto a second port,
device configuration should be fully described and available.
Other configuration items (i.e. MAC addresses) are stored within
rte_eth_dev_data, but not this one.

Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
lib/librte_ether/rte_ethdev.c
lib/librte_ether/rte_ethdev.h

index 838ace3..76179fd 100644 (file)
@@ -1981,6 +1981,7 @@ int
 rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
 {
        struct rte_eth_dev *dev;
+       int ret;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
@@ -1996,7 +1997,23 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
        }
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_filter_set, -ENOTSUP);
 
-       return (*dev->dev_ops->vlan_filter_set)(dev, vlan_id, on);
+       ret = (*dev->dev_ops->vlan_filter_set)(dev, vlan_id, on);
+       if (ret == 0) {
+               struct rte_vlan_filter_conf *vfc;
+               int vidx;
+               int vbit;
+
+               vfc = &dev->data->vlan_filter_conf;
+               vidx = vlan_id / 64;
+               vbit = vlan_id % 64;
+
+               if (on)
+                       vfc->ids[vidx] |= UINT64_C(1) << vbit;
+               else
+                       vfc->ids[vidx] &= ~(UINT64_C(1) << vbit);
+       }
+
+       return ret;
 }
 
 int
index 5093436..93182b8 100644 (file)
@@ -373,6 +373,14 @@ enum rte_vlan_type {
        ETH_VLAN_TYPE_MAX,
 };
 
+/**
+ * A structure used to describe a vlan filter.
+ * If the bit corresponding to a VID is set, such VID is on.
+ */
+struct rte_vlan_filter_conf {
+       uint64_t ids[64];
+};
+
 /**
  * A structure used to configure the Receive Side Scaling (RSS) feature
  * of an Ethernet port.
@@ -1674,6 +1682,8 @@ struct rte_eth_dev_data {
        uint32_t dev_flags; /**< Capabilities */
        enum rte_kernel_driver kdrv;    /**< Kernel driver passthrough */
        int numa_node;  /**< NUMA node connection */
+       struct rte_vlan_filter_conf vlan_filter_conf;
+       /**< VLAN filter configuration. */
 };
 
 /** Device supports hotplug detach */