diff options
| author | Qiuwen Lu <[email protected]> | 2019-04-11 18:47:27 +0600 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2019-06-15 11:25:42 +0800 |
| commit | d78f9e51d23a1f645968e306b770a7828993d0d1 (patch) | |
| tree | 19881d595227f3976988575f21b1d45b48e8957b | |
| parent | 248c9861ab765239834e1512384d9eabb48aa39e (diff) | |
增加读入vlan-filter的allow vlan id列表和deny vlan id列表
| -rw-r--r-- | service/include/sc_phydev.h | 6 | ||||
| -rw-r--r-- | service/src/phydev.c | 44 |
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); // 分流模式 |
