summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilippe Guibert <philippe.guibert@6wind.com>2023-02-23 15:38:11 +0100
committerLouis Scalbert <louis.scalbert@6wind.com>2024-06-05 13:11:29 +0200
commit2b6bcda64bdf58f6c6dc1690880edb473af2ec66 (patch)
treeecdc70fcfee2320c837fd4c3d0532c9ee61a2242
parent9fd26c1aa5348bc1d73b92feab2f4e96196c00e3 (diff)
bgpd: fix label in adj-rib-out
After modifying the "label vpn export value", the vpn label information of the VRF is not updated to the peers. For example, the 192.168.0.0/24 prefix is announced to the peer with a label value of 222. > router bgp 65500 > [..] > neighbor 192.0.2.2 remote-as 65501 > address-family ipv4-vpn > neighbor 192.0.2.2 activate > exit-address-family > exit > router bgp 65500 vrf vrf2 > address-family ipv4 unicast > network 192.168.0.0/24 > label vpn export 222 > rd vpn export 444:444 > rt vpn both 53:100 > export vpn > import vpn > exit-address-family Changing the label with "label vpn export" does not update the label value to the peer unless the BGP sessions is re-established. No labels are stored are stored struct bgp_adj_out so that it is impossible to compare the current value with the previous value in adj-RIB-out. Reference the bgp_labels pointer in struct bgp_adj_out and compare the values when updating adj-RIB-out. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com> Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
-rw-r--r--bgpd/bgp_advertise.h3
-rw-r--r--bgpd/bgp_updgrp_adv.c10
2 files changed, 12 insertions, 1 deletions
diff --git a/bgpd/bgp_advertise.h b/bgpd/bgp_advertise.h
index e3cd743d43..8c831892b3 100644
--- a/bgpd/bgp_advertise.h
+++ b/bgpd/bgp_advertise.h
@@ -75,6 +75,9 @@ struct bgp_adj_out {
/* Advertised attribute. */
struct attr *attr;
+ /* VPN label information */
+ struct bgp_labels *labels;
+
/* Advertisement information. */
struct bgp_advertise *adv;
};
diff --git a/bgpd/bgp_updgrp_adv.c b/bgpd/bgp_updgrp_adv.c
index 0a852c75de..250378af68 100644
--- a/bgpd/bgp_updgrp_adv.c
+++ b/bgpd/bgp_updgrp_adv.c
@@ -78,6 +78,8 @@ static inline struct bgp_adj_out *adj_lookup(struct bgp_dest *dest,
static void adj_free(struct bgp_adj_out *adj)
{
+ bgp_labels_unintern(&adj->labels);
+
TAILQ_REMOVE(&(adj->subgroup->adjq), adj, subgrp_adj_train);
SUBGRP_DECR_STAT(adj->subgroup, adj_count);
@@ -572,7 +574,9 @@ bool bgp_adj_out_set_subgroup(struct bgp_dest *dest,
attr_hash = attrhash_key_make(attr);
if (!CHECK_FLAG(subgrp->sflags, SUBGRP_STATUS_FORCE_UPDATES) &&
- attr_hash && adj->attr_hash == attr_hash) {
+ attr_hash && adj->attr_hash == attr_hash &&
+ bgp_labels_cmp(path->extra ? path->extra->labels : NULL,
+ adj->labels)) {
if (BGP_DEBUG(update, UPDATE_OUT)) {
char attr_str[BUFSIZ] = {0};
@@ -614,6 +618,10 @@ bool bgp_adj_out_set_subgroup(struct bgp_dest *dest,
adv->baa = bgp_advertise_attr_intern(subgrp->hash, attr);
adv->adj = adj;
adj->attr_hash = attr_hash;
+ if (path->extra)
+ adj->labels = bgp_labels_intern(path->extra->labels);
+ else
+ adj->labels = NULL;
/* Add new advertisement to advertisement attribute list. */
bgp_advertise_add(adv->baa, adv);