10 Star 4 Fork 33

src-openEuler/gazelle

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0058-ltran-support-vlan.patch 4.28 KB
一键复制 编辑 原始数据 按行查看 历史
yinbin6 提交于 2023-11-29 15:01 . sync support vlan offload
From 0b7daa128d4b6dc231814537594158f8d928ef6c Mon Sep 17 00:00:00 2001
From: zhengjiebing <zhengjiebing_yewu@cmss.chinamobile.com>
Date: Thu, 23 Nov 2023 16:20:50 +0800
Subject: [PATCH] ltran support vlan
---
src/ltran/ltran_forward.c | 35 ++++++++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 7 deletions(-)
diff --git a/src/ltran/ltran_forward.c b/src/ltran/ltran_forward.c
index b41e1e2..a6f2d71 100644
--- a/src/ltran/ltran_forward.c
+++ b/src/ltran/ltran_forward.c
@@ -281,14 +281,26 @@ static __rte_always_inline int32_t tcp_handle(struct rte_mbuf *m, const struct r
return GAZELLE_OK;
}
+static uint32_t get_vlan_offset(const struct rte_mbuf *m)
+{
+ uint32_t offset = 0;
+ struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
+ u16_t type = ethh->ether_type;
+ if (type == PP_HTONS(RTE_ETHER_TYPE_VLAN)) {
+ offset += sizeof(struct rte_vlan_hdr);
+ }
+ return offset;
+}
+
static struct gazelle_stack* get_icmp_handle_stack(const struct rte_mbuf *m)
{
int32_t i;
struct gazelle_stack** stack_array = NULL;
struct rte_ipv4_hdr *ipv4_hdr = NULL;
struct gazelle_instance *instance = NULL;
+ uint32_t offset = get_vlan_offset(m);
- ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr));
+ ipv4_hdr = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr) + offset);
instance = gazelle_instance_get_by_ip(get_instance_mgr(), ipv4_hdr->dst_addr);
if (instance == NULL) {
return NULL;
@@ -321,10 +333,11 @@ static __rte_always_inline int32_t ipv4_handle(struct rte_mbuf *m, struct rte_ip
{
struct rte_tcp_hdr *tcp_hdr = NULL;
int32_t ret = -1;
+ uint32_t offset = get_vlan_offset(m);
if (likely(ipv4_hdr->next_proto_id == IPPROTO_TCP)) {
tcp_hdr = rte_pktmbuf_mtod_offset(m, struct rte_tcp_hdr *, sizeof(struct rte_ether_hdr) +
- sizeof(struct rte_ipv4_hdr));
+ sizeof(struct rte_ipv4_hdr) + offset);
get_statistics()->port_stats[g_port_index].tcp_pkt++;
ret = tcp_handle(m, ipv4_hdr, tcp_hdr);
} else if (ipv4_hdr->next_proto_id == IPPROTO_ICMP) {
@@ -336,7 +349,8 @@ static __rte_always_inline int32_t ipv4_handle(struct rte_mbuf *m, struct rte_ip
static __rte_always_inline void arp_handle(struct rte_mbuf *m)
{
- struct rte_arp_hdr *arph = rte_pktmbuf_mtod_offset(m, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr));
+ uint32_t offset = get_vlan_offset(m);
+ struct rte_arp_hdr *arph = rte_pktmbuf_mtod_offset(m, struct rte_arp_hdr *, sizeof(struct rte_ether_hdr) + offset);
get_statistics()->port_stats[g_port_index].arp_pkt++;
@@ -367,14 +381,14 @@ static __rte_always_inline void arp_handle(struct rte_mbuf *m)
static __rte_always_inline void upstream_forward_one(struct rte_mbuf *m)
{
struct rte_ipv4_hdr *iph = NULL;
- struct rte_ether_hdr *ethh = NULL;
uint8_t ip_version;
const int32_t ipv4_version_offset = 4;
const int32_t ipv4_version = 4;
+ uint32_t offset = get_vlan_offset(m);
get_statistics()->port_stats[g_port_index].rx_bytes += m->data_len;
- iph = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr));
+ iph = rte_pktmbuf_mtod_offset(m, struct rte_ipv4_hdr *, sizeof(struct rte_ether_hdr) + offset);
ip_version = (iph->version_ihl & 0xf0) >> ipv4_version_offset;
if (likely(ip_version == ipv4_version)) {
int32_t ret = ipv4_handle(m, iph);
@@ -385,8 +399,15 @@ static __rte_always_inline void upstream_forward_one(struct rte_mbuf *m)
goto forward_to_kni;
}
- ethh = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
- if (unlikely(RTE_BE16(RTE_ETHER_TYPE_ARP) == ethh->ether_type)) {
+ uint16_t type = 0;
+ if (offset > 0) {
+ struct rte_vlan_hdr *vlan_hdr = rte_pktmbuf_mtod_offset(m, struct rte_vlan_hdr *, sizeof(struct rte_ether_hdr));
+ type = vlan_hdr->eth_proto;
+ } else {
+ struct rte_ether_hdr *ethh = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
+ type = ethh->ether_type;
+ }
+ if (unlikely(RTE_BE16(RTE_ETHER_TYPE_ARP) == type)) {
arp_handle(m);
// arp packets are sent to kni by default
goto forward_to_kni;
--
2.27.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/gazelle.git
git@gitee.com:src-openeuler/gazelle.git
src-openeuler
gazelle
gazelle
master

搜索帮助

D67c1975 1850385 1daf7b77 1850385