summaryrefslogtreecommitdiff
path: root/infra
diff options
context:
space:
mode:
author童宗振 <[email protected]>2024-05-11 11:12:48 +0000
committer童宗振 <[email protected]>2024-05-11 11:12:48 +0000
commit53b4887e5c2dd8d2113a011135c5f13f4ca42edb (patch)
tree4b847d1d1726065da57feb06438ebef279119b3a /infra
parent4a1635862ee49c06620bb1b374c3315a14950fea (diff)
Dp trace save quadruple 2
Diffstat (limited to 'infra')
-rw-r--r--infra/include/dp_trace.h5
-rw-r--r--infra/include/ldbc.h19
-rw-r--r--infra/src/dp_trace.c91
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