summaryrefslogtreecommitdiff
path: root/tunnat
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-07-31 09:54:18 +0800
committerQiuwen Lu <[email protected]>2017-07-31 09:54:18 +0800
commitb84ab1d6344878baab38a820af79e9af13dc53bc (patch)
treed4cb8f40ce2b9254536d1dc2ffe876983688b36d /tunnat
parent2759a867feccb603e480e339372cd58de18d9cb1 (diff)
增加VXLAN头部信息获取功能
- 将到达包的VXLAN头部信息写入控制域,便于上层获取并进行包活。
Diffstat (limited to 'tunnat')
-rw-r--r--tunnat/include/tunnel.h11
-rw-r--r--tunnat/src/runtime.cc8
2 files changed, 19 insertions, 0 deletions
diff --git a/tunnat/include/tunnel.h b/tunnat/include/tunnel.h
index 4994eff..1ccbdf4 100644
--- a/tunnat/include/tunnel.h
+++ b/tunnat/include/tunnel.h
@@ -20,6 +20,10 @@ struct AddressInfo
struct in_addr dst_in_addr;
struct in6_addr src_in6_addr;
struct in6_addr dst_in6_addr;
+
+ uint32_t s_port;
+ uint32_t d_port;
+ uint32_t vpn_id;
};
/* 隧道格式类型 */
@@ -114,6 +118,13 @@ public:
int GetAddressInfo(struct AddressInfo & addr_info)
{
+ addr_info.src_in_addr = src_in_addr_;
+ addr_info.dst_in_addr = dst_in_addr_;
+ addr_info.s_port = udp_hdr_.src_port;
+ addr_info.d_port = udp_hdr_.dst_port;
+ addr_info.vpn_id = (vxlan_hdr_.vlan_id_half_low & 0xf) |
+ (vxlan_hdr_.vlan_id_half_high & 0xff) << 4;
+
return 0;
}
diff --git a/tunnat/src/runtime.cc b/tunnat/src/runtime.cc
index ab4e6f7..f4d113f 100644
--- a/tunnat/src/runtime.cc
+++ b/tunnat/src/runtime.cc
@@ -105,6 +105,14 @@ static int __phy_to_virt_pkt_modify(TunnatInstance * instance, TunnatThreadInsta
TunnelContainer & outer_tunnel = tun_array.GetOuterTunContainer();
TunnelContainer & inner_tunnel = tun_array.GetInnerTunContainer();
+ AddressInfo outer_tunnel_addrinfo;
+ if (outer_tunnel.GetAddressInfo(outer_tunnel_addrinfo) == RT_SUCCESS)
+ {
+ ctrlzone->g_device_in_addr = outer_tunnel_addrinfo.dst_in_addr.s_addr;
+ ctrlzone->l_device_l4_port = outer_tunnel_addrinfo.s_port;
+ ctrlzone->g_device_vpn_id = outer_tunnel_addrinfo.vpn_id;
+ }
+
ctrlzone->__encap_type = outer_tunnel.ThisTunType();
ctrlzone->__encap_len = tun_array.sz_total_len - inner_tunnel.ThisTunLength();
ctrlzone->action = TUNNAT_CZ_ACTION_FORWARD;