Commit Graph

7559 Commits

Author SHA1 Message Date
Donatas Abraitis
babb23b748 bgpd: Prevent from one more CVE triggering this place
If we receive an attribute that is handled by bgp_attr_malformed(), use
treat-as-withdraw behavior for unknown (or missing to add - if new) attributes.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-29 09:13:11 +02:00
Donatas Abraitis
ba6a8f1a31 bgpd: Fix error handling when receiving BGP Prefix SID attribute
Without this patch, we always set the BGP Prefix SID attribute flag without
checking if it's malformed or not. RFC8669 says that this attribute MUST be discarded.

Also, this fixes the bgpd crash when a malformed Prefix SID attribute is received,
with malformed transitive flags and/or TLVs.

Reported-by: Iggy Frankovic <iggyfran@amazon.com>
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-28 17:26:00 +02:00
Russ White
67aaa4b076
Merge pull request #15525 from venko-networks/ccs/bugfix/show-ip-bgp
bgpd: add missing white-space between route short status and network …
2024-03-26 10:04:43 -04:00
Russ White
94e6a0f0c1
Merge pull request #15524 from raja-rajasekar/rajasekarr/backpressure_bgp_zebra_client
backpressure bgp zebra client
2024-03-26 10:03:35 -04:00
Donald Sharp
ccfe452763 bgpd : backpressure - Handle BGP-Zebra Install evt Creation
BGP is now keeping a list of dests with the dest having a pointer
to the bgp_path_info that it will be working on.

1) When bgp receives a prefix, process it, add the bgp_dest of the
prefix into the new Fifo list if not present, update the flags (Ex:
earlier if the prefix was advertised and now it is a withdrawn),
increment the ref_count and DO NOT advertise the install/withdraw
to zebra yet.

2) Schedule an event to wake up to invoke the new function which will
walk the list one by one and installs/withdraws the routes into zebra.
  a) if BUFFER_EMPTY, process the next item on the list
  b) if BUFFER_PENDING, bail out and the callback in
  zclient_flush_data() will invoke the same function when BUFFER_EMPTY

Changes
 - rename old bgp_zebra_announce to bgp_zebra_announce_actual
 - rename old bgp_zebra_withdrw to bgp_zebra_withdraw_actual
 - Handle new fifo list cleanup in bgp_exit()
 - New funcs: bgp_handle_route_announcements_to_zebra() and
   bgp_zebra_route_install()
 - Define a callback function to invoke
   bgp_handle_route_announcements_to_zebra() when BUFFER_EMPTY in
   zclient_flush_data()

The current change deals with bgp installing routes via
bgp_process_main_one()

Ticket: #3390099

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com>
2024-03-25 17:49:35 -07:00
Donald Sharp
5f379bebe8 bgpd: backpressure - cleanup bgp_zebra_XX func args
Since installing/withdrawing routes into zebra is going to be changed
around to be dest based in a list,
 - Retrieve the afi/safi to use based upon the dest's afi/safi
   instead of passing it in.
 - Prefix is known by the dest. Remove this arg as well

Ticket: #3390099

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com>
2024-03-25 14:30:18 -07:00
Donald Sharp
705fed7ca8 bgpd: backpressure - Add a typesafe list for Zebra Announcement
Modify the bgp master to hold a type safe list for bgp_dests that need
to be passed to zebra.

Future commits will use this.

Ticket: #3390099

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com>
2024-03-25 14:23:53 -07:00
Donatas Abraitis
874242f129 *: Add missing SPDX-License-Identifier for some .c/.h files
Adding them as others: GPL-2.0-or-later

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-21 16:46:58 +02:00
Donatas Abraitis
08c56b40b6
Merge pull request #15574 from chiragshah6/fdev2
bgpd: do not del peer upon pg remote as change
2024-03-20 23:07:22 +02:00
Donatas Abraitis
551656709e bgpd: Drop periodic merge check functions
Not used anymore. There is triggered merge check, not periodic.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-20 16:44:13 +02:00
Cassiano Campes
f3dd00510f bgpd: add missing white-space between route short status and network columns
When running `show ip bgp` command, the 'route short status' and
    'network' columns do not have white-space between them.

    Old show:
        Network          Next Hop            Metric LocPrf Weight Path
     *>i1.1.1.1/32       10.1.12.111              0    100      0 i

    New show:
         Network          Next Hop            Metric LocPrf Weight Path
     *>i 1.1.1.1/32       10.1.12.111              0    100      0 i

    Added white-space to enhance readability between them.

