diff options
| author | songyanchao <[email protected]> | 2024-03-06 16:00:45 +0800 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2024-03-06 16:00:45 +0800 |
| commit | 51070f7bbeb9792877683acdcd56194239d02dea (patch) | |
| tree | 220de2a3762620ede925c147711d076f03fff9df | |
| parent | 3c1a6ccf1ff44688bdf8ead969f53eb1eabc4acb (diff) | |
🐞 fix(TSG-19793): Fix core dump caused by trace information handling in 'bridge' node.v4.6.77-20240306
Fix core dump caused by trace information handling in 'bridge' node.
| -rw-r--r-- | service/src/devmgr.c | 13 | ||||
| -rw-r--r-- | service/src/node_bridge.c | 21 | ||||
| -rw-r--r-- | service/src/node_eth_egress.c | 15 | ||||
| -rw-r--r-- | service/src/node_etherfabric.c | 20 | ||||
| -rw-r--r-- | service/src/node_lb.c | 7 | ||||
| -rw-r--r-- | service/src/node_tera.c | 4 |
6 files changed, 45 insertions, 35 deletions
diff --git a/service/src/devmgr.c b/service/src/devmgr.c index 73cdcc2..550c413 100644 --- a/service/src/devmgr.c +++ b/service/src/devmgr.c @@ -20,6 +20,7 @@ #include <rte_config.h> #include <rte_debug.h> #include <rte_eth_bond.h> +#include <rte_eth_bond_8023ad.h> #include <rte_ethdev.h> #include <rte_ether.h> #include <rte_flow.h> @@ -28,7 +29,6 @@ #include <rte_node_eth_api.h> #include <rte_pci.h> #include <rte_string_fns.h> -#include <rte_eth_bond_8023ad.h> #include <MESA_prof_load.h> #include <cJSON.h> @@ -248,7 +248,7 @@ static const char * str_bond_xmit_policy(unsigned int xmit_policy) return _str_bond_xmit_policy_map[xmit_policy]; } -static const char * str_bond_agg_selection(unsigned int agg_selection) +static const char * str_bond_agg_selection(unsigned int agg_selection) { static const char * _str_bond_agg_selection_map[] = { [AGG_BANDWIDTH] = "bandwidth", @@ -710,7 +710,8 @@ int mr_dev_desc_config_load(struct devmgr_main * devmgr_main, struct mr_dev_desc /* Get allow vlan ids */ uint32_t vlan_ids[16]; - int nr_vlan_members = MESA_load_profile_uint_range(cfgfile, str_section, "allow_vlan_ids", RTE_DIM(vlan_ids), vlan_ids); + int nr_vlan_members = + MESA_load_profile_uint_range(cfgfile, str_section, "allow_vlan_ids", RTE_DIM(vlan_ids), vlan_ids); if (nr_vlan_members > 0) { if (nr_vlan_members > RTE_DIM(dev_desc->vlan_members)) @@ -881,6 +882,9 @@ struct mr_dev_desc * mr_dev_desc_iterate(struct devmgr_main * devmgr_main, unsig struct mr_dev_desc * mr_dev_desc_lookup_by_port_id(struct devmgr_main * devmgr_main, port_id_t port_id) { + if (unlikely(port_id >= RTE_DIM(devmgr_main->dev_descs))) + return NULL; + return devmgr_main->dev_descs[port_id]; } @@ -1881,7 +1885,8 @@ static struct bond_dev_config * bond_dev_config_load(struct devmgr_main * devmgr bond_cfg->nr_dev_slaves = nr_str_tokens; MESA_load_profile_uint_def(cfg, str_section, "bond_mode", &bond_cfg->mode, BONDING_MODE_BALANCE); - MESA_load_profile_uint_def(cfg, str_section, "bond_xmit_policy", &bond_cfg->xmit_policy, BALANCE_XMIT_POLICY_LAYER34); + MESA_load_profile_uint_def(cfg, str_section, "bond_xmit_policy", &bond_cfg->xmit_policy, + BALANCE_XMIT_POLICY_LAYER34); return bond_cfg; diff --git a/service/src/node_bridge.c b/service/src/node_bridge.c index 0692bad..7f9dfbe 100644 --- a/service/src/node_bridge.c +++ b/service/src/node_bridge.c @@ -219,12 +219,6 @@ static __rte_always_inline void gen_store_trace_info(struct rte_node * node, str char str_record[MR_STRING_MAX]; 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; @@ -243,10 +237,17 @@ static __rte_always_inline void gen_store_trace_info(struct rte_node * node, str 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); + 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"); + } + else + { + /* Populate the egress port information */ + struct mrb_metadata * mrb_meta = mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); + len += snprintf(str_record + len, sizeof(str_record) - len, ",tx_port:%u", mrb_meta->port_egress); + } /* Emit the trace record */ dp_trace_record_emit_str(sc_main_get()->trace, mbuf, &meta, str_record); diff --git a/service/src/node_eth_egress.c b/service/src/node_eth_egress.c index 300f498..e4bff16 100644 --- a/service/src/node_eth_egress.c +++ b/service/src/node_eth_egress.c @@ -86,10 +86,19 @@ static __rte_always_inline void gen_store_trace_info_egress(struct rte_node * no char str_record[MR_STRING_MAX]; int len = snprintf(str_record, sizeof(str_record), "next:%s", node->nodes[next_node_index]->name); + /* Populate the egress port information */ 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); + len += snprintf(str_record + len, sizeof(str_record) - len, ",tx_port:%u", mrb_meta->port_egress); + + if (likely(mrb_meta->port_egress < MR_DEVICE_MAX)) + { + struct mr_dev_desc * dev_desc = + mr_dev_desc_lookup_by_port_id(sc_main_get()->devmgr_main, mrb_meta->port_egress); + if (likely(dev_desc != NULL)) + { + len += snprintf(str_record + len, sizeof(str_record) - len, ",%s", dev_desc->symbol); + } + } /* Emit the trace record */ dp_trace_record_emit_str(sc_main_get()->trace, mbuf, &meta, str_record); diff --git a/service/src/node_etherfabric.c b/service/src/node_etherfabric.c index f5a88fc..daea9ad 100644 --- a/service/src/node_etherfabric.c +++ b/service/src/node_etherfabric.c @@ -714,6 +714,13 @@ static __rte_always_inline void gen_store_trace_info_egress(struct rte_node * no char str_record[MR_STRING_MAX]; int len = snprintf(str_record, sizeof(str_record), "next:%s", node->nodes[next_node_index]->name); + /* Populate the nf create information */ + struct mrb_metadata * mrb_meta = mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); + if (unlikely(mrb_meta->packet_create_from_nf)) + { + len += snprintf(str_record + len, sizeof(str_record) - len, "nf_create:yes"); + } + /* Populate the drop reason */ if (unlikely(next_node_index == EF_EGRESS_NEXT_PKT_DROP)) { @@ -728,19 +735,12 @@ static __rte_always_inline void gen_store_trace_info_egress(struct rte_node * no len += snprintf(str_record + len, sizeof(str_record) - len, ",drp_rsn:ef adapter mode is tap"); } } - - /* Populate the nf create information */ - struct mrb_metadata * mrb_meta = mrbuf_cz_data(mbuf, MR_NODE_CTRLZONE_ID); - if (unlikely(mrb_meta->packet_create_from_nf)) + else { - len += snprintf(str_record + len, sizeof(str_record) - len, "nf_create:yes"); + /* Populate the egress port information */ + len += snprintf(str_record + len, sizeof(str_record) - len, ",tx_port:%u", mrb_meta->port_egress); } - /* Populate the egress port info */ - 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); } diff --git a/service/src/node_lb.c b/service/src/node_lb.c index 53970ff..a38c28e 100644 --- a/service/src/node_lb.c +++ b/service/src/node_lb.c @@ -458,12 +458,9 @@ static __rte_always_inline void gen_store_trace_info(struct rte_node * node, str if (likely(next_node_index == LB_NEXT_ETH_EGRESS)) { - /* Populate the egress port info */ + /* Populate the egress port information */ 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); + len += snprintf(str_record + len, sizeof(str_record) - len, ",tx_port:%u", mrb_meta->port_egress); } /* Emit the trace record */ diff --git a/service/src/node_tera.c b/service/src/node_tera.c index fe6c045..998b4e8 100644 --- a/service/src/node_tera.c +++ b/service/src/node_tera.c @@ -525,9 +525,7 @@ static __rte_always_inline void gen_store_trace_info_egress(struct rte_node * no /* Populate the egress port info */ 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); + len += snprintf(str_record + len, sizeof(str_record) - len, ",tx_port:%u", mrb_meta->port_egress); /* Emit the trace record */ dp_trace_record_emit_str(sc_main_get()->trace, mbuf, &meta, str_record); |
