TSG-14649 tsg-service-chaining-engine适配新的控制报文格式

This commit is contained in:
luwenpeng
2023-04-28 15:00:46 +08:00
parent d1b04d50b8
commit a2d0f40f76
26 changed files with 16188 additions and 164 deletions

View File

@@ -1,4 +1,4 @@
add_library(common src/addr_tuple4.cpp src/session_table.cpp src/raw_packet.cpp src/ctrl_packet.cpp src/bfd.cpp src/utils.cpp src/g_vxlan.cpp src/log.cpp src/timestamp.cpp)
add_library(common src/addr_tuple4.cpp src/session_table.cpp src/raw_packet.cpp src/ctrl_packet.cpp src/bfd.cpp src/utils.cpp src/g_vxlan.cpp src/log.cpp src/timestamp.cpp src/mpack.cpp)
target_link_libraries(common PUBLIC cjson)
target_link_libraries(common PUBLIC MESA_handle_logger)

8207
common/include/mpack.h Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,10 @@
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <cjson/cJSON.h>
#include "log.h"
#include "mpack.h"
#include "utils.h"
#include "ctrl_packet.h"
@@ -30,7 +32,151 @@ void ctrl_packet_parser_init(struct ctrl_pkt_parser *handler)
// return 0 : success
// return -1 : error
int ctrl_packet_parser_parse(struct ctrl_pkt_parser *handler, const char *data, size_t length)
int ctrl_packet_parser_mpack(struct ctrl_pkt_parser *handler, const char *data, size_t length)
{
mpack_tree_t tree;
mpack_node_t root;
mpack_node_t temp;
mpack_node_t item;
mpack_error_t ret;
char buffer[16];
mpack_tree_init_data(&tree, data, length);
mpack_tree_parse(&tree);
root = mpack_tree_root(&tree);
if (mpack_node_is_nil(root))
{
LOG_ERROR("%s: unexpected control packet: (invalid mpack format)", LOG_TAG_CTRLPKT);
goto error_out;
}
// tsync
temp = mpack_node_map_cstr(root, "tsync");
if (mpack_node_is_nil(temp))
{
LOG_ERROR("%s: unexpected control packet: (tsync no found)", LOG_TAG_CTRLPKT);
goto error_out;
}
mpack_node_copy_cstr(temp, handler->tsync, sizeof(handler->tsync));
if (strcasecmp(handler->tsync, "2.0") != 0)
{
LOG_ERROR("%s: unexpected control packet: (invalid tsync value) %s", LOG_TAG_CTRLPKT, handler->tsync);
goto error_out;
}
// session_id
temp = mpack_node_map_cstr(root, "session_id");
if (mpack_node_is_nil(temp))
{
LOG_ERROR("%s: unexpected control packet: (session_id no found)", LOG_TAG_CTRLPKT);
goto error_out;
}
handler->session_id = mpack_node_u64(temp);
if (handler->session_id == 0)
{
LOG_ERROR("%s: unexpected control packet: (invalid session_id value) %lu", LOG_TAG_CTRLPKT, handler->session_id);
goto error_out;
}
// state
temp = mpack_node_map_cstr(root, "state");
if (mpack_node_is_nil(temp))
{
LOG_ERROR("%s: unexpected control packet: (state no found)", LOG_TAG_CTRLPKT);
goto error_out;
}
mpack_node_copy_cstr(temp, buffer, sizeof(buffer));
if (strcasecmp(buffer, "opening") == 0)
{
handler->state = SESSION_STATE_OPENING;
}
else if (strcasecmp(buffer, "active") == 0)
{
handler->state = SESSION_STATE_ACTIVE;
}
else if (strcasecmp(buffer, "closing") == 0)
{
handler->state = SESSION_STATE_CLOSING;
}
else if (strcasecmp(buffer, "resetall") == 0)
{
handler->state = SESSION_STATE_RESETALL;
}
else
{
LOG_ERROR("%s: unexpected control packet: (invalid state value) %s", LOG_TAG_CTRLPKT, buffer);
goto error_out;
}
if (handler->state != SESSION_STATE_ACTIVE)
{
goto success_out;
}
// method
temp = mpack_node_map_cstr(root, "method");
if (mpack_node_is_nil(temp))
{
LOG_ERROR("%s: unexpected control packet: (method no found)", LOG_TAG_CTRLPKT);
goto error_out;
}
mpack_node_copy_cstr(temp, handler->method, sizeof(handler->method));
if (strcasecmp(handler->method, "policy_update") != 0)
{
LOG_ERROR("%s: unexpected control packet: (invalid method value) %s", LOG_TAG_CTRLPKT, handler->method);
goto error_out;
}
// params
temp = mpack_node_map_cstr(root, "params");
if (mpack_node_is_nil(temp))
{
LOG_ERROR("%s: unexpected control packet: (params no found)", LOG_TAG_CTRLPKT);
goto error_out;
}
// params->sce
temp = mpack_node_map_cstr(temp, "sce");
if (mpack_node_is_nil(temp))
{
LOG_ERROR("%s: unexpected control packet: (sce no found)", LOG_TAG_CTRLPKT);
goto error_out;
}
// params->sce->rule_ids
temp = mpack_node_map_cstr(temp, "rule_ids");
if (mpack_node_is_nil(temp))
{
LOG_ERROR("%s: unexpected control packet: (rule_ids no found)", LOG_TAG_CTRLPKT);
goto error_out;
}
handler->rule_id_num = MIN(mpack_node_array_length(temp), (int)(sizeof(handler->rule_ids) / sizeof(handler->rule_ids[0])));
if (handler->rule_id_num <= 0)
{
LOG_ERROR("%s: unexpected control packet: (invalid rule id num) %ld", LOG_TAG_CTRLPKT, mpack_node_array_length(temp));
goto error_out;
}
for (int i = 0; i < handler->rule_id_num; i++)
{
item = mpack_node_array_at(temp, i);
handler->rule_ids[i] = mpack_node_u64(item);
}
success_out:
ret = mpack_tree_destroy(&tree);
if (ret != mpack_ok)
{
LOG_ERROR("%s: unexpected control packet: (mpack return error) %d", LOG_TAG_CTRLPKT, ret);
return -1;
}
return 0;
error_out:
mpack_tree_destroy(&tree);
return -1;
}
// return 0 : success
// return -1 : error
int ctrl_packet_parser_cjson(struct ctrl_pkt_parser *handler, const char *data, size_t length)
{
int iter = 0;
cJSON *item = NULL;
@@ -152,6 +298,14 @@ error_out:
return -1;
}
// return 0 : success
// return -1 : error
int ctrl_packet_parser_parse(struct ctrl_pkt_parser *handler, const char *data, size_t length)
{
// return ctrl_packet_parser_cjson(handler, data, length);
return ctrl_packet_parser_mpack(handler, data, length);
}
void ctrl_packet_parser_dump(struct ctrl_pkt_parser *handler)
{
if (handler)
@@ -164,7 +318,7 @@ void ctrl_packet_parser_dump(struct ctrl_pkt_parser *handler)
for (int i = 0; i < handler->rule_id_num; i++)
{
LOG_INFO("%s: rule_ids[%03d] : %lu", LOG_TAG_POLICY, i, handler->rule_ids[i]);
LOG_INFO("%s: rule_ids[%03d] : %lu", LOG_TAG_POLICY, i, handler->rule_ids[i]);
}
}
}

