openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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:
Msdk-6.5.16/include/bcm_int/esw/l3.h | 1+
Msdk-6.5.16/src/bcm/esw/alpm2/alpm.c | 15+++++++++++++++
Msdk-6.5.16/src/bcm/esw/alpm2/alpm_ts.c | 18+++++++++++++-----
Msdk-6.5.16/src/bcm/esw/tomahawk/alpm.c | 2+-
Msdk-6.5.16/src/bcm/esw/tomahawk3/alpm.c | 6+++---
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;