Signed-off-by: Cassiano Campes   <cassiano.campes@venkonetworks.com>
2024-03-19 16:36:14 -03:00
Russ White
8341f6464c
Merge pull request #15558 from opensourcerouting/fix/bgp_dynamic_neighbors_default_advertise
bgpd: Update default-originate route-map actual map structure
2024-03-19 10:25:29 -04:00
Russ White
80c8e10f5d
Merge pull request #15533 from opensourcerouting/fix/add_paths_limit_capability_test
bgpd: Add tests for Paths-Limit capability
2024-03-19 10:18:44 -04:00
Chirag Shah
6b96dcf80e bgpd: do not del peer upon pg remote as change
Currently, when peer-group remote-as is removed, it
deletes all associated neighbors.
Upon re configuring peer-group remote-as, all neighbors
needs to be reconfigured.

Instead, when peer-group remote-as is remove,
cease associated peer's connection and keep in Idle state.
When the peer-group remote-as is (re)configured, trigger
BGP Peer FSM to form neighbor.
Note the connection will be initiated after start timer
expiry.

Ticket: #3828243
Testing:

----- Peers start config ----

router bgp 65566
 bgp router-id 27.0.0.5
 bgp bestpath as-path multipath-relax
 neighbor fabric peer-group
 neighbor fabric remote-as external >>>>
 neighbor swp1 interface peer-group fabric
 neighbor swp1 advertisement-interval 0
 neighbor swp1 timers 3 9
 neighbor swp1 timers connect 10
 neighbor swp2 interface peer-group fabric
 neighbor swp2 advertisement-interval 0
 neighbor swp2 timers 3 9

tor(config)# router bgp 65566
tor(config-router)# no neighbor fabric remote-as external

----- Peers are retained in config ----
router bgp 65566
 bgp router-id 27.0.0.5
 bgp bestpath as-path multipath-relax
 neighbor fabric peer-group
 neighbor swp1 interface peer-group fabric
 neighbor swp1 advertisement-interval 0
 neighbor swp1 timers 3 9
 neighbor swp1 timers connect 10
 neighbor swp2 interface peer-group fabric
 neighbor swp2 advertisement-interval 0
 neighbor swp2 timers 3 9

----- Peers are in idle state ----
Neighbor        V  AS  MsgRcvd MsgSent TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
spine-1(swp1)   4   0       52      34      0    0    0 00:00:04         Idle        0 N/A
spine-3(swp2)   4   0       52      34      0    0    0 00:00:04         Idle        0 N/A

tor(config)# router bgp 65566
tor(config-router)# neighbor fabric remote-as external

---- after connect timer expiry forms the neighbor ----

Neighbor       V    AS MsgRcvd MsgSent TblVer InQ OutQ  Up/Down State/PfxRcd  PfxSnt Desc
spine-1(swp1)  4 64435     784     749      0   0    0 00:35:10           11       2 N/A
spine-3(swp2)  4 64435     784     749      0   0    0 00:35:10           11       2 N/A

Signed-off-by: Chirag Shah <chirag@nvidia.com>
2024-03-18 15:36:41 -07:00
Donatas Abraitis
5e420114e1
Merge pull request #15520 from donaldsharp/bgp_dest_dev_build
bgpd: When using dev build add pointer information to %pBD
2024-03-18 22:49:27 +02:00
Donatas Abraitis
0ecea59c13
Merge pull request #15553 from fdumontet6WIND/as_path_loop
bgpd: make as-path-loop-detection conform to the framework
2024-03-18 10:54:21 +02:00
Donatas Abraitis
4f1e2dcd7a bgpd: Update default-originate route-map actual map structure
If using with `bgp listen range ... peer-group x`, default_rmap[afi][safi] is not
updated, and after the hard-reset in other side, this is flushed and never updated
again without restarting the sender BGP daemon.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-15 13:49:06 +02:00
Francois Dumontet
11d6560104 bgpd: make as-path-loop-detection conform to the framework
currently:
when as-path-loop-detection is set on a peer-group.
members of the peer-group are not using that functionnality.

analysis:
the as-path-loop-detection, is not using the peer's flags
related framework.

fix:
use the peer's flag framework for as-path-loop-detection.

Signed-off-by: Francois Dumontet <francois.dumontet@6wind.com>
2024-03-14 14:30:51 +01:00
Donald Sharp
bc265804ca bgpd: Add some missing data to show bgp attribute-info
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-14 06:51:45 -04:00
Donald Sharp
894cb4f689 bgpd: When using dev build add pointer information to %pBD
When building FRR with `--enable-dev-build`.  Add a bit of
code to include the pointer value as part of the output.
Helps with tracking down issues and let's us see more data
when using the dev build option.

