diff options
| author | wangmenglan <[email protected]> | 2024-01-05 10:26:44 +0800 |
|---|---|---|
| committer | wangmenglan <[email protected]> | 2024-01-05 15:24:24 +0800 |
| commit | b1f670c05da4a83df2ba68db62a0c1a91f614d93 (patch) | |
| tree | f7f7e45e353893032fed9aa943a227af8dafdaeb /common/src/tfe_packet_io.cpp | |
| parent | 9ce2d570829acb8fdb72804d341f9dcd1728cf2a (diff) | |
perf:通过控制报文PACKET_CUR_DIR字段判断当前包的方向,不再默认active控制报文为C2S方向v4.8.60-20230105
Diffstat (limited to 'common/src/tfe_packet_io.cpp')
| -rw-r--r-- | common/src/tfe_packet_io.cpp | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/common/src/tfe_packet_io.cpp b/common/src/tfe_packet_io.cpp index 283c047..ce2cf0b 100644 --- a/common/src/tfe_packet_io.cpp +++ b/common/src/tfe_packet_io.cpp @@ -41,6 +41,8 @@ #define RX_BURST_MAX 128 +#define CURDIR_C2S 0x1 +#define CURDIR_S2C 0x2 #define IS_SINGLE 0x01 #define IS_TUNNEL 0x02 @@ -259,11 +261,6 @@ static struct metadata *metadata_new() return meta; } -static int metadata_is_empty(struct metadata *meta) -{ - return meta->write_ref == 0 ? 1 : 0; -} - static void metadata_deep_copy(struct metadata *dst, struct metadata *src) { dst->write_ref++; @@ -1058,26 +1055,20 @@ static void packet_io_send_fake_pkt(struct packet_io_thread_ctx *thread, struct marsio_send_burst_with_options(packet_io->dev_nf_interface.mr_path, thread->thread_index, tx_buffs, 3, MARSIO_SEND_OPT_REHASH); } -int raw_traffic_decapsulate(struct packet *handler, const char *raw_data, int raw_len, char **header, int *header_len, int *is_ipv4) +int raw_traffic_decapsulate(const char *raw_data, int raw_len, struct packet_info *pkt_info) { const struct layer_record *l3_layer_record = NULL; - const struct layer_record *l4_layer_record = NULL; - - l4_layer_record = packet_get_innermost_layer(handler, LAYER_TYPE_L4); - if (l4_layer_record == NULL) - return -1; - - if (l4_layer_record->type != LAYER_TYPE_TCP) - return -1; + struct packet pkt; + packet_parse(&pkt, raw_data, raw_len); - l3_layer_record = packet_get_innermost_layer(handler, LAYER_TYPE_L3); + l3_layer_record = packet_get_innermost_layer(&pkt, LAYER_TYPE_L3); if (l3_layer_record == NULL) return -1; - *is_ipv4 = l3_layer_record->type == LAYER_TYPE_IPV4 ? 1 : 0; - *header_len = l3_layer_record->hdr_offset; - *header = (char *)calloc(*header_len, sizeof(char)); - memcpy(*header, raw_data, *header_len); + pkt_info->is_ipv4 = l3_layer_record->type == LAYER_TYPE_IPV4 ? 1 : 0; + pkt_info->header_len = l3_layer_record->hdr_offset; + pkt_info->header_data = (char *)calloc(pkt_info->header_len, sizeof(char)); + memcpy(pkt_info->header_data, raw_data, pkt_info->header_len); return 0; } @@ -1103,7 +1094,6 @@ static int handle_session_opening(struct metadata *meta, struct ctrl_pkt_parser unsigned int stream_common_direction; uint8_t stream_protocol_in_char = 0; uint8_t enable_decrypted_traffic_steering = 0; - struct ethhdr *ether_hdr = NULL; struct session_ctx *s_ctx = NULL; struct tuple4 inner_tuple4; struct tcp_restore_info restore_info; @@ -1251,18 +1241,27 @@ passthrough: route_ctx_copy(&s_ctx->ctrl_meta->route_ctx, &meta->route_ctx); if (parser->seq_len > 0) - raw_traffic_decapsulate(&pkt, parser->seq_header, parser->seq_len, &s_ctx->c2s_info.header_data, &s_ctx->c2s_info.header_len, &s_ctx->c2s_info.is_ipv4); + raw_traffic_decapsulate(parser->seq_header, parser->seq_len, &s_ctx->c2s_info); if (parser->ack_len > 0) - raw_traffic_decapsulate(&pkt, parser->ack_header, parser->ack_len, &s_ctx->s2c_info.header_data, &s_ctx->s2c_info.header_len, &s_ctx->s2c_info.is_ipv4); + raw_traffic_decapsulate(parser->ack_header, parser->ack_len, &s_ctx->s2c_info); + + uint8_t packet_cur_dir = CURDIR_C2S; + tfe_cmsg_get_value(parser->cmsg, TFE_CMSG_TCP_RESTORE_INFO_PACKET_CUR_DIR, (unsigned char *)&packet_cur_dir, sizeof(uint8_t), &size); + + if (packet_cur_dir == CURDIR_C2S) { + s_ctx->c2s_info.tuple4 = inner_tuple4; + tuple4_reverse(&inner_tuple4, &s_ctx->s2c_info.tuple4); + } + else { + s_ctx->s2c_info.tuple4 = inner_tuple4; + tuple4_reverse(&inner_tuple4, &s_ctx->c2s_info.tuple4); + } // c2s - s_ctx->c2s_info.is_e2i_dir = meta->is_e2i_dir; - s_ctx->c2s_info.tuple4 = inner_tuple4; sids_copy(&s_ctx->c2s_info.sids, &parser->seq_sids); route_ctx_copy(&s_ctx->c2s_info.route_ctx, &parser->seq_route_ctx); // s2c - tuple4_reverse(&inner_tuple4, &s_ctx->s2c_info.tuple4); sids_copy(&s_ctx->s2c_info.sids, &parser->ack_sids); route_ctx_copy(&s_ctx->s2c_info.route_ctx, &parser->ack_route_ctx); @@ -1941,8 +1940,6 @@ void handle_decryption_packet_from_tap(const char *data, int len, void *args) void handle_raw_packet_from_tap(const char *data, int len, void *args) { - char *src_mac = NULL; - char *dst_mac = NULL; struct packet_io_thread_ctx *thread = (struct packet_io_thread_ctx *)args; struct packet_io *packet_io = thread->ref_io; struct packet_io_fs *packet_io_fs = thread->ret_fs_state; |
