summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2019-04-11 18:47:27 +0600
committerQiuwen Lu <[email protected]>2019-06-15 11:25:42 +0800
commitd78f9e51d23a1f645968e306b770a7828993d0d1 (patch)
tree19881d595227f3976988575f21b1d45b48e8957b
parent248c9861ab765239834e1512384d9eabb48aa39e (diff)
增加读入vlan-filter的allow vlan id列表和deny vlan id列表
-rw-r--r--service/include/sc_phydev.h6
-rw-r--r--service/src/phydev.c44
2 files changed, 50 insertions, 0 deletions
diff --git a/service/include/sc_phydev.h b/service/include/sc_phydev.h
index a0951f2..d7a321c 100644
--- a/service/include/sc_phydev.h
+++ b/service/include/sc_phydev.h
@@ -57,6 +57,12 @@ struct phydev_info
unsigned int en_vlan_filter;
unsigned int en_drop;
+ /* VLAN Filter详细配置 */
+ unsigned int nr_vlan_filter_allow_ids;
+ unsigned int nr_vlan_filter_deny_ids;
+ unsigned int vlan_filter_allow_ids[4096];
+ unsigned int vlan_filter_deny_ids[4096];
+
/* PCI地址/虚设备地址 */
union
{
diff --git a/service/src/phydev.c b/service/src/phydev.c
index bef2d2f..8cb4c93 100644
--- a/service/src/phydev.c
+++ b/service/src/phydev.c
@@ -340,6 +340,31 @@ static int phydev_setup(struct sc_main * sc,
rte_eth_macaddr_get(dev->port_id, &dev->ether_addr);
dev->promisc = rte_eth_promiscuous_get(dev->port_id);
+
+ /* VLAN Filter设置 */
+ if (dev->en_vlan_filter)
+ {
+ for(unsigned int i = 0; i < dev->info.nr_vlan_filter_allow_ids; i++)
+ {
+ uint16_t vlan_id = (uint16_t)(dev->info.vlan_filter_allow_ids[i]);
+ if ((retval = rte_eth_dev_vlan_filter(dev->port_id, vlan_id, 1)) < 0)
+ {
+ MR_WARNING("Physical device %s VLAN Filter allow vlan-id %d setup failed: %s",
+ dev->symbol, vlan_id, strerror(-retval));
+ }
+ }
+
+ for(unsigned int i = 0; i < dev->info.nr_vlan_filter_deny_ids; i++)
+ {
+ uint16_t vlan_id = (uint16_t)(dev->info.vlan_filter_deny_ids[i]);
+ if ((retval = rte_eth_dev_vlan_filter(dev->port_id, vlan_id, 0)) < 0)
+ {
+ MR_WARNING("Physical device %s VLAN Filter deny vlan-id %d setup failed: %s",
+ dev->symbol, vlan_id, strerror(-retval));
+ }
+ }
+ }
+
phydev_info_dump(dev);
dev->inited = 1;
dev->enable = 1;
@@ -508,6 +533,25 @@ void phydev_config_by_g_cfg(struct phydev * phydev, const char * cfg)
// 读VLAN-Filter选项,默认不开启
MESA_load_profile_uint_def(cfg, str_section, "vlan-filter", &phydev_info->en_vlan_filter,
phydev_info->en_vlan_filter);
+
+ // 允许通过的VLAN ID列表,仅当vlan-filter开启后有效
+ int ret = MESA_load_profile_uint_range(cfg, str_section, "vlan-id-allow",
+ RTE_DIM(phydev_info->vlan_filter_allow_ids), phydev_info->vlan_filter_allow_ids);
+
+ if (ret >= 0)
+ {
+ phydev_info->nr_vlan_filter_allow_ids = ret;
+ }
+
+ // 禁止通过的VLAN ID列表,仅当vlan-filter开启后有效
+ ret = MESA_load_profile_uint_range(cfg, str_section, "vlan-id-deny",
+ RTE_DIM(phydev_info->vlan_filter_deny_ids), phydev_info->vlan_filter_deny_ids);
+
+ if(ret >= 0)
+ {
+ phydev_info->nr_vlan_filter_deny_ids = ret;
+ }
+
// 丢包选项
MESA_load_profile_uint_def(cfg, str_section, "drop_en", &phydev_info->en_drop, phydev_info->en_drop);
// 分流模式