summaryrefslogtreecommitdiff
path: root/bgpd/bgp_mplsvpn.h
AgeCommit message (Collapse)Author
2025-03-24bgpd: fix do not export VPN prefix when no SID available on the VRFPhilippe Guibert
When detaching the locator from the main BGP instance, the used SIDs and locators are removed from the srv6 per-afi or per-vrf contects. Under those conditions, it is not possible to attempt to export new VPN updates. Do invalidate the nexthop for leaking. Restrict the control for exported VPN prefixes and not for unicast imported prefixes. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2025-01-08bgpd: Respect allowas-in value from the source VRF's peerDonatas Abraitis
If the peer which has allowas-in enabled and then reimports the routes to another local VRF, respect that value. This was working with < 10.2 releases. Fixes: d4426b62d221f4e15810dbe578de05df8991c991 ("bgpd: copy source vrf ASN to leaked route and block loops") Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-12-16bgpd: Releasing the label in bgp_delete flowvaruntumbe
Releasing the vpn label from label pool chunk using bgp_lp_release routine whenever vpn session is removed. bgp_lp_release will clear corresponding bit in the allocated map of the label pool chunk and increases nfree by 1 Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2024-09-05bgpd: Make `sid_register()` non-staticCarmine Scarpitta
Make the `sid_register()` function non-static to allow other BGP modules (e.g. bgp_zebra.c) to register SIDs. Signed-off-by: Carmine Scarpitta <cscarpit@cisco.com>
2024-04-18bgpd: do allocate vrf label only when necessaryPhilippe Guibert
Today, with the following bgp instance configured, the local VRF label is allocated even if it is not used. > router bgp 65500 vrf vrf1 > address-family ipv4 unicast > label vpn export allocation-mode per-nexthop > label vpn export auto > rd vpn export 444:1 > rt vpn both 52:100 > export vpn > import vpn The 'show mpls table' indicates that the 16 label value is allocated, but never used in the exported prefixes. > r1# show mpls table > Inbound Label Type Nexthop Outbound Label > ----------------------------------------------------- > 16 BGP vrf1 - > 17 BGP 192.168.255.13 - > 18 BGP 192.0.2.12 - > 19 BGP 192.0.2.11 - Fix this by only allocating new label values when really used. Consequently, only 3 labels will be allocated instead of previously 4. > r1# show mpls table > Inbound Label Type Nexthop Outbound Label > ----------------------------------------------------- > 16 BGP 192.168.255.13 - > 17 BGP 192.0.2.11 - > 18 BGP 192.0.2.12 - Fixes: 577be36a41be ("bgpd: add support for l3vpn per-nexthop label") Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-11-21bgpd: fix export prefixes when rt extcomm set by route-mapPhilippe Guibert
When exporting BGP prefixes, it is necessary to configure the route target extended communities with the following command: > rt vpn export <RouteTarget> But the customer may need to configure the route-target to apply to bgp updates, solely based on a route-map criterium. by using the below route-map configured like that: > route-map vpn export <routemapname> Fix this by allowing to export bgp updates based on the presence of route-targets on either route-map or vpn configured rt. the exportation process is stopped if no route target is available in the ecommunity list. Fixes: ddb5b4880ba8 ("bgpd: vpn-vrf route leaking") Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2023-10-18bgpd: fix hardset l3vpn label available in mpls poolPhilippe Guibert
Today, when configuring BGP L3VPN mpls, the operator may use that command to hardset a label value: > router bgp 65500 vrf vrf1 > address-family ipv4 unicast > label vpn export <hardset_label_value> Today, BGP uses this value without checks, leading to potential conflicts with other control planes like LDP. For instance, if LDP initiates with a label chunk of [16;72] and BGP also uses the 50 label value, a conflict arises. The 'label manager' service in zebra oversees label allocations. While all the control plane daemons use it, BGP doesn't when a hardset label is in place. This update fixes this problem. Now, when a hardset label is set for l3vpn export, a request is made to the label manager for approval, ensuring no conflicts with other daemons. But, this means some existing BGP configurations might become non-operational if they conflict with labels already allocated to another daemon but not used. note: Labels below 16 are reserved and won't be checked for consistency by the label manager. Fixes: ddb5b4880ba8 ("bgpd: vpn-vrf route leaking") Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
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>