TFE适配MRZCPD的分流算法的变更;并增加分流的调试日志

This commit is contained in:
luwenpeng
2023-08-04 16:56:32 +08:00
parent e43b4954b5
commit bc39cd0706
8 changed files with 115 additions and 11 deletions

View File

@@ -1536,6 +1536,22 @@ static int handle_raw_packet_from_nf(struct packet_io *handle, marsio_buff_t *rx
if (node == NULL) {
throughput_metrics_inc(&packet_io_fs->raw_pkt_rx, 1, raw_len);
throughput_metrics_inc(&packet_io_fs->raw_bypass, 1, raw_len);
if (thread->ref_acceptor_ctx->debug)
{
struct addr_tuple4 inner_addr;
struct raw_pkt_parser raw_parser;
memset(&inner_addr, 0, sizeof(struct addr_tuple4));
raw_packet_parser_init(&raw_parser, 0, LAYER_TYPE_ALL, 8);
raw_packet_parser_parse(&raw_parser, (const void *)raw_data, raw_len, logger);
raw_packet_parser_get_most_inner_tuple4(&raw_parser, &inner_addr, logger);
uint16_t ipid = raw_packet_parser_get_most_inner_ipid(&raw_parser);
char *str = addr_tuple4_to_str(&inner_addr);
TFE_LOG_ERROR(logger, "packet from nf %lu: %s (ipid: %u) miss session table", meta.session_id, str, ipid);
free(str);
}
marsio_send_burst(handle->dev_nf_interface.mr_path, thread_seq, &rx_buff, 1);
return -1;
}
@@ -1913,6 +1929,7 @@ int packet_io_polling_nf_interface(struct packet_io *handle, int thread_seq, voi
{
marsio_buff_t *rx_buff = rx_buffs[j];
int raw_len = marsio_buff_datalen(rx_buff);
char *raw_data = marsio_buff_mtod(rx_buff);
if (is_downstream_keepalive_packet(rx_buff))
{
@@ -1926,6 +1943,21 @@ int packet_io_polling_nf_interface(struct packet_io *handle, int thread_seq, voi
continue;
}
if (thread->ref_acceptor_ctx->debug)
{
struct addr_tuple4 inner_addr;
struct raw_pkt_parser raw_parser;
memset(&inner_addr, 0, sizeof(struct addr_tuple4));
raw_packet_parser_init(&raw_parser, 0, LAYER_TYPE_ALL, 8);
raw_packet_parser_parse(&raw_parser, (const void *)raw_data, raw_len, thread->logger);
raw_packet_parser_get_most_inner_tuple4(&raw_parser, &inner_addr, thread->logger);
uint16_t ipid = raw_packet_parser_get_most_inner_ipid(&raw_parser);
char *str = addr_tuple4_to_str(&inner_addr);
TFE_LOG_DEBUG(thread->logger, "recv packet %s (ipid: %u)", str, ipid);
free(str);
}
if (marsio_buff_is_ctrlbuf(rx_buff))
{
throughput_metrics_inc(&packet_io_fs->raw_pkt_rx, 1, raw_len);
@@ -2041,6 +2073,15 @@ void handle_raw_packet_from_tap(const char *data, int len, void *args)
struct session_node *node = session_table_search_by_addr(thread->session_table, &inner_addr);
if (node == NULL) {
throughput_metrics_inc(&packet_io_fs->tap_pkt_rxdrop, 1, len);
if (thread->ref_acceptor_ctx->debug)
{
char *str = addr_tuple4_to_str(&inner_addr);
uint16_t ipid = raw_packet_parser_get_most_inner_ipid(&raw_parser);
TFE_LOG_ERROR(logger, "packet from tap %s (ipid: %u) miss session table", str, ipid);
free(str);
}
return;
}

View File

@@ -168,7 +168,7 @@ int raw_packet_parser_get_most_inner_tuple4(struct raw_pkt_parser *handler, stru
// return 0 : success
// return -1 : error
int raw_packet_parser_get_most_outer_tuple4(struct raw_pkt_parser *handler, struct addr_tuple4 *addr, void *logger)
int raw_packet_parser_get_most_outer_tuple4(struct raw_pkt_parser *handler, struct addr_tuple4 *addr, void *logger)
{
const char *l3_layer_data = NULL;
const char *l4_layer_data = NULL;
@@ -271,6 +271,64 @@ int raw_packet_parser_get_most_outer_address(struct raw_pkt_parser *handler, str
return -1;
}
uint16_t raw_packet_parser_get_most_inner_ipid(struct raw_pkt_parser *handler)
{
const char *l3_layer_data = NULL;
struct layer_results *results = &handler->results;
// search L3 layer in reverse order
for (int8_t i = results->layers_used - 1; i >= 0; i--)
{
const struct layer_result *layer = &results->layers[i];
enum layer_type type = layer->type;
if (type & LAYER_TYPE_L3)
{
l3_layer_data = (const char *)handler->ptr_pkt_start + layer->offset;
if (type == LAYER_TYPE_IPV4)
{
const struct ip *ipv4_hdr = (const struct ip *)l3_layer_data;
return ntohs(ipv4_hdr->ip_id);
}
else
{
return 0;
}
}
}
return 0;
}
uint16_t raw_packet_parser_get_most_outer_ipid(struct raw_pkt_parser *handler)
{
const char *l3_layer_data = NULL;
struct layer_results *results = &handler->results;
// search L3 layer in order
for (int8_t i = 0; i <= results->layers_used - 1; i++)
{
const struct layer_result *layer = &results->layers[i];
enum layer_type type = layer->type;
if (type & LAYER_TYPE_L3)
{
l3_layer_data = (const char *)handler->ptr_pkt_start + layer->offset;
if (type == LAYER_TYPE_IPV4)
{
const struct ip *ipv4_hdr = (const struct ip *)l3_layer_data;
return ntohs(ipv4_hdr->ip_id);
}
else
{
return 0;
}
}
}
return -1;
}
uint64_t raw_packet_parser_get_hash_value(struct raw_pkt_parser *handler, enum ldbc_method method, int dir_is_internal, void *logger)
{
uint64_t temp = 0;
@@ -392,7 +450,7 @@ uint64_t raw_packet_parser_get_hash_value(struct raw_pkt_parser *handler, enum l
char *inner_addr_str = addr_tuple4_to_str(&inner_addr);
char *outer_addr_str = addr_tuple4_to_str(&outer_addr);
TFE_LOG_DEBUG(logger, "%s: pkt_trace_id: %lu, outer_addr: %s, inner_addr: %s, is_internal: %d, hash_method: %s, hash_value: %lu",
LOG_TAG_RAWPKT, handler->pkt_trace_id, outer_addr_str, inner_addr_str, dir_is_internal, ldbc_method_to_string(method), hash_value);
LOG_TAG_RAWPKT, handler->pkt_trace_id, outer_addr_str, inner_addr_str, dir_is_internal, ldbc_method_to_string(method), hash_value);
free(inner_addr_str);
free(outer_addr_str);
@@ -889,7 +947,7 @@ static const void *parse_vxlan(struct raw_pkt_parser *handler, const void *data,
return data;
}
//struct vxlan_hdr *vxlan_hdr = (struct vxlan_hdr *)data;
// struct vxlan_hdr *vxlan_hdr = (struct vxlan_hdr *)data;
uint16_t hdr_len = sizeof(struct vxlan_hdr);
const void *data_next_layer = (const char *)data + hdr_len;
size_t data_next_length = length - hdr_len;