New output:

2024/03/08 19:48:56 BGP: [V0J1J-W5RHA] 11.0.20.1/32(0x5759ddf8d7c0) for 11.0.20.1/32

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-14 09:45:09 +00:00
Donatas Abraitis
081f6520ff bgpd: Avoid padding for bgp_paths_limit_capability struct
When sending the packets over the network (dynamic capability) it reports 6 bytes
instead of 5 bytes, and causes some issues between little/big endian machines.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-14 09:50:49 +02:00
Donald Sharp
addff17a55 bgpd: Ensure community data is freed in some cases.
Customer has this valgrind trace:

Direct leak of 2829120 byte(s) in 70728 object(s) allocated from:
  0 in community_new ../bgpd/bgp_community.c:39
  1 in community_uniq_sort ../bgpd/bgp_community.c:170
  2 in route_set_community ../bgpd/bgp_routemap.c:2342
  3 in route_map_apply_ext ../lib/routemap.c:2673
  4 in subgroup_announce_check ../bgpd/bgp_route.c:2367
  5 in subgroup_process_announce_selected ../bgpd/bgp_route.c:2914
  6 in group_announce_route_walkcb ../bgpd/bgp_updgrp_adv.c:199
  7 in hash_walk ../lib/hash.c:285
  8 in update_group_af_walk ../bgpd/bgp_updgrp.c:2061
  9 in group_announce_route ../bgpd/bgp_updgrp_adv.c:1059
 10 in bgp_process_main_one ../bgpd/bgp_route.c:3221
 11 in bgp_process_wq ../bgpd/bgp_route.c:3221
 12 in work_queue_run ../lib/workqueue.c:282

The above leak detected by valgrind was from a screenshot so I copied it
by hand.  Any mistakes in line numbers are purely from my transcription.
Additionally this is against a slightly modified 8.5.1 version of FRR.
Code inspection of 8.5.1 -vs- latest master shows the same problem
exists.  Code should be able to be followed from there to here.

What is happening:

There is a route-map being applied that modifes the outgoing community
to a peer.  This is saved in the attr copy created in
subgroup_process_announce_selected.  This community pointer is not
interned.  So the community->refcount is still 0.  Normally when
a prefix is announced, the attr and the prefix are placed on a
adjency out structure where the attribute is interned.  This will
cause the community to be saved in the community hash list as well.
In a non-normal operation when the decision to send is aborted after
the route-map application, the attribute is just dropped and the
pointer to the community is just dropped too, leading to situations
where the memory is leaked.  The usage of bgp suppress-fib would
would be a case where the community is caused to be leaked.
Additionally the previous commit where an unsuppress-map is used
to modify the outgoing attribute but since unsuppress-map was
not considered part of outgoing policy the attribute would be dropped as
well.  This pointer drop also extends to any dynamically allocated
memory saved by the attribute pointer that was not interned yet as well.

So let's modify the return case where the decision is made to
not send the prefix to the peer to always just flush the attribute
to ensure memory is not leaked.

Fixes: #15459
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-13 19:28:11 -04:00
Donald Sharp
6814401c47 bgpd: Include unsuppress-map as a valid outgoing policy
If unsuppress-map is setup for outgoing peers, consider that
policy is being applied as for RFC 8212.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-13 19:28:11 -04:00
Donald Sharp
e613e12f12 bgpd: Ensure that the correct aspath is free'd
Currently in subgroup_default_originate the attr.aspath
is set in bgp_attr_default_set, which hashs the aspath
and creates a refcount for it.  If this is a withdraw
the subgroup_announce_check and bgp_adj_out_set_subgroup
is called which will intern the attribute.  This will
cause the the attr.aspath to be set to a new value
finally at the bottom of the function it intentionally
uninterns the aspath which is not the one that was
created for this function.  This reduces the other
aspath's refcount by 1 and if a clear bgp * is issued
fast enough the aspath for that will be removed
and the system will crash.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-13 19:28:11 -04:00
Donatas Abraitis
56a23f056c bgpd: Set Paths Limit to 0 instead of unsetting the capability
The capability should be untouched, and send 0 (unlimited) instead.

Otherwise, we miss the capability and things are broken later until the
session reset.

