This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-tsg-master/test/src/gtest_proxy.cpp

140 lines
5.5 KiB
C++

#include <linux/if_ether.h>
#include <netinet/ip6.h>
#include <pcap.h>
#include <gtest/gtest.h>
#include <pcap/pcap.h>
#include <netinet/ip.h>
#include "tsg_proxy.h"
TEST(IPV4, tcp_opt_parse)
{
struct pkt_info pktinfo;
struct tsg_proxy_tcp_attribute tcp_attr;
pcap_t *pcap_file_fd = NULL;
struct pcap_pkthdr *header; // pcap报文头部结构
const u_char *packet; // 报文数据指针
struct iphdr *ip; // ip头部结构
struct streaminfo stream;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_file_fd = pcap_open_offline("pcap/ipv4_ssl_handshake.pcapng", errbuf);
ASSERT_TRUE(pcap_file_fd != NULL);
//syn
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip = (struct iphdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv4_header_parse((void *)ip, &pktinfo);
tsg_proxy_tcp_parse(&tcp_attr, &pktinfo, &stream);
ASSERT_EQ(tcp_attr.tcp_opt_client.mss, 1460);
ASSERT_EQ(tcp_attr.tcp_opt_client.wscale_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_client.wscale, 8);
ASSERT_EQ(tcp_attr.tcp_opt_client.sack, 1);
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_val, ntohl(619788329));
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_ecr, 0);
ASSERT_EQ(tcp_attr.tcp_opt_client.window, 64240);
//syn&ack
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip = (struct iphdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv4_header_parse((void *)ip, &pktinfo);
tsg_proxy_tcp_parse(&tcp_attr, &pktinfo, &stream);
ASSERT_EQ(tcp_attr.tcp_opt_server.mss, 1460);
ASSERT_EQ(tcp_attr.tcp_opt_server.wscale_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_server.wscale, 8);
ASSERT_EQ(tcp_attr.tcp_opt_server.sack, 1);
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_val, ntohl(201296612));
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_ecr, ntohl(619788329));
ASSERT_EQ(tcp_attr.tcp_opt_server.window, 65535);
//ack
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip = (struct iphdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv4_header_parse((void *)ip, &pktinfo);
tsg_proxy_tcp_parse(&tcp_attr, &pktinfo, &stream);
//first data pkt
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip = (struct iphdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv4_header_parse((void *)ip, &pktinfo);
stream.curdir = DIR_C2S;
tsg_proxy_first_data_process(&stream, &tcp_attr, &pktinfo);
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_val, ntohl(619788360));
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_val, ntohl(201296612));
ASSERT_EQ(tcp_attr.tcp_seq, ntohl(265573753));
ASSERT_EQ(tcp_attr.tcp_ack, ntohl(2286004672));
ASSERT_EQ(tcp_attr.tcp_info_packet_cur_dir, DIR_C2S);
pcap_close(pcap_file_fd);
}
TEST(IPV6, tcp_opt_parse)
{
struct pkt_info pktinfo;
struct tsg_proxy_tcp_attribute tcp_attr;
pcap_t *pcap_file_fd = NULL;
struct pcap_pkthdr *header; // pcap报文头部结构
const u_char *packet; // 报文数据指针
struct ip6_hdr *ip6; // ip头部结构
struct streaminfo stream;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_file_fd = pcap_open_offline("pcap/ipv6_ssl_handshake.pcapng", errbuf);
ASSERT_TRUE(pcap_file_fd != NULL);
//syn
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip6 = (struct ip6_hdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv6_header_parse((void *)ip6, &pktinfo);
tsg_proxy_tcp_parse(&tcp_attr, &pktinfo, &stream);
ASSERT_EQ(tcp_attr.tcp_opt_client.mss, 1440);
ASSERT_EQ(tcp_attr.tcp_opt_client.wscale_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_client.wscale, 8);
ASSERT_EQ(tcp_attr.tcp_opt_client.sack, 1);
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_val, ntohl(619788492));
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_ecr, 0);
ASSERT_EQ(tcp_attr.tcp_opt_client.window, 64800);
//syn&ack
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip6 = (struct ip6_hdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv6_header_parse((void *)ip6, &pktinfo);
tsg_proxy_tcp_parse(&tcp_attr, &pktinfo, &stream);
ASSERT_EQ(tcp_attr.tcp_opt_server.mss, 1440);
ASSERT_EQ(tcp_attr.tcp_opt_server.wscale_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_server.wscale, 8);
ASSERT_EQ(tcp_attr.tcp_opt_server.sack, 1);
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_set, 1);
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_val, ntohl(1014079587));
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_ecr, ntohl(619788492));
ASSERT_EQ(tcp_attr.tcp_opt_server.window, 65535);
//ack
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip6 = (struct ip6_hdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv6_header_parse((void *)ip6, &pktinfo);
tsg_proxy_tcp_parse(&tcp_attr, &pktinfo, &stream);
//first data pkt
ASSERT_TRUE(pcap_next_ex(pcap_file_fd, &header, &packet) >= 0);
ip6 = (struct ip6_hdr*) (packet + sizeof(struct ethhdr));
tsg_proxy_ipv6_header_parse((void *)ip6, &pktinfo);
stream.curdir = DIR_C2S;
tsg_proxy_first_data_process(&stream, &tcp_attr, &pktinfo);
ASSERT_EQ(tcp_attr.tcp_opt_client.ts_val, ntohl(619788540));
ASSERT_EQ(tcp_attr.tcp_opt_server.ts_val, ntohl(1014079587));
ASSERT_EQ(tcp_attr.tcp_seq, ntohl(625826589));
ASSERT_EQ(tcp_attr.tcp_ack, ntohl(64211095));
ASSERT_EQ(tcp_attr.tcp_info_packet_cur_dir, DIR_C2S);
pcap_close(pcap_file_fd);
}
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}