diff options
| author | Donatas Abraitis <donatas@opensourcerouting.org> | 2022-11-18 15:47:50 +0200 | 
|---|---|---|
| committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2022-11-18 16:17:15 +0200 | 
| commit | 6eeb9255450020cb90abf2d4e7de6c31a646e609 (patch) | |
| tree | b933b00b4513dd43d451962823455de9e101d3d5 /bgpd/bgp_updgrp_packet.c | |
| parent | 9a84cb612e8532d6f14d4702ecd9dfd6af408be5 (diff) | |
bgpd: Allow overriding MPLS VPN next-hops via route-maps
Just do not reset next-hop for MPLS VPN routes.
Example of 172.16.255.1/32 (using extended next-hop capability):
```
pe2# sh bgp ipv4 vpn
BGP table version is 4, local router ID is 10.10.10.20, vrf id 0
Default local pref 100, local AS 65001
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
    Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 192.168.1.2:2
 *>i10.0.0.0/24      2001:db8:1::1            0    100      0 65000 ?
    UN=2001:db8:1::1 EC{192.168.1.2:2} label=1111 type=bgp, subtype=0
 *>i172.16.255.1/32  2001:db8::1              0    100      0 65000 ?
    UN=2001:db8::1 EC{192.168.1.2:2} label=1111 type=bgp, subtype=0
 *>i192.168.1.0/24   2001:db8:1::1            0    100      0 65000 ?
    UN=2001:db8:1::1 EC{192.168.1.2:2} label=1111 type=bgp, subtype=0
 *>i192.168.2.0/24   2001:db8:1::1                 100      0 65000 ?
    UN=2001:db8:1::1 EC{192.168.1.2:2} label=1111 type=bgp, subtype=0
Route Distinguisher: 192.168.2.2:2
 *> 10.0.0.0/24      192.168.2.1@4<           0     50      0 65000 ?
    UN=192.168.2.1 EC{192.168.2.2:2} label=2222 type=bgp, subtype=5
 *> 172.16.255.1/32  192.168.2.1@4<                 50      0 65000 ?
    UN=192.168.2.1 EC{192.168.2.2:2} label=2222 type=bgp, subtype=5
 *> 192.168.1.0/24   192.168.2.1@4<                 50      0 65000 ?
    UN=192.168.2.1 EC{192.168.2.2:2} label=2222 type=bgp, subtype=5
 *> 192.168.2.0/24   192.168.2.1@4<           0     50      0 65000 ?
    UN=192.168.2.1 EC{192.168.2.2:2} label=2222 type=bgp, subtype=5
Displayed  8 routes and 8 total paths
```
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
Diffstat (limited to 'bgpd/bgp_updgrp_packet.c')
| -rw-r--r-- | bgpd/bgp_updgrp_packet.c | 26 | 
1 files changed, 19 insertions, 7 deletions
diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index 9de97cf060..b52d67ed3c 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -379,10 +379,11 @@ struct stream *bpacket_reformat_for_peer(struct bpacket *pkt,  		route_map_sets_nh =  			(CHECK_FLAG(vec->flags, -				    BPKT_ATTRVEC_FLAGS_RMAP_IPV4_NH_CHANGED) -			 || CHECK_FLAG( -				 vec->flags, -				 BPKT_ATTRVEC_FLAGS_RMAP_NH_PEER_ADDRESS)); +				    BPKT_ATTRVEC_FLAGS_RMAP_IPV4_NH_CHANGED) || +			 CHECK_FLAG(vec->flags, +				    BPKT_ATTRVEC_FLAGS_RMAP_VPNV4_NH_CHANGED) || +			 CHECK_FLAG(vec->flags, +				    BPKT_ATTRVEC_FLAGS_RMAP_NH_PEER_ADDRESS));  		switch (nhlen) {  		case BGP_ATTR_NHLEN_IPV4: @@ -468,10 +469,12 @@ struct stream *bpacket_reformat_for_peer(struct bpacket *pkt,  		route_map_sets_nh =  			(CHECK_FLAG(vec->flags, -				    BPKT_ATTRVEC_FLAGS_RMAP_IPV6_GNH_CHANGED) -			 || CHECK_FLAG( +				    BPKT_ATTRVEC_FLAGS_RMAP_IPV6_GNH_CHANGED) || +			 CHECK_FLAG(  				 vec->flags, -				 BPKT_ATTRVEC_FLAGS_RMAP_NH_PEER_ADDRESS)); +				 BPKT_ATTRVEC_FLAGS_RMAP_VPNV6_GNH_CHANGED) || +			 CHECK_FLAG(vec->flags, +				    BPKT_ATTRVEC_FLAGS_RMAP_NH_PEER_ADDRESS));  		/*  		 * The logic here is rather similar to that for IPv4, the @@ -1276,6 +1279,15 @@ bpacket_vec_arr_inherit_attr_flags(struct bpacket_attr_vec_arr *vecarr,  		SET_FLAG(vecarr->entries[BGP_ATTR_VEC_NH].flags,  			 BPKT_ATTRVEC_FLAGS_RMAP_IPV6_GNH_CHANGED); +	if (CHECK_FLAG(attr->rmap_change_flags, BATTR_RMAP_VPNV4_NHOP_CHANGED)) +		SET_FLAG(vecarr->entries[BGP_ATTR_VEC_NH].flags, +			 BPKT_ATTRVEC_FLAGS_RMAP_VPNV4_NH_CHANGED); + +	if (CHECK_FLAG(attr->rmap_change_flags, +		       BATTR_RMAP_VPNV6_GLOBAL_NHOP_CHANGED)) +		SET_FLAG(vecarr->entries[BGP_ATTR_VEC_NH].flags, +			 BPKT_ATTRVEC_FLAGS_RMAP_VPNV6_GNH_CHANGED); +  	if (CHECK_FLAG(attr->rmap_change_flags,  		       BATTR_RMAP_IPV6_LL_NHOP_CHANGED))  		SET_FLAG(vecarr->entries[BGP_ATTR_VEC_NH].flags,  | 
