From 64b01ee0b22d1f99dbba564580af922af9cd7aad Mon Sep 17 00:00:00 2001 From: Michal Jastrzebski Date: Fri, 20 Feb 2015 11:26:12 +0100 Subject: [PATCH 1/1] app/testpmd: check vlan filter configuration This patch modifies testpmd behavior when setting: rx_vlan add all vf_port (enabling all vlanids to be passed thru rx filter on VF). Rx_vlan_all_filter_set() function, checks if the next vlanid can be enabled by the driver. Number of vlanids is limited by the NIC and thus the NIC do not allow to enable more vlanids than it can allocate in VFTA table. Signed-off-by: Michal Jastrzebski Acked-by: Pablo de Lara --- app/test-pmd/config.c | 15 +++++++++------ app/test-pmd/testpmd.h | 2 +- lib/librte_ether/rte_ethdev.c | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index ec53923e3b..73f7230e78 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -1679,21 +1679,22 @@ rx_vlan_filter_set(portid_t port_id, int on) "diag=%d\n", port_id, on, diag); } -void +int rx_vft_set(portid_t port_id, uint16_t vlan_id, int on) { int diag; if (port_id_is_invalid(port_id, ENABLED_WARN)) - return; + return 1; if (vlan_id_is_invalid(vlan_id)) - return; + return 1; diag = rte_eth_dev_vlan_filter(port_id, vlan_id, on); if (diag == 0) - return; + return 0; printf("rte_eth_dev_vlan_filter(port_pi=%d, vlan_id=%d, on=%d) failed " "diag=%d\n", port_id, vlan_id, on, diag); + return -1; } void @@ -1703,8 +1704,10 @@ rx_vlan_all_filter_set(portid_t port_id, int on) if (port_id_is_invalid(port_id, ENABLED_WARN)) return; - for (vlan_id = 0; vlan_id < 4096; vlan_id++) - rx_vft_set(port_id, vlan_id, on); + for (vlan_id = 0; vlan_id < 4096; vlan_id++) { + if (rx_vft_set(port_id, vlan_id, on)) + break; + } } void diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 0d5a526dc3..389fc24f8a 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -508,7 +508,7 @@ void rx_vlan_strip_set_on_queue(portid_t port_id, uint16_t queue_id, int on); void rx_vlan_filter_set(portid_t port_id, int on); void rx_vlan_all_filter_set(portid_t port_id, int on); -void rx_vft_set(portid_t port_id, uint16_t vlan_id, int on); +int rx_vft_set(portid_t port_id, uint16_t vlan_id, int on); void vlan_extend_set(portid_t port_id, int on); void vlan_tpid_set(portid_t port_id, uint16_t tp_id); void tx_vlan_set(portid_t port_id, uint16_t vlan_id); diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index f70fc7525f..03e0af1cd5 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -2002,8 +2002,8 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on) return (-EINVAL); } FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_filter_set, -ENOTSUP); - (*dev->dev_ops->vlan_filter_set)(dev, vlan_id, on); - return (0); + + return (*dev->dev_ops->vlan_filter_set)(dev, vlan_id, on); } int -- 2.20.1