summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_labelpool.c3
-rw-r--r--bgpd/bgp_mplsvpn.c23
-rw-r--r--bgpd/bgp_route.h17
3 files changed, 28 insertions, 15 deletions
diff --git a/bgpd/bgp_labelpool.c b/bgpd/bgp_labelpool.c
index 91763b85a0..3afb3db06b 100644
--- a/bgpd/bgp_labelpool.c
+++ b/bgpd/bgp_labelpool.c
@@ -1147,7 +1147,8 @@ static void show_bgp_nexthop_label_afi(struct vty *vty, afi_t afi,
if (!detail)
continue;
vty_out(vty, " Paths:\n");
- LIST_FOREACH (path, &(iter->paths), label_nh_thread) {
+ LIST_FOREACH (path, &(iter->paths),
+ mplsvpn.blnc.label_nh_thread) {
dest = path->net;
table = bgp_dest_table(dest);
assert(dest && table);
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c
index 0ac76c48b4..4b8aa1ee70 100644
--- a/bgpd/bgp_mplsvpn.c
+++ b/bgpd/bgp_mplsvpn.c
@@ -1341,14 +1341,18 @@ void bgp_mplsvpn_path_nh_label_unlink(struct bgp_path_info *pi)
if (!pi)
return;
- blnc = pi->label_nexthop_cache;
+ if (!CHECK_FLAG(pi->flags, BGP_PATH_MPLSVPN_LABEL_NH))
+ return;
+
+ blnc = pi->mplsvpn.blnc.label_nexthop_cache;
if (!blnc)
return;
- LIST_REMOVE(pi, label_nh_thread);
- pi->label_nexthop_cache->path_count--;
- pi->label_nexthop_cache = NULL;
+ LIST_REMOVE(pi, mplsvpn.blnc.label_nh_thread);
+ pi->mplsvpn.blnc.label_nexthop_cache->path_count--;
+ pi->mplsvpn.blnc.label_nexthop_cache = NULL;
+ UNSET_FLAG(pi->flags, BGP_PATH_MPLSVPN_LABEL_NH);
if (LIST_EMPTY(&(blnc->paths)))
bgp_label_per_nexthop_free(blnc);
@@ -1390,7 +1394,7 @@ static int bgp_mplsvpn_get_label_per_nexthop_cb(mpls_label_t label,
ZEBRA_MPLS_LABELS_ADD, blnc->label, blnc->nh->ifindex,
blnc->nh->vrf_id, ZEBRA_LSP_BGP, &blnc->nexthop);
- LIST_FOREACH (pi, &(blnc->paths), label_nh_thread) {
+ LIST_FOREACH (pi, &(blnc->paths), mplsvpn.blnc.label_nh_thread) {
if (!pi->net)
continue;
table = bgp_dest_table(pi->net);
@@ -1457,7 +1461,7 @@ _vpn_leak_from_vrf_get_per_nexthop_label(struct bgp_path_info *pi,
bgp_mplsvpn_get_label_per_nexthop_cb);
}
- if (pi->label_nexthop_cache == blnc)
+ if (pi->mplsvpn.blnc.label_nexthop_cache == blnc)
/* no change */
return blnc->label;
@@ -1466,9 +1470,10 @@ _vpn_leak_from_vrf_get_per_nexthop_label(struct bgp_path_info *pi,
bgp_mplsvpn_path_nh_label_unlink(pi);
/* updates NHT pi list reference */
- LIST_INSERT_HEAD(&(blnc->paths), pi, label_nh_thread);
- pi->label_nexthop_cache = blnc;
- pi->label_nexthop_cache->path_count++;
+ LIST_INSERT_HEAD(&(blnc->paths), pi, mplsvpn.blnc.label_nh_thread);
+ pi->mplsvpn.blnc.label_nexthop_cache = blnc;
+ pi->mplsvpn.blnc.label_nexthop_cache->path_count++;
+ SET_FLAG(pi->flags, BGP_PATH_MPLSVPN_LABEL_NH);
blnc->last_update = monotime(NULL);
/* then add or update the selected nexthop */
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h
index 9bd9e48e22..96aa98c277 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -246,6 +246,14 @@ struct bgp_path_info_extra {
struct bgp_path_mh_info *mh_info;
};
+struct bgp_mplsvpn_label_nh {
+ /* For nexthop per label linked list */
+ LIST_ENTRY(bgp_path_info) label_nh_thread;
+
+ /* Back pointer to the bgp label per nexthop structure */
+ struct bgp_label_per_nexthop_cache *label_nexthop_cache;
+};
+
struct bgp_path_info {
/* For linked list. */
struct bgp_path_info *next;
@@ -298,6 +306,7 @@ struct bgp_path_info {
#define BGP_PATH_ANNC_NH_SELF (1 << 14)
#define BGP_PATH_LINK_BW_CHG (1 << 15)
#define BGP_PATH_ACCEPT_OWN (1 << 16)
+#define BGP_PATH_MPLSVPN_LABEL_NH (1 << 17)
/* BGP route type. This can be static, RIP, OSPF, BGP etc. */
uint8_t type;
@@ -320,11 +329,9 @@ struct bgp_path_info {
uint32_t addpath_rx_id;
struct bgp_addpath_info_data tx_addpath;
- /* For nexthop per label linked list */
- LIST_ENTRY(bgp_path_info) label_nh_thread;
-
- /* Back pointer to the bgp label per nexthop structure */
- struct bgp_label_per_nexthop_cache *label_nexthop_cache;
+ union {
+ struct bgp_mplsvpn_label_nh blnc;
+ } mplsvpn;
};
/* Structure used in BGP path selection */