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 96c788e80e42083538be34922249e9dc5f1055b9
parent e6063b937c5fa2e903f8e9ba6df29ce9e4bef19d
Author: Broadcom SDK Release <sdk.releases@broadcom.com>
Date:   Wed, 22 May 2019 08:56:12 -0700

SDK-178925: As part of this fix, the support is added to return correct numbe...

Devices: 56870_A0,56980_B0
Module: mpls

Symptom:
bcm_mpls_tunnel_initiator_get returning wrong number of labels

As part of this fix, the support is added to return correct number of
labels when the tunnel entry is created with 0 number of labels.

Diffstat:
Msdk-6.5.16/include/bcm_int/esw/mpls.h | 7++++---
Msdk-6.5.16/src/bcm/esw/xgs5/mpls.c | 24++++++++++++++++++++++--
2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/sdk-6.5.16/include/bcm_int/esw/mpls.h b/sdk-6.5.16/include/bcm_int/esw/mpls.h @@ -210,9 +210,10 @@ typedef struct _bcm_mpls_old_nh_info_s { #define MAX_FREE_ENTRY_INDEXES 8 -#define BCMI_EGR_IP_TUNNEL_MPLS_START_OF_ENTRY 0x1 -#define BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_USED 0x2 -#define BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_CHECKED 0x4 +#define BCMI_EGR_IP_TUNNEL_MPLS_START_OF_ENTRY (1 << 0) +#define BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_USED (1 << 1) +#define BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_CHECKED (1 << 2) +#define BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_ZERO (1 << 3) /* S/w list of all interfaces pointing to mpls tnl */ typedef struct intf_list_s { diff --git a/sdk-6.5.16/src/bcm/esw/xgs5/mpls.c b/sdk-6.5.16/src/bcm/esw/xgs5/mpls.c @@ -3872,6 +3872,15 @@ bcmi_xgs5_mpls_egr_tunnel_lookup (int unit, int push_action, BCMI_EGR_IP_TUNNEL_MPLS_START_OF_ENTRY)) { continue; } + if (!push_action) { + if ((tunnel_entry[tnl_index]->label_entry[i]->flags & + BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_ZERO)) { + *match_mpls_tunnel_index = (tnl_index * + _BCM_MPLS_NUM_MPLS_ENTRIES_PER_INDEX(unit)) + i; + } + return BCM_E_NONE; + } + if (!(tunnel_entry[tnl_index]->label_entry[i]->num_elements == push_action)) { continue; @@ -4810,6 +4819,11 @@ bcmi_xgs5_mpls_tunnel_initiator_set(int unit, bcm_if_t intf, int num_labels, tunnel_entry[tnl_id]->label_entry[offset]->num_elements = ((num_labels) ? num_labels : 1); + if (!num_labels) { + tunnel_entry[tnl_id]->label_entry[offset]->flags |= + BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_ZERO; + } + rv = bcmi_egr_ip_tnl_mpls_table_read(unit, tnl_id,tnl_entry); if (rv < 0) { return rv; @@ -5844,8 +5858,14 @@ bcmi_xgs5_mpls_tunnel_initiator_get(int unit, bcm_if_t intf, int label_max, if (tunnel_entry[tnl_index]->label_entry[offset]->flags & BCMI_EGR_IP_TUNNEL_MPLS_START_OF_ENTRY) { - no_of_elements = - tunnel_entry[tnl_index]->label_entry[offset]->num_elements; + if (tunnel_entry[tnl_index]->label_entry[offset]->flags + & BCMI_EGR_IP_TUNNEL_MPLS_ENTRY_ZERO) { + no_of_elements = 0; + } else { + no_of_elements = + tunnel_entry[tnl_index]->label_entry[offset]->num_elements; + } + } else { return BCM_E_NOT_FOUND; }