diff options
| author | Qiuwen Lu <[email protected]> | 2019-06-04 19:41:43 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2019-06-15 11:25:42 +0800 |
| commit | 5a229e06149ec056162bd5ed0cd5e3cfe238e8a3 (patch) | |
| tree | 7a8479ce6f748887354c618ea390ee707d627f0f | |
| parent | e1ff587ef72edc6d329e3971dbc2c0a47fa35f14 (diff) | |
增加为物理网卡设置PVID的功能
| -rw-r--r-- | app/src/arp.c | 2 | ||||
| -rw-r--r-- | app/src/icmp.c | 2 | ||||
| -rw-r--r-- | app/src/marsio.c | 2 | ||||
| -rw-r--r-- | app/src/mrb.c | 2 | ||||
| -rw-r--r-- | app/src/neigh.c | 2 | ||||
| -rw-r--r-- | include/external/marsio.h | 2 | ||||
| -rw-r--r-- | include/internal/vdev_define.h | 2 | ||||
| -rw-r--r-- | infra/include/common.h | 2 | ||||
| -rw-r--r-- | infra/include/ctrlmsg.h | 2 | ||||
| -rw-r--r-- | infra/include/ldbc.h | 2 | ||||
| -rw-r--r-- | infra/include/vnode.h | 2 | ||||
| -rw-r--r-- | infra/src/ctrlmsg.c | 2 | ||||
| -rw-r--r-- | infra/src/ldbc.c | 2 | ||||
| -rw-r--r-- | infra/src/vnode_mirror.c | 2 | ||||
| -rw-r--r-- | service/include/sc_phydev.h | 17 | ||||
| -rw-r--r-- | service/src/fwd.c | 38 | ||||
| -rw-r--r-- | service/src/phydev.c | 15 |
17 files changed, 68 insertions, 30 deletions
diff --git a/app/src/arp.c b/app/src/arp.c index b67f18a..56b5304 100644 --- a/app/src/arp.c +++ b/app/src/arp.c @@ -1,4 +1,4 @@ -/* \brief 简单协议栈ARP/RARP协议处理模块 +/* \brief 简单协议栈ARP/RARP协议处理模块 * * 处理ARP/RARP协议报文数据 * diff --git a/app/src/icmp.c b/app/src/icmp.c index 81b6b8c..1bbec2a 100644 --- a/app/src/icmp.c +++ b/app/src/icmp.c @@ -1,4 +1,4 @@ - + #include <mrapp.h> #include <rte_icmp.h> #include <rte_ip.h> diff --git a/app/src/marsio.c b/app/src/marsio.c index 04cf39b..fd3641e 100644 --- a/app/src/marsio.c +++ b/app/src/marsio.c @@ -1,4 +1,4 @@ -#include <stdio.h> +#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <rte_eal.h> diff --git a/app/src/mrb.c b/app/src/mrb.c index 141b18c..f990e3f 100644 --- a/app/src/mrb.c +++ b/app/src/mrb.c @@ -1,4 +1,4 @@ - + #include <rte_common.h> #include <rte_mbuf.h> diff --git a/app/src/neigh.c b/app/src/neigh.c index bc36103..cfe7b2f 100644 --- a/app/src/neigh.c +++ b/app/src/neigh.c @@ -1,4 +1,4 @@ -/* \brief 简单协议栈邻居子系统 +/* \brief 简单协议栈邻居子系统 * * 处理与主机邻接通信的所需的信息 * diff --git a/include/external/marsio.h b/include/external/marsio.h index 1d34a97..fc971c8 100644 --- a/include/external/marsio.h +++ b/include/external/marsio.h @@ -1,4 +1,4 @@ -/* +/* * \brief MARSIO Userspace ZeroCopy Driver Version 4 * * This is the user api header file of MARSIOv4 ZeroCopy Driver diff --git a/include/internal/vdev_define.h b/include/internal/vdev_define.h index 4bbfafd..64c7eae 100644 --- a/include/internal/vdev_define.h +++ b/include/internal/vdev_define.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include <common.h> #include <rte_ether.h> diff --git a/infra/include/common.h b/infra/include/common.h index bf2bfac..c22ed5a 100644 --- a/infra/include/common.h +++ b/infra/include/common.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #ifdef __cplusplus extern "C" { #endif diff --git a/infra/include/ctrlmsg.h b/infra/include/ctrlmsg.h index c33c7dc..f1e4e2a 100644 --- a/infra/include/ctrlmsg.h +++ b/infra/include/ctrlmsg.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include <sys/queue.h> #include <netinet/in.h> diff --git a/infra/include/ldbc.h b/infra/include/ldbc.h index 97bbee1..83f361e 100644 --- a/infra/include/ldbc.h +++ b/infra/include/ldbc.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include <stdint.h> #include <assert.h> diff --git a/infra/include/vnode.h b/infra/include/vnode.h index 714c774..d70432d 100644 --- a/infra/include/vnode.h +++ b/infra/include/vnode.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #ifdef __cplusplus extern "C" { diff --git a/infra/src/ctrlmsg.c b/infra/src/ctrlmsg.c index 2edca72..77fa941 100644 --- a/infra/src/ctrlmsg.c +++ b/infra/src/ctrlmsg.c @@ -1,4 +1,4 @@ -/* 控制面消息通信框架 +/* 控制面消息通信框架 * * \author Qiuwen Lu * \date 2017-03-08 diff --git a/infra/src/ldbc.c b/infra/src/ldbc.c index b0e11d6..dde358b 100644 --- a/infra/src/ldbc.c +++ b/infra/src/ldbc.c @@ -1,4 +1,4 @@ - + /// @brief 二级消费者负载均衡模块 /// 负责向各核心分发到达的报文 /// @author : Lu Qiuwen <[email protected]> diff --git a/infra/src/vnode_mirror.c b/infra/src/vnode_mirror.c index 30ad935..f9dd672 100644 --- a/infra/src/vnode_mirror.c +++ b/infra/src/vnode_mirror.c @@ -1,4 +1,4 @@ - + /* Virtual Data Deliver Node - Packet Deliver Class Author : Lu Qiuwen<[email protected]> Zheng Chao<[email protected]> diff --git a/service/include/sc_phydev.h b/service/include/sc_phydev.h index d7a321c..1fe7644 100644 --- a/service/include/sc_phydev.h +++ b/service/include/sc_phydev.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #ifdef __cplusplus extern "C" { @@ -26,6 +26,17 @@ enum phydev_type __PHYDEV_INFO_TYPE_VDEV }; +// PVID设置实现方式 +enum pvidmode +{ + /* 软件实现,在出方向报文插入VLAN标签 */ + MR_DEV_PVID_BY_SW = 0, + /* 硬件实现,在网卡初始化时设置 */ + MR_DEV_PVID_BY_HW_SETUP = 1, + /* 硬件实现,在出方向报文标记VLAN,offload到网卡插入vlan标签 */ + MR_DEV_PVID_BY_HW_OFFLOAD = 2 +}; + struct phydev_info { /* 名称 */ @@ -57,6 +68,10 @@ struct phydev_info unsigned int en_vlan_filter; unsigned int en_drop; + /* PVID */ + enum pvidmode pvidmode; + unsigned int pvid; + /* VLAN Filter详细配置 */ unsigned int nr_vlan_filter_allow_ids; unsigned int nr_vlan_filter_deny_ids; diff --git a/service/src/fwd.c b/service/src/fwd.c index 0f09b08..2f7d639 100644 --- a/service/src/fwd.c +++ b/service/src/fwd.c @@ -1,4 +1,4 @@ -/* +/* * 前置交换机——线路交换 * 物理网卡和虚拟网卡一一对应,映射交换 * @@ -146,14 +146,9 @@ void sw_forward_pv(struct sc_main * sc, struct fwd_rule * fwd_rule, unsigned int if(unlikely(sc->en_pkt_timestamp)) timestamp_caculate(sc, mbufs, rx_nr_mbufs); - /* FM10K,从vlan-strip特性中恢复vlan标签 */ - for(unsigned int i = 0; i < rx_nr_mbufs; i++) - { - rte_vlan_insert(&mbufs[i]); - } - distributer_caculate(sc->dist_object, mbufs, rx_nr_mbufs); vdev_dispatch(vdev_to, local_txq_id, mbufs, rx_nr_mbufs, 0); + return; } @@ -167,17 +162,34 @@ void sw_forward_vp(struct sc_main * sc, struct fwd_rule * fwd_rule, unsigned int struct vdev * vdev_from = fwd_rule->from.vdev; struct phydev * phydev_to = fwd_rule->to.phydev; + struct phydev_info * phydev_to_info = &phydev_to->info; /* TX:虚设备到物理设备 */ unsigned int rx_nr_mbufs = vdev_collect(vdev_from, local_rxq_id, mbufs, nr_tx_burst, 0); - if (unlikely(rx_nr_mbufs == 0)) return; + if (unlikely(rx_nr_mbufs == 0)) + { + return; + } - /* - for(unsigned int i = 0; i < rx_nr_mbufs; i++) + if (phydev_to_info->pvid) { - rte_vlan_strip(mbufs[i]); + if (phydev_to_info->pvidmode == MR_DEV_PVID_BY_HW_OFFLOAD) + { + for(unsigned int i = 0; i < rx_nr_mbufs; i++) + { + mbufs[i]->vlan_tci = phydev_to_info->pvid; + mbufs[i]->ol_flags |= PKT_TX_VLAN_PKT; + } + } + else if (phydev_to_info->pvidmode == MR_DEV_PVID_BY_SW) + { + for(unsigned int i = 0; i < rx_nr_mbufs; i++) + { + mbufs[i]->vlan_tci = phydev_to_info->pvid; + rte_vlan_insert(&mbufs[i]); + } + } } - */ unsigned int tx_nr_mbufs = rte_eth_tx_burst(phydev_to->port_id, local_txq_id, mbufs, rx_nr_mbufs); @@ -488,4 +500,4 @@ void sw_forward_idle_loop(struct sc_main * sc, unsigned int lcore_id) } return; -}
\ No newline at end of file +} diff --git a/service/src/phydev.c b/service/src/phydev.c index 8cb4c93..e082dbf 100644 --- a/service/src/phydev.c +++ b/service/src/phydev.c @@ -1,4 +1,4 @@ -/// 物理设备管理器 +/// 物理设备管理器 #include <sys/queue.h> #include <assert.h> @@ -340,7 +340,6 @@ 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) { @@ -365,6 +364,11 @@ static int phydev_setup(struct sc_main * sc, } } + if (dev->info.pvidmode == MR_DEV_PVID_BY_HW_SETUP && dev->info.pvid > 0) + { + rte_eth_dev_set_vlan_pvid(dev->port_id, dev->info.pvid, 1); + } + phydev_info_dump(dev); dev->inited = 1; dev->enable = 1; @@ -534,6 +538,12 @@ void phydev_config_by_g_cfg(struct phydev * phydev, const char * cfg) MESA_load_profile_uint_def(cfg, str_section, "vlan-filter", &phydev_info->en_vlan_filter, phydev_info->en_vlan_filter); + // 默认PVID设置模式, + // 所有出方向的报文全部打vlan标签 + MESA_load_profile_uint_def(cfg, str_section, "vlan-pvid-mode", &phydev_info->pvidmode, + MR_DEV_PVID_BY_HW_SETUP); + MESA_load_profile_uint_def(cfg, str_section, "vlan-pvid", &phydev_info->pvid, 0); + // 允许通过的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); @@ -570,6 +580,7 @@ void phydev_config_by_g_cfg(struct phydev * phydev, const char * cfg) MESA_load_profile_short_def(cfg, str_section, "mtu", (short *) &phydev->mtu, (short) phydev->mtu); // 读混杂模式 MESA_load_profile_uint_def(cfg, str_section, "promisc", &phydev->promisc, phydev->promisc); + // 读报文缓冲区名称 memset(phydev->str_direct_pool, 0, sizeof(phydev->str_direct_pool)); memset(phydev->str_indirect_pool, 0, sizeof(phydev->str_indirect_pool)); |