7304
common/src/mpack.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,25 +1,335 @@
#include <gtest/gtest.h>
#include "mpack.h"
#include "ctrl_packet.h"
TEST(CTRL_PACKET, PARSE)
{
const char *data = "{\"tsync\":\"1.0\",\"session_id\":\"123456789\",\"state\":\"active\",\"method\":\"policy_update\",\"params\":{\"service_chaining\":[1,2,3],\"shaping\":[4,5,6]}}";
size_t length = strlen(data);
static u_char ctrl_pkt_active0[] = {
0x85, 0xA5, 0x74, 0x73, 0x79, 0x6E, 0x63, 0xA3, 0x32, 0x2E, 0x30, 0xAA, 0x73, 0x65, 0x73, 0x73,
0x69, 0x6F, 0x6E, 0x5F, 0x69, 0x64, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA5,
0x73, 0x74, 0x61, 0x74, 0x65, 0xA6, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0xA6, 0x6D, 0x65, 0x74,
0x68, 0x6F, 0x64, 0xAD, 0x70, 0x6F, 0x6C, 0x69, 0x63, 0x79, 0x5F, 0x75, 0x70, 0x64, 0x61, 0x74,
0x65, 0xA6, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x83, 0xA3, 0x73, 0x63, 0x65, 0x81, 0xA8, 0x72,
0x75, 0x6C, 0x65, 0x5F, 0x69, 0x64, 0x73, 0x92, 0xCD, 0x04, 0x57, 0xCD, 0x08, 0xAE, 0xA6, 0x73,
0x68, 0x61, 0x70, 0x65, 0x72, 0x81, 0xA8, 0x72, 0x75, 0x6C, 0x65, 0x5F, 0x69, 0x64, 0x73, 0x92,
0xCD, 0x0D, 0x05, 0xCD, 0x11, 0x5C, 0xA5, 0x70, 0x72, 0x6F, 0x78, 0x79, 0x82, 0xA8, 0x72, 0x75,
0x6C, 0x65, 0x5F, 0x69, 0x64, 0x73, 0x92, 0xCD, 0x15, 0xB3, 0xCD, 0x1A, 0x0A, 0xAD, 0x74, 0x63,
0x70, 0x5F, 0x68, 0x61, 0x6E, 0x64, 0x73, 0x68, 0x61, 0x6B, 0x65, 0xDC, 0x00, 0x24, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xA3, 0x31,
0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31,
0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31,
0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31,
0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0xA3, 0x31, 0x32, 0x33, 0x92, 0xCD, 0x15, 0xB3, 0xCD, 0x1A,
0x0A, 0x92, 0xCD, 0x15, 0xB3, 0xCD, 0x1A, 0x0A, 0x92, 0xCD, 0x15, 0xB3, 0xCD, 0x1A, 0x0A, 0x92,
0x01, 0x01, 0x92, 0x01, 0x01};
static u_char ctrl_pkt_active1[] = {
0x85, 0xA5, 0x74, 0x73, 0x79, 0x6E, 0x63, 0xA3, 0x32, 0x2E, 0x30, 0xAA, 0x73, 0x65, 0x73, 0x73,
0x69, 0x6F, 0x6E, 0x5F, 0x69, 0x64, 0xCF, 0x04, 0x08, 0x02, 0x1B, 0x68, 0x4C, 0x03, 0xE9, 0xA5,
0x73, 0x74, 0x61, 0x74, 0x65, 0xA6, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0xA6, 0x6D, 0x65, 0x74,
0x68, 0x6F, 0x64, 0xAD, 0x70, 0x6F, 0x6C, 0x69, 0x63, 0x79, 0x5F, 0x75, 0x70, 0x64, 0x61, 0x74,
0x65, 0xA6, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x81, 0xA3, 0x73, 0x63, 0x65, 0x81, 0xA8, 0x72,
0x75, 0x6C, 0x65, 0x5F, 0x69, 0x64, 0x73, 0x91, 0xCE, 0x00, 0x0F, 0x2F, 0x7F};
static u_char ctrl_pkt_opening[] = {
0x83, 0xA5, 0x74, 0x73, 0x79, 0x6E, 0x63, 0xA3, 0x32, 0x2E, 0x30, 0xAA, 0x73, 0x65, 0x73, 0x73,
0x69, 0x6F, 0x6E, 0x5F, 0x69, 0x64, 0xCF, 0x04, 0x08, 0x02, 0x1B, 0x68, 0x4C, 0x03, 0xE9, 0xA5,
0x73, 0x74, 0x61, 0x74, 0x65, 0xA7, 0x6F, 0x70, 0x65, 0x6E, 0x69, 0x6E, 0x67};
TEST(CTRL_PACKET, PACKAGE0)
{
char *data;
size_t size;
mpack_writer_t writer;
mpack_writer_init_growable(&writer, &data, &size);
// write the example on the msgpack homepage
mpack_build_map(&writer); // root begin
// tsync
mpack_write_cstr(&writer, "tsync");
mpack_write_cstr(&writer, "2.0");
// session_id
mpack_write_cstr(&writer, "session_id");
mpack_write_u64(&writer, 18446744073709551615);
// state
mpack_write_cstr(&writer, "state");
mpack_write_cstr(&writer, "active");
// method
mpack_write_cstr(&writer, "method");
mpack_write_cstr(&writer, "policy_update");
// params
{
mpack_write_cstr(&writer, "params");
mpack_build_map(&writer); // params value begin
// sce
{
mpack_write_cstr(&writer, "sce");
mpack_build_map(&writer);
mpack_write_cstr(&writer, "rule_ids");
mpack_build_array(&writer);
mpack_write_u64(&writer, 1111);
mpack_write_u64(&writer, 2222);
mpack_complete_array(&writer);
mpack_complete_map(&writer);
}
// shaper
{
mpack_write_cstr(&writer, "shaper");
mpack_build_map(&writer);
mpack_write_cstr(&writer, "rule_ids");
mpack_build_array(&writer);
mpack_write_u64(&writer, 3333);
mpack_write_u64(&writer, 4444);
mpack_complete_array(&writer);
mpack_complete_map(&writer);
}
// proxy
{
mpack_write_cstr(&writer, "proxy");
mpack_build_map(&writer); // proxy value begin
mpack_write_cstr(&writer, "rule_ids");
mpack_build_array(&writer);
mpack_write_u64(&writer, 5555);
mpack_write_u64(&writer, 6666);
mpack_complete_array(&writer);
mpack_write_cstr(&writer, "tcp_handshake");
mpack_build_array(&writer); // tcp_handshake value begin
mpack_write_u32(&writer, 1); // tcp_seq
mpack_write_u32(&writer, 1); // tcp_ack
mpack_write_u16(&writer, 1); // tcp_mss_client
mpack_write_u16(&writer, 1); // tcp_mss_server
mpack_write_u8(&writer, 1); // tcp_wsacle_client
mpack_write_u8(&writer, 1); // tcp_wsacle_server
mpack_write_u8(&writer, 1); // tcp_sack_client
mpack_write_u8(&writer, 1); // tcp_sack_server
mpack_write_u8(&writer, 1); // tcp_ts_client
mpack_write_u8(&writer, 1); // tcp_ts_server
mpack_write_u8(&writer, 1); // tcp_protocol
mpack_write_u16(&writer, 1); // tcp_window_client
mpack_write_u16(&writer, 1); // tcp_window_server
mpack_write_u32(&writer, 1); // tcp_ts_client_val
mpack_write_u32(&writer, 1); // tcp_ts_server_val
mpack_write_u8(&writer, 1); // tcp_info_packet_cur_dir
mpack_write_str(&writer, "123", 3); // src_sub_id
mpack_write_str(&writer, "123", 3); // dst_sub_id
mpack_write_str(&writer, "123", 3); // src_asn
mpack_write_str(&writer, "123", 3); // dst_asn
mpack_write_str(&writer, "123", 3); // src_organization
mpack_write_str(&writer, "123", 3); // dst_organization
mpack_write_str(&writer, "123", 3); // src_ip_location_country
mpack_write_str(&writer, "123", 3); // dst_ip_location_country
mpack_write_str(&writer, "123", 3); // src_ip_location_provine
mpack_write_str(&writer, "123", 3); // dst_ip_location_provine
mpack_write_str(&writer, "123", 3); // src_ip_location_city
mpack_write_str(&writer, "123", 3); // dst_ip_location_city
mpack_write_str(&writer, "123", 3); // src_ip_location_subdivision
mpack_write_str(&writer, "123", 3); // dst_ip_location_subdivision
mpack_write_str(&writer, "123", 3); // ssl_client_ja3_fingerprint
mpack_build_array(&writer); // fqdn_cat_id_val
mpack_write_u32(&writer, 5555);
mpack_write_u32(&writer, 6666);
mpack_complete_array(&writer);
mpack_build_array(&writer); // tcp_seq_sids
mpack_write_u16(&writer, 5555);
mpack_write_u16(&writer, 6666);
mpack_complete_array(&writer);
mpack_build_array(&writer); // tcp_ack_sids
mpack_write_u16(&writer, 5555);
mpack_write_u16(&writer, 6666);
mpack_complete_array(&writer);
mpack_build_array(&writer); // tcp_seq_route_ctx
mpack_write_u8(&writer, 1);
mpack_write_u8(&writer, 1);
mpack_complete_array(&writer);
mpack_build_array(&writer); // tcp_ack_route_ctx
mpack_write_u8(&writer, 1);
mpack_write_u8(&writer, 1);
mpack_complete_array(&writer);
mpack_complete_array(&writer); // tcp_handshake value end
mpack_complete_map(&writer); // proxy value end
}
mpack_complete_map(&writer); // params value end
}
mpack_complete_map(&writer); // root end
// finish writing
EXPECT_TRUE(mpack_writer_destroy(&writer) == mpack_ok);
EXPECT_TRUE(size == sizeof(ctrl_pkt_active0));
EXPECT_TRUE(memcmp(data, ctrl_pkt_active0, size) == 0);
// data to hex
for (size_t i = 0; i < size; i++)
{
printf("%02X, ", data[i]);
}
printf("\n");
free(data);
}
TEST(CTRL_PACKET, PACKAGE1)
{
char *data;
size_t size;
mpack_writer_t writer;
mpack_writer_init_growable(&writer, &data, &size);
// write the example on the msgpack homepage
mpack_build_map(&writer); // root begin
// tsync
mpack_write_cstr(&writer, "tsync");
mpack_write_cstr(&writer, "2.0");
// session_id
mpack_write_cstr(&writer, "session_id");
mpack_write_u64(&writer, 290484492702581737);
// state
mpack_write_cstr(&writer, "state");
mpack_write_cstr(&writer, "active");
// method
mpack_write_cstr(&writer, "method");
mpack_write_cstr(&writer, "policy_update");
// params
{
mpack_write_cstr(&writer, "params");
mpack_build_map(&writer); // params value begin
// sce
{
mpack_write_cstr(&writer, "sce");
mpack_build_map(&writer);
mpack_write_cstr(&writer, "rule_ids");
mpack_build_array(&writer);
mpack_write_u64(&writer, 995199);
mpack_complete_array(&writer);
mpack_complete_map(&writer);
}
mpack_complete_map(&writer); // params value end
}
mpack_complete_map(&writer); // root end
// finish writing
EXPECT_TRUE(mpack_writer_destroy(&writer) == mpack_ok);
EXPECT_TRUE(size == sizeof(ctrl_pkt_active1));
EXPECT_TRUE(memcmp(data, ctrl_pkt_active1, size) == 0);
// data to hex
for (size_t i = 0; i < size; i++)
{
printf("%02X, ", data[i]);
}
printf("\n");
free(data);
}
TEST(CTRL_PACKET, PACKAGE2)
{
char *data;
size_t size;
mpack_writer_t writer;
mpack_writer_init_growable(&writer, &data, &size);
// write the example on the msgpack homepage
mpack_build_map(&writer); // root begin
// tsync
mpack_write_cstr(&writer, "tsync");
mpack_write_cstr(&writer, "2.0");
// session_id
mpack_write_cstr(&writer, "session_id");
mpack_write_u64(&writer, 290484492702581737);
// state
mpack_write_cstr(&writer, "state");
mpack_write_cstr(&writer, "opening");
mpack_complete_map(&writer); // root end
// finish writing
EXPECT_TRUE(mpack_writer_destroy(&writer) == mpack_ok);
EXPECT_TRUE(size == sizeof(ctrl_pkt_opening));
EXPECT_TRUE(memcmp(data, ctrl_pkt_opening, size) == 0);
// data to hex
for (size_t i = 0; i < size; i++)
{
printf("%02X, ", data[i]);
}
printf("\n");
free(data);
}
TEST(CTRL_PACKET, PARSE0)
{
struct ctrl_pkt_parser parser;
ctrl_packet_parser_init(&parser);
EXPECT_TRUE(ctrl_packet_parser_parse(&parser, data, length) == 0);
EXPECT_TRUE(ctrl_packet_parser_parse(&parser, (const char *)ctrl_pkt_active0, sizeof(ctrl_pkt_active0)) == 0);
ctrl_packet_parser_dump(&parser);
EXPECT_STREQ(parser.tsync, "1.0");
EXPECT_TRUE(parser.session_id == 123456789);
EXPECT_STREQ(parser.tsync, "2.0");
EXPECT_TRUE(parser.session_id == 18446744073709551615);
EXPECT_TRUE(parser.state == SESSION_STATE_ACTIVE);
EXPECT_STREQ(parser.method, "policy_update");
EXPECT_TRUE(parser.rule_id_num == 3);
EXPECT_TRUE(parser.rule_ids[0] == 1);
EXPECT_TRUE(parser.rule_ids[1] == 2);
EXPECT_TRUE(parser.rule_ids[2] == 3);
EXPECT_TRUE(parser.rule_id_num == 2);
EXPECT_TRUE(parser.rule_ids[0] == 1111);
EXPECT_TRUE(parser.rule_ids[1] == 2222);
}
TEST(CTRL_PACKET, PARSE1)
{
struct ctrl_pkt_parser parser;
ctrl_packet_parser_init(&parser);
EXPECT_TRUE(ctrl_packet_parser_parse(&parser, (const char *)ctrl_pkt_active1, sizeof(ctrl_pkt_active1)) == 0);
ctrl_packet_parser_dump(&parser);
EXPECT_STREQ(parser.tsync, "2.0");
EXPECT_TRUE(parser.session_id == 290484492702581737);
EXPECT_TRUE(parser.state == SESSION_STATE_ACTIVE);
EXPECT_STREQ(parser.method, "policy_update");
EXPECT_TRUE(parser.rule_id_num == 1);
EXPECT_TRUE(parser.rule_ids[0] == 995199);
}
TEST(CTRL_PACKET, PARSE2)
{
struct ctrl_pkt_parser parser;
ctrl_packet_parser_init(&parser);
EXPECT_TRUE(ctrl_packet_parser_parse(&parser, (const char *)ctrl_pkt_opening, sizeof(ctrl_pkt_opening)) == 0);
ctrl_packet_parser_dump(&parser);
EXPECT_STREQ(parser.tsync, "2.0");
EXPECT_TRUE(parser.session_id == 290484492702581737);
EXPECT_TRUE(parser.state == SESSION_STATE_OPENING);
EXPECT_STREQ(parser.method, "");
EXPECT_TRUE(parser.rule_id_num == 0);
}
int main(int argc, char **argv)