From 707b4182506ed31afc1f5fe290974b40e3f88311 Mon Sep 17 00:00:00 2001 From: wangmenglan Date: Mon, 23 Sep 2024 18:35:47 +0800 Subject: TSG-22699 适配控制报文修改 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/src/tfe_ctrl_packet.cpp | 75 +++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 23 deletions(-) (limited to 'common/src/tfe_ctrl_packet.cpp') diff --git a/common/src/tfe_ctrl_packet.cpp b/common/src/tfe_ctrl_packet.cpp index 509cc58..2941d81 100644 --- a/common/src/tfe_ctrl_packet.cpp +++ b/common/src/tfe_ctrl_packet.cpp @@ -59,15 +59,15 @@ enum { }; int tags_ids_cmsg_maps[] = { - [INDEX_SRC_IP_TAGS_IDS] = TFE_CMSG_SRC_IP_TAGS_IDS_STR, - [INDEX_DST_IP_TAGS_IDS] = TFE_CMSG_DST_IP_TAGS_IDS_STR, - [INDEX_FQDN_TAGS_IDS] = TFE_CMSG_FQDN_TAGS_IDS_STR, + [INDEX_SRC_IP_TAGS_IDS] = TFE_CMSG_SRC_IP_TAGS_IDS_ARR, + [INDEX_DST_IP_TAGS_IDS] = TFE_CMSG_DST_IP_TAGS_IDS_ARR, + [INDEX_FQDN_TAGS_IDS] = TFE_CMSG_FQDN_TAGS_IDS_ARR, }; const char *tags_ids_cmsg_name_maps[] = { - [INDEX_SRC_IP_TAGS_IDS] = "TFE_CMSG_SRC_IP_TAGS_IDS_STR", - [INDEX_DST_IP_TAGS_IDS] = "TFE_CMSG_DST_IP_TAGS_IDS_STR", - [INDEX_FQDN_TAGS_IDS] = "TFE_CMSG_FQDN_TAGS_IDS_STR", + [INDEX_SRC_IP_TAGS_IDS] = "TFE_CMSG_SRC_IP_TAGS_IDS_ARR", + [INDEX_DST_IP_TAGS_IDS] = "TFE_CMSG_DST_IP_TAGS_IDS_ARR", + [INDEX_FQDN_TAGS_IDS] = "TFE_CMSG_FQDN_TAGS_IDS_ARR", }; struct mpack_mmap_id2type @@ -118,6 +118,15 @@ struct mpack_mmap_id2type extern void * g_packet_io_logger; +static int mpack_parse_uuid(mpack_node_t node, uuid_t uuid) +{ + size_t len = mpack_node_bin_size(node); + if (len != UUID_LEN) + return -1; + memcpy(uuid, mpack_node_bin_data(node), len); + return 0; +} + static int sids_array_parse_mpack(struct ctrl_pkt_parser *handler, mpack_node_t node, int is_seq) { struct sids *sid = is_seq ? &handler->seq_sids : &handler->ack_sids; @@ -169,21 +178,23 @@ static int pkt_header_parse_mpack(struct ctrl_pkt_parser *handler, mpack_node_t static int tags_ids_array_parse_mpack(struct ctrl_pkt_parser *handler, mpack_node_t node, int map_index) { - uint64_t value = 0; - int tags_ids_len = 0; - char tags_ids_str[TAGS_IDS_STR_LEN] = {0}; - uint32_t array_cnt = mpack_node_array_length(node); if (!array_cnt) return 0; + int tags_ids_len = UUID_LEN*array_cnt; + uuid_t *tags_ids = (uuid_t *)calloc(tags_ids_len, 1); + for (uint32_t i = 0; i < array_cnt; i++) { - value = mpack_node_u64(mpack_node_array_at(node, i)); - tags_ids_len += snprintf(tags_ids_str+tags_ids_len, TAGS_IDS_STR_LEN-tags_ids_len, "%s%lu", i==0?"":",", value); + if (mpack_parse_uuid(mpack_node_array_at(node, i), tags_ids[i]) != 0) + { + TFE_LOG_ERROR(g_packet_io_logger, "%s: session %lu unexpected control packet: (%s[%d] len != uuid_t[%d])", LOG_TAG_CTRLPKT, handler->session_id, tags_ids_cmsg_name_maps[map_index], i, UUID_LEN); + return -1; + } } - tfe_cmsg_set(handler->cmsg, (enum tfe_cmsg_tlv_type)tags_ids_cmsg_maps[map_index], (const unsigned char*)tags_ids_str, tags_ids_len); + tfe_cmsg_set(handler->cmsg, (enum tfe_cmsg_tlv_type)tags_ids_cmsg_maps[map_index], (const unsigned char*)tags_ids, tags_ids_len); return 0; } @@ -336,8 +347,13 @@ static int proxy_parse_messagepack(mpack_node_t node, void *ctx, void *logger) return -1; } handler->tfe_policy_id_num = mpack_node_array_length(mpack_node_map_cstr(node, "rule_ids")); - for (int i = 0; i < handler->tfe_policy_id_num; i++) { - handler->tfe_policy_ids[i] = mpack_node_u64(mpack_node_array_at(mpack_node_map_cstr(node, "rule_ids"), i)); + for (int i = 0; i < handler->tfe_policy_id_num; i++) + { + if (mpack_parse_uuid(mpack_node_array_at(mpack_node_map_cstr(node, "rule_ids"), i), handler->tfe_policy_ids[i]) != 0) + { + TFE_LOG_ERROR(g_packet_io_logger, "%s: session %lu unexpected control packet: (proxy rule_ids[index:%d] len != uuid_t[16])", LOG_TAG_CTRLPKT, handler->session_id, i); + return -1; + } } mpack_node_t tcp_handshake = mpack_node_map_cstr(node, "tcp_handshake"); @@ -466,8 +482,13 @@ int ctrl_packet_parser_parse(void *ctx, const char* data, size_t length, void *l goto error; } handler->sce_policy_id_num = mpack_node_array_length(mpack_node_map_cstr(sce_map, "rule_ids")); - for (int i = 0; i < handler->sce_policy_id_num; i++) { - handler->sce_policy_ids[i] = mpack_node_u64(mpack_node_array_at(mpack_node_map_cstr(sce_map, "rule_ids"), i)); + for (int i = 0; i < handler->sce_policy_id_num; i++) + { + if (mpack_parse_uuid(mpack_node_array_at(mpack_node_map_cstr(sce_map, "rule_ids"), i), handler->sce_policy_ids[i]) != 0) + { + TFE_LOG_ERROR(logger, "%s: session %lu unexpected control packet: (sce rule_ids[index:%d] len != uuid_t[16])", LOG_TAG_CTRLPKT, handler->session_id, i); + goto error; + } } } @@ -545,7 +566,7 @@ void ctrl_packet_parser_dump(struct ctrl_pkt_parser *handler, void *logger) struct sids *sid = NULL; int map_index = 0; char *log_str = NULL; - char tags_ids_str[4096] = {0}; + uuid_t tags_ids_array[128]; int log_len = 0; log_str = (char *)calloc(1, LOG_STR_LEN); @@ -560,12 +581,16 @@ void ctrl_packet_parser_dump(struct ctrl_pkt_parser *handler, void *logger) log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, ", tfe policy_id_num: %d, tfe policy_ids[", handler->tfe_policy_id_num); for (int i = 0; i < handler->tfe_policy_id_num; i++) { - log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, "%03lu ", handler->tfe_policy_ids[i]); + char str_tfe_policy_ids[UUID_STR_LEN] = {0}; + uuid_unparse(handler->tfe_policy_ids[i], str_tfe_policy_ids); + log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, "%s, ", str_tfe_policy_ids); } log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, "], sce policy_id_num: %d, sce policy_ids[", handler->sce_policy_id_num); for (int i = 0; i < handler->sce_policy_id_num; i++) { - log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, "%03lu ", handler->sce_policy_ids[i]); + char str_sce_policy_ids[UUID_STR_LEN] = {0}; + uuid_unparse(handler->sce_policy_ids[i], str_sce_policy_ids); + log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, "%s, ", str_sce_policy_ids); } log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, "]"); @@ -596,13 +621,17 @@ void ctrl_packet_parser_dump(struct ctrl_pkt_parser *handler, void *logger) else if (mpack_table[i].type == MPACK_ARRAY_FQDN_TAGS_IDS) map_index = INDEX_FQDN_TAGS_IDS; - memset(tags_ids_str, 0, sizeof(tags_ids_str)); - ret = tfe_cmsg_get_value(handler->cmsg, (enum tfe_cmsg_tlv_type)tags_ids_cmsg_maps[map_index], (unsigned char *)tags_ids_str, sizeof(tags_ids_str), &size); + memset(tags_ids_array, 0, sizeof(tags_ids_array)); + ret = tfe_cmsg_get_value(handler->cmsg, (enum tfe_cmsg_tlv_type)tags_ids_cmsg_maps[map_index], (unsigned char *)tags_ids_array, sizeof(tags_ids_array), &size); if (ret < 0) { log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, ", %s:null", tags_ids_cmsg_name_maps[map_index]); break; } - log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, ", %s:%s", tags_ids_cmsg_name_maps[map_index], tags_ids_str); + for (int i = 0; i < size/UUID_LEN; i++) { + char str_tags_ids[UUID_STR_LEN] = {0}; + uuid_unparse(tags_ids_array[i], str_tags_ids); + log_len += snprintf(log_str + log_len, LOG_STR_LEN - log_len, ", %s:%s", tags_ids_cmsg_name_maps[map_index], str_tags_ids); + } break; case MPACK_ARRAY_SEQ_ROUTE_CTX: case MPACK_ARRAY_ACK_ROUTE_CTX: -- cgit v1.2.3