commit fb23fbf3e674daea9bd710219f87e33f7ff7d93d
parent d7ed1f03386788af1c73e09c08c0194b7afbdb18
Author: Broadcom SDK Release <sdk.releases@broadcom.com>
Date: Tue, 21 Jan 2020 12:45:53 -0800
SDK-181312: Fixed mistake in previous change SDK-177481, where PVT_BKT_DEF(pv...
Devices: 56980_A0,56980_B0,AllChips
Module: ALPM
Symptom:
ALPM: Parallel Mode: DEFAULT_MISS=1: Packets gets dropped due to dest
miss even if a matching route exists in the database
Fixed mistake in previous change SDK-177481, where PVT_BKT_DEF(pvt_node)
for Level2 is using wrong pvt_node from Level1. Solution is: 1.) Add
default_miss argument in lpm_cfg, and when init, insert or update a
pvt_node, indicate default_miss and set properly in HW for Parallel and
TCAM mixed mode. 2) Add default_miss sanity check for both positive or
negative cases.
Diffstat:
5 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/sdk-6.5.16/include/bcm_int/esw/l3.h b/sdk-6.5.16/include/bcm_int/esw/l3.h
@@ -280,6 +280,7 @@ typedef struct _bcm_defip_cfg_s {
void *tcam_write; /* carry _alpm_tcam_write_t info for L1 pvt add during L2 bkt split */
uint32 spl_key[5];
int spl_key_len;
+ int default_miss; /* Used for pivot's default_miss in ALPM_TCAM_ZONED */
int fast_delete_all; /* used only in TH3 fast delete_all */
#endif
} _bcm_defip_cfg_t;
diff --git a/sdk-6.5.16/src/bcm/esw/alpm2/alpm.c b/sdk-6.5.16/src/bcm/esw/alpm2/alpm.c
@@ -784,6 +784,8 @@ alpm_pvt_delete_by_pvt_node(int u, _alpm_cb_t *acb, _alpm_pvt_node_t *pvt_node)
/* Assoc-data */
if (PVT_BKT_DEF(pvt_node) != NULL) {
alpm_util_adata_trie_to_cfg(u, &PVT_BKT_DEF(pvt_node)->adata, &lpm_cfg);
+ } else {
+ lpm_cfg.default_miss = 1;
}
rv = alpm_pvt_delete(u, acb, &lpm_cfg);
@@ -891,6 +893,8 @@ alpm_pvt_update_by_pvt_node(int u, _alpm_cb_t *acb, _alpm_pvt_node_t *pvt_node,
/* Assoc-data */
if (PVT_BKT_DEF(pvt_node) != NULL) {
alpm_util_adata_trie_to_cfg(u, &PVT_BKT_DEF(pvt_node)->adata, &lpm_cfg);
+ } else {
+ lpm_cfg.default_miss = 1;
}
if (ACB_HAS_TCAM(acb)) {
@@ -2468,8 +2472,10 @@ alpm_bkt_split_pvt_add(int u, _alpm_cb_t *acb,
/* Construct Assoc-data */
if (pfx_node->bkt_ptr != NULL) {
alpm_util_adata_trie_to_cfg(u, &pfx_node->bkt_ptr->adata, pvt_lpm_cfg);
+ pvt_lpm_cfg->default_miss = 0;
} else {
alpm_util_adata_zero_cfg(u, pvt_lpm_cfg);
+ pvt_lpm_cfg->default_miss = 1;
}
rv = alpm_pvt_insert(u, acb, pvt_lpm_cfg);
if (BCM_SUCCESS(rv)) {
@@ -3049,6 +3055,10 @@ alpm_vrf_init(int u, _alpm_cb_t *acb, int vrf_id, int ipt, uint8 db_type)
pvt_cfg.defip_vrf = ALPM_VRF_ID_TO_VRF(u, vrf_id);
pvt_cfg.defip_flags |= ALPM_IS_IPV6(ipt) ? BCM_L3_IP6 : 0;
+ if (ALPM_TCAM_ZONED(u)) {
+ pvt_cfg.default_miss = 1;
+ }
+
ALPM_IEG_PRT_EXCEPT(alpm_cb_pvt_add(u, acb, vrf_id, ipt, &pvt_cfg), BCM_E_FULL);
ACB_VRF_INIT_SET(u, acb, vrf_id, ipt);
@@ -3092,6 +3102,9 @@ alpm_vrf_deinit(int u, int vrf_id, int ipt)
if (ALPM_IS_IPV6(ipt)) {
lpm_cfg.defip_flags |= BCM_L3_IP6;
}
+ if (ALPM_TCAM_ZONED(u)) {
+ lpm_cfg.default_miss = 1;
+ }
for (i = ACB_CNT(u) - 1; i >= 0; i--) {
acb = ACB(u, i);
@@ -4217,6 +4230,8 @@ alpm_cb_path_construct(int u, _alpm_cb_t *acb, _bcm_defip_cfg_t *lpm_cfg)
&l2_lpm_cfg);
} else {
alpm_util_adata_zero_cfg(u, &l2_lpm_cfg);
+ l2_lpm_cfg.default_miss = 1;
+
}
rv = alpm_cb_pvt_add(u, acb, vrf_id, ipt, &l2_lpm_cfg);
if (BCM_FAILURE(rv)) {
diff --git a/sdk-6.5.16/src/bcm/esw/alpm2/alpm_ts.c b/sdk-6.5.16/src/bcm/esw/alpm2/alpm_ts.c
@@ -1356,13 +1356,15 @@ alpm_cb_sanity_process(int u, int vrf_id, int pkm, _alpm_cb_t *acb,
#endif
/* Pvt default route verification & Assoc_Data Sw validation */
- if ((def_miss == FALSE) && (pfx_trie != NULL)) {
+ if (pfx_trie != NULL) {
rv = alpm_lib_trie_find_lpm(pfx_trie, pfx, key_len,
(alpm_lib_trie_node_t **)&pfx_node);
if (BCM_FAILURE(rv)) {
- sanity->error++;
- ALPM_ERR(("%s: Pivot idx:%d.%d BPM missing (rv=%d)\n",
- ALPM_TBL_NAME(pvt_tbl), idx, sub_idx, rv));
+ if (def_miss == 0) {
+ sanity->error++;
+ ALPM_ERR(("%s: Pivot idx:%d.%d BPM missing (rv=%d)\n",
+ ALPM_TBL_NAME(pvt_tbl), idx, sub_idx, rv));
+ }
} else {
if (pvt_node != NULL) {
if (PVT_BKT_DEF(pvt_node) != pfx_node->bkt_ptr) {
@@ -1372,6 +1374,12 @@ alpm_cb_sanity_process(int u, int vrf_id, int pkm, _alpm_cb_t *acb,
ALPM_TBL_NAME(pvt_tbl), idx, sub_idx,
PVT_KEY_LEN(pvt_node), PVT_BPM_LEN(pvt_node),
PVT_BKT_DEF(pvt_node), pfx_node->bkt_ptr));
+ } else {
+ if (def_miss == 1 && PVT_BKT_DEF(pvt_node)) {
+ sanity->error++;
+ ALPM_ERR(("%s: Pivot idx:%d.%d Default_Miss=1 but BPM route exits\n",
+ ALPM_TBL_NAME(pvt_tbl), idx, sub_idx));
+ }
}
}
@@ -1398,7 +1406,7 @@ alpm_cb_sanity_process(int u, int vrf_id, int pkm, _alpm_cb_t *acb,
} else {
/* Parallel & TCAM mix mode, pivot sanity check:
no best match def_rte but default_miss = 0 */
- if (ALPM_TCAM_ZONED(u)) {
+ if ((def_miss == 0) && ALPM_TCAM_ZONED(u)) {
sanity->error++;
ALPM_ERR(("%s: Pivot idx:%d.%d w/o bm_rte => "
"wrong def_miss:0 dest:%d\n",
diff --git a/sdk-6.5.16/src/bcm/esw/tomahawk/alpm.c b/sdk-6.5.16/src/bcm/esw/tomahawk/alpm.c
@@ -2642,7 +2642,7 @@ _conf:
_MEM32_SET(fld_glb_rt[f], lpm_cfg->defip_vrf == BCM_L3_VRF_OVERRIDE ||
lpm_cfg->defip_vrf == BCM_L3_VRF_GLOBAL);
_MEM32_SET(fld_df_ms[f], ALPM_TCAM_ZONED(unit) &&
- lpm_cfg->defip_ecmp_index == 0);
+ lpm_cfg->default_miss == 1);
_MEM32_SET(fld_dt[f], 0);
pvt_node = (_alpm_pvt_node_t *)lpm_cfg->pvt_node;
diff --git a/sdk-6.5.16/src/bcm/esw/tomahawk3/alpm.c b/sdk-6.5.16/src/bcm/esw/tomahawk3/alpm.c
@@ -1735,7 +1735,7 @@ th3_alpm_ent_assemble(int u, _alpm_cb_t *acb,
fmt_a2d.KSHIFT = lpm_cfg->bkt_kshift;
fmt_a2d.ROFS = bkt_info->rofs + offset;
fmt_a2d.BKT_PTR = bkt_info->bkt_idx;
- if (ALPM_TCAM_ZONED(u) && PVT_BKT_DEF(pvt_node) == NULL) {
+ if (ALPM_TCAM_ZONED(u) && lpm_cfg->default_miss == 1) {
/* TH3TBD, Parallel & Mixed ALPM need to set DEFAULT_MISS to 1
* if assoc_data is NOT set, in case of missing default */
fmt_a2d.DEFAULT_MISS = 1;
@@ -2616,12 +2616,12 @@ th3_tcam_entry_from_cfg(int u, int pkm, _bcm_defip_cfg_t *lpm_cfg, void *e, int
sal_memset(&fmt_a1d, 0, sizeof(fmt_a1d));
fmt_a1d.DIRECT_ROUTE = ALPM_LPM_DIRECT_RTE(u, lpm_cfg);
- pvt_node = (_alpm_pvt_node_t *)lpm_cfg->pvt_node;
- if (ALPM_TCAM_ZONED(u) && (!pvt_node || PVT_BKT_DEF(pvt_node) == NULL)) {
+ if (ALPM_TCAM_ZONED(u) && lpm_cfg->default_miss == 1) {
/* TH3TBD, Parallel & Mixed ALPM need to set DEFAULT_MISS to 1
* if assoc_data is NOT set, in case of missing default */
fmt_a1d.DEFAULT_MISS = 1;
}
+ pvt_node = (_alpm_pvt_node_t *)lpm_cfg->pvt_node;
if (pvt_node != NULL) {
int offset = 0;
_alpm_tbl_t tbl;