Fixes: 72f0e06824 ("bgpd: Implement Paths-Limit capability")

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-13 16:48:54 +02:00
Donatas Abraitis
5f50359c8a bgpd: Show Addpath capability TX/RX flags unconditionally
It's very annoying when testing and instead of looking for true/false, you
have to check if the field exists.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-13 16:48:54 +02:00
Donatas Abraitis
778357e9ef bgpd: Check the route and the nexthop appropriately when validating NH
A route and its nexthop might belong to different VRFs. Therefore, we need
both the bgp and bgp_nexthop pointers.

Fixes: 8d51fafdcb ("bgpd: Drop bgp_static_update_safi() function")

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-13 09:39:22 +02:00
Donald Sharp
0042ea49b5
Merge pull request #15513 from opensourcerouting/fix/bgp_default_software_version
bgpd: Fix `no` form for `neighbor X capability software-version`
2024-03-11 07:17:09 -04:00
Donatas Abraitis
78757362f2 bgpd: Allow dynamically disable graceful-restart/long-lived graceful-restart
If we enter `bgp graceful-restart-disable`, make sure we disable the capabilities.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-10 18:25:30 +02:00
Donatas Abraitis
77102e853e bgpd: Unset advertised capabilities if capability is disabled
When using dynamic capabilities, do not forget to unset advertised capabilities.

Otherwise, it's kept as advertised.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-09 22:23:37 +02:00
Donatas Abraitis
2038fad33e bgpd: Fix no form for neighbor X capability software-version
If `bgp default software-version-capability` is enabled, allow unsetting this
for a single neighbor also.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-03-09 21:52:17 +02:00
Donatas Abraitis
864844a2e8
Merge pull request #15486 from donaldsharp/make_prefix
bgpd: pi->attr is deref'ed in all paths leading up to test
2024-03-06 08:43:40 +02:00
Donald Sharp
a9c16a0a89 bgpd: pi->attr is deref'ed in all paths leading up to test
In make_prefix, the code checks to see if the pi->attr
is non-NULL.  Since (A) we cannot have a path_info without
an attribute and (B) all paths leading up to the test
in make_prefix already have pi->attr deref'ed and the
code is not crashing we know this is safe to remove.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-05 10:37:48 -05:00
Chirag Shah
5cb7712b3e bgpd:aggr summary-only remove suppressed from evpn
Ticket: #3534718 #3720960
Testing Done:

Config:
router bgp 65564 vrf sym_2
 bgp router-id 27.0.0.9
 !
 address-family ipv4 unicast
  redistribute static
 exit-address-family

vrf sym_2
 vni 8889
 ip route 63.2.1.0/24 blackhole
 ip route 63.2.1.2/32 blackhole
 ip route 63.2.1.3/32 blackhole
exit-vrf

tor-1:# vtysh -c "show bgp l2vpn evpn route" | grep -A3 63.2
*> [5]:[0]:[24]:[63.2.1.0] RD 27.0.0.9:19
                    27.0.0.9 (tor-1)
                                             0         32768 ?
                    ET:8 RT:28:8889 Rmac:44:38:39:ff:ff:29
--
*> [5]:[0]:[32]:[63.2.1.2] RD 27.0.0.9:19
                    27.0.0.9 (tor-1)
                                             0         32768 ?
                    ET:8 RT:28:8889 Rmac:44:38:39:ff:ff:29
*> [5]:[0]:[32]:[63.2.1.3] RD 27.0.0.9:19
                    27.0.0.9 (tor-1)
                                             0         32768 ?
                    ET:8 RT:28:8889 Rmac:44:38:39:ff:ff:29

tor-1(config)# router bgp 65564 vrf sym_2
tor-1(config-router)# address-family ipv4 unicast
tor-1(config-router-af)# aggregate-address 63.2.0.0/16 summary-only
tor-1(config-rou-f)# end

tor-1:# vtysh -c "show bgp l2vpn evpn route" | grep -A3 63.2.1
tor-1:# vtysh -c "show bgp l2vpn evpn route" | grep -A3 63.2
*> [5]:[0]:[16]:[63.2.0.0] RD 27.0.0.9:19
                    27.0.0.9 (tor-1)
                                             0         32768 ?
                    ET:8 RT:28:8889 Rmac:44:38:39:ff:ff:29

