summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2019-12-18 15:15:23 +0800
committerQiuwen Lu <[email protected]>2019-12-18 15:15:23 +0800
commitf5433253e98e56b52189dd94e219124fdeddbc7a (patch)
treee13b45f5e6201be3b3c29e13480cc2d59b23b2b9
parent75ee84472bd4b88e1b3588149df54702ea59a1f9 (diff)
TSG-324 增加对MAC地址翻转接入方式的支持v4.3.18-20200428v4.3.17-20200421
-rw-r--r--tunnat/include/tunnat.h3
-rw-r--r--tunnat/include/tunnel.h7
-rw-r--r--tunnat/src/core.cc43
-rw-r--r--tunnat/src/tunnel.cc66
4 files changed, 84 insertions, 35 deletions
diff --git a/tunnat/include/tunnat.h b/tunnat/include/tunnat.h
index 7e31a45..f2a90db 100644
--- a/tunnat/include/tunnat.h
+++ b/tunnat/include/tunnat.h
@@ -133,6 +133,9 @@ struct TunnatInstance
bool en_vlan_flipping{false};
uint16_t vlan_fliping_map[ETHER_MAX_VLAN_ID + 1]{0};
+ /* MAC Flipping */
+ bool mac_flipping[ETHER_MAX_VLAN_ID + 1]{false};
+
/* 线程运行句柄 */
TunnatThreadInstance * thread_instances[MR_SID_MAX];
diff --git a/tunnat/include/tunnel.h b/tunnat/include/tunnel.h
index 086dc78..6801cf7 100644
--- a/tunnat/include/tunnel.h
+++ b/tunnat/include/tunnel.h
@@ -200,11 +200,12 @@ public:
static int MbufMetaForwardModify(marsio_buff_t * mbuf);
private:
- unsigned int vlan_id_;
- unsigned int vlan_id_map_;
+ uint16_t vlan_id_;
+ uint16_t vlan_id_map_;
+ bool mac_flipping_;
bool vlan_id_offload_by_nic_{false};
- static uint16_t vlan_flipping_map_lookup(uint16_t le_vlan_id);
+ static bool flipping_map_lookup(uint16_t le_vlan_id, uint16_t & vlan_id_out, bool & en_mac_flipping);
};
class TunInnerEther : public Tunnel
diff --git a/tunnat/src/core.cc b/tunnat/src/core.cc
index 23d7223..3765cab 100644
--- a/tunnat/src/core.cc
+++ b/tunnat/src/core.cc
@@ -142,44 +142,55 @@ int tunnat_vlan_flipping_setup(TunnatInstance * instance)
/* 读VLAN FLIPPING映射表 */
for(unsigned int i = 0; i < C_I_VLAN_PAIR_MAX; i++)
{
- char __c_router_cfg_name[MR_SYMBOL_MAX] = {};
- char __i_router_cfg_name[MR_SYMBOL_MAX] = {};
- unsigned int __c_router_cfg_value{};
- unsigned int __i_router_cfg_value{};
+ char c_router_cfg_name[MR_SYMBOL_MAX] = {};
+ char i_router_cfg_name[MR_SYMBOL_MAX] = {};
+ char en_mac_flipping_cfg_name[MR_SYMBOL_MAX] = {};
- snprintf(__c_router_cfg_name, sizeof(__c_router_cfg_name), "c_router_vlan_id_%u", i);
- snprintf(__i_router_cfg_name, sizeof(__i_router_cfg_name), "i_router_vlan_id_%u", i);
+ unsigned int c_router_cfg_value{};
+ unsigned int i_router_cfg_value{};
+ unsigned int en_mac_flipping{};
- if (MESA_load_profile_uint_nodef(cfgfile, "vlan_flipping", __c_router_cfg_name, &__c_router_cfg_value) < 0)
+ snprintf(c_router_cfg_name, sizeof(c_router_cfg_name), "c_router_vlan_id_%u", i);
+ snprintf(i_router_cfg_name, sizeof(i_router_cfg_name), "i_router_vlan_id_%u", i);
+ snprintf(en_mac_flipping_cfg_name, sizeof(en_mac_flipping_cfg_name), "en_mac_flipping_%u", i);
+
+ if (MESA_load_profile_uint_nodef(cfgfile, "vlan_flipping", c_router_cfg_name, &c_router_cfg_value) < 0)
+ {
+ break;
+ }
+
+ if (MESA_load_profile_uint_nodef(cfgfile, "vlan_flipping", i_router_cfg_name, &i_router_cfg_value) < 0)
{
break;
}
- if (MESA_load_profile_uint_nodef(cfgfile, "vlan_flipping", __i_router_cfg_name, &__i_router_cfg_value) < 0)
+ if (MESA_load_profile_uint_nodef(cfgfile, "vlan_flipping", en_mac_flipping_cfg_name, &en_mac_flipping) < 0)
{
break;
}
- auto __u16_c_router_vlan_id = static_cast<uint16_t>(__c_router_cfg_value);
- auto __u16_i_router_vlan_id = static_cast<uint16_t>(__i_router_cfg_value);
+ auto u16_c_router_vlan_id = static_cast<uint16_t>(c_router_cfg_value);
+ auto u16_i_router_vlan_id = static_cast<uint16_t>(i_router_cfg_value);
- if (instance->vlan_fliping_map[__u16_c_router_vlan_id] != 0)
+ if (instance->vlan_fliping_map[u16_c_router_vlan_id] != 0)
{
MR_WARNING("Duplicated vlan-id-flipping-map found, id = %u, ignore it.", i);
continue;
}
- if (instance->vlan_fliping_map[__u16_i_router_vlan_id] != 0)
+ if (instance->vlan_fliping_map[u16_i_router_vlan_id] != 0)
{
MR_WARNING("Duplicated vlan-id-flipping-map found, id = %u, ignore it.", i);
continue;
}
- instance->vlan_fliping_map[__u16_c_router_vlan_id] = __u16_i_router_vlan_id;
- instance->vlan_fliping_map[__u16_i_router_vlan_id] = __u16_c_router_vlan_id;
+ instance->vlan_fliping_map[u16_c_router_vlan_id] = u16_i_router_vlan_id;
+ instance->vlan_fliping_map[u16_i_router_vlan_id] = u16_c_router_vlan_id;
+ instance->mac_flipping[u16_c_router_vlan_id] = en_mac_flipping;
+ instance->mac_flipping[u16_i_router_vlan_id] = en_mac_flipping;
- MR_INFO("VLAN-FLIPPING-MAP %u: C-router-vlan-id %u, I-router-vlan-id %u",i,
- __u16_c_router_vlan_id, __u16_i_router_vlan_id);
+ MR_INFO("VLAN-FLIPPING-MAP %u: C-router-vlan-id %u, I-router-vlan-id %u, MAC FLIPPING: %s",i,
+ u16_c_router_vlan_id, u16_i_router_vlan_id, en_mac_flipping ? "true" : "false");
}
return RT_SUCCESS;
diff --git a/tunnat/src/tunnel.cc b/tunnat/src/tunnel.cc
index f3b496b..65e9f7d 100644
--- a/tunnat/src/tunnel.cc
+++ b/tunnat/src/tunnel.cc
@@ -349,10 +349,8 @@ int TunVlanFlipping::PacketParse(const char * pkt, unsigned int pkt_len)
vlan_id_ = rte_cpu_to_le_16(vlan_hdr->vlan_tci);
}
- vlan_id_map_ = vlan_flipping_map_lookup(vlan_id_);
-
/* 不在VLAN Flipping Map中的VLAN,不认为是隧道的一部分 */
- if (!vlan_id_map_)
+ if (!flipping_map_lookup(vlan_id_, vlan_id_map_, mac_flipping_))
{
return RT_ERR;
}
@@ -368,7 +366,24 @@ int TunVlanFlipping::PacketParse(const char * pkt, unsigned int pkt_len)
int TunVlanFlipping::PacketConstruct(const char * pkt, unsigned int pkt_len)
{
- return PacketForwardModify(pkt, pkt_len);
+ auto * eth_hdr = (struct ether_hdr *) pkt;
+ if (eth_hdr->ether_type == htons(ETHER_TYPE_VLAN))
+ {
+ unsigned int offset = 0;
+ pkt += sizeof(struct ether_hdr);
+ offset += sizeof(struct ether_hdr);
+
+ /* 外层IP头部 */
+ auto * vlan_hdr = (struct vlan_hdr *) pkt;
+ vlan_hdr->vlan_tci = htons(vlan_id_map_);
+ }
+
+ if (mac_flipping_)
+ {
+ std::swap<ether_addr>(eth_hdr->s_addr, eth_hdr->d_addr);
+ }
+
+ return 0;
}
int TunVlanFlipping::PacketForwardModify(const char * pkt, unsigned int pkt_len)
@@ -387,29 +402,46 @@ int TunVlanFlipping::PacketForwardModify(const char * pkt, unsigned int pkt_len)
auto * vlan_hdr = (struct vlan_hdr *) pkt;
uint16_t vlan_id = ntohs(vlan_hdr->vlan_tci);
- uint16_t map_vlan_id = vlan_flipping_map_lookup(vlan_id);
- if (!map_vlan_id)
+ uint16_t map_vlan_id = 0;
+ bool mac_flipping = false;
+
+ if (!flipping_map_lookup(vlan_id, map_vlan_id, mac_flipping))
{
return RT_ERR;
}
+ if (mac_flipping)
+ {
+ std::swap<ether_addr>(eth_hdr->s_addr, eth_hdr->d_addr);
+ }
+
vlan_hdr->vlan_tci = htons(map_vlan_id);
return RT_SUCCESS;
}
int TunVlanFlipping::MbufMetaForwardModify(marsio_buff_t * mbuf)
{
- auto * __mbuf = (struct rte_mbuf *)mbuf;
- if (!__mbuf->ol_flags & PKT_RX_VLAN)
+ auto * __mbuf = (struct rte_mbuf *) mbuf;
+ if (!(__mbuf->ol_flags & PKT_RX_VLAN))
{
return 0;
}
- uint16_t vlan_id_fliping = vlan_flipping_map_lookup(__mbuf->vlan_tci);
- if (vlan_id_fliping != 0)
+ uint16_t vlan_id_fliping{0};
+ bool mac_flipping{false};
+
+ if (!flipping_map_lookup(__mbuf->vlan_tci, vlan_id_fliping, mac_flipping))
{
- __mbuf->ol_flags |= PKT_TX_VLAN_PKT;
- __mbuf->vlan_tci = vlan_id_fliping;
+ return 0;
+ }
+
+ __mbuf->ol_flags |= PKT_TX_VLAN_PKT;
+ __mbuf->vlan_tci = vlan_id_fliping;
+
+ if (mac_flipping)
+ {
+ struct ether_hdr * eth_hdr = rte_pktmbuf_mtod(__mbuf, struct ether_hdr *);
+ std::swap<ether_addr>(eth_hdr->s_addr, eth_hdr->d_addr);
}
return 0;
@@ -436,23 +468,25 @@ void TunVlanFlipping::MbufMetaConstruct(marsio_buff_t * mbuf)
}
}
-uint16_t TunVlanFlipping::vlan_flipping_map_lookup(uint16_t le_vlan_id)
+bool TunVlanFlipping::flipping_map_lookup(uint16_t le_vlan_id, uint16_t & vlan_id_out, bool & en_mac_flipping)
{
auto * instance = TunnatInstance::TunnatInstanceGet();
if (unlikely(le_vlan_id < 1 || le_vlan_id > ETHER_MAX_VLAN_ID))
{
TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_VLAN_FLIPING_INVALID_VLAN_ID, 1);
- return 0;
+ return false;
}
uint16_t result = instance->vlan_fliping_map[le_vlan_id];
if (unlikely(result == 0))
{
TUNNAT_THREAD_STAT_ADD(TUNNAT_STAT_VLAN_FLIPING_NO_FLIP_MAP, 1);
- return 0;
+ return false;
}
- return result;
+ vlan_id_out = result;
+ en_mac_flipping = instance->mac_flipping[le_vlan_id];
+ return true;
}
bool TunVlanFlipping::operator==(const TunVlanFlipping & rhs)