diff options
| author | 童宗振 <[email protected]> | 2024-05-11 11:12:48 +0000 |
|---|---|---|
| committer | 童宗振 <[email protected]> | 2024-05-11 11:12:48 +0000 |
| commit | 53b4887e5c2dd8d2113a011135c5f13f4ca42edb (patch) | |
| tree | 4b847d1d1726065da57feb06438ebef279119b3a /infra | |
| parent | 4a1635862ee49c06620bb1b374c3315a14950fea (diff) | |
Dp trace save quadruple 2
Diffstat (limited to 'infra')
| -rw-r--r-- | infra/include/dp_trace.h | 5 | ||||
| -rw-r--r-- | infra/include/ldbc.h | 19 | ||||
| -rw-r--r-- | infra/src/dp_trace.c | 91 |
3 files changed, 107 insertions, 8 deletions
diff --git a/infra/include/dp_trace.h b/infra/include/dp_trace.h index d3655fd..55fd720 100644 --- a/infra/include/dp_trace.h +++ b/infra/include/dp_trace.h @@ -128,6 +128,11 @@ struct dp_trace_buffer struct dp_trace_instance * inst; unsigned int snaplen; + uint16_t traffic_link_id; + char inner_src_addr_str[INET6_ADDRSTRLEN]; + char inner_dst_addr_str[INET6_ADDRSTRLEN]; + int32_t inner_src_port; + int32_t inner_dst_port; /* record buffer*/ uint16_t buffer_len; diff --git a/infra/include/ldbc.h b/infra/include/ldbc.h index f039e9c..13ee531 100644 --- a/infra/include/ldbc.h +++ b/infra/include/ldbc.h @@ -37,6 +37,25 @@ enum e_hash_mode LDBC_HASH_MAX }; +enum complex_layer_type_id +{ + LAYER_TYPE_ID_ETHER, + LAYER_TYPE_ID_PPP, + LAYER_TYPE_ID_HDLC, + LAYER_TYPE_ID_VLAN, + LAYER_TYPE_ID_PPPOE, + LAYER_TYPE_ID_MPLS, + LAYER_TYPE_ID_IPV4, + LAYER_TYPE_ID_IPV6, + LAYER_TYPE_ID_UDP, + LAYER_TYPE_ID_TCP, + LAYER_TYPE_ID_ICMP, + LAYER_TYPE_ID_ICMP6, + LAYER_TYPE_ID_GRE, + LAYER_TYPE_ID_G_VXLAN, + LAYER_TYPE_ID_GTPV1_U, +}; + enum complex_layer_type_mask { /* 数据链路层 */ diff --git a/infra/src/dp_trace.c b/infra/src/dp_trace.c index 84370ad..95ddfbc 100644 --- a/infra/src/dp_trace.c +++ b/infra/src/dp_trace.c @@ -5,6 +5,9 @@ #include <linux/if_ether.h> #include <rte_common.h> #include <rte_ether.h> +#include <rte_ip.h> +#include <rte_tcp.h> +#include <rte_udp.h> #include <stdio.h> #include <string.h> #include <sys/stat.h> @@ -12,6 +15,8 @@ #include <unistd.h> static inline bool dp_trace_is_disable(struct dp_trace_process * trace); +static inline void dp_trace_buffer_initialize(struct dp_trace_process * trace, struct rte_mbuf * mbuf, + job_bitmap_t match_jobs, unsigned int snaplen); static struct dp_trace_instance * dp_trace_instance_create() { @@ -384,15 +389,8 @@ void dp_trace_filter_exec(struct dp_trace_process * trace, struct rte_mbuf * mbu } else { - struct dp_trace_buffer * dp_trace_buffer = mrb_meta->dp_trace_buffer; - unsigned header_size = sizeof(struct dp_trace_buffer); - memset(dp_trace_buffer, 0, header_size); - dp_trace_buffer->buffer_refcnt = 1; - dp_trace_buffer->buffer_len = DP_TRACE_RECORD_SIZE - header_size; - dp_trace_buffer->inst = trace->inst; - dp_trace_buffer->jobs = match_jobs; - dp_trace_buffer->snaplen = snaplen; statistics->record_buf_alloc_success++; + dp_trace_buffer_initialize(trace, mbuf, match_jobs, snaplen); } } } @@ -573,4 +571,81 @@ const char * dp_trace_strerror(unsigned int err) return errlist[err]; } return errlist[DP_TRACE_ERROR_MAX]; +} + +static inline void dp_trace_buffer_initialize(struct dp_trace_process * trace, struct rte_mbuf * mbuf, + job_bitmap_t match_jobs, unsigned int snaplen) +{ + struct mrb_metadata * mrb_meta = rte_mbuf_to_priv(mbuf); + struct dp_trace_buffer * dp_trace_buffer = mrb_meta->dp_trace_buffer; + struct pkt_parser_result * pkt_parser_result = &mrb_meta->pkt_parser_result; + + unsigned header_size = sizeof(struct dp_trace_buffer); + memset(dp_trace_buffer, 0, header_size); + dp_trace_buffer->buffer_refcnt = 1; + dp_trace_buffer->buffer_len = DP_TRACE_RECORD_SIZE - header_size; + dp_trace_buffer->inst = trace->inst; + dp_trace_buffer->jobs = match_jobs; + dp_trace_buffer->snaplen = snaplen; + dp_trace_buffer->traffic_link_id = mrb_meta->traffic_link_id; + + // Extract inner layer3 + for (int i = pkt_parser_result->nr_layers - 1; i >= 0; i--) + { + uint16_t this_layer_type_id = pkt_parser_result->layers[i].type_id; + uint16_t this_layer_offset = pkt_parser_result->layers[i].offset; + enum complex_layer_type_mask this_layer_type_mask = complex_layer_id_to_mask(this_layer_type_id); + if (this_layer_type_mask & LAYER_TYPE_L3) + { + if (this_layer_type_mask == LAYER_TYPE_IPV4) + { + struct rte_ipv4_hdr ipv4_hdr_copy; + const struct rte_ipv4_hdr * ipv4_hdr = + rte_pktmbuf_read(mbuf, this_layer_offset, sizeof(struct rte_ipv4_hdr), &ipv4_hdr_copy); + inet_ntop(AF_INET, &ipv4_hdr->src_addr, dp_trace_buffer->inner_src_addr_str, + sizeof(dp_trace_buffer->inner_src_addr_str)); + inet_ntop(AF_INET, &ipv4_hdr->dst_addr, dp_trace_buffer->inner_dst_addr_str, + sizeof(dp_trace_buffer->inner_dst_addr_str)); + } + else if (this_layer_type_mask & LAYER_TYPE_IPV6) + { + struct rte_ipv6_hdr ipv6_hdr_copy; + const struct rte_ipv6_hdr * ipv6_hdr = + rte_pktmbuf_read(mbuf, this_layer_offset, sizeof(struct rte_ipv6_hdr), &ipv6_hdr_copy); + inet_ntop(AF_INET6, &ipv6_hdr->src_addr, dp_trace_buffer->inner_src_addr_str, + sizeof(dp_trace_buffer->inner_src_addr_str)); + inet_ntop(AF_INET6, &ipv6_hdr->dst_addr, dp_trace_buffer->inner_dst_addr_str, + sizeof(dp_trace_buffer->inner_dst_addr_str)); + } + break; + } + } + + // Extract inner layer4 + for (int i = pkt_parser_result->nr_layers - 1; i >= 0; i--) + { + uint16_t this_layer_type_id = pkt_parser_result->layers[i].type_id; + uint16_t this_layer_offset = pkt_parser_result->layers[i].offset; + enum complex_layer_type_mask this_layer_type_mask = complex_layer_id_to_mask(this_layer_type_id); + if (this_layer_type_mask & LAYER_TYPE_L4) + { + if (this_layer_type_mask == LAYER_TYPE_TCP) + { + struct rte_tcp_hdr tcp_hdr_copy; + const struct rte_tcp_hdr * tcp_hdr = + rte_pktmbuf_read(mbuf, this_layer_offset, sizeof(struct rte_tcp_hdr), &tcp_hdr_copy); + dp_trace_buffer->inner_src_port = ntohs(tcp_hdr->src_port); + dp_trace_buffer->inner_dst_port = ntohs(tcp_hdr->dst_port); + } + else if (this_layer_type_mask == LAYER_TYPE_UDP) + { + struct rte_udp_hdr udp_hdr_copy; + const struct rte_udp_hdr * udp_hdr = + rte_pktmbuf_read(mbuf, this_layer_offset, sizeof(struct rte_udp_hdr), &udp_hdr_copy); + dp_trace_buffer->inner_src_port = ntohs(udp_hdr->src_port); + dp_trace_buffer->inner_dst_port = ntohs(udp_hdr->dst_port); + } + break; + } + } }
\ No newline at end of file |
