summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2024-03-05 14:57:31 +0800
committersongyanchao <[email protected]>2024-03-05 14:58:57 +0800
commit9172ddbcf61cf2f14a2f789e4af712446e04ffb6 (patch)
treee738bac9ef43e2e8b4e559f0691159fb032455e8
parent004ce0bc079b8b1987071d08daf22f5c903d6e0e (diff)
✨ feat(TSG-19602): Add the trace information for 'bridge' node.v4.6.76-20240305
Add the trace information for 'bridge' node.
-rw-r--r--service/src/node_bridge.c94
-rw-r--r--test/ptf_test/bridge_test.py17
2 files changed, 87 insertions, 24 deletions
diff --git a/service/src/node_bridge.c b/service/src/node_bridge.c
index 176bf29..2ce7ddd 100644
--- a/service/src/node_bridge.c
+++ b/service/src/node_bridge.c
@@ -15,14 +15,14 @@ enum
BRIDGE_NEXT_MAX
};
-/* Bridge stat struct */
+/* Bridge stats struct */
struct bridge_stats
{
volatile uint64_t deal_pkts;
volatile uint64_t to_master_dev;
volatile uint64_t drop_for_miss;
volatile uint64_t broadcast;
- volatile uint64_t pkt_clone_err;
+ volatile uint64_t pkt_clone_failed;
} __rte_cache_aligned;
struct bridge
@@ -207,6 +207,51 @@ int bridge_lookup(struct bridge * bridge, struct rte_ether_hdr * ether_hdr, uint
return RT_ERR;
}
+/* Generate and store the trace information */
+static __rte_always_inline void gen_store_trace_info(struct rte_node * node, struct rte_mbuf * mbuf,
+ uint16_t next_node_index, struct bridge_stats * stats,
+ struct bridge_stats * stats_for_trace)
+{
+ struct dp_record_meta meta = {0};
+ rte_strscpy(meta.module, node->name, sizeof(meta.module));
+
+ /* Populate the next node infomation */
+ char str_record[MR_STRING_MAX] = {0};
+ int len = snprintf(str_record, sizeof(str_record), "next:%s", node->nodes[next_node_index]->name);
+
+ if (next_node_index == BRIDGE_NEXT_DROP)
+ {
+ stats_for_trace->drop_for_miss = stats->drop_for_miss;
+ len += snprintf(str_record + len, sizeof(str_record) - len, ",drp_rsn:match unsuccessful");
+ }
+
+ if (stats->to_master_dev != stats_for_trace->to_master_dev)
+ {
+ stats_for_trace->to_master_dev = stats->to_master_dev;
+ len += snprintf(str_record + len, sizeof(str_record) - len, ",to_master_dev");
+ }
+
+ if (stats->broadcast != stats_for_trace->broadcast)
+ {
+ stats_for_trace->broadcast = stats->broadcast;
+ len += snprintf(str_record + len, sizeof(str_record) - len, ",broadcast");
+ }
+
+ if (stats->pkt_clone_failed != stats_for_trace->pkt_clone_failed)
+ {
+ stats_for_trace->pkt_clone_failed = stats->pkt_clone_failed;
+ len += snprintf(str_record + len, sizeof(str_record) - len, ",pkt_clone_failed");
+ }
+
+ struct mrb_metadata * mrb_meta = mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID);
+ struct mr_dev_desc * dev_desc = mr_dev_desc_lookup_by_port_id(sc_main_get()->devmgr_main, mrb_meta->port_egress);
+ len +=
+ snprintf(str_record + len, sizeof(str_record) - len, ",tx_port:%u,%s", mrb_meta->port_egress, dev_desc->symbol);
+
+ /* Emit the trace record */
+ dp_trace_record_emit_str(sc_main_get()->trace, mbuf, &meta, str_record);
+}
+
static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph, struct rte_node * node, void ** objs,
uint16_t cnt)
{
@@ -218,7 +263,8 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
uint16_t batch_next_node_index = BRIDGE_NEXT_ETH_EGRESS;
rte_graph_t graph_id = graph->id;
- struct bridge_stats stat = {};
+ struct bridge_stats stats = {};
+ struct bridge_stats stats_for_trace = {};
struct sc_main * sc = sc_main_get();
struct node_bridge_main * bridge_main = node_bridge_main_get();
@@ -226,10 +272,10 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
{
uint16_t next_node_index = BRIDGE_NEXT_ETH_EGRESS;
- struct rte_mbuf * mbuf0 = pkts[0];
- assert(mbuf0 != NULL);
+ struct rte_mbuf * mbuf = pkts[0];
+ assert(mbuf != NULL);
- struct mrb_metadata * mrb_meta = mrbuf_cz_data(mbuf0, MR_NODE_CTRLZONE_ID);
+ struct mrb_metadata * mrb_meta = mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID);
assert(mrb_meta != NULL);
port_id_t port_ingress = mrb_meta->port_ingress;
@@ -238,7 +284,7 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
uint8_t bridge_index = dev_desc->bridge_index;
assert((bridge_index < RTE_DIM(bridge_main->bridge_table)) && (bridge_index != UINT8_MAX));
- //__rte_mbuf_sanity_check(mbuf0, 1);
+ //__rte_mbuf_sanity_check(mbuf, 1);
pkts += 1;
n_left_from -= 1;
@@ -246,7 +292,7 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
/* Bridge lookup */
port_id_t egress_port;
struct bridge * bridge = &bridge_main->bridge_table[bridge_index];
- struct rte_ether_hdr * ether_hdr = rte_pktmbuf_mtod(mbuf0, struct rte_ether_hdr *);
+ struct rte_ether_hdr * ether_hdr = rte_pktmbuf_mtod(mbuf, struct rte_ether_hdr *);
int ret = bridge_lookup(bridge, ether_hdr, &last_bridge_index[graph_id][bridge_index], &egress_port);
if (likely(ret == RT_SUCCESS))
@@ -262,19 +308,19 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
egress_port = bridge->master_port;
if (likely((egress_port != port_ingress) && (egress_port != UINT32_MAX)))
{
- stat.to_master_dev++;
+ stats.to_master_dev++;
mrb_meta->port_egress = egress_port;
goto node_enqueue;
}
/* Drop pkts */
- stat.drop_for_miss++;
+ stats.drop_for_miss++;
next_node_index = BRIDGE_NEXT_DROP;
goto node_enqueue;
}
/* Deal broadcast pkt */
- stat.broadcast++;
+ stats.broadcast++;
uint8_t original_pkt = 1;
for (int index = 0; index < bridge->nr_devices; index++)
{
@@ -292,10 +338,10 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
}
/* Clone pkt */
- struct rte_mbuf * mbuf_clone = rte_pktmbuf_clone(mbuf0, bridge_main->direct_pool);
+ struct rte_mbuf * mbuf_clone = rte_pktmbuf_clone(mbuf, bridge_main->direct_pool);
if (unlikely(mbuf_clone == NULL))
{
- stat.pkt_clone_err++;
+ stats.pkt_clone_failed++;
continue;
}
@@ -306,6 +352,12 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
}
node_enqueue:
+ /* Check if tracing is enabled for the current Mbuf */
+ if (unlikely(dp_trace_record_can_emit(mbuf)))
+ {
+ gen_store_trace_info(node, mbuf, next_node_index, &stats, &stats_for_trace);
+ }
+
/* Batch processing */
if (unlikely(batch_next_node_index != next_node_index))
{
@@ -326,13 +378,13 @@ static __rte_always_inline uint16_t bridge_node_process(struct rte_graph * graph
if (likely(last_spec > 0))
rte_node_enqueue(graph, node, batch_next_node_index, batch_pkts, last_spec);
- /* Update graph stat */
- struct bridge_stats * graph_stat = &stats_per_graph[graph_id];
- graph_stat->deal_pkts += cnt;
- graph_stat->to_master_dev += stat.to_master_dev;
- graph_stat->drop_for_miss += stat.drop_for_miss;
- graph_stat->broadcast += stat.broadcast;
- graph_stat->pkt_clone_err += stat.pkt_clone_err;
+ /* Update graph stats */
+ struct bridge_stats * graph_stats = &stats_per_graph[graph_id];
+ graph_stats->deal_pkts += cnt;
+ graph_stats->to_master_dev += stats.to_master_dev;
+ graph_stats->drop_for_miss += stats.drop_for_miss;
+ graph_stats->broadcast += stats.broadcast;
+ graph_stats->pkt_clone_failed += stats.pkt_clone_failed;
return 0;
}
@@ -367,7 +419,7 @@ cJSON * bridge_node_monit_loop(struct sc_main * sc)
cJSON_AddNumberToObject(graph_obj, "to_master_dev", stat_item->to_master_dev);
cJSON_AddNumberToObject(graph_obj, "drop_for_miss", stat_item->drop_for_miss);
cJSON_AddNumberToObject(graph_obj, "broadcast", stat_item->broadcast);
- cJSON_AddNumberToObject(graph_obj, "pkt_clone_err", stat_item->pkt_clone_err);
+ cJSON_AddNumberToObject(graph_obj, "pkt_clone_failed", stat_item->pkt_clone_failed);
char graph_index[MR_STRING_MAX];
snprintf(graph_index, sizeof(graph_index), "graph-%u", graph_id);
diff --git a/test/ptf_test/bridge_test.py b/test/ptf_test/bridge_test.py
index 5bcc480..67f93d9 100644
--- a/test/ptf_test/bridge_test.py
+++ b/test/ptf_test/bridge_test.py
@@ -103,6 +103,17 @@ devices=veth0,veth1,veth2,veth3
"""
+dynamic_conf_base = """
+[dp_trace_rule]
+enable=1
+dp_trace_file_path=/var/run/mrzcpd/dp_trace.pcapng
+dp_trace_file_max_size=655360
+
+[dp_trace_rule:0]
+bpf_expr=net 0.0.0.0/0
+pkt_cnt_max=10240
+"""
+
"""
+----------------------------------------------------------------------------------------------+
| Name | veth0 | veth1 | veth2 | veth3 (master) |
@@ -124,7 +135,7 @@ class TestForUnicastPkt(BaseTest):
def runTest(self):
try:
# Init & Start mrzcpd
- mrzcpd = Mrzcpd(bridge_conf, "")
+ mrzcpd = Mrzcpd(bridge_conf, dynamic_conf_base)
mrzcpd.start()
"""
@@ -210,7 +221,7 @@ class TestForBroadcastPkt(BaseTest):
def runTest(self):
try:
# Init & Start mrzcpd
- mrzcpd = Mrzcpd(bridge_conf, "")
+ mrzcpd = Mrzcpd(bridge_conf, dynamic_conf_base)
mrzcpd.start()
# Create packet
@@ -251,7 +262,7 @@ class TestForMasterDevice(BaseTest):
def runTest(self):
try:
# Init & Start mrzcpd
- mrzcpd = Mrzcpd(bridge_conf, "")
+ mrzcpd = Mrzcpd(bridge_conf, dynamic_conf_base)
mrzcpd.start()
# Create packet