summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2019-06-04 19:41:43 +0800
committerQiuwen Lu <[email protected]>2019-06-15 11:25:42 +0800
commit5a229e06149ec056162bd5ed0cd5e3cfe238e8a3 (patch)
tree7a8479ce6f748887354c618ea390ee707d627f0f
parente1ff587ef72edc6d329e3971dbc2c0a47fa35f14 (diff)
增加为物理网卡设置PVID的功能
-rw-r--r--app/src/arp.c2
-rw-r--r--app/src/icmp.c2
-rw-r--r--app/src/marsio.c2
-rw-r--r--app/src/mrb.c2
-rw-r--r--app/src/neigh.c2
-rw-r--r--include/external/marsio.h2
-rw-r--r--include/internal/vdev_define.h2
-rw-r--r--infra/include/common.h2
-rw-r--r--infra/include/ctrlmsg.h2
-rw-r--r--infra/include/ldbc.h2
-rw-r--r--infra/include/vnode.h2
-rw-r--r--infra/src/ctrlmsg.c2
-rw-r--r--infra/src/ldbc.c2
-rw-r--r--infra/src/vnode_mirror.c2
-rw-r--r--service/include/sc_phydev.h17
-rw-r--r--service/src/fwd.c38
-rw-r--r--service/src/phydev.c15
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));