diff options
| -rw-r--r-- | app/src/dp_trace.c | 11 | ||||
| -rw-r--r-- | app/src/version.map | 1 | ||||
| -rw-r--r-- | include/external/marsio.h | 27 | ||||
| -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 | ||||
| -rw-r--r-- | service/src/dp_trace.c | 12 |
7 files changed, 135 insertions, 31 deletions
diff --git a/app/src/dp_trace.c b/app/src/dp_trace.c index fda43ee..20ac8da 100644 --- a/app/src/dp_trace.c +++ b/app/src/dp_trace.c @@ -354,6 +354,7 @@ void marsio_dp_trace_mbuf_free(struct mr_instance * instance, marsio_buff_t * mb int marsio_dp_trace_buffer_info_get(const marsio_buff_t * mbuf, struct dp_trace_buffer_telemetry * info) { + memset(info, 0, sizeof(struct dp_trace_buffer_telemetry)); struct mrb_metadata * mrb_meta = rte_mbuf_to_priv((struct rte_mbuf *)mbuf); struct dp_trace_buffer * dp_trace_buffer = mrb_meta->dp_trace_buffer; assert(dp_trace_buffer != NULL); @@ -364,6 +365,12 @@ int marsio_dp_trace_buffer_info_get(const marsio_buff_t * mbuf, struct dp_trace_ info->buffer_len = dp_trace_buffer->buffer_len; info->buffer_used = dp_trace_buffer->buffer_used; + info->traffic_link_id = dp_trace_buffer->traffic_link_id; + snprintf(info->inner_src_addr_str, sizeof(info->inner_src_addr_str), "%s", dp_trace_buffer->inner_src_addr_str); + snprintf(info->inner_dst_addr_str, sizeof(info->inner_dst_addr_str), "%s", dp_trace_buffer->inner_dst_addr_str); + info->inner_src_port = dp_trace_buffer->inner_src_port; + info->inner_dst_port = dp_trace_buffer->inner_dst_port; + return 0; } @@ -378,6 +385,7 @@ int marsio_dp_trace_mbuf_refcnt_update(const marsio_buff_t * mbuf, int16_t value return 0; } +#if 0 void * marsio_pkt_jump_to_innermost_layer(const marsio_buff_t * mbuf, enum complex_layer_type_id layer_id) { struct mrb_metadata * mrb_meta = rte_mbuf_to_priv((struct rte_mbuf *)mbuf); @@ -401,4 +409,5 @@ void * marsio_pkt_jump_to_innermost_layer(const marsio_buff_t * mbuf, enum compl } return ret; -}
\ No newline at end of file +} +#endif
\ No newline at end of file diff --git a/app/src/version.map b/app/src/version.map index 07bc6eb..6d5e927 100644 --- a/app/src/version.map +++ b/app/src/version.map @@ -97,7 +97,6 @@ global: marsio_dp_trace_mbuf_recv_burst; marsio_dp_trace_mbuf_free; marsio_dp_trace_buffer_info_get; - marsio_pkt_jump_to_innermost_layer; marsio_dp_trace_mbuf_refcnt_update; local: *; diff --git a/include/external/marsio.h b/include/external/marsio.h index 3eb68dd..3925647 100644 --- a/include/external/marsio.h +++ b/include/external/marsio.h @@ -118,25 +118,6 @@ enum mr_buff_metadata_type MR_BUFF_USER_0 = 254 }; -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, -}; - #ifdef __cplusplus extern "C" { @@ -364,6 +345,12 @@ struct dp_trace_buffer_telemetry char * buffer; uint16_t buffer_len; uint16_t buffer_used; + + 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; }; struct dp_trace_record_header @@ -388,8 +375,6 @@ struct dp_trace_job_desc uint16_t traffic_link_ids[DP_TRACE_TRAFFIC_LINK_ID_ARRAY_SIZE_MAX]; }; -void * marsio_pkt_jump_to_innermost_layer(const marsio_buff_t * mbuf, enum complex_layer_type_id layer_id); - int marsio_dp_trace_job_id_uesd_get(struct mr_instance * instance, job_bitmap_t * jobs_id); job_bitmap_t marsio_dp_trace_job_add(struct mr_instance * instance, const struct dp_trace_job_desc * desc); 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 diff --git a/service/src/dp_trace.c b/service/src/dp_trace.c index 166a2d1..30ebf61 100644 --- a/service/src/dp_trace.c +++ b/service/src/dp_trace.c @@ -194,6 +194,12 @@ void hook_rte_pktmbuf_free(struct rte_mbuf * m) if (m == NULL) return; struct dp_trace_process * trace = sc_main_get()->trace; + if (unlikely(dp_trace_record_can_emit(m, DP_TRACE_MEASUREMENT_TYPE_TELEMETRY))) + { + struct dp_trace_record_meta meta = { + .measurement_type = DP_TRACE_MEASUREMENT_TYPE_TELEMETRY, .appsym = MR_TRACE_APPSYM, .module = ""}; + dp_trace_record_emit_str(sc_main_get()->trace, m, rte_lcore_id(), &meta, "packet free."); + } if (unlikely(dp_trace_record_can_emit(m, DP_TRACE_MEASUREMENT_TYPE_TRACE))) { struct dp_trace_record_meta meta = { @@ -211,6 +217,12 @@ void hook_rte_pktmbuf_free_bulk(struct rte_mbuf ** mbufs, unsigned int count) { if (mbufs[idx] == NULL) continue; + if (unlikely(dp_trace_record_can_emit(mbufs[idx], DP_TRACE_MEASUREMENT_TYPE_TELEMETRY))) + { + struct dp_trace_record_meta meta = { + .measurement_type = DP_TRACE_MEASUREMENT_TYPE_TELEMETRY, .appsym = MR_TRACE_APPSYM, .module = ""}; + dp_trace_record_emit_str(sc_main_get()->trace, mbufs[idx], rte_lcore_id(), &meta, "packet free."); + } if (unlikely(dp_trace_record_can_emit(mbufs[idx], DP_TRACE_MEASUREMENT_TYPE_TRACE))) { struct dp_trace_record_meta meta = { |
