代码拉取完成,页面将自动刷新
同步操作将从 src-openEuler/gazelle 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。