summaryrefslogtreecommitdiff
path: root/bgpd/bgp_mplsvpn.h
AgeCommit message (Collapse)Author
2023-09-12bgpd: fix vpn import from local vrf with no retainLouis Scalbert
The BGP "no retain" VPN option avoids storing VPN prefixes that are not imported in the incoming BGP table (aka. Adj RIB in). When a VPN import policy is changed, BGP does a soft clear so that a prefix refresh is requested from the peers. However, the import from local VPN prefixes is never requested. Fix this issue by requesting a local import refresh. Fixes: a486300b26 ("bgpd: implement retain route-target all behaviour") Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2023-08-08bgpd: bgp_path_info_extra memory optimizationValerian_He
Even if some of the attributes in bgp_path_info_extra are not used, their memory is still allocated every time. It cause a waste of memory. This commit code deletes all unnecessary attributes and changes the optional attributes to pointer storage. Memory will only be allocated when they are actually used. After optimization, extra info related memory is reduced by about half(~400B -> ~200B). Signed-off-by: Valerian_He <1826906282@qq.com>
2023-07-04bgpd: free bgp vpn policyryndia
The bgp vpn policy had some attribute not free when the function bgp_free was called leading to memory leak as shown below. ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251:Direct leak of 592 byte(s) in 2 object(s) allocated from: ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #0 0x7f4b7ae92037 in __interceptor_calloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:154 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #1 0x7f4b7aa96e38 in qcalloc lib/memory.c:105 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #2 0x7f4b7aa9bec9 in srv6_locator_chunk_alloc lib/srv6.c:135 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #3 0x56396f8e56f8 in ensure_vrf_tovpn_sid_per_af bgpd/bgp_mplsvpn.c:752 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #4 0x56396f8e608a in ensure_vrf_tovpn_sid bgpd/bgp_mplsvpn.c:846 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #5 0x56396f8e075d in vpn_leak_postchange bgpd/bgp_mplsvpn.h:259 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #6 0x56396f8f3e5b in vpn_leak_postchange_all bgpd/bgp_mplsvpn.c:3397 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #7 0x56396fa920ef in bgp_zebra_process_srv6_locator_chunk bgpd/bgp_zebra.c:3238 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #8 0x7f4b7abb2913 in zclient_read lib/zclient.c:4134 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #9 0x7f4b7ab62010 in thread_call lib/thread.c:1991 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #10 0x7f4b7aa5a418 in frr_run lib/libfrr.c:1185 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #11 0x56396f7d756d in main bgpd/bgp_main.c:505 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #12 0x7f4b7a479d09 in __libc_start_main ../csu/libc-start.c:308 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251:Direct leak of 32 byte(s) in 2 object(s) allocated from: ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #0 0x7f4b7ae92037 in __interceptor_calloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:154 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #1 0x7f4b7aa96e38 in qcalloc lib/memory.c:105 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #2 0x56396f8e31b8 in vpn_leak_zebra_vrf_sid_update_per_af bgpd/bgp_mplsvpn.c:386 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #3 0x56396f8e3ae8 in vpn_leak_zebra_vrf_sid_update bgpd/bgp_mplsvpn.c:448 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #4 0x56396f8e09b0 in vpn_leak_postchange bgpd/bgp_mplsvpn.h:271 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #5 0x56396f8f3e5b in vpn_leak_postchange_all bgpd/bgp_mplsvpn.c:3397 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #6 0x56396fa920ef in bgp_zebra_process_srv6_locator_chunk bgpd/bgp_zebra.c:3238 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #7 0x7f4b7abb2913 in zclient_read lib/zclient.c:4134 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #8 0x7f4b7ab62010 in thread_call lib/thread.c:1991 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #9 0x7f4b7aa5a418 in frr_run lib/libfrr.c:1185 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #10 0x56396f7d756d in main bgpd/bgp_main.c:505 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #11 0x7f4b7a479d09 in __libc_start_main ../csu/libc-start.c:308 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251:Direct leak of 32 byte(s) in 2 object(s) allocated from: ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #0 0x7f4b7ae92037 in __interceptor_calloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:154 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #1 0x7f4b7aa96e38 in qcalloc lib/memory.c:105 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #2 0x56396f8e5730 in ensure_vrf_tovpn_sid_per_af bgpd/bgp_mplsvpn.c:753 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #3 0x56396f8e608a in ensure_vrf_tovpn_sid bgpd/bgp_mplsvpn.c:846 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #4 0x56396f8e075d in vpn_leak_postchange bgpd/bgp_mplsvpn.h:259 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #5 0x56396f8f3e5b in vpn_leak_postchange_all bgpd/bgp_mplsvpn.c:3397 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #6 0x56396fa920ef in bgp_zebra_process_srv6_locator_chunk bgpd/bgp_zebra.c:3238 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #7 0x7f4b7abb2913 in zclient_read lib/zclient.c:4134 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #8 0x7f4b7ab62010 in thread_call lib/thread.c:1991 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #9 0x7f4b7aa5a418 in frr_run lib/libfrr.c:1185 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #10 0x56396f7d756d in main bgpd/bgp_main.c:505 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- #11 0x7f4b7a479d09 in __libc_start_main ../csu/libc-start.c:308 ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251- ./bgp_srv6l3vpn_to_bgp_vrf.test_bgp_srv6l3vpn_to_bgp_vrf/r2.bgpd.asan.603251-SUMMARY: AddressSanitizer: 656 byte(s) leaked in 6 allocation(s). Signed-off-by: ryndia <dindyalsarvesh@gmail.com>
2023-06-20Merge pull request #13750 from louis-6wind/fix-no-retain-memory-usageRuss White
bgpd: fix memory usage of vpn no retain
2023-06-16bgpd: cleanup un-imported vpn prefix if no retain setLouis Scalbert
After some VRF imports are removed and "no bgp retain route-target all" is set, prefixes that are not imported anymore remain in the BGP table. Parse the BGP table and remove un-imported prefixes in such a case. Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2023-06-16bgpd: fix memory usage of vpn no retainLouis Scalbert
By default, bgpd stores all MPLS VPN SAFI prefixes unless the "no bgp retain route-target all" option is used to store only prefixes that are imported into local VRFs. The "no retain" option temporarily uses too much memory, as all prefixes are stored in memory before the deletion of non-imported prefixes is done. Filter out non-imported prefixes before they are set into the BGP adj RIB out. Fixes: a486300b26 ("bgpd: implement retain route-target all behaviour") Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2023-06-16bgpd: revert no retain backendLouis Scalbert
Partially revert a486300b26 ("bgpd: implement retain route-target all behaviour") in order to fix a memory consumption issue in the next commit. Fixes: a486300b26 ("bgpd: implement retain route-target all behaviour") Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2023-06-16bgpd: add 'show bgp mplsvpn-nh-label-bind' commandLouis Scalbert
There is no 'show command' to use for troubleshooting purposes. Add a new show command to dump the cache entry of the MPLS VPN nexthop label bind cache table. > show bgp [vrf NAME] mplsvpn-nh-label-bind [detail] The below command illustrates its output: > dut# show bgp mplsvpn-nh-label-bind detail > Current BGP mpls-vpn nexthop label bind cache, VRF default > 192.168.1.3, label 102, local label 18 #paths 3 > interface r2-eth1 > Last update: Mon May 22 14:39:42 2023 > Paths: > 1/3 172.31.3.0/24 VRF default flags 0x418 > 1/3 172.31.2.0/24 VRF default flags 0x418 > 1/3 172.31.1.0/24 VRF default flags 0x418 > 192.0.2.1, label 101, local label 19 #paths 1 > interface r2-eth0 > Last update: Mon May 22 14:39:43 2023 > Paths: > 1/3 172.31.0.0/24 VRF default flags 0x418 Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com> Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-06-16bgpd: update the mpls entry to handle return trafficPhilippe Guibert
When advertising an mpls vpn entry with a new label, the return traffic is redirected to the local machine, but the MPLS traffic is dropped. Add an MPLS entry to handle MPLS packets which have the new label value. Traffic is swapped to the original label value from the mpls vpn next-hop entry; then it is sent to the resolved next-hop of the original next-hop from the mpls vpn next-hop entry. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-06-16bgpd: advertise mpls vpn routes with appropriate labelPhilippe Guibert
The advertised label value from mpls vpn routes is not modified when the advertised next-hop is modified to next-hop-self. Actually, the original label value received is redistributed as is, whereas the new_label value bound in the nexthop label bind entry should be used. Only the VPN entries that contain MPLS information, and that are redistributed between distinct peers, will have a label value to advertise. - no SRv6 attribute - no local prefix - no exported VPN prefixes from a VRF If the advertisement to a given peer has the next-hop modified, then the new label value will be picked up. The considered cases are peers configured with 'next-hop-self' option, or ebgp peerings without the 'next-hop-unchanged' option. Note that the the NLRI format will follow the rfc3107 format, as multiple label values for MPLS VPN NLRIs are not supported (the rfc8277 is not supported). Note also that the case where an outgoing route-map is applied to the outgoing neighbor is not considered in this commit. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-06-16bgpd: allocate label bound to received mpls vpn routesPhilippe Guibert
Current implementation does not offer a new label to bind to a received VPN route entry to redistribute with that new label. This commit allocates a label for VPN entries that have a valid label, and a reachable next-hop interface that is configured as follows: > interface eth0 > mpls bgp l3vpn-multi-domain-switching > exit An mplsvpn next-hop label binding entry is created in an mpls vpn nexthop label bind hash table of the current BGP instance. That mpls vpn next-hop label entry is indexed by the (next-hop, orig_label) values provided by the incoming updates, and shared with other updates having the same (next-hop, orig_label) values. A new 'LP_TYPE_BGP_L3VPN_BIND' label value is picked up from the zebra mpls label pool, and assigned to the new_label attribute. The 'bgp_path_info' appends a 'bgp_mplsvpn_nh_label_bind' structure to the 'mplsvpn' union structure. Both structures in the union are not used at the same, as the paths are either VRF updates to export, or MPLS VPN updates. Using an union gives a 24 bytes memory gain compared to if the structures had not been in an union (24 bytes compared to 48 bytes). Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-06-16bgpd: add mpls vpn nh label bind cache struct and apisLouis Scalbert
In the context of the ASBR facing an EBGP neighbor, or facing an IBGP neighbor where the BGP updates received are re-advertised with a modified next-hop, a new local label will be re-advertised too, to replace the original one. Create a binding table, in the form of a hash list, from the original labels to the new labels. Since labels can be the same on several routers, set the next-hop and the label as the keys. Add the needed API functions to manage the hash list. Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com> Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-05-09bgpd: add support for l3vpn per-nexthop labelPhilippe Guibert
This commit introduces a new method to associate a label to prefixes to export to a VPNv4 backbone. All the methods to associate a label to a BGP update is documented in rfc4364, chapter 4.3.2. Initially, the "single label for an entire VRF" method was available. This commit adds "single label for each attachment circuit" method. The change impacts the control-plane, because each BGP update is checked to know if the nexthop has reachability in the VRF or not. If this is the case, then a unique label for a given destination IP in the VRF will be picked up. This label will be reused for an other BGP update that will have the same nexthop IP address. The change impacts the data-plane, because the MPLs pop mechanism applied to incoming labelled packets changes: the MPLS label is popped, and the packet is directly sent to the connected nexthop described in the previous outgoing BGP VPN update. By default per-vrf mode is done, but the user may choose the per-nexthop mode, by using the vty command from the previous commit. In the latter case, a per-vrf label will however be allocated to handle networks that are not directly connected. This is the case for local traffic for instance. The change also include the following: - ECMP case In case a route is learnt in a given VRF, and is resolved via an ECMP nexthop. This implies that when exporting the route as a BGP update, if label allocation per nexthop is used, then two possible MPLS values could be picked up, which is not possible with the current implementation. Actually, the NLRI for VPNv4 stores one prefix, and one single label value, not two. Today, RFC8277 with multiple label capability is not yet available. To avoid this corner case, when a route is resolved via more than one nexthop, the label allocation per nexthop will not apply, and the default per-vrf label will be chosen. Let us imagine BGP redistributes a static route using the `172.31.0.20` nexthop. The nexthop resolution will find two different nexthops fo a unique BGP update. > r1# show running-config > [..] > vrf vrf1 > ip route 172.31.0.30/32 172.31.0.20 > r1# show bgp vrf vrf1 nexthop > [..] > 172.31.0.20 valid [IGP metric 0], #paths 1 > gate 192.0.2.11 > gate 192.0.2.12 > Last update: Mon Jan 16 09:27:09 2023 > Paths: > 1/1 172.31.0.30/32 VRF vrf1 flags 0x20018 To avoid this situation, BGP updates that resolve over multiple nexthops are using the unique per-vrf label. - recursive route case Prefixes that need a recursive route to be resolved can also be eligible for mpls allocation per nexthop. In that case, the nexthop will be the recursive nexthop calculated. To achieve this, all nexthop types in bnc contexts are valid, except for the blackhole nexthops. - network declared prefixes Nexthop tracking is used to look for the reachability of the prefixes. When the the 'no bgp network import-check' command is used, network declared prefixes are maintained active, even if there is no active nexthop. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-05-03Revert "MPLS allocation mode per next hop"Donatas Abraitis
Broken tests, let's revert now. Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2023-03-22bgpd: add support for l3vpn per-nexthop labelPhilippe Guibert
This commit introduces a new method to associate a label to prefixes to export to a VPNv4 backbone. All the methods to associate a label to a BGP update is documented in rfc4364, chapter 4.3.2. Initially, the "single label for an entire VRF" method was available. This commit adds "single label for each attachment circuit" method. The change impacts the control-plane, because each BGP update is checked to know if the nexthop has reachability in the VRF or not. If this is the case, then a unique label for a given destination IP in the VRF will be picked up. This label will be reused for an other BGP update that will have the same nexthop IP address. The change impacts the data-plane, because the MPLs pop mechanism applied to incoming labelled packets changes: the MPLS label is popped, and the packet is directly sent to the connected nexthop described in the previous outgoing BGP VPN update. By default per-vrf mode is done, but the user may choose the per-nexthop mode, by using the vty command from the previous commit. In the latter case, a per-vrf label will however be allocated to handle networks that are not directly connected. This is the case for local traffic for instance. The change also include the following: - ECMP case In case a route is learnt in a given VRF, and is resolved via an ECMP nexthop. This implies that when exporting the route as a BGP update, if label allocation per nexthop is used, then two possible MPLS values could be picked up, which is not possible with the current implementation. Actually, the NLRI for VPNv4 stores one prefix, and one single label value, not two. Today, RFC8277 with multiple label capability is not yet available. To avoid this corner case, when a route is resolved via more than one nexthop, the label allocation per nexthop will not apply, and the default per-vrf label will be chosen. Let us imagine BGP redistributes a static route using the `172.31.0.20` nexthop. The nexthop resolution will find two different nexthops fo a unique BGP update. > r1# show running-config > [..] > vrf vrf1 > ip route 172.31.0.30/32 172.31.0.20 > r1# show bgp vrf vrf1 nexthop > [..] > 172.31.0.20 valid [IGP metric 0], #paths 1 > gate 192.0.2.11 > gate 192.0.2.12 > Last update: Mon Jan 16 09:27:09 2023 > Paths: > 1/1 172.31.0.30/32 VRF vrf1 flags 0x20018 To avoid this situation, BGP updates that resolve over multiple nexthops are using the unique per-vrf label. - recursive route case Prefixes that need a recursive route to be resolved can also be eligible for mpls allocation per nexthop. In that case, the nexthop will be the recursive nexthop calculated. To achieve this, all nexthop types in bnc contexts are valid, except for the blackhole nexthops. - network declared prefixes Nexthop tracking is used to look for the reachability of the prefixes. When the the 'no bgp network import-check' command is used, network declared prefixes are maintained active, even if there is no active nexthop. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-02-09*: auto-convert to SPDX License IDsDavid Lamparter
Done with a combination of regex'ing and banging my head against a wall. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2023-02-06bgpd: Drop struct bgp from vpn_leak_to_vrf_withdraw()Donatas Abraitis
Not used at all, just drop it. Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2022-10-18bgpd: Add `no sid vpn per-vrf export` commandCarmine Scarpitta
The command `sid vpn per-vrf export (1-255)|auto` can be used to export IPv4 and IPv6 routes from a VRF to the VPN RIB using a single SRv6 SID (End.DT46 behavior). This commit implements the no form of the above command, which can be used to disable the export of the IPv4/IPv6 routes: `no sid vpn per-vrf export`. Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
2022-10-18bgpd: add support for per-VRF SRv6 SIDCarmine Scarpitta
In the current implementation of bgpd, SRv6 SIDs can be configured only under the address-family. This enables bgpd to leak IPv6 routes using an SRv6 End.DT6 behavior and IPv4 routes using an SRv6 End.DT4 behavior. It is not possible to leak both IPv6 and IPv4 routes using a single SRv6 SID. This commit adds a new CLI command "sid vpn per-vrf export <sid_idx|auto>" that enables bgpd to leak both IPv6 and IPv4 routes using a single SRv6 SID (End.DT46 behavior). Signed-off-by: Carmine Scarpitta <carmine.scarpitta@uniroma2.it>
2022-10-12bgpd: Implement ACCEPT_OWN extended communityDonatas Abraitis
TL;DR: rfc7611. Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2022-10-07bgpd: allocate SID according to Function lengthRyoga Saito
Allocate SID according to Function length to eliminate old SID allocation limits (255). Signed-off-by: Ryoga Saito <ryoga.saito@linecorp.com>
2022-07-26Merge pull request #11523 from pguibert6WIND/bgp_no_retainRuss White
Bgp no retain
2022-07-18bgpd: Add constants for some repetitive CLI stringsDonatas Abraitis
"Address Family\n" "Address Family modifier\n" Before: ``` donatas-laptop(config-router)# address-family ipv4 <cr> flowspec Address Family Modifier labeled-unicast Address Family modifier multicast Address Family modifier unicast Address Family Modifier vpn Address Family modifier ``` After: ``` donatas-laptop(config-router)# address-family ipv4 Address Family ipv6 Address Family l2vpn Address Family donatas-laptop(config-router)# address-family ipv4 <cr> flowspec Address Family modifier labeled-unicast Address Family modifier multicast Address Family modifier unicast Address Family modifier vpn Address Family modifier ``` Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2022-07-18bgpd: implement retain route-target all behaviourPhilippe Guibert
A new command is available under SAFI_MPLS_VPN: With this command, the BGP vpnvx prefixes received are not kept, if there are no VRF interested in importing those vpn entries. A soft refresh is performed if there is a change of configuration: retain cmd, vrf import settings, or route-map change. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2022-07-11bgpd: rename "struct bgp" variables in mplsvpnLouis Scalbert
The "struct bgp" variable names in the mplsvpn bgp code do not explicitly say whether they refer to a source or destination BGP instance. Some variable declarations are commented out with "from" and "to" but this does not avoid confusion within the functions. The names of "struct bgp" variables are reused in different functions but their names sometimes refer to a source instance and sometimes to a destination instance. Rename the "struct bgp" variable names to from_bgp and to_bgp. Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2022-04-12bgpd: Convert vpn_policy_direction_t to enumDonatas Abraitis
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2022-02-25bgpd: change the treatment for SRv6 routesRyoga Saito
This patch adds transpostion_offset and transposition_len to bgp_sid_info, and transposes SID only at bgp_zebra_announce. Signed-off-by: Ryoga Saito <ryoga.saito@linecorp.com>
2021-09-21Merge pull request #9546 from proelbtn/add-support-for-perfix-sid-type-5Russ White
Add support for Prefix-SID (Type 5)
2021-09-07bgpd: handle srv6 locator notification and update vpn-ribHiroki Shirokura
Signed-off-by: Hiroki Shirokura <slank.dev@gmail.com>
2021-09-03bgpd: introduce new alloc algorithm for SRv6 SIDRyoga Saito
Current implementation of SRv6 SID allocation algorithm sets most least 2 bytes. But, according to RFC8986, function bits is located in the next to locator. New allocation alogirithm respects this format. Signed-off-by: Ryoga Saito <contact@proelbtn.com>
2021-06-02*: fix code format accourding to checkpatchHiroki Shirokura
Signed-off-by: Hiroki Shirokura <slank.dev@gmail.com>
2021-06-02bgpd: cli for SRv6 SID alloc to redirect to vrf (step4)Hiroki Shirokura
This commit add cil to configure BGP SRv6-VPN sid allocation. Almost mechanism are based on BGP MPLS-VPN. User can allocate and export sid with using following config. Then bgpd try to allocate new SID to redirect vpn to vrf using SRv6 localsid End.DT4/DT6. Currently linux kernel will regect End.DT4 route install due to no-implementation. (at-least today's FRR's ci kernel.) So now we only supports BGP SRv6-VPNv6. router bgp 1 segment-routing srv6 locator loc1 ! address-family ipv6 vpn exit-address-family ! router bgp 1 vrf vrf10 address-family ipv6 unicast sid vpn export 1 !!(option1)!! sid vpn export auto !!(option2)!! exit-address-family ! Signed-off-by: Hiroki Shirokura <slank.dev@gmail.com>
2021-02-02bgpd: add utility to check if a vrf is MPLS VPNPat Ruddy
If a vrf is exporting to a vpn table and/or importing to a vpn table then it is assumed t be a MPLS VPN vrf. Signed-off-by: Pat Ruddy <pat@voltanet.io>
2020-10-03bgpd: convert global config to transactional cliChirag Shah
Convert global congigurations clis to transactional clis using northbound plugin callbacks. Signed-off-by: Chirag Shah <chirag@nvidia.com>
2020-06-23bgp: rename bgp_node to bgp_destDonald Sharp
This is the bulk part extracted from "bgpd: Convert from `struct bgp_node` to `struct bgp_dest`". It should not result in any functional change. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-06-17bgpd: router bgp export leaked vpn routesChirag Shah
two bgp vrf instance has vrf route leak configured, when a source vrf x is deleted, its leaked routes are cleaned up from the destination and vpn table. With this change when a source bgp instance is reconfigured, export its routes back to destination vrfs where it is configured as leak. Ticket:CM-20534 CM-24484 Reviewed By: Testing Done: configure vrf leak between two vrf intances, delete and readd source vrf and checked its routes exported to vpn table and leaked vrfs table. Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-06-17bgpd: no router bgp cleanup vrf leaked vpn routesChirag Shah
A VRF leak is configured between two vrfs, bgp VRF X and VRF Y. When a bgp VRF X is removed, unimport bgp VRF X routes from VPN and VRF Y. If VRF X is also importing from bgp VRF Y, remove X from export list of Y and do required route cleanup. Ticket:CM-20534 CM-24484 Reviewed By: Testing Done: Before deleteing vrf1002: nl1# show ip route vrf vrf1003 9.9.2.4/32 Routing entry for 9.9.2.4/32 Known via "bgp", distance 200, metric 0, vrf vrf1003, best Last update 00:04:51 ago * 200.2.8.2, via swp1.2(vrf vrf1002) * 200.2.9.2, via swp2.2(vrf vrf1002) * 200.2.10.2, via swp3.2(vrf vrf1002) Instance vrf1003: This VRF is importing IPv4 Unicast routes from the following VRFs: vrf1002 Import RT(s): 6.0.2.9:2 This VRF is exporting IPv4 Unicast routes to the following VRFs: vrf1002 RD: 6.0.3.9:3 Export RT: 6.0.3.9:3 After deleting vrf1002: nl1(config)# no router bgp 64902 vrf vrf1002 nl1# show ip route vrf vrf1003 9.9.2.4/32 Routing entry for 9.9.2.4/32 Known via "bgp", distance 20, metric 0, vrf vrf1003, best Last update 00:00:32 ago * 200.3.8.2, via swp1.3 * 200.3.9.2, via swp2.3 * 200.3.10.2, via swp3.3 Instance vrf1003: This VRF is importing IPv4 Unicast routes from the following VRFs: vrf1002 Import RT(s): This VRF is not exporting IPv4 Unicast routes to any other VRF nl1# show bgp ipv4 vpn No BGP prefixes displayed, 0 exist Readd vrf1002: points back to source vrf nl1# show ip route vrf vrf1003 9.9.2.4/32 Routing entry for 9.9.2.4/32 Known via "bgp", distance 200, metric 0, vrf vrf1003, best Last update 00:00:21 ago * 200.2.8.2, via swp1.2(vrf vrf1002) * 200.2.9.2, via swp2.2(vrf vrf1002) * 200.2.10.2, via swp3.2(vrf vrf1002) Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-06-12bgpd: auto router-id should not change configured vpn RD/RTMark Stapp
A router-id change that isn't explicitly configured (a change from zebra, for example) should not replace a configured vpn RD/RT. Signed-off-by: Mark Stapp <mjs@voltanet.io>
2019-04-02Merge pull request #3931 from chiragshah6/evpn_dev1Russ White
bgpd: vrf route-leak router-id change reflect to vpn auto rd rt
2019-03-11bgpd: router-id change reflect to vpn auto rd rtChirag Shah
VRF route leak auto RD and RT uses router-id, when a router-id changes for a bgp instance, change associated vpn RD and RT values. Withdraw old RD/RT routes from vpn and with new RD/RT values advertise new routes to vpn. One of the sceanrio is restarting frr: A router-id change may not have reflected for bgp vrf instance X, while import vrf X under bgp vrf instance Y. Once router-id changes for bgp VRF X, change RD and RTs from export VRF and imported VRFs. Readvertise routes with new values to VPN. Ticket:CM-24149 Reviewed By:CCR-8394 Testing Done: Validated via configured multiple bgp VRF instances and enable route leaks among them, restart frr and all instance received correct RD and RT values. Checked 'show bgp vrf all ipv4 unicast route-leak' and vpn table 'show bgp ipv4 vpn all' output. Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-03-01bgpd: Correctly identify VPN-imported routes in a VRFvivek
Refine check that looks for VPN routes imported into a VRF because a VRF can have other imported routes too like IPv4 and IPv6 unicast routes sourced from EVPN type-2 and type-5 routes. Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com> Reviewed-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com> Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-02-28bgpd: Refine check for which routes can be exported into VPNvivek
A non-imported route or a non-VPN imported route is a candidate to be exported into the VPN routing table for leaking to other BGP instances or advertisement into BGP/MPLS VPN. The former is a local or learnt IPv4 or IPv6 route. The latter is an IPv4 or IPv6 route that is based on a received EVPN type-2 or type-5 route. Implement a function to specify if a route can be exported into VPN and use in the appropriate places. Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com> Reviewed-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com> Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-10-09bgpd: Rename various variable names to something more appropriateDonald Sharp
ri -> pi bi -> bpi info -> path info -> rmap_path ( for routemap applications ) Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-10-09bgpd: Convert `struct bgp_info` to `struct bgp_path_info`Donald Sharp
Do a straight conversion of `struct bgp_info` to `struct bgp_path_info`. This commit will setup the rename of variables as well. This is being done because `struct bgp_info` is not descriptive of what this data actually is. It is path information for routes that we keep to build the actual routes nexthops plus some extra information. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-08-30bgpd/ospfd: make bgp and ospf json response a bit more consistentDon Slice
Problem reported that some bgp and ospf json commands did not return any json output at all if the bgp/ospf instance did not exist. Additionally, some bgp and ospf json commands did not return any json output if the instance existed but no neighbors were defined. This fix makes these commands more consistent in returning empty braces for json output and issue a message if not using json output. Additionally, made the flag "use_json" a bool to make it consistent since previously, it had been defined as an int, char, u_char, and bool at various places. Ticket: CM-21040 Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2018-08-14bgpd: issues with vrf imports when switchd or networking restartedDon Slice
Problem reported that when systemctl restart networking or switchd performed, not all imported prefixes were successfully restored. Ticket: CM-21684 Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2018-06-30bgpd: fix NULL dereference in vrf-vpn leak config if before default instanceG. Paul Ziemba
Issue 2473 VRF-VPN route-leaking configuration commands assumed existence of default bgp instance. If a non-default vrf configuration occurred before the default vrf configuration, it would result in a (NULL) dereference to the non-existent default vrf. This change 1) detects non-existence of default vrf and skips corresponding RIB updating that normally occurs during configuration changes of the route-leaking parameters; and 2) when the default bgp instance is defined, runs the deferred RIB updating. In vpn_leak_to_vrf_update_all(), replace early return if bgp_vpn is NULL with assert, as the former would lead to subtly wrong RIB contents. The underlying issue that led to commit 73aed5841a1fe31e8a1f251dfcf87e1f2b1f2463 should be fixed by the above changes. Signed-off-by: G. Paul Ziemba <paulz@labn.net>
2018-04-25bgpd: Add some vrf <-> vrf code commentsDonald Sharp
Note that when we are importing vrf EVA into vrf DONNA we must keep track of all the vrfs EVA is being exported into and we must also keep track of all the vrf's that DONNA is receiving data from as well. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-04-25bgpd: Fixes for VRF route leakingvivek
Implement fixes for route leaking between VRFs through BGP, especially for the scenario where routes are leaked from a VRF X to multiple other VRFs. This include making sure that import and export happen via the global VPN table, setting RD correctly and proper handling for multiple import/export. Ticket: CM-20256 Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com> Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
2018-04-25bgpd: Implement vrf - vrf route leaking cliDonald Sharp
add the `import vrf XXXX` command router bgp 4 vrf DONNA <config> ! router bgp 4 vrf EVA <config> address-family ipv4 uni import vrf DONNA ! ! This command will allow for vrf EVA to specify that it would like to receive the routes from vrf DONNA into it's table. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>