2024-06-07 14:47:38 +08:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
2024-08-16 16:12:12 +08:00
|
|
|
#include "packet_helper.h"
|
2024-06-07 14:47:38 +08:00
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Layer 2 Tunneling Protocol
|
|
|
|
|
* Flags: 0xc802, Type: Control Message, Length Bit, Sequence Bit
|
|
|
|
|
* 1... .... .... .... = Type: Control Message (1)
|
|
|
|
|
* .1.. .... .... .... = Length Bit: Length field is present
|
|
|
|
|
* .... 1... .... .... = Sequence Bit: Ns and Nr fields are present
|
|
|
|
|
* .... ..0. .... .... = Offset bit: Offset size field is not present
|
|
|
|
|
* .... ...0 .... .... = Priority: No priority
|
|
|
|
|
* .... .... .... 0010 = Version: 2
|
|
|
|
|
* Length: 105
|
|
|
|
|
* Tunnel ID: 0
|
|
|
|
|
* Session ID: 0
|
|
|
|
|
* Ns: 0
|
|
|
|
|
* Nr: 0
|
|
|
|
|
* Control Message AVP
|
|
|
|
|
* 1... .... .... .... = Mandatory: True
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1000 = Length: 8
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Control Message (0)
|
|
|
|
|
* Message Type: Start_Control_Request (1)
|
|
|
|
|
* Protocol Version AVP
|
|
|
|
|
* 1... .... .... .... = Mandatory: True
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1000 = Length: 8
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Protocol Version (2)
|
|
|
|
|
* Version: 1
|
|
|
|
|
* Revision: 0
|
|
|
|
|
* Framing Capabilities AVP
|
|
|
|
|
* 1... .... .... .... = Mandatory: True
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1010 = Length: 10
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Framing Capabilities (3)
|
|
|
|
|
* .... .... .... .... .... .... .... ..0. = Async Framing Supported: False
|
|
|
|
|
* .... .... .... .... .... .... .... ...1 = Sync Framing Supported: True
|
|
|
|
|
* Bearer Capabilities AVP
|
|
|
|
|
* 1... .... .... .... = Mandatory: True
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1010 = Length: 10
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Bearer Capabilities (4)
|
|
|
|
|
* .... .... .... .... .... .... .... ..0. = Analog Access Supported: False
|
|
|
|
|
* .... .... .... .... .... .... .... ...0 = Digital Access Supported: False
|
|
|
|
|
* Firmware Revision AVP
|
|
|
|
|
* 0... .... .... .... = Mandatory: False
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1000 = Length: 8
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Firmware Revision (6)
|
|
|
|
|
* Firmware Revision: 1537 (0x0601)
|
|
|
|
|
* Host Name AVP
|
|
|
|
|
* 1... .... .... .... = Mandatory: True
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0001 0010 = Length: 18
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Host Name (7)
|
|
|
|
|
* Host Name: IIE-SM-THINK
|
|
|
|
|
* Vendor Name AVP
|
|
|
|
|
* 0... .... .... .... = Mandatory: False
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1111 = Length: 15
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Vendor Name (8)
|
|
|
|
|
* Vendor Name: Microsoft
|
|
|
|
|
* Assigned Tunnel ID AVP
|
|
|
|
|
* 1... .... .... .... = Mandatory: True
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1000 = Length: 8
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Assigned Tunnel ID (9)
|
|
|
|
|
* Assigned Tunnel ID: 1
|
|
|
|
|
* Receive Window Size AVP
|
|
|
|
|
* 1... .... .... .... = Mandatory: True
|
|
|
|
|
* .0.. .... .... .... = Hidden: False
|
|
|
|
|
* .... ..00 0000 1000 = Length: 8
|
|
|
|
|
* Vendor ID: Reserved (0)
|
|
|
|
|
* AVP Type: Receive Window Size (10)
|
|
|
|
|
* Receive Window Size: 8
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
unsigned char v2_over_udp_ctrl_msg[] = {
|
|
|
|
|
0xc8, 0x02, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x08, 0x00, 0x00, 0x00, 0x02,
|
|
|
|
|
0x01, 0x00, 0x80, 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x80, 0x0a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
|
|
|
|
|
0x00, 0x06, 0x06, 0x01, 0x80, 0x12, 0x00, 0x00, 0x00, 0x07, 0x49, 0x49, 0x45, 0x2d, 0x53, 0x4d, 0x2d, 0x54, 0x48, 0x49, 0x4e, 0x4b, 0x00, 0x0f, 0x00, 0x00,
|
|
|
|
|
0x00, 0x08, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x80, 0x08, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x80, 0x08, 0x00, 0x00, 0x00, 0x0a, 0x00,
|
|
|
|
|
0x08};
|
|
|
|
|
|
2024-06-19 14:43:32 +08:00
|
|
|
TEST(L2TPV2_OVER_UDP_UTILS, CRTL_MSG)
|
2024-06-07 14:47:38 +08:00
|
|
|
{
|
|
|
|
|
const struct l2tp_hdr *hdr = (struct l2tp_hdr *)v2_over_udp_ctrl_msg;
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(l2tp_hdr_get_ver(hdr) == 2);
|
|
|
|
|
EXPECT_TRUE(l2tp_hdr_get_type(hdr) == 1);
|
|
|
|
|
EXPECT_TRUE(calc_udp_l2tpv2_hdr_len((const char *)v2_over_udp_ctrl_msg, sizeof(v2_over_udp_ctrl_msg)) == 105);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Layer 2 Tunneling Protocol
|
|
|
|
|
* Flags: 0x4002, Type: Data Message, Length Bit
|
|
|
|
|
* 0... .... .... .... = Type: Data Message (0)
|
|
|
|
|
* .1.. .... .... .... = Length Bit: Length field is present
|
|
|
|
|
* .... 0... .... .... = Sequence Bit: Ns and Nr fields are not present
|
|
|
|
|
* .... ..0. .... .... = Offset bit: Offset size field is not present
|
|
|
|
|
* .... ...0 .... .... = Priority: No priority
|
|
|
|
|
* .... .... .... 0010 = Version: 2
|
|
|
|
|
* Length: 78
|
|
|
|
|
* Tunnel ID: 28998
|
|
|
|
|
* Session ID: 2
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
unsigned char v2_over_udp_data_msg[] = {
|
|
|
|
|
0x40, 0x02, 0x00, 0x4e, 0x71, 0x46, 0x00, 0x02};
|
|
|
|
|
|
2024-06-19 14:43:32 +08:00
|
|
|
TEST(L2TPV2_OVER_UDP_UTILS, DATA_MSG)
|
2024-06-07 14:47:38 +08:00
|
|
|
{
|
|
|
|
|
const struct l2tp_hdr *hdr = (struct l2tp_hdr *)v2_over_udp_data_msg;
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(l2tp_hdr_get_ver(hdr) == 2);
|
|
|
|
|
EXPECT_TRUE(l2tp_hdr_get_type(hdr) == 0);
|
|
|
|
|
EXPECT_TRUE(calc_udp_l2tpv2_hdr_len((const char *)v2_over_udp_data_msg, sizeof(v2_over_udp_data_msg)) == 8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* TODO
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
unsigned char v3_over_udp_ctrl_msg[] = {};
|
|
|
|
|
|
2024-06-19 14:43:32 +08:00
|
|
|
TEST(L2TPV3_OVER_UDP_UTILS, CRTL_MSG)
|
2024-06-07 14:47:38 +08:00
|
|
|
{
|
|
|
|
|
// TODO
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Layer 2 Tunneling Protocol version 3
|
|
|
|
|
* Flags: 0x0003, Type: Data Message
|
|
|
|
|
* 0... .... .... .... = Type: Data Message (0)
|
|
|
|
|
* .0.. .... .... .... = Length Bit: Length field is not present
|
|
|
|
|
* .... 0... .... .... = Sequence Bit: Ns and Nr fields are not present
|
|
|
|
|
* .... .... .... 0011 = Version: 3
|
|
|
|
|
* Reserved: 0x0000
|
|
|
|
|
* Session ID: 0x00000fa0
|
|
|
|
|
* [Pseudowire Type: Unknown (0)]
|
|
|
|
|
* Cookie: 00000000
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
unsigned char v3_over_udp_data_msg[] = {
|
|
|
|
|
0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0x00};
|
|
|
|
|
|
2024-06-19 14:43:32 +08:00
|
|
|
TEST(L2TPV3_OVER_UDP_UTILS, DATA_MSG)
|
2024-06-07 14:47:38 +08:00
|
|
|
{
|
|
|
|
|
const struct l2tp_hdr *hdr = (struct l2tp_hdr *)v3_over_udp_data_msg;
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(l2tp_hdr_get_ver(hdr) == 3);
|
|
|
|
|
EXPECT_TRUE(l2tp_hdr_get_type(hdr) == 0);
|
|
|
|
|
EXPECT_TRUE(calc_udp_l2tpv3_hdr_len((const char *)v3_over_udp_data_msg, sizeof(v3_over_udp_data_msg)) == 12);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* TODO
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
unsigned char v3_over_ip_ctrl_msg[] = {};
|
|
|
|
|
|
2024-06-19 14:43:32 +08:00
|
|
|
TEST(L2TPV3_OVER_IP_UTILS, CRTL_MSG)
|
2024-06-07 14:47:38 +08:00
|
|
|
{
|
|
|
|
|
// TODO
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Layer 2 Tunneling Protocol version 3
|
|
|
|
|
* Session ID: 0x00009652
|
|
|
|
|
* [Pseudowire Type: Unknown (0)]
|
|
|
|
|
* Cookie: ca031078
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
unsigned char v3_over_ip_data_msg[] = {
|
|
|
|
|
0x00, 0x00, 0x96, 0x52, 0xca, 0x03, 0x10, 0x78};
|
|
|
|
|
|
2024-06-19 14:43:32 +08:00
|
|
|
TEST(L2TPV3_OVER_IP_UTILS, DATA_MSG)
|
2024-06-07 14:47:38 +08:00
|
|
|
{
|
|
|
|
|
EXPECT_TRUE(ntohl(*((uint32_t *)v3_over_ip_data_msg)) != 0); // data message
|
|
|
|
|
EXPECT_TRUE(calc_ip_l2tpv3_hdr_len((const char *)v3_over_ip_data_msg, sizeof(v3_over_ip_data_msg)) == 8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
|
|
|
return RUN_ALL_TESTS();
|
|
|
|
|
}
|