diff options
| author | Qiuwen Lu <[email protected]> | 2019-12-18 15:15:23 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2019-12-18 15:15:23 +0800 |
| commit | f5433253e98e56b52189dd94e219124fdeddbc7a (patch) | |
| tree | e13b45f5e6201be3b3c29e13480cc2d59b23b2b9 | |
| parent | 75ee84472bd4b88e1b3588149df54702ea59a1f9 (diff) | |
TSG-324 增加对MAC地址翻转接入方式的支持v4.3.18-20200428v4.3.17-20200421
| -rw-r--r-- | tunnat/include/tunnat.h | 3 | ||||
| -rw-r--r-- | tunnat/include/tunnel.h | 7 | ||||
| -rw-r--r-- | tunnat/src/core.cc | 43 | ||||
| -rw-r--r-- | tunnat/src/tunnel.cc | 66 |
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) |
