diff options
| author | Philippe Guibert <philippe.guibert@6wind.com> | 2023-02-23 15:38:11 +0100 | 
|---|---|---|
| committer | Louis Scalbert <louis.scalbert@6wind.com> | 2024-06-05 13:11:29 +0200 | 
| commit | 2b6bcda64bdf58f6c6dc1690880edb473af2ec66 (patch) | |
| tree | ecdc70fcfee2320c837fd4c3d0532c9ee61a2242 | |
| parent | 9fd26c1aa5348bc1d73b92feab2f4e96196c00e3 (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.h | 3 | ||||
| -rw-r--r-- | bgpd/bgp_updgrp_adv.c | 10 | 
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);  | 
