diff options
| author | songyanchao <[email protected]> | 2024-03-05 14:57:31 +0800 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2024-03-05 14:58:57 +0800 |
| commit | 9172ddbcf61cf2f14a2f789e4af712446e04ffb6 (patch) | |
| tree | e738bac9ef43e2e8b4e559f0691159fb032455e8 | |
| parent | 004ce0bc079b8b1987071d08daf22f5c903d6e0e (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.c | 94 | ||||
| -rw-r--r-- | test/ptf_test/bridge_test.py | 17 |
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 |