Signed-off-by: Chirag Shah <chirag@nvidia.com>
2024-03-05 07:03:39 -08:00
Russ White
018fad7806
Merge pull request #15450 from opensourcerouting/fix/coverity
bgpd: Check if attributes exists for the path before checking mp_nexthop_len
2024-03-05 08:43:28 -05:00
Donatas Abraitis
c256a9a40a
Merge pull request #15467 from donaldsharp/bgp_best_selection_cleanup
Bgp best selection cleanup
2024-03-04 13:35:35 +02:00
Donatas Abraitis
9feb1aab76
Merge pull request #15448 from louis-6wind/bmp-labels
bgpd: export labels into BMP
2024-03-03 20:21:17 +02:00
Donald Sharp
0a8dfbec45 bgpd: Simplify for loop
This for loop has no chance of removing entries so there is no
need to do a bit of complicated code to handle the case where
an entry can be removed.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-02 21:05:46 -05:00
Donald Sharp
f9c86734e5 bgpd: Allow string creation to handle NULL case
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-02 21:05:46 -05:00
Donald Sharp
4d307c9914 bgpd: Both possible paths unset a flag, so reduce
Both paths through the code unset a flag, so reduce the
duplication.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-02 21:05:46 -05:00
Donald Sharp
b56758dae8 bgpd: Testing for valid pointer is done by for loop
No need to test for valid pointer as that the for loop will
do so as well.  This reduces indentation.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2024-03-02 21:05:46 -05:00
Farid Mihoub
d9ce12cd3f bgpd: add labeled vpn bmp monitoring support
Support BMP monitoring for the BGP labeled VPN prefixes.

Signed-off-by: Farid Mihoub <farid.mihoub@6wind.com>
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2024-02-29 16:55:02 +01:00
Donatas Abraitis
4967bf6d72 bgpd: Send "Send Hold Timer Expired" on such events notification
This is required by the current (latest/-02 draft).

IANA has registered code 8 for "Send Hold Timer Expired" in the "BGP
Error (Notification) Codes" sub-registry under the "Border Gateway
Protocol (BGP) Parameters" registry.

https://datatracker.ietf.org/doc/html/draft-ietf-idr-bgp-sendholdtimer

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-02-29 15:37:53 +02:00
Donatas Abraitis
df98e88368
Merge pull request #15368 from louis-6wind/fix-6pe
bgpd: fix 6vpe nexthop
2024-02-28 11:34:43 +02:00
Donatas Abraitis
3f7ed2c99c bgpd: Check if attributes exists for the path before checking mp_nexthop_len
CID: 1583901

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
2024-02-28 08:26:25 +02:00
Farid Mihoub
3104d482e9 bmp: fix vty_out for monitor afi loc-rib
"show run" displays BMP monitor AFI in upper case.

> bmp targets bmp1
>  bmp monitor IPv4 unicast loc-rib

Display it in lower case.

> bmp targets bmp1
>  bmp monitor ipv4 unicast loc-rib

Signed-off-by: Farid Mihoub <farid.mihoub@6wind.com>
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
2024-02-27 19:12:19 +01:00
Russ White
0f3923d821
Merge pull request #13721 from pguibert6WIND/route_target_wrong_display
bgpd: fix route-target display with as dotted format
2024-02-27 12:01:45 -05:00
Russ White
c4f9b874b7
Merge pull request #14810 from dmytroshytyi-6WIND/srv6_bgp_sid_reachability
SRv6 BGP SID reachability
2024-02-27 10:32:14 -05:00
Russ White
879ca714ed
Merge pull request #15273 from opensourcerouting/feature/paths_limit_capability
bgpd: Implement Paths-Limit capability
2024-02-27 10:24:05 -05:00
Philippe Guibert
7c1480fd2f bgpd: fix route-target display with as dotted format
The following command results in a wrong route-target
display:
> # show running-config
> [..]
> route-map rmap permit 1
>  set extcommunity rt 1.45:55
> exit
> router bgp 1.45 as-notation plain
> neighbor 192.0.2.1 remote-as 65500
> address-family ipv4 unicast
> network 192.0.2.2/32 route-map rmap
>

Observed output:

> # show bgp ipv4 192.0.2.2/32
> [..]
>     Extended Community: RT:1.0.0.45:55
>

The decoding of the passed cli string assumes this is an
IP address, whereas it is an AS number in dotted format.
Consequently, the vty output will use the ip address encoding.

Count the number of dots in the extended community format.
If a single dot number is detected, the AS format is passed,
and used by the vty output.

After fix:

>
> # show bgp ipv4 192.0.2.2/32
> [..]
>    Extended Community: RT:65581:55
>

For remind, AS 65581 and AS 1.45 are a unique AS number.

> show bgp neighbor
> BGP neighbor is 192.0.2.1, remote AS 65500, local AS 65581, external link
> [..]

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2024-02-27 14:28:22 +01:00