summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2024-03-06 16:00:45 +0800
committersongyanchao <[email protected]>2024-03-06 16:00:45 +0800
commit51070f7bbeb9792877683acdcd56194239d02dea (patch)
tree220de2a3762620ede925c147711d076f03fff9df
parent3c1a6ccf1ff44688bdf8ead969f53eb1eabc4acb (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.c13
-rw-r--r--service/src/node_bridge.c21
-rw-r--r--service/src/node_eth_egress.c15
-rw-r--r--service/src/node_etherfabric.c20
-rw-r--r--service/src/node_lb.c7
-rw-r--r--service/src/node_tera.c4
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);