From 1b30b6d6a29626e1cce31b935fb0f57a89df62b2 Mon Sep 17 00:00:00 2001 From: lijia Date: Mon, 8 Nov 2021 16:03:29 +0800 Subject: [PATCH] =?UTF-8?q?TSG-8372,=20=E5=A2=9E=E5=8A=A0=E4=B8=89?= =?UTF-8?q?=E5=B1=82vlan=20=E8=87=AA=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/gtest_jump_layer.cpp | 123 ++++++++++++++++++- test/sample_pcap/vxlan_inner_3_vlan_udp.pcap | Bin 0 -> 263 bytes 2 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 test/sample_pcap/vxlan_inner_3_vlan_udp.pcap diff --git a/test/gtest_jump_layer.cpp b/test/gtest_jump_layer.cpp index 2b8811d..bf9103f 100644 --- a/test/gtest_jump_layer.cpp +++ b/test/gtest_jump_layer.cpp @@ -34,11 +34,6 @@ #define GTEST_SAPP_ERR (-1) #define GTEST_SAPP_SUCC 0 -static void sendto_test_result(int n) -{ - -} - static pcap_t *g_jmp_pcap_handle; @@ -1279,6 +1274,124 @@ TEST(jump_layer, eth_vlan_ip6_udp_gtpext_ip4_tcp) ASSERT_EQ(chk_res, 0); } +static void jump_layer_eth_vxlan_3vlan_ipv4_udp(u_char *result_val, const struct pcap_pkthdr *hdr, const u_char *data) +{ + int ret; + const void *eth_header = data; + const void *outer_ipv4_header; + const void *outer_udp_header; + //const void *gtp_header; + const void *inner_ipv4_header; + + outer_ipv4_header = MESA_net_jump_to_layer(eth_header, ADDR_TYPE_MAC, ADDR_TYPE_IPV4); + if(NULL == outer_ipv4_header){ + printf("\033[1;31;40m jump_layer_eth_vxlan_3vlan_ipv4_udp(): eth->ipv4 error!\033[0m\n"); + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + ret = jump_check_ipv4_pkt((struct ip *)outer_ipv4_header, 209, IPPROTO_UDP, "10.10.0.8", "10.252.20.1"); + if(ret < 0){ + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + outer_udp_header = MESA_net_jump_to_layer(eth_header, ADDR_TYPE_MAC, ADDR_TYPE_UDP); + if(NULL == outer_udp_header){ + printf("\033[1;31;40m jump_layer_eth_vxlan_3vlan_ipv4_udp(): eth->vlan->ipv6->udp error!\033[0m\n"); + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + ret = jump_check_udp_pkt((const struct udphdr *)outer_udp_header, 189, 61717, 4789); + if(ret < 0){ + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + const struct ethhdr *inner_mac_header = (struct ethhdr *)MESA_jump_layer_greedy(outer_ipv4_header, ADDR_TYPE_IPV4, ADDR_TYPE_MAC); + if(NULL == inner_mac_header){ + printf("\033[1;31;jump_layer_eth_vxlan_3vlan_ipv4_udp(): eth->ipv6->udp->vxlan->mac error!\033[0m\n"); + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + const unsigned char expect_src_mac[6] = {0x6c, 0x3b, 0x6b, 0xc0, 0x01, 0x1f}; + const unsigned char expect_dst_mac[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + if(memcmp(inner_mac_header->h_source, expect_src_mac, 6) != 0){ + printf("\033[1;31;jump_layer_eth_vxlan_3vlan_ipv4_udp(): eth->ipv6->udp->vxlan->src_mac error!\033[0m\n"); + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + if(memcmp(inner_mac_header->h_dest, expect_dst_mac, 6) != 0){ + printf("\033[1;31;jump_layer_eth_vxlan_3vlan_ipv4_udp(): eth->ipv6->udp->vxlan->dst_mac error!\033[0m\n"); + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + inner_ipv4_header = ( struct ip *)MESA_jump_layer_greedy(eth_header, ADDR_TYPE_MAC, ADDR_TYPE_IPV4); + if(NULL == inner_ipv4_header){ + printf("\033[1;31;jump_layer_eth_vxlan_3vlan_ipv4_udp(): eth->ipv6->udp->gtp->ipv4 error!\033[0m\n"); + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + ret = jump_check_ipv4_pkt((struct ip *)inner_ipv4_header, 147, IPPROTO_UDP, "0.0.0.0", "255.255.255.255"); + if(ret < 0){ + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + const void *greedy_udp_hdr = MESA_jump_layer_greedy(eth_header, ADDR_TYPE_MAC, ADDR_TYPE_UDP); + if(NULL == greedy_udp_hdr){ + printf("\033[1;31;40m jump_layer_eth_vxlan_3vlan_ipv4_udp(): greedy jump eth->vlan->ipv6->udp error!\033[0m\n"); + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + ret = jump_check_udp_pkt((const struct udphdr *)greedy_udp_hdr, 127, 5678, 5678); + if(ret < 0){ + *result_val = -1; + pcap_breakloop(g_jmp_pcap_handle); + return; + } + + printf("\033[32m jump_layer_eth_vxlan_3vlan_ipv4_udp() test succ\033[0m\n"); + + *result_val = 0; + return; +} + + +#define __jump_layer_eth_vxlan_3vlan_ipv4_udp 1 +TEST(jump_layer, eth_vxlan_3vlan_ipv4_udp) +{ + int fun_ret; + u_char chk_res = -1; + + fun_ret = jmp_file_md5_checksum("./sample_pcap/vxlan_inner_3_vlan_udp.pcap", "3d9da66edfe7e8958f797ca57fff9ba5"); + ASSERT_EQ(fun_ret, 0); + + fun_ret = jmp_pcap_init("./sample_pcap/vxlan_inner_3_vlan_udp.pcap", jump_layer_eth_vxlan_3vlan_ipv4_udp, (u_char *)&chk_res); + ASSERT_EQ(fun_ret, 0); + + ASSERT_EQ(chk_res, 0); +} + +/* + TODO: + 基础协议跳转测试用例; + 各种隧道嵌套协议跳转测试用例. +*/ int main(int argc, char *argv[]) { diff --git a/test/sample_pcap/vxlan_inner_3_vlan_udp.pcap b/test/sample_pcap/vxlan_inner_3_vlan_udp.pcap new file mode 100644 index 0000000000000000000000000000000000000000..16ee8a8ed88ef4955abd9bc913242e56d0243f63 GIT binary patch literal 263 zcmca|c+)~A1{MYcU}0bcax`1o6G3A4p?CrV!$b!cE+Amw;9ziNV7SP@;K1M@D98sA z;rb)O_)%17E5lv}1`d!m21|zjV31>-eSlHEk%3pQk%9R`BLg2ZSodU*8VA9uXb=rj zD5fW-$55Yh@dg7k1JD6%5Pb}+3>;2Dj={PC0Rar`4E$z#CI)&I3K~hJ>1ml2nn1fa zd^59)@zaqVdo%Db@HsmN85$Uy=^7fj>zV{J@PWK1 Vz`$3QlbENQo0ylFo~m1F2mr$bIr0Di literal 0 HcmV?d00001