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:
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;
}