summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/dp_trace.c11
-rw-r--r--app/src/version.map1
-rw-r--r--include/external/marsio.h27
-rw-r--r--infra/include/dp_trace.h5
-rw-r--r--infra/include/ldbc.h19
-rw-r--r--infra/src/dp_trace.c91
-rw-r--r--service/src/dp_trace.c12
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 = {