Commit Graph

4020 Commits

Author SHA1 Message Date
Lakshman Krishnamoorthy
f5cfc290d3 bgpd: Blank RD in "sh bgp l2vpn evpn all neighbors <ip> advertised-routes json"
Bug: While preparing the JSON output, 2 loops are traversed: the outer loop
loops through RD, and the inner loop loops through the prefixes of that RD.

We hit the bug (printing blank RD and stale or null prefix info) when the inner
loop exits with nothing to print, (without allocating json_routes) and the outer
loop still tries to attach it to the parent, json_adv. Thus, we have
key=<BLANK RD>, value=<junk or prev json_routes>

The fix: Avoid attaching json_routes to the parent json if there
is nothing to print.

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-11-21 15:30:00 -08:00
v00lk
6b9ce3dc81 bgpd: IPv4 LU withdraw using 0x000000 label
According to RFC 8277 IPv4 LU NLRI can be withdrawn using label 0x000000.
This RFC updates RFC3101 where it should be done only with 0x800000 label value.
Juniper implementation sets value 0x000000 when prefix is being withdrawn.
Page 12 RFC8277 states:
[RFC3107] also made it possible to withdraw a binding without
specifying the label explicitly, by setting the Compatibility field
to 0x800000. However, some implementations set it to 0x000000. In
order to ensure backwards compatibility, it is RECOMMENDED by this
document that the Compatibility field be set to 0x800000, but it is
REQUIRED that it be ignored upon reception.

Now FRR drops BGP session when receives such BGP update.

Signed-off-by: Aleksandr Klimenko <v00lk@bk.ru>
2019-11-20 15:28:46 +03:00
bisdhdh
949b0f24fa bgpd: Implementing a hash table for connected address - ipv4/ipv6
* IPv6 routes received via a ibgp session with one of its own interface as
nexthop are getting installed in the BGP table.
*A common table to be implemented should take cares of both
ipv4 and ipv6 connected addresses.

Signed-off-by: Biswajit Sadhu sadhub@vmware.com
2019-11-20 01:23:11 +05:30
Juergen Werner
54317cbae5 bgpd: Special handling for 2-level routing tables
The command `show ip bgp ipv4|ipv6 vpn neighbors <ip> prefix-counts`
caused a segfault, because the 2-level routing was not accounted for.

Signed-off-by: Juergen Werner <juergen@opensourcerouting.org>
2019-11-19 17:41:04 +01:00
Russ White
20a4c5f4f1
Merge pull request #5285 from ton31337/fix/send_BGP_NOTIFY_CEASE_PEER_UNCONFIG_after_no_neighbor
bgpd: Notify "Peer De-configured" after entering 'no neighbor <neighb…
2019-11-19 11:39:13 -05:00
Sri Mohana Singamsetty
6580da9f54
Merge pull request #5257 from ton31337/fix/update_rib_on_bgp_distance_changes
bgpd: Reflect the distance in RIB when it is changed for an arbitrary afi/safi
2019-11-19 08:35:57 -08:00
Donatas Abraitis
5ab1b40c57
Merge pull request #5364 from lkrishnamoor/prefix_route_bugfix
bgpd: Bug fix in "show bgp l2vpn evpn X:X::X:X/M"
2019-11-19 15:00:08 +02:00
Donatas Abraitis
47774e2757
Merge pull request #5354 from mitch-skiba/addpath-fix
bgpd: Fix per afi/safi addpath peer counting
2019-11-19 08:38:59 +02:00
Lakshman Krishnamoorthy
62e43fd7a8 bgpd: Bug fix in "show bgp l2vpn evpn X:X::X:X/M"
The CLI was not parsing prefix format of ipv6 address.
This fixes the bug: https://github.com/FRRouting/frr/issues/5322

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-11-18 18:20:21 -08:00
Mitch Skiba
d4a0d83bfd bgpd: Fix per afi/safi addpath peer counting
The total_peercount table was created as a short cut for queries about
if addpath was enabled at all on a particular afi/safi. However, the
values weren't updated, so BGP would act as if addpath wasn't enabled
when determining if updates should be sent out. The error in behavior
was much more noticeable in tx-all than best-per-as, since changes in
what is sent by best-per-as would often trigger updates even if addpath
wasn't enabled.

Signed-off-by: Mitchell Skiba <mskiba@amazon.com>
2019-11-18 19:22:04 +00:00
Donatas Abraitis
839bdd0f45
Merge pull request #5334 from adharkar/frr-master-nexthop_check
bgpd: Add nexthop of received EVPN RT-5 for nexthop tracking
2019-11-18 09:57:01 +02:00
Donatas Abraitis
75b3bd3534
Merge pull request #5327 from lkrishnamoor/rm_rd_filter
bgpd: route-map support for evpn RD filter
2019-11-16 08:55:24 +02:00
Sri Mohana Singamsetty
670812fd13
Merge pull request #5312 from chiragshah6/evpn_dev2
bgpd: fix memory leak in vni-vrf route tables for evpn routes
2019-11-15 15:39:53 -08:00
Ameya Dharkar
7c312383ba bgpd: Add nexthop of received EVPN RT-5 for nexthop tracking
Problem statement:
When IPv4/IPv6 prefixes are received in BGP, bgp_update function registers the
nexthop of the route with nexthop tracking module. The BGP route is marked as
valid only if the nexthop is resolved.

Even for EVPN RT-5, route should be marked as valid only if the the nexthop is
resolvable.

Code changes:
1. Add nexthop of EVPN RT-5 for nexthop tracking. Route will be marked as valid
only if the nexthop is resolved.
2. Only the valid EVPN routes are imported to the vrf.
3. When nht update is received in BGP, make sure that the EVPN routes are
imported/unimported based on the route becomes valid/invalid.

Testcases:
1. At rtr-1, advertise EVPN RT-5 with a nexthop 10.100.0.2.
10.100.0.2 is resolved at rtr-2 in default vrf.
At rtr-2, remote EVPN RT-5 should be marked as valid and should be imported into
vrfs.

2. Make the nexthop 10.100.0.2 unreachable at rtr-2
Remote EVPN RT-5 should be marked as invalid and should be unimported from the
vrfs. As this code change deals with EVPN type-5 routes only, other EVPN routes
should be valid.

3. At rtr-2, add a static route to make nexthop 10.100.0.2 reachable.
EVPN RT-5 should again become valid and should be imported into the vrfs.

Signed-off-by: Ameya Dharkar <adharkar@vmware.com>
2019-11-15 10:15:14 -08:00
Donald Sharp
d5b0f7372d
Merge pull request #5351 from ton31337/fix/add_missing_whitespace
bgpd: Add missing whitespace in update_subgroup_remove_peer_internal()
2019-11-15 07:38:07 -05:00
Donatas Abraitis
4882d29695 bgpd: Add missing whitespace in update_subgroup_remove_peer_internal()
Before the fix:

2019/11/14 19:52:21 BGP: peer 192.168.2.5 deleted from subgroup s4peer
cnt 0 - missing space after s4 before peer

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-11-15 11:09:17 +02:00
Lakshman Krishnamoorthy
196c6b092d bgpd: route-map support for evpn RD filter
With this code change, we can now filter evpn routes based on RD using the
match statement: "match evpn rd XX"

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-11-14 13:40:25 -08:00
Donatas Abraitis
fb29348a19 bgpd: Reject routes having AS_SET or AS_CONFED_SET
This is the first step towards eliminating AS_SET and AS_CONFED_SET types
and obsolete them in the future.

More information:
https://datatracker.ietf.org/doc/html/draft-ietf-idr-deprecate-as-set-confed-set-02

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-11-14 19:19:04 +02:00
Donatas Abraitis
8b54bc30f0 tests: Test if distance bgp (1-255) (1-255) (1-255) works
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-11-14 10:13:02 +02:00
Lakshman Krishnamoorthy
10d5be75aa bgpd: Bug fix in "show bgp l2vpn evpn ... advertised-routes'
The bug:
As part of displaying advertised routes to a peer, in the outer loop, we
iterate through all prefixes in the evpn table. In the inner loop,
we iterate through adj_out of each prefix.

If a prefix which is present in the evpn table is not advertised to a peer,
its corresponding attr == NULL. Checking for this condition is the fix.

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-11-12 14:02:05 -08:00
Donald Sharp
a6ac9df8ea
Merge pull request #5307 from ton31337/fix/bgp_dampening_per_afi_safi
bgpd: Rework BGP dampening to be per AFI/SAFI
2019-11-12 15:11:27 -05:00
Chirag Shah
3c11d70a10 bgpd: fix memory leak in vrf inst for evpn route
There is a memory leak of the bgp node (route node)
in bgp vrf rib table while processing evpn remote routes.

During the remote evpn route processing, a new route
is imported and created in per vrf bgp rib route table,
the refcount for the route node is incremented multiple
times.

Post evpn route creation, the bgp (route) node refcount needs
to be decremented.

Ticket:CM-26838,CM-27169
Reviewed By:CCR-9477
Testing Done:

Before fix:
----------
initial state:
TORC1#vtysh -c "show memory"
BGP node                      :      515    184
BGP route                     :      568    112

with 1 mac-ip route:
TORC1#vtysh -c "show memory"
BGP node                      :      524    184
BGP route                     :      583    112

withdraw 1 mac-ip route:
TORC1#vtysh -c "show memory"
BGP node                      :      520    184
BGP route                     :      568    112

After fix:
withdra 1 mac-ip route
TORC1#vtysh -c "show memory"
BGP node                      :      515    184
BGP route                     :      568    112

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-11-11 08:27:55 -08:00
Chirag Shah
a97a1e1144 bgpd: fix memory leak in vni table for evpn routes
There is a memory leak of the bgp node (route node)
in vni table while processing evpn remote route(s).

During the remote evpn route processing, a new route
is created in per vni route table, the refcount for
the route node is incremented twice. First refcount
is incremented during the node creation and the second
one when the bgp_info_add is added.

Post evpn route creation, the bgp node refcount needs
to be decremented.

Ticket:CM-26898,CM-26838,CM-27169
Reviewed By:CCR-9474
Testing Done:
In EVPN topology send 1K MAC routes then check the memory footprint
at the remote VTEP before sending 1K type-2 routes
and after flushing/withdrawal of the routes.

Before fix:
-----------
Initial memory footprint:
root@TOR1:~# vtysh -c "show memory" | grep "Hash Bucket \|BGP node \|BGP route"
Hash Bucket                   :       2008      32
BGP node                      :        182     152
BGP route                     :         96     112

With 1K MAC (type-2 routes)
root@TOR1:~# vtysh -c "show memory" | grep "Hash Bucket \|BGP node \|BGP route"
Hash Bucket                   :       6008      32
BGP node                      :       4182     152
BGP route                     :       2096     112

After cleaning up 1K MAC entries from source VTEP which triggers BGP withdraw
at the remote VTEP.
root@TOR1:~# vtysh -c "show memory" | grep "Hash Bucket \|BGP node \|BGP route"
Hash Bucket                   :       4008      32
BGP node                      :       2182     152   <-- Here 2K delta from initial count.
BGP route                     :         96     112

With fix:
---------

After 1K MAC entries cleaned up at the remote VTEP, the memory footprint
(BGP Node and Hash Bucket count) is equilibrium to start of the test.
root@TOR1:~# vtysh -c "show memory" | grep "Hash Bucket \|BGP node \|BGP route"
Hash Bucket                   :       2008      32
BGP node                      :        182     152
BGP route                     :         96     112

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-11-11 08:27:37 -08:00
Chirag Shah
90c31d7190 bgpd: fix json output for show cmd for evpn routes
Fix json output where show command displayed
"Route Distinguisher: " string in json output because
NULL json object passed to bgp_evpn_show_route_rd_header()

Testing Done:
Route Distinguisher: ip 27.0.0.11:3
Route Distinguisher: ip 27.0.0.11:4
Route Distinguisher: ip 27.0.0.16:3
Route Distinguisher: ip 27.0.0.16:5
Route Distinguisher: ip 27.0.0.16:9
{
  "27.0.0.11:3":{
    "rd":"27.0.0.11:3",
    "[2]:[0]:[48]:[00:02:00:00:00:02]":{
      "prefix":"[2]:[0]:[48]:[00:02:00:00:00:02]",
      "prefixLen":288,
 ...
}

Post fix:
{
  "27.0.0.11:3":{
    "rd":"27.0.0.11:3",
    "[2]:[0]:[48]:[00:02:00:00:00:02]":{
      "prefix":"[2]:[0]:[48]:[00:02:00:00:00:02]",
      "prefixLen":288,
  ...
}
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-11-11 07:57:57 -08:00
Chirag Shah
527fd6dee5 bgpd: fix rd printing in show commands for evpn rts
PR 5118 introduce additional (prepend) keywords
like 'ip' to Route Distinguisher output which
breaks existing evpn route show commands parsing.

Restore to original behavior.

Testing Done:

vtysh -c 'show bgp l2vpn evpn route'

Before fix:
Route Distinguisher: ip 27.0.0.15:44

Post fix:
Route Distinguisher: 27.0.0.15:44

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-11-11 07:57:37 -08:00
Donald Sharp
a5f271c635
Merge pull request #5299 from ton31337/fix/remove_dead_code
bgpd: Remove not used bgp_find_nexthop() function
2019-11-11 07:57:09 -05:00
Donald Sharp
97b8644912
Merge pull request #5306 from ton31337/fix/replace_subcode_static_value_to_const_name
bgpd: Use BGP_NOTIFY_SUBCODE_UNSPECIFIC value for bgp_notify_send() where 0
2019-11-11 07:56:42 -05:00
Donatas Abraitis
a935f597fc bgpd: Rework BGP dampening to be per AFI/SAFI
Before we had:

!
router bgp 65031
 bgp dampening 1 2 3 4
!

exit2-debian-9(config)# router bgp 65031
exit2-debian-9(config-router)# address-family ipv4 multicast
exit2-debian-9(config-router-af)# bgp dampening 5 6 7 8
exit2-debian-9(config-router-af)# end
exit2-debian-9# show running-config

!
router bgp 65031
 bgp dampening 1 2 3 4
!

After fix:

!
router bgp 65031
 neighbor 192.168.1.2 remote-as 100
 !
 address-family ipv4 unicast
  bgp dampening 1 2 3 4
 exit-address-family
 !
 address-family ipv4 multicast
  bgp dampening 5 6 7 8
 exit-address-family
!

exit2-debian-9# show ip bgp ipv4 unicast dampening parameters
Half-life time: 1 min
Reuse penalty: 2
Suppress penalty: 3
Max suppress time: 4 min
Max suppress penalty: 32

exit2-debian-9# show ip bgp ipv4 multicast dampening parameters
Half-life time: 5 min
Reuse penalty: 6
Suppress penalty: 7
Max suppress time: 8 min
Max suppress penalty: 18

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-11-11 09:52:40 +02:00
Donatas Abraitis
0e35025eb4 bgpd: Use BGP_NOTIFY_SUBCODE_UNSPECIFIC value for bgp_notify_send() where 0
Just a code cleanup to keep the code consistent.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-11-10 17:54:37 +02:00
Donatas Abraitis
a78d1c77fe bgpd: Remove not used bgp_find_nexthop() function
Seems like a dead code.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-11-08 15:04:29 +02:00
Donald Sharp
45206fe2d0 bgpd: Fix missed prefix_free conversion in rpki code
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-11-08 07:51:57 -05:00
Donald Sharp
306c4dab55
Merge pull request #5278 from slankdev/slankdev-bgpd-fix-prefix-sid-fetch-error
bgpd: skip unsupported PREFIX_SID sub-type
2019-11-07 10:36:47 -05:00
Donald Sharp
8c1a4c1041 bgpd: use bgp->name_pretty in debugs and add vrf to some output
Recently had a case where I was attempting to debug a nexthop tracking
issue across multiple bgp vrf's and since the setup vrf's in it with
overlapping address ranges, it became real fun real fast to track
vrf data associated.  Add a bit of code to allow us to figure out
what vrf we are in when we print out debug messages.

Look through the rest of the code and find debugs where we are
not using bgp->name_pretty and switch it over.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-11-07 07:20:41 -05:00
Russ White
a049e601ec
Merge pull request #5281 from bisdhdh/bgpv4-over-v6-1
BGPD: Prevent IPv6-LL being fwd to IBGP peers not on same link.
2019-11-06 14:03:52 -05:00
Donatas Abraitis
4e2786df3e bgpd: Notify "Peer De-configured" after entering 'no neighbor <neighbor> cmd'
Before changes:

~# vtysh -c 'show ip bgp neighbors 192.168.0.2 json' | \
	jq '."192.168.0.2".lastNotificationReason'
null

After changes:

~# vtysh -c 'show ip bgp neighbors 192.168.0.2 json' | \
	jq '."192.168.0.2".lastNotificationReason'
"Cease/Peer Unconfigured"

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-11-06 20:38:02 +02:00
bisdhdh
63696f1d89 BGPD: Prevent IPv6-LL being fwd to IBGP peers not on same link.
Prevent IPv6 Link-local address being forward to IBGP peer,
which are not directly connected.

R1----IPV6-unnumbered-EBGP-------R2-----IPV6-IBGP-----R3

Configure route-map to set preferred global address on and apply
route-map-IN on R2 for R1-R2 session. Now check on R3's BGP and
RIB table has route nexthop as R1 link-local address, which is
not correct.

As of now we clear link-local address info from mp_nexthop_global,
only if mp_nexthop_global is populated with link-local address.

We should do it even if route-map is configured boz forwarding
link-local address from one link scope to another is violation of
the standards.

Signed-off-by: Biswajit Sadhu sadhub@vmware.com
2019-11-05 11:17:47 +05:30
Hiroki Shirokura
c6ca155d73 bgpd: skip unsupported PREFIX_SID sub-type
This commit make bgpd to skip and ignore unsupported
sub-type of PREFIX_SID. (especially new defined sub-type)
Current bgpd can't parase unsupported sub-type of PREFIX_SID.
PREFIX_SID is drafted on draft-ietf-idr-bgp-prefix-sid-27.
There are already new sub-type drafted on
draft-dawra-idr-srv6-vpn-05. (Type5,6 is new defined.)
This commit fix the problem reported as #5277 on GitBub.

Signed-off-by: Hiroki Shirokura <slank.dev@gmail.com>
2019-11-05 03:41:53 +00:00
Donald Sharp
721c08573a *: Convert connected_free to a double pointer
Set the connected pointer to set the pointer to NULL.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-11-02 16:13:44 -04:00
Donald Sharp
63265b5c1f *: Convert prefix_free to double pointer
Have the prefix_free code take a double pointer to free the data.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-11-02 16:13:44 -04:00
Donald Sharp
c86e8d64e8 bgpd: Prevent usage after free in bgp_mac.c
Running with --enable-address-sanitizer I am seeing this:

=================================================================
==19520==ERROR: AddressSanitizer: heap-use-after-free on address 0x6020003ef850 at pc 0x7fe9b8f7b57b bp 0x7fffbac6f9c0 sp 0x7fffbac6f170
READ of size 6 at 0x6020003ef850 thread T0
    #0 0x7fe9b8f7b57a  (/lib/x86_64-linux-gnu/libasan.so.5+0xb857a)
    #1 0x55e33d1071e5 in bgp_process_mac_rescan_table bgpd/bgp_mac.c:159
    #2 0x55e33d107c09 in bgp_mac_rescan_evpn_table bgpd/bgp_mac.c:252
    #3 0x55e33d107e39 in bgp_mac_rescan_all_evpn_tables bgpd/bgp_mac.c:266
    #4 0x55e33d108270 in bgp_mac_remove_ifp_internal bgpd/bgp_mac.c:291
    #5 0x55e33d108893 in bgp_mac_del_mac_entry bgpd/bgp_mac.c:351
    #6 0x55e33d21412d in bgp_ifp_down bgpd/bgp_zebra.c:257
    #7 0x7fe9b8cbf3be in if_down_via_zapi lib/if.c:198
    #8 0x7fe9b8db303a in zclient_interface_down lib/zclient.c:1549
    #9 0x7fe9b8db8a06 in zclient_read lib/zclient.c:2693
    #10 0x7fe9b8d7b95a in thread_call lib/thread.c:1599
    #11 0x7fe9b8cd824e in frr_run lib/libfrr.c:1024
    #12 0x55e33d09d463 in main bgpd/bgp_main.c:477
    #13 0x7fe9b879409a in __libc_start_main ../csu/libc-start.c:308
    #14 0x55e33d09c189 in _start (/usr/lib/frr/bgpd+0x168189)
0x6020003ef850 is located 0 bytes inside of 16-byte region [0x6020003ef850,0x6020003ef860)
freed by thread T0 here:
    #0 0x7fe9b8fabfb0 in __interceptor_free (/lib/x86_64-linux-gnu/libasan.so.5+0xe8fb0)
    #1 0x7fe9b8ce4ea9 in qfree lib/memory.c:129
    #2 0x55e33d10825c in bgp_mac_remove_ifp_internal bgpd/bgp_mac.c:289
    #3 0x55e33d108893 in bgp_mac_del_mac_entry bgpd/bgp_mac.c:351
    #4 0x55e33d21412d in bgp_ifp_down bgpd/bgp_zebra.c:257
    #5 0x7fe9b8cbf3be in if_down_via_zapi lib/if.c:198
    #6 0x7fe9b8db303a in zclient_interface_down lib/zclient.c:1549
    #7 0x7fe9b8db8a06 in zclient_read lib/zclient.c:2693
    #8 0x7fe9b8d7b95a in thread_call lib/thread.c:1599
    #9 0x7fe9b8cd824e in frr_run lib/libfrr.c:1024
    #10 0x55e33d09d463 in main bgpd/bgp_main.c:477
    #11 0x7fe9b879409a in __libc_start_main ../csu/libc-start.c:308
previously allocated by thread T0 here:
    #0 0x7fe9b8fac518 in calloc (/lib/x86_64-linux-gnu/libasan.so.5+0xe9518)
    #1 0x7fe9b8ce4d93 in qcalloc lib/memory.c:110
    #2 0x55e33d106b29 in bgp_mac_hash_alloc bgpd/bgp_mac.c:96
    #3 0x7fe9b8cb8350 in hash_get lib/hash.c:149
    #4 0x55e33d10845b in bgp_mac_add_mac_entry bgpd/bgp_mac.c:303
    #5 0x55e33d226757 in bgp_ifp_create bgpd/bgp_zebra.c:2644
    #6 0x7fe9b8cbf1e6 in if_new_via_zapi lib/if.c:176
    #7 0x7fe9b8db2d3b in zclient_interface_add lib/zclient.c:1481
    #8 0x7fe9b8db87f8 in zclient_read lib/zclient.c:2659
    #9 0x7fe9b8d7b95a in thread_call lib/thread.c:1599
    #10 0x7fe9b8cd824e in frr_run lib/libfrr.c:1024
    #11 0x55e33d09d463 in main bgpd/bgp_main.c:477
    #12 0x7fe9b879409a in __libc_start_main ../csu/libc-start.c:308

Effectively we are passing to bgp_mac_remove_ifp_internal the macaddr
that is associated with the bsm data structure.  There exists a path
where the bsm is freed and then we immediately pass the macaddr into
bgp_mac_rescan_all_evpn_tables.  So just make a copy of the macaddr
data structure before we free the bsm

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-31 20:23:23 -04:00
Donatas Abraitis
a612fb77d5 bgpd: Reflect the distance in RIB when it is changed for an arbitrary afi/safi
debian-9# show ip route 192.168.255.2/32 longer-prefixes
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

B>* 192.168.255.2/32 [20/0] via 192.168.0.1, eth1, 00:15:22
debian-9# conf
debian-9(config)# router bgp 100
debian-9(config-router)# address-family ipv4
debian-9(config-router-af)# distance bgp 123 123 123
debian-9(config-router-af)# do show ip route 192.168.255.2/32 longer-prefixes
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

B>* 192.168.255.2/32 [123/0] via 192.168.0.1, eth1, 00:00:09
debian-9(config-router-af)# no distance bgp
debian-9(config-router-af)# do show ip route 192.168.255.2/32 longer-prefixes
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

B>* 192.168.255.2/32 [20/0] via 192.168.0.1, eth1, 00:00:02
debian-9(config-router-af)#

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-10-31 09:53:18 +02:00
Rafael Zalamena
2b31007ca2 bgpd: expose sender side AS path loop detection
The sender side AS path loop detection code was implemented since the
import of Quagga code, however it was always disabled by a `ifdef`
guard.

Lets allow the user to decide whether or not to enable this feature on
run-time.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
2019-10-29 16:29:09 -03:00
Rafael Zalamena
37cdb6e91d
Merge pull request #5197 from SumitAgarwal123/BFD_ADMIN_DOWN
bfdd: Handling local and remote admin-down
2019-10-29 12:12:27 -03:00
Donald Sharp
50f450bd53
Merge pull request #4941 from ton31337/fix/do_not_include_nexthop_dash_dash
bgpd: Do not send next-hop as :: in MP_REACH_NLRI if no link-local ex…
2019-10-29 09:37:04 -04:00
SumitAgarwal123
7555dc6116 bfdd: Handling local and remote admin-down
Scenarios where this code change is required:

1. BFD is un-configured from BGP at remote end.

Neighbour BFD sends ADMIN_DOWN state, but BFD on local side will send
DOWN to BGP, resulting in BGP session DOWN.
Removing BFD session administratively shouldn't bring DOWN BGP session
at local or remote.

2. BFD is un-configured from BGP or shutdown locally.

BFD will send state DOWN to BGP resulting in BGP session DOWN.
(This is akin to saying do not use BFD for BGP)
Removing BFD session administratively shouldn't bring DOWN BGP session at
local or remote.

Signed-off-by: Sayed Mohd Saquib sayed.saquib@broadcom.com
2019-10-28 21:38:20 -07:00
Donald Sharp
36f12ed703 bgpd: write variable is never used in cli function
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-25 21:35:04 -04:00
Donald Sharp
13c01b7e27 bgpd: bgp_path_info_mpath_next only returns values
Since we don't set a value from the return of bgp_path_info_mpath_next
it is impossible for this function to do anything as such the if statement
is dead code as well.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-25 21:10:31 -04:00
Donald Sharp
22df2d8aaf bgpd: Logically dead code
SAFI_EVPN and SAFI_MPLSVPN have been excluded by previous
if statements.  This code is dead.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-25 20:42:21 -04:00
Donald Sharp
c7e803f1f4 bgpd: Remove dead code in rfapi
Coverity spotted some dead code in the rfapi code.  Removing.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-25 20:42:21 -04:00
Donald Sharp
2d50e11896
Merge pull request #5216 from ton31337/fix/override_peers_ttl_if_peer_group_configured
bgpd: Override peer's TTL only if peer-group is configured with TTL
2019-10-25 14:03:06 -04:00
Don Slice
8e5509b04b bgpd: remove error message for unkown afi/safi combination
Problem reported with error messages appearing in the log
complaining about invalid afi/safi combinations.  Determined
that the error messages were recently added in the function
that turns afi and safi values to strings.  Unfortunately,
the function is called from places using FOREACH_AFI_SAFI,
which spins thru every afi and safi number including some
that are not legal together (ipv4 evpn and l2vpn multicast
for example.)   This fix removes these error messages since
it is not necessarily an error to call it with invalid
combinations.

Ticket: CM-26883
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-10-24 11:29:40 +00:00
Mark Stapp
bd0254af6c bgpd: clarify evpn datastruct use for SA
Clear up an SA report by clarifying a function call in the evpn
code.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
2019-10-23 11:56:35 -04:00
Donatas Abraitis
a0903cd24c bgpd: Override peer's TTL only if peer-group is configured with TTL
When a peer-group is configured for an already configured eBGP neighbor,
ebgp-multihop command is removed for that peer.

This fix remains configured peer's ebgp-multihop value if peer-group does
not have ebgp-multihop configured.

!
router bgp 100
 neighbor A8 peer-group
 neighbor A9 peer-group
 neighbor A9 ebgp-multihop 12
 neighbor 3.3.3.3 remote-as 123
 neighbor 3.3.3.3 ebgp-multihop 255
 neighbor 4.4.4.4 remote-as 123
 !

spine1-debian-9#
spine1-debian-9# conf
spine1-debian-9(config)# router bgp 100
spine1-debian-9(config-router)# neighbor 3.3.3.3 peer-group A8
spine1-debian-9(config-router)# do sh run

!
router bgp 100
 neighbor A8 peer-group
 neighbor A9 peer-group
 neighbor A9 ebgp-multihop 12
 neighbor 3.3.3.3 remote-as 123
 neighbor 3.3.3.3 peer-group A8
 neighbor 3.3.3.3 ebgp-multihop 255
 neighbor 4.4.4.4 remote-as 123
!

spine1-debian-9(config-router)# neighbor 4.4.4.4 peer-group A9
spine1-debian-9(config-router)# do sh run

!
router bgp 100
 neighbor A8 peer-group
 neighbor A9 peer-group
 neighbor A9 ebgp-multihop 12
 neighbor 3.3.3.3 remote-as 123
 neighbor 3.3.3.3 peer-group A8
 neighbor 3.3.3.3 ebgp-multihop 255
 neighbor 4.4.4.4 remote-as 123
 neighbor 4.4.4.4 peer-group A9
!

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-10-23 18:04:14 +03:00
Donatas Abraitis
acf061a9ab
Merge pull request #5108 from donaldsharp/sendbuffer_size_bgp
Sendbuffer size bgp
2019-10-20 12:09:42 +03:00
Russ White
12bea6d575
Merge pull request #4850 from lkrishnamoor/show_cli
bgpd: Adding new bgp evpn cli's for ip-prefix lookup
2019-10-18 21:30:37 -04:00
Renato Westphal
dfd7b62ddd
Merge pull request #5172 from donaldsharp/sa_clean_and_clean
Sa clean and clean
2019-10-17 23:14:31 -03:00
Sri Mohana Singamsetty
03e484aafa
Merge pull request #5165 from donaldsharp/evpn_fixup
bgpd: return created bgp_path_info
2019-10-17 10:15:01 -07:00
Mark Stapp
10e75ceb6a
Merge pull request #5150 from qlyoung/bgp-vector-io-4
BGP vector I/O - Redux
2019-10-17 10:57:47 -04:00
Russ White
718804149e
Merge pull request #5078 from lkrishnamoor/advertise-routes
bgpd: Fix "show bgp l2vpn evpn neighbors x.x.x.x advertised-routes json"
2019-10-16 15:05:23 -04:00
Russ White
b42d15054d
Merge pull request #5118 from lkrishnamoor/routes_json
bgpd: Fix in "show bgp l2vpn evpn neighbors X.X.X.X routes json"
2019-10-16 15:01:13 -04:00
Donald Sharp
401b063670 bgpd: In redistribution aspath cannot be NULL
Coverity has found a path where the attr.aspath may be NULL.

assert that the aspath is non-null so we can make this go away.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-16 13:38:29 -04:00
Donald Sharp
05864da791 bgpd: struct bgp_path_info *->attr must not be NULL
We make the assumption that ->attr is not NULL throughout
the code base.  We are totally inconsistent about application
of this though.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-16 13:38:29 -04:00
Donald Sharp
d38c6bb1b0 bgpd: Check setsockopt return codes
Let end user know that a setsockopt failed and we may
be experiencing degraded performance.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-16 13:38:29 -04:00
Donald Sharp
c2d020ad71 bgpd: Add ability to set tcp socket buffer size
Add -s X or --socket_size X to the bgp cli to allow
the end user to specify the outgoing bgp tcp kernel
socket buffer size.

It is recommended that this option is only used on
large scale operations.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-16 07:42:05 -04:00
Donald Sharp
c011a88bb5 bgpd: return created bgp_path_info
In bgp_create_evpn_bgp_path_info we create a bgp_path_info
that should be returned since we need it later.

Found by Coverity Scan.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-16 07:02:55 -04:00
Donald Sharp
b60afd5c38
Merge pull request #5097 from ton31337/fix/do_not_reconnect_if_prefix_overflow
bgpd: Keep the session down if maximum-prefix is reached
2019-10-15 16:18:19 -04:00
Quentin Young
185553660f bgpd: speak soothing words to scanbuild
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-10-15 18:25:02 +00:00
Russ White
e9f66ba9af
Merge pull request #5156 from donaldsharp/soft_reconfig_the_peer
bgpd: Soft reconfig-in should find the right bgp_path_info
2019-10-15 11:37:07 -04:00
Russ White
218f11515b
Merge pull request #5022 from chiragshah6/mdev
bgpd: evpn fix advertise-svi-ip display in show commands
2019-10-15 11:34:22 -04:00
Russ White
51de65305d
Merge pull request #5152 from donaldsharp/evpn_es_not_locking
Some bgp evpn fixes
2019-10-15 11:09:12 -04:00
Donald Sharp
d7d158892a bgpd: Soft reconfig-in should find the right bgp_path_info
When using soft reconfiguration inbound we are storing packet
data on the side for replaying when necessary.  The problem here
is that we are just grabbing the first bgp_path_info and using
that as the base.  What happens when we have soft-reconfig turned
on with multiple bgp_path_info's for a path?  This was introduced
in commit 8692c50652, yes back
in 2012!  I would argue, though, that it was just broken
in a different way before this.

Choose the correct bgp_path_info that corresponds to the peer
we received the data from for rethinking.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-15 09:31:20 -04:00
Donatas Abraitis
4e2313d8ee
Merge pull request #5119 from lkrishnamoor/community-list
bgpd: Implement "sh bgp l2vpn evpn community|large-community X"
2019-10-15 13:35:27 +03:00
Lakshman Krishnamoorthy
7f433a5e4d bgpd: Implement "sh bgp l2vpn evpn community|large-community X"
Full output here: https://github.com/FRRouting/frr/pull/5119

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-10-15 00:43:41 -07:00
Donatas Abraitis
597ca790b3
Merge pull request #5130 from donaldsharp/as_path_json_maximum_overdrive
bgpd: AS paths are uint32_t instead of integers
2019-10-15 09:14:16 +03:00
Donald Sharp
a51743300c bgpd: Be careful about displaying vni's as labels.
When a type 2/3 or 5 route is received, verified and the
resulting route generated is pushed into the appropriate vrf
the vni's associated with the route are also passed in.
This is showing up as a Remote label when you dump
the route in bgp:

BGP routing table entry for 0.0.0.0/0^M
Paths: (1 available, best #1, table third)
   Advertised to non peer-group peers:
   10.10.120.22
   42001 42005 42006 42055
     10.10.120.22 from 10.10.120.22 (10.10.255.193)
       Origin IGP, valid, external, bestpath-from-AS 42001, best
       Remote label: 62750
       AddPath ID: RX 0, TX 2
       Last update: Fri Oct 11 12:59:56 2019

The `Remote label: 62750` is the mpls label version of the
vni passed in.  This is meaningless and confusing to the end
user.  Do not display this information.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-14 21:17:16 -04:00
Donald Sharp
6b74234908 bgpd: Refactor bgp_path_info creation
We are doing the same thing in multiple places.  Refactor.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-14 21:17:16 -04:00
Donald Sharp
f4d7cb0e9b bgpd: Properly lock parent node for type4 routes
When creating a bgp_path_info for a type 4 route the pi->extra->parent
and the route node for the originating table were not being locked
properly.  This will prevent BGP from not properly cleaning up
the data structures on cleanup.

Possibly every one of the functions that we use to create the
new bgp_path_info's should use an abstracted version of this code,
but I am unsure at this point in time if a type 4 should use the same
or not.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-14 21:17:04 -04:00
Quentin Young
8fa7732f5d bgpd: raise default & max r/w quanta to 64
Vectored writes are more efficient with a higher quantum.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-10-14 18:41:53 +00:00
Quentin Young
093279cd02 bgpd: vector I/O
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-10-14 18:41:53 +00:00
Quentin Young
421a7dfc93 bgpd: move assert out of error case
bgp_process_packets has an assert to make sure an appropriate amount of
working space in the input buffer has been freed up for future reads.
However, this assert shouldn't be made when we have encountered an error
that's going to tear down the session, because in this case we may not
be able to process the full contents of the input buffer.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-10-14 18:41:07 +00:00
Quentin Young
7336ccbf0d bgpd: move assert out of error case
bgp_process_packets has an assert to make sure an appropriate amount of
working space in the input buffer has been freed up for future reads.
However, this assert shouldn't be made when we have encountered an error
that's going to tear down the session, because in this case we may not
be able to process the full contents of the input buffer.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-10-14 16:09:36 +00:00
Donald Sharp
5c117085f6
Merge pull request #5117 from ton31337/fix/remove_deprecation_for_ip_prefix
bgpd: Remove depracated `ip` prefix for as-path/extcommunity/large/co…
2019-10-14 08:14:05 -04:00
Russ White
adca8385ae
Merge pull request #5131 from donaldsharp/extra_clean
bgpd: When creating extra from stack ensure it is zero'ed out
2019-10-11 07:24:39 -04:00
Philippe Guibert
1276ce3833 bgpd: withdraw fib entry on appropriate table identifier
There are cases where the table identifier is set on a bgp entry, mainly
due to route-map, and associate fib entry needs to be removed.
This change encompasses also the route-map reconfiguration that leads to
removing the previous entry, whereas bgp update had been triggered (
this happens when software inbound reconfiguration is handled).

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2019-10-10 16:06:51 +02:00
Philippe Guibert
951745bdab bgpd: ability to export prefixes entries to a kernel table identifier
this table identifier can be used for policy routing. incoming entries
are locally exported to that local table identifier.
note that so that the user applies the new table identifier to all
entries, the user should flush local tables first.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2019-10-10 16:06:51 +02:00
Donald Sharp
ef1af5e530 bgpd: Ensure that struct prefix_rd rd is zero'ed out
We are passing around the created rd, Just make sure that
the data is zero'ed out.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-10 09:03:56 -04:00
Donald Sharp
b8694ef44c bgpd: When creating extra from stack ensure it is zero'ed out
BGP code assumes that the extra data is zero'ed out.  Ensure that we
are not leaving any situation that the data on the stack is actually all
0's when we pass it around as a pointer later.

Please note in issue #5025, Lou reported a different valgrind
issue, which is not the same issue:

==7313== Conditional jump or move depends on uninitialised value(s)
==7313== at 0x181F9F: subgroup_announce_check (bgp_route.c:1555)
==7313== by 0x1A112B: subgroup_announce_table (bgp_updgrp_adv.c:641)
==7313== by 0x1A1340: subgroup_announce_route (bgp_updgrp_adv.c:704)
==7313== by 0x1A13E3: subgroup_coalesce_timer (bgp_updgrp_adv.c:331)
==7313== by 0x4EBA615: thread_call (thread.c:1531)
==7313== by 0x4E8AC37: frr_run (libfrr.c:1052)
==7313== by 0x1429E0: main (bgp_main.c:486)
==7313==
==7313== Conditional jump or move depends on uninitialised value(s)
==7313== at 0x201C0E: rfapi_vty_out_vncinfo (rfapi_vty.c:429)
==7313== by 0x18D0D6: route_vty_out (bgp_route.c:7481)
==7313== by 0x18DD76: bgp_show_table (bgp_route.c:9365)
==7313== by 0x1930C4: bgp_show_table_rd (bgp_route.c:9471)
==7313== by 0x1932A3: bgp_show (bgp_route.c:9510)
==7313== by 0x193E68: show_ip_bgp_json (bgp_route.c:10284)
==7313== by 0x4E6D024: cmd_execute_command_real.isra.2 (command.c:1072)
==7313== by 0x4E6F51E: cmd_execute_command (command.c:1131)
==7313== by 0x4E6F686: cmd_execute (command.c:1285)
==7313== by 0x4EBF9C4: vty_command (vty.c:516)
==7313== by 0x4EBFB9F: vty_execute (vty.c:1285)
==7313== by 0x4EC250F: vtysh_read (vty.c:2119)
==7313==

that is causing the actual crash.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-10 09:03:56 -04:00
Donald Sharp
ca9e5ab316 bgpd: AS paths are uint32_t instead of integers
We have some JSON output that was displaying high order
AS path data as negative numbers:

{
 "paths":[
    {
      "aspath":{
        "string":"4200010118 4200010000 20473 1299",
        "segments":[
          {
            "type":"as-sequence",
            "list":[
              -94957178,
              -94957296,
              20473,
              1299
            ]
          }
        ],

Notice "String" output -vs- the list.

With fixed code:

  "paths":[
    {
      "aspath":{
        "string":"64539 4294967000 15096 6939 7922 7332 4249",
        "segments":[
          {
            "type":"as-sequence",
            "list":[
              64539,
              4294967000,
              15096,
              6939,
              7922,
              7332,
              4249
            ]
          }
        ],

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-09 16:10:44 -04:00
Donatas Abraitis
7b9a4750b8 bgpd: Remove depracated ip prefix for as-path/extcommunity/large/communities
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-10-08 08:39:55 +03:00
Lakshman Krishnamoorthy
c69e79f1d1 bgpd: Bug fix in "show bgp l2vpn evpn neighbors X.X.X.X routes json"
Fixed memory leak and  incorrect json output. Check the full output in the PR:
https://github.com/FRRouting/frr/pull/5118

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-10-07 14:33:29 -07:00
Donatas Abraitis
a0a87037ac bgpd: Use uint32_t for maximum-prefix
Currently we have unsigned long which is not what we defined
in CLI (1-4294967295).

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-10-04 15:46:21 +03:00
Donald Sharp
3835984f1c bgpd: bgp pointer may be null
The bgp pointer may not be actually found.  The debug
message that was using it could get the same value
another way.  Convert over

Fixes Coverity Scan Issue:

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-03 08:57:55 -04:00
Donald Sharp
c17140fd7a bgpd: Show to compiler that uint64_t -> uint32_t is ok here
We only have a uint32_t value here but clippy is wise and
gives us more data than we need. Tell the compiler we can
throw some stuff away.

This was found by inspecting CI results.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-10-03 08:55:29 -04:00
Donatas Abraitis
d091d9adcd bgpd: Keep the session down if maximum-prefix is reached
Under high load instances with hundreds of thousands of prefixes this
could result in very unstable systems.

When maximum-prefix is set, but restart timer is not set then the session
flaps between Idle(Pfx) -> Established -> Idle(Pfx) states.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-10-03 09:31:50 +03:00
Renato Westphal
698603ce6d
Merge pull request #5085 from qlyoung/strip-trailing-whitespace-2019
*: strip trailing whitespace
2019-09-30 22:53:56 -03:00
Russ White
44cde8a39f
Merge pull request #5011 from karamalla0406/evpn_cli_json
bgpd: Fixed 'show bgp l2vpn evpn json' to display all routes
2019-09-30 18:30:28 -04:00
Quentin Young
c258527bd2 *: strip trailing whitespace
Some of it has snuck by CI

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-09-30 16:44:43 +00:00
Russ White
9898a2fb34
Merge pull request #5009 from donaldsharp/interface_deletion
lib, zebra: Allow for interface deletion when kernel event happens
2019-09-30 07:46:19 -04:00
Lakshman Krishnamoorthy
dc387b0fea bgpd: Fixing "show bgp l2vpn evpn neighbors x.x.x.x advertised-routes json
Display output from adj_out instead of the rib table.

Also fixes crash for the json output. RCA: prefix is written to json object
using inet_ntop. But, this api returns null buffer for AF_EVPN address family
(it works only for AF_INET and AF_INET6).  This null buffer is then deref'd
by json-object-to string api.

Full output shown in PR: https://github.com/FRRouting/frr/pull/5078
Crash issue: https://github.com/FRRouting/frr/issues/5010

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-09-27 12:04:13 -07:00
Lakshman Krishnamoorthy
44c6974748 bgpd: Adding new bgp evpn cli's for ip-prefix lookup
Implement CLIs for the following, to filter for a prefix within
evpn type 5 route
1) show bgp l2vpn evpn A.B.C.D
2) show bgp l2vpn evpn A.B.C.D json
3) show bgp l2vpn evpn A.B.C.D/M
4) show bgp l2vpn evpn A.B.C.D/M json
5) show bgp l2vpn evpn X:X::X:X
6) show bgp l2vpn evpn X:X::X:X json
7) show bgp l2vpn evpn X:X::X:X/M
8) show bgp l2vpn evpn X:X::X:X/M json

Sample output provided here: https://github.com/FRRouting/frr/pull/4850

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-09-27 10:58:46 -07:00
Donald Sharp
cb70bd5638
Merge pull request #5067 from ton31337/fix/no_aggregate-address_command_for_route-map
bgpd: Accept no aggregate-address <IP> route-map <RMAP> commands
2019-09-26 17:40:41 -04:00
Donald Sharp
961f406493
Merge pull request #5070 from ton31337/fix/aggregate-address_for_ipv6_summary-only_missreading
bgpd: aggregate-address X:X::X:X/M summary-only was missreading config
2019-09-26 17:39:09 -04:00
Donatas Abraitis
273fae13b2 bgpd: aggregate-address X:X::X:X/M summary-only was missreading config
Entering:
aggregate-address 2a02:4780::/48 summary-only

Will transform this to:
aggregate-address 2a02:4780::/48 summary-only route-map summary-only

This patch fixes that.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-09-26 21:47:55 +03:00
Donald Sharp
cf40d0528e bgpd: aggregate-address A.B.C.D A.B.C.D summary-only was missreading config
The `aggregate-address 30.0.5.0 255.255.255.0 summary-only` command
was missreading the inputed data and translating it into:

`aggregate-address 30.0.5.0/24 summary-only route-map summary-only`

This is not quite correct.  Fix this behavior:

donna.cumulusnetworks.com# conf
donna.cumulusnetworks.com(config)# router bgp
donna.cumulusnetworks.com(config-router)# aggregate-address 30.0.5.0 255.255.255.0 summary-only
donna.cumulusnetworks.com(config-router)# do show run
Building configuration...

Current configuration:
!
frr version 7.3-dev
frr defaults datacenter
hostname donna.cumulusnetworks.com
log file /var/log/frr/frr.log
no ipv6 forwarding
frr version 7.2-dev
!
router bgp 500
 neighbor 192.168.209.1 remote-as external
 neighbor 192.168.209.1 ebgp-multihop 255
 neighbor 192.168.210.1 remote-as external
 !
 address-family ipv4 unicast
  network 192.168.9.0/24
  network 192.168.10.0/24
  aggregate-address 30.0.5.0/24 summary-only
 exit-address-family
!

Issue: #5054
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-26 12:40:19 -04:00
Donatas Abraitis
b84da0db76 bgpd: Accept no aggregate-address <IP> route-map <RMAP> commands
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-09-26 17:35:25 +03:00
Donatas Abraitis
5300176ff8
Merge pull request #5047 from dslicenc/bgp-next-hop-routemap
bgpd: stop sending nexthop set by "route-map in" to eBGP peers
2019-09-26 11:17:51 +03:00
Don Slice
1c875ddb57 bgpd: stop sending nexthop set by "route-map in" to eBGP peers
Problem reported that when a "neighbor x.x.x.x route-map FOO in"
set a next-hop value, that modified next-hop value was also sent
to eBGP peers.  This is incorrect since bgp is expected to set
next-hop to self when sending to eBGP peers unless third party
next-hop on a shared segment is true.  This fix modifies the
behavior to stop sending the modified next-hop to eBGP peers
if the route-map was applied inbound on another peer.

Ticket: CM-26025
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-09-25 13:54:39 -07:00
Chirag Shah
2c4654a183 bgpd: fix global and per vni knobs display
Not just per vni knobs but when the global
knobs are enabled, display
per vni advertise-svi-ip and advertise-gw-macip
as active.

Ticket:CM-26381
Reviewed By:
Testing Done:

TOR1#show running-config bgpd
router bgp 5587
 ...
 address-family l2vpn evpn
  advertise-all-vni
  advertise-svi-ip
...

TORC11# show bgp l2vpn evpn vni 1004 json
{
  "vni":1004,
  "type":"L2",
  "kernelFlag":"Yes",
  "rd":"27.0.0.11:7",
  "originatorIp":"36.0.0.11",
  "mcastGroup":"0.0.0.0",
  "advertiseGatewayMacip":"Disabled",
  "advertiseSviMacip":"Active",
  "importRts":[
    "5546:1004"
  ],
  "exportRts":[
    "5546:1004"
  ]
}

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-09-24 14:25:38 -07:00
Chirag Shah
cbdbb1cafc bgpd: add advertise-svi-ip in json output
Ticket:CM-26404
Reviewed By:
Testing Done:

TORC1# show bgp l2vpn evpn vni 1004 json
{
  "vni":1004,
  "type":"L2",
  "kernelFlag":"Yes",
  "rd":"37.0.1.11:7",
  "originatorIp":"37.0.1.11",
  "mcastGroup":"0.0.0.0",
  "advertiseGatewayMacip":"No",
  "advertiseSviMacip":"No",
  "importRts":[
    "5546:1004"
  ],
  "exportRts":[
    "5546:1004"
  ]
}

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-09-24 14:25:38 -07:00
Russ White
a7f5a058e2
Merge pull request #4822 from vishaldhingra/route_agg
bgpd : route aggregation optimisation
2019-09-24 11:40:01 -04:00
Donald Sharp
a3116965bb bgpd: rmap_type is 8 bit but we have 9 bits of flags
The newly added PEER_RMAP_TYPE_AGGREGATE flag is setup to
be the 9th bit:

But the flag we are putting it into:
uint8_t rmap_type;

is 8 bits.  Adjust the size.

Found by Coverity SA Scan
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-24 08:29:46 -04:00
vdhingra
ef51a7d8d4 bgpd : route agg. with aspath attribute is consuming lot of cycles.
While configuring aggregate route prepare the hash table first,
then prepare the aggregated aspath value just like lcomm,
ecomm and standard community.

Signed-off-by: vishaldhingra<vdhingra@vmware.com>
2019-09-24 02:54:19 -07:00
vdhingra
4edd83f91b bgpd : route agg. with ecomm attribute is consuming lot of cycles.
While configuring aggregate route prepare the hash table first,
then prepare the aggregated ecomm value and then do the
unique sort once for ecommunity.

Signed-off-by: vishaldhingra<vdhingra@vmware.com>
2019-09-24 02:54:19 -07:00
vdhingra
21fec67453 bgpd : route agg. with comm attr is consuming lot of cycles.
While configuring aggregate route prepare the hash table
first, then prepare the aggregated standard comm value
and then do the unique sort once for standard community.

Signed-off-by: vishaldhingra<vdhingra@vmware.com>
2019-09-24 02:54:19 -07:00
vdhingra
f1eb1f0526 bgpd : route agg. with lcomm attribute is consuming lot of cycles.
While configuring aggregate route prepare the hash table first,
then prepare the aggregated lcomm value and then do the unique
sort once for large community.

Signed-off-by: vishaldhingra <vdhingra@vmware.com>
2019-09-24 02:53:51 -07:00
Donald Sharp
5b18ef8270 bgpd: When displaying update group information include coalesce time
Include the coalesce time for the update group `show bgp update-group`
command as well as print out how long the coalesce timer waited
for on the timer pop.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-23 14:15:01 -04:00
Donald Sharp
7dba67ff25 bgpd: Do not display 'X' as part of outgoing route-map name
The peer's outgoing routemap should not be displaying a 'X'
appended to the front of the name.  This will create
confusion.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-23 13:46:55 -04:00
Donald Sharp
7decb30c20 bgpd: Invalid NH's should send an apropriate reason code
RFC 4271 sec 6.3 p33, In the case of a BGP_NEXTHOP attribute with an
incorrect value, FRR is supposed to send a notification
and include 'Corresponding type, length and value of the NEXT_HOP
attribute in the notification data.

Fixes: #4997
Signed-off-by: Nikos <ntriantafillis@gmail.com>
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-20 06:41:02 -04:00
Donald Sharp
3c3c325203 *: Convert zapi->interface_delete to ifp callback
Convert the callback of the interface_delete to the new
ifp callback.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-19 13:34:06 -04:00
Donald Sharp
b0b69e59f4 *: Convert interface_down to interface down callback
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-19 13:34:06 -04:00
Donald Sharp
ddbf3e6060 *: Convert from ->interface_up to the interface callback
For all the places we have a zclient->interface_up convert
them to use the interface ifp_up callback instead.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-19 13:34:06 -04:00
Donald Sharp
ef7bd2a3d5 *: Switch all zclient->interface_add to interface create callback
Switch the zclient->interface_add functionality to have everyone
use the interface create callback in lib/if.c

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-19 13:34:06 -04:00
Donald Sharp
138c5a7450 *: Add infrastructure to support zapi interface callbacks
Start the conversion to allow zapi interface callbacks to be
controlled like vrf creation/destruction/change callbacks.

This will allow us to consolidate control into the interface.c
instead of having each daemon read the stream and react accordingly.
This will hopefully reduce a bunch of cut-n-paste stuff

Create 4 new callback functions that will be controlled by
lib/if.c

create -> A upper level protocol receives an interface creation event
The ifp is brand spanking newly created in the system.
up -> A upper level protocol receives a interface up event
This means the interface is up and ready to go.
down -> A upper level protocol receives a interface down
destroy -> A upper level protocol receives a destroy event
This means to delete the pointers associated with it.

At this point this is just boilerplate setup for future commits.
There is no new functionality.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-19 13:34:06 -04:00
Kishore Aramalla
0afbd728ed bgpd: Fixed 'show bgp l2vpn evpn json' to display all routes
Fixed the following:
1. Print the complete header for 'show bgp l2vpn evpn' command
2. Print the Route Distinguisher header
3. Print all relevant routes in json (some were being skipped)

Signed-off-by: Kishore Aramalla <karamalla@vmware.com>
2019-09-18 20:47:50 -07:00
Emanuele Di Pascale
33a9e19681 bgpd: fix include path for bgp_bmp_clippy.c
not using a relative path was breaking out-of-tree compilation

Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
2019-09-18 11:49:24 +02:00
Lou Berger
ef5307f23f
Merge pull request #4861 from NaveenThanikachalam/logs
BGP: Rectifying the log messages.
2019-09-17 11:33:43 -04:00
Donald Sharp
b6534e248a
Merge pull request #4993 from ton31337/fix/remove_trailing_whitespaces
bgpd: Remove trailing whitespaces from some header files
2019-09-17 07:49:51 -04:00
Russ White
2d6f27a9eb
Merge pull request #4981 from donaldsharp/bgp_distance
Bgp distance
2019-09-17 07:45:29 -04:00
Russ White
1fcc189f24
Merge pull request #4970 from shikenghua/prefer_global
bgpd: prefer-global command not working on IPv4 peers
2019-09-17 07:33:05 -04:00
Russ White
aa83afaaa5
Merge pull request #4887 from vishaldhingra/lcomm_json
lib: rmap dep table is not correct in case of exact-match clause
2019-09-17 07:30:17 -04:00
Russ White
321b1efab2
Merge pull request #4810 from qlyoung/fix-pthread-bad-pointer
Fix potential frr_pthread.c stale pointer
2019-09-17 07:27:12 -04:00
Russ White
fe8d933c2c
Merge pull request #4564 from pguibert6WIND/misc_vrf_update_name
Misc vrf update name
2019-09-17 07:22:22 -04:00
Donatas Abraitis
9ea364a21f bgpd: Remove trailing whitespaces from some header files
This is annoying when editing a file and saving the file. IDEs like
VSCode can automatically remove trailing whitespaces, hence it would be better
having a clean code before pushing other changes.

I step onto this not the first time.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-09-17 11:28:48 +03:00
Quentin Young
bfc18a0205 bgpd: do not send keepalives when KA timer is 0
RFC4271 specifies behavior when the hold timer is sent to zero - we
should not send keepalives or run a hold timer. But FRR, and other
vendors, allow the keepalive timer to be set to zero with a nonzero hold
timer. In this case we were sending keepalives constantly and maxing out
a pthread to do so. Instead behave similarly to other vendors and do not
send keepalives.

Unsure what the utility of this is, but blasting keepalives is
definitely the wrong thing to do.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-09-16 16:15:07 +00:00
Quentin Young
b9b4c0610a lib: handle frr_pthread_init/fini in libfrr init
Make sure we are always cleaning init'ing and cleaning up pthread infra.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-09-16 16:12:04 +00:00
vdhingra
909f3d56ae lib: rmap dep table is not correct in case of exact-match clause
User pass the string match large-community 1 exact-match from CLI.
Now route map lib has got the string as "1 exact-match". It passes the string
to call back for compilation. BGP will parse this string and came to know
that for "1" it has to do exact match. Routemap lib has to save "1" in it’s
dependency table. Here routemap is saving this as a “1 exact-match”
which is wrong. The solution is used the compiled data.

Signed-off-by: vishaldhingra <vdhingra@vmware.com>
2019-09-15 05:45:27 -07:00
Donald Sharp
7b7d48e586 bgpd: Create set distance XXX command for routemaps
Allow bgp to set a local Administrative distance to use
for installing routes into the rib.

Example:
!
router bgp 9323
 bgp router-id 1.2.3.4
 neighbor enp0s8 interface remote-as external
 !
 address-family ipv4 unicast
  neighbor enp0s8 route-map DISTANCE in
 exit-address-family
!
route-map DISTANCE permit 10
 set distance 153
!
line vty
!
end
eva# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued route, r - rejected route

B   0.0.0.0/0 [153/0] via fe80::a00:27ff:fe84:c2d6, enp0s8, 00:00:06
K>* 0.0.0.0/0 [0/100] via 10.0.2.2, enp0s3, 00:06:31
B>* 1.1.1.1/32 [153/0] via fe80::a00:27ff:fe84:c2d6, enp0s8, 00:00:06
B>* 1.1.1.2/32 [153/0] via fe80::a00:27ff:fe84:c2d6, enp0s8, 00:00:06
B>* 1.1.1.3/32 [153/0] via fe80::a00:27ff:fe84:c2d6, enp0s8, 00:00:06
C>* 10.0.2.0/24 is directly connected, enp0s3, 00:06:31
K>* 169.254.0.0/16 [0/1000] is directly connected, enp0s3, 00:06:31
eva#

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-13 16:43:16 -04:00
Donatas Abraitis
0606039c19 bgpd: Use defined constants for NHLEN instead of numeric values
This is better in cases when you need to find specific pattern and/or
replacing.

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-09-13 11:43:44 +03:00
kh_shi
c5ca731e64 bgpd: prefer-global command not working on IPv4 peers
`set ipv6 next-hop prefer-global` is not working on IPv4 peers.
In MP-BGP, bgp routers can advertising IPv6 routes over IPv4 peers.
Remove the peer's remote address AFI type checking.

Signed-off-by: shikenghua <kh_shi@edge-core.com>
2019-09-12 10:26:26 +00:00
Lou Berger
ccc13acc0f
Merge pull request #4866 from ton31337/feature/apply_route-map_for_aggregate-address
bgpd: Apply route-map for aggregate-address
2019-09-10 11:59:10 -04:00
Russ White
6740a30296
Merge pull request #4933 from chiragshah6/evpn_dev2
bgpd: clear l3vni prefix-only flag upon deletion
2019-09-10 11:53:08 -04:00
Donatas Abraitis
c728d02764 bgpd: Do not send next-hop as :: in MP_REACH_NLRI if no link-local exists
This is the unusual case when you have global IPv6 address and no link-local
on interface attached. Like here:

eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
 link/ether 08:00:27:65:c6:82 brd ff:ff:ff:ff:ff:ff
 inet6 2a02:4780:face::1/64 scope global
    valid_lft forever preferred_lft forever

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-09-10 18:11:58 +03:00
Naveen Thanikachalam
4cb5e18ba5 BGP: Rectifying the log messages.
This change addresses the following:
1) Ensures logs under DEBUG macro checks are categorized
   as zlog_debug instead of zlog_info.
2) Error logs are categorized as zlog_err instead of zlog_info.
3) Rephrasing certain logs to make them appear more intuitive.

Signed-off-by: NaveenThanikachalam <nthanikachal@vmware.com>
2019-09-09 22:59:22 -07:00
Mark Stapp
df9e8ae722 bgpd: fix build breakage after hook re-definition
A recent merge re-defined a hook, but one file did not get
the appropriate change.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
2019-09-09 12:03:30 -04:00
Quentin Young
1ce14168b3
Merge pull request #4809 from martonksz/master
bgpd: hook for bgp peer status change events
2019-09-09 10:55:00 -04:00
Chirag Shah
ff9d54fb98 bgpd: clear l3vni prefix-only flag upon deletion
When L3vni is created with prefix-only flag,
the flag is set at bgp vrf instance level.
In the case of bgp instance is non auto created,
means user configured instance (i.e 'router bgp x vrf <name>')

Upon deletion of l3vni, clear the prefix-only flag from
bgp vrf instance.

Ticket:CM-21894
Reviewed By:CCR-9176
Testing Done:

vrf vrf1
 vni 104001
 exit-vrf
!
router bgp 650030 vrf vrf1
!

tor-21(config)# vrf vrf1
tor-21(config-vrf)# vni 104001 prefix-routes-only
tor-21(config-vrf)# no vni 104001 prefix-routes-only
tor-21(config-vrf)# end

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-09-06 10:58:51 -07:00
Sri Mohana Singamsetty
eef47e1ed1
Merge pull request #4863 from chiragshah6/evpn_dev1
bgpd: evpn convey svi_ip knob to zebra post vni add
2019-09-05 21:58:36 -07:00
Donald Sharp
947d34af23
Merge pull request #4869 from rtrlib/2019-08-22-bugfix-master
bgpd: rpki fixes (master)
2019-09-04 07:49:14 -04:00
Donald Sharp
11d443f591
Merge pull request #4925 from ddutt/master
bgpd: Fixes to error message printed for failed peerings
2019-09-03 20:36:53 -04:00
Dinesh G Dutt
05912a17e6 bgpd: Fixes to error message printed for failed peerings
There was a silly bug introduced when the command to show failed sessions
was added. A missing "," caused the wrong error message to be printed.
Debugging this led down a path that:
   - Led to discovering one more error message that needed to be added
   - Providing the error code along with the string in the JSON output
     to allow programs to key off numbers rather than strings.
   - Fixing the missing ","
   - Changing the error message to "Waiting for Peer IPv6 LLA" to
     make it clear that we're waiting for the link local addr.

Signed-off-by: Dinesh G Dutt <5016467+ddutt@users.noreply.github.com>
2019-09-03 19:55:49 +00:00
David Lamparter
0cf6db21ec *: frr_elevate_privs -> frr_with_privs
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-09-03 17:18:35 +02:00
David Lamparter
00dffa8cde lib: add frr_with_mutex() block-wrapper
frr_with_mutex(...) { ... } locks and automatically unlocks the listed
mutex(es) when the block is exited.  This adds a bit of safety against
forgetting the unlock in error paths & co. and makes the code a slight
bit more readable.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-09-03 17:15:17 +02:00
Donald Sharp
cda7187d27 *: Convert some route map functions to return the enum
Conver these functions:
route_map_add_match
route_map_delete_match
route_map_add_set
route_map_delete_set

To return the `enum rmap_compile_rets` and ensure all functions
that use this code handle all the enumerated possible returns.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-09-03 08:19:22 -04:00
Donald Sharp
6ae3f8420f
Merge pull request #4920 from ddutt/bgp-summary-upd8
Add Estd & Dropped counters to JSON output of "show bgp summary" command
2019-09-03 08:06:22 -04:00
Donald Sharp
217f07373e
Merge pull request #4913 from ddutt/master
bgpd: Add a new command to only show failed peerings
2019-09-03 08:05:33 -04:00
Dinesh G Dutt
200116db4c bgpd: Add Established and Dropped counts to JSON output of bgp summary
Based on a suggestion by Donald Sharp, this patch adds the counts of the
number of times a BGP peering session has transitioned from Estd->NotEstd
and from NotEstd->Estd to the JSON output only of the
"show [ip] bgp [vrf <vrf>] summary" command. The idea is that even if the
current session is well and up, but a sessions has trasnitionined in and
out of Estd state multiple times, its worth noting that. We cannot change
the non-JSON output as easily, and so this command only addresses the JSON
part for now. The fields added are the ones that were provided only as part
of the "show bgp neighbor" command.

Signed-off-by: Dinesh G Dutt <5016467+ddutt@users.noreply.github.com>
2019-09-02 19:37:37 +00:00
Dinesh G Dutt
3577f1c54f bgpd: Add a new command to only show failed peerings
In a data center, having 32-128 peers is not uncommon. In such a situation, to find a
peer that has failed and why is several commands. This hinders both the automatability of
failure detection and the ease/speed with which the reason can be found. To simplify this
process of catching a failure and its cause quicker, this patch does the following:

1. Created a new function, bgp_show_failed_summary to display the
   failed summary output for JSON and vty
2. Created a new function to display the reset code/subcode. This is now used in the
   failed summary code and in the show neighbors code
3. Added a new variable failedPeers in all the JSON outputs, including the vanilla
   "show bgp summary" family. This lists the failed session count.
4. Display peer, dropped count, estd count, uptime and the reason for failure as the
   output of "show bgp summary failed" family of commands
5. Added three resset codes for the case where we're waiting for NHT, waiting for peer
   IPv6 addr, waiting for VRF to init.

This also counts the case where only one peer has advertised an AFI/SAFI.

The new command has the optional keyword "failed" added to the classical summary command.

The changes affect only one existing output, that of "show [ip] bgp neighbors <nbr>". As
we track the lack of NHT resolution for a peer or the lack of knowing a peer IPv6 addr,
the output of that command will show a "waiting for NHT" etc. as the last reset reason.

This patch includes update to the documentation too.

Signed-off-by: Dinesh G Dutt <5016467+ddutt@users.noreply.github.com>
2019-09-02 14:21:44 +00:00
David Lamparter
83c64a7d32 build: make BMP optional
Sigh.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-08-30 19:22:29 +02:00
David Lamparter
ed18356f1f bgpd/bmp: BMP implementation
This implements BMP.  There's no fine-grained history here, the non-BMP
preparations are already split out from here so all that remains is BMP
proper.

Signed-off-by: David Lamparter <equinox@diac24.net>
2019-08-30 19:22:23 +02:00
David Lamparter
0ba4eeec22 bgpd/bmp: convert BMP code into module
This is mostly here for documentation purposes to show how some code is
converted into a module.

Signed-off-by: David Lamparter <equinox@diac24.net>
2019-08-30 19:00:45 +02:00
David Lamparter
d35a6c2895 bgpd/bmp: use bgp packet dump hook
Signed-off-by: David Lamparter <equinox@diac24.net>
2019-08-30 19:00:45 +02:00
Yasuhiro Ohara
6c29258c96 bgpd/bmp: Initial BMP implementation.
This is the initial BMP skeleton from Yasuhiro Ohara.

(License/Signoff note: code published on github as GPLv2+.)

Signed-off-by: David Lamparter <equinox@diac24.net>
2019-08-30 19:00:45 +02:00
David Lamparter
6566d669a5 bgpd: add timestamp to bgp_adj_in
If we reject a received update in a filter, it never turns into a
bgp_path_info but stays in adj_in.  For that case, we don't have any
timestamp for the update.

Currently, this isn't visible anywhere; BMP will make use of this
timestamp (and we can add a CLI option if we want.)

Signed-off-by: David Lamparter <equinox@diac24.net>
2019-08-30 19:00:45 +02:00
Donatas Abraitis
234166648f
Merge pull request #4891 from donaldsharp/bgp_keepalives
bgpd: Shut off keepalives as soon as we shutdown a peer
2019-08-29 16:22:04 +03:00
Sri Mohana Singamsetty
614338c6ac
Merge pull request #4847 from vivek-cumulus/evpn-route-import-fix
bgpd: Ensure correct checks for EVPN route import
2019-08-29 05:50:23 -07:00
Donatas Abraitis
20894f50bd bgpd: Apply route-map for aggregate-address command
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-08-28 16:45:21 +03:00
Donald Sharp
0a6469e55e bgpd: Shut off keepalives as soon as we shutdown a peer
We have this crash:

2019-08-18T07:58:44.831656-04:00 rch2-140-fwK2b bgpd[1791]: %NOTIFICATION: sent to neighbor 10.73.248.8 4/0 (Hold Timer Expired) 0 bytes
2019-08-18T07:58:44.832164-04:00 rch2-140-fwK2b bgpd[1791]: Assertion `!((peer->thread_flags) & ((1 << 0)))' failed in file bgpd.c, line 2173, function peer_delete
2019-08-18T07:58:44.832548-04:00 rch2-140-fwK2b bgpd[1791]: Backtrace for 11 stack frames:
2019-08-18T07:58:44.832942-04:00 rch2-140-fwK2b bgpd[1791]: [bt 0] /usr/lib/libfrr.so.0(zlog_backtrace+0x3a) [0x7f5503c7c31a]
2019-08-18T07:58:44.833311-04:00 rch2-140-fwK2b bgpd[1791]: [bt 1] /usr/lib/libfrr.so.0(_zlog_assert_failed+0x61) [0x7f5503c7c891]
2019-08-18T07:58:44.833684-04:00 rch2-140-fwK2b bgpd[1791]: [bt 2] /usr/lib/frr/bgpd(peer_delete+0x4d5) [0x1432ceea15]
2019-08-18T07:58:44.834095-04:00 rch2-140-fwK2b bgpd[1791]: [bt 3] /usr/lib/frr/bgpd(+0x430e9) [0x1432cfc0e9]
2019-08-18T07:58:44.834479-04:00 rch2-140-fwK2b bgpd[1791]: [bt 4] /usr/lib/frr/bgpd(bgp_event_update+0x121) [0x1432cfe1c1]
2019-08-18T07:58:44.834852-04:00 rch2-140-fwK2b bgpd[1791]: [bt 5] /usr/lib/frr/bgpd(+0x453f1) [0x1432cfe3f1]
2019-08-18T07:58:44.835388-04:00 rch2-140-fwK2b bgpd[1791]: [bt 6] /usr/lib/libfrr.so.0(thread_call+0x60) [0x7f5503c9e3c0]
2019-08-18T07:58:44.835829-04:00 rch2-140-fwK2b bgpd[1791]: [bt 7] /usr/lib/libfrr.so.0(frr_run+0xb8) [0x7f5503c79de8]
2019-08-18T07:58:44.836292-04:00 rch2-140-fwK2b bgpd[1791]: [bt 8] /usr/lib/frr/bgpd(main+0x229) [0x1432ce4a69]
2019-08-18T07:58:44.836729-04:00 rch2-140-fwK2b bgpd[1791]: [bt 9] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f550271bb45]
2019-08-18T07:58:44.837198-04:00 rch2-140-fwK2b bgpd[1791]: [bt 10] /usr/lib/frr/bgpd(+0x2cefc) [0x1432ce5efc]
2019-08-18T07:58:44.837670-04:00 rch2-140-fwK2b bgpd[1791]: Current thread function (bgp_holdtime_timer), scheduled from file bgp_fsm.c, line 380

This is the code:
	bgp_reads_off(peer);
	bgp_writes_off(peer);
	assert(!CHECK_FLAG(peer->thread_flags, PEER_THREAD_WRITES_ON));
	assert(!CHECK_FLAG(peer->thread_flags, PEER_THREAD_READS_ON));

The line crashing is the first assert.  We know in bgp_writes_off we unset this flag:

void bgp_writes_off(struct peer *peer)
{
        struct frr_pthread *fpt = bgp_pth_io;
        assert(fpt->running);

        thread_cancel_async(fpt->master, &peer->t_write, NULL);
        THREAD_OFF(peer->t_generate_updgrp_packets);

        UNSET_FLAG(peer->thread_flags, PEER_THREAD_WRITES_ON);
}

We also know that the keepalives are not being turned off until we call
bgp_fsm_change_status(peer, Deleted);

later in the function.  We know that the keepalive pthread will
write to individual peers and issue a bgp_write_on(), which sets
this flag.

Modify the code base so that we explicitly turn off the keepalives
immediately before the turning of writes off.

Ticket: CM-26119
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-08-27 16:12:07 -04:00
Chirag Shah
df070e6f5e bgpd: evpn convey svi_ip to zebra post vni add
Problem:
With advertise_svi_ip knob enabled per vni.
Post vni flap, svi MAC-IP route are not originated.

Fix:
When a vni is flapped, upon re-add
send advetise_svi_ip knob to zebra.

Workaround:
re-configure advertise-svi-ip under l2vpn/evpn.

Ticket:CM-26001
Reviewed By:CCR-9118
Testing Done:

With advertise-svi-ip enabled under l2vpn/evpn
in bgp default instance.
Validated vni del/create post ifdown vxlan device
followed by ifup vxlan device.

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-08-27 08:49:10 -07:00
Chirag Shah
b90d4580f0 bgpd: fix evpn ecommunity auto rts
Evpn extended communities like auto rts (import/export) should
check if its present in list before adding it, to avoid duplicate
addition.
L3vni_add callback from zebra to bgp may see updates to vnis.
The auto import/export rt derivation may call multiple times.

Testing Done:

Before:
TORC11# show bgp l2vpn evpn vni 4001
VNI: 4001 (known to the kernel)
  Type: L3
  Tenant VRF: vrf1
  RD: 45.0.2.2:3
  ...
  Import Route Target:
    5546:4001
    5546:4001
  Export Route Target:
    5546:4001
    5546:4001

After:
VNI: 4001 (known to the kernel)
  Type: L3
  Tenant VRF: vrf1
  RD: 45.0.2.2:3
  ...
 Import Route Target:
    5546:4001
  Export Route Target:
    5546:4001

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-08-27 08:48:50 -07:00
Dinesh G Dutt
5cb5f4d04d bgpd: Eliminate all incorrect formulations of afi/safi in JSON
In a number of places, the JSON output had invalid key names for
AFI/SAFI. For example, the key name in JSON was "IPv4 Unicast" which
is invalid as a JSON Key name. Many JSON tools such as those used in
Ansible, jq etc. all fail to parse the output in these scenarios. The
valid name is ipv4Unicast. There's already a routine afi_safi_json()
defined to handle this change, but it was not consistently called.
The non-JSON version was called afi_safi_print() and it merely returned
the CLI version of the string, didn't print anything.

This patch deals with this issue by:
   - Renaming afi_safi_print to get_afi_safi_str()
   - get_afi_safi_str takes an additional param, for_json which if true
     will return the JSON-valid string
   - Renaming afi_safi_json to get_afi_safi_json_str()
   - Creating a new routine get_afi_safi_vty_str() for printing to vty
   - Consistently using get_afi_safi_str() with the appropriate for_json
     value

Signed-off-by: Dinesh G Dutt <5016467+ddutt@users.noreply.github.com>
2019-08-27 14:05:39 +00:00
Philippe Guibert
d5f31d5f82 bgpd: register to vrf_update_name() hook
that hook is called back when default vrf name changes.
note that the hook is bgp_vrf_enable, and that the function is slightly
modified in order to be able to move bgp vrf instance from vrf to
default instance. for this, rfapi contexts are allocated.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2019-08-27 15:08:50 +02:00
Donald Sharp
9131e6e818 bgpd: Add 'no set as-path prepend last-as X' command
The `set as-path prepend last-as X` command had no, 'no' form
of the command.  Add this into the cli.

Testing:
!
route-map BLARBLE permit 10
 set as-path prepend last-as 3
!
!
router bgp 9999
 neighbor 10.50.12.118 remote-as external
 neighbor 10.50.12.118 ebgp-multihop 30
 !
 address-family ipv4 unicast
  neighbor 10.50.12.118 route-map BLARBLE in
 !
!

eva# show bgp ipv4 uni 4.4.4.4
BGP routing table entry for 4.4.4.4/32
Paths: (1 available, best #1, table default)
  Advertised to non peer-group peers:
  10.50.12.118
  999 999 999 999
    10.50.12.118 from 10.50.12.118 (10.50.12.118)
      Origin incomplete, metric 0, valid, external, best (First path received)
      Last update: Mon Aug 26 09:47:17 2019

eva# conf
eva(config)# route-map BLARBLE permit 10
eva(config-route-map)# no set as-path prepend last-as 3
eva(config-route-map)# end
eva# clear bgp ipv4 uni *
eva# show bgp ipv4 uni 4.4.4.4
BGP routing table entry for 4.4.4.4/32
Paths: (1 available, best #1, table default)
  Advertised to non peer-group peers:
  10.50.12.118
  999
    10.50.12.118 from 10.50.12.118 (10.50.12.118)
      Origin incomplete, metric 0, valid, external, best (First path received)
      Last update: Mon Aug 26 09:48:31 2019

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-08-26 09:49:18 -04:00
Marcel Röthke
a5d254243a bgpd: cleanup rtrlib includes in rpki module
Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
2019-08-26 15:22:10 +02:00
Donatas Abraitis
3eb0d26717
Merge pull request #4821 from vishaldhingra/lcomm_json
bgpd : Ambiguous command: show bgp large-community-list 1
2019-08-26 11:23:30 +03:00
vdhingra
960b69b9df bgpd : Ambiguous command: show bgp large-community-list 1
When user wants to dump individual large-community-list with the name
then bgp throws an error. It is due to command to dump the bgp RIB routes
having a particular large-community-list values. To segregate both the
commands this fix has added the detail keyword in the below command.
show bgp large-community-list <(1-500)|WORD> detail
The same code change is applicable for community-list also.

Signed-off-by: vishaldhingra<vdhingra@vmware.com>
2019-08-25 23:01:02 -07:00
Donatas Abraitis
5d4324440d
Merge pull request #4815 from NaveenThanikachalam/603_bgp_vty
bgpd: Large-communities CLI accepts configurations sans attributes.
2019-08-24 22:52:08 +03:00
Donald Sharp
dde42c9b95 bgpd: Allow shortened input for show bgp l2vpn evpn route type e|p
The `show bgp l2vpn evpn route type <es|prefix>` commands
only accepted 2 letters.  You could not type `show bgp l2vpn evpn route type e`
or `show bgp l2vpn evpn route type p` although both are technically legal
since nothing overlaps with them.

Ticket: CM-25988
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-08-23 15:44:32 -04:00
Marcel Röthke
8add171952 bgpd: automatically disable rpki when the last cache is removed instead of erroring out
Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
2019-08-22 17:39:00 +02:00
Marcel Röthke
dd783f3e1d bgpd: deprecate rpki initial sync timeout commands
Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
2019-08-22 17:31:24 +02:00
Marcel Röthke
6893064b42 bgpd: cleanup properly if rtr mgr cannot add a cache
Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
2019-08-22 17:31:09 +02:00
Marcel Röthke
a2ed7b2b18 bgpd: ensure rpki cache preference values are unique even if rtr mgr is not yet started
Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
2019-08-22 17:30:51 +02:00
Russ White
f197ecb35f
Merge pull request #4857 from dslicenc/bgpd-clear-afi-safi
bgpd: make clear bgp * clear all peers in all afi/safis
2019-08-21 14:53:32 -04:00
Sri Mohana Singamsetty
bc90819210
Merge pull request #4858 from donaldsharp/bgp_default
bgpd: Remove declarations of unused functions
2019-08-20 10:29:53 -07:00
Sri Mohana Singamsetty
d1c6230236
Merge pull request #4846 from vivek-cumulus/rfc-5549-gua-fix-ra
Fix nexthop reg and RA enable for IPv4 route exchange using GUA IPv6 peering
2019-08-20 09:07:54 -07:00
Donald Sharp
7299243511 bgpd: Remove declarations of unused functions
Code inspection found some functions being declared
in a .h file but FRR does not have the functions
implemented.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-08-20 09:59:39 -04:00
Don Slice
dc91261567 bgpd: make clear bgp * clear all peers in all afi/safis
Problem reported that "clear bgp *" only cleared ipv6 peers.
Changed the logic to clear all afi/safis of all peers in
that case.  Also improved the operation of clearing
individual afi/safi using soft/in/out to do the right thing.

Ticket: CM-25887
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-08-20 13:50:58 +00:00
Donald Sharp
f79f7a7bb2 *: Fix spelling errors pointed out by debian packaging
Debian packaging when run finds a bunch of spelling errors:

I: frr: spelling-error-in-binary usr/bin/vtysh occurences occurrences
I: frr: spelling-error-in-binary usr/lib/frr/bfdd Amount of times Number of times
I: frr: spelling-error-in-binary usr/lib/frr/bgpd occurences occurrences
I: frr: spelling-error-in-binary usr/lib/frr/bgpd recieved received
I: frr: spelling-error-in-binary usr/lib/frr/isisd betweeen between
I: frr: spelling-error-in-binary usr/lib/frr/ospf6d Infomation Information
I: frr: spelling-error-in-binary usr/lib/frr/ospfd missmatch mismatch
I: frr: spelling-error-in-binary usr/lib/frr/pimd bootsrap bootstrap
I: frr: spelling-error-in-binary usr/lib/frr/pimd Unknwon Unknown
I: frr: spelling-error-in-binary usr/lib/frr/zebra Requsted Requested
I: frr: spelling-error-in-binary usr/lib/frr/zebra uknown unknown
I: frr: spelling-error-in-binary usr/lib/x86_64-linux-gnu/frr/libfrr.so.0.0.0 overriden overridden

This commit fixes all of them except the bgp `recieved` issue due to
it being part of json output.  That one will need to go through
a deprecation cycle.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
2019-08-19 10:36:53 -04:00
Donald Sharp
604321440e
Merge pull request #4841 from rtrlib/2019-08-16-bugfix-master
bgpd: rpki fixes (master)
2019-08-19 09:57:18 -04:00
vivek
3d0b43d7c5 bgpd: Ensure correct checks for EVPN route import
In a situation where a VRF has configured route targets for importing
EVPN routes, this configuration may exist prior to the VRF being
ready to have EVPN routes installed into it - e.g., still missing
the L3VNI configuration or associated interface information. Ensure
that this is taken into account during EVPN route import and unimport.
Without this fix, EVPN routes would end up being prematurely imported
into the VRF routing table and consequently installed as inactive
(because the nexthop information would be incorrect when BGP informs
zebra).

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
2019-08-18 23:07:59 -07:00
vivek
5408e68e24 bgpd: Display peer info in NHT output
When a BGP next hop tracking (NHT) entry is created for a peer,
display it in the corresponding "show" command output.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by:   Donald Sharp <sharpd@cumulusnetworks.com>
2019-08-18 22:21:38 -07:00
vivek
e2d3a90954 bgpd: Fix nexthop reg for IPv4 route exchange using GUA IPv6 peering
In the case of IPv4 route exchange using GUA IPv6 peering, the route install
into the FIB involves mapping the immediate next hop to an IPv4 link-local
address and installing neighbor entries for this next hop address. To
accomplish the latter, IPv6 Router Advertisements are exchanged (the next hop
or peer must also have this enabled) and the RAs are dynamically initiated
based on next hop resolution.

However, in the case of a passive connection where the local system has not
initiated anything, no NHT entry is created for the peer, hence RAs were not
getting triggered. Address this by ensuring that a NHT entry is created even
in this situation. This is done at the time the connection becomes established
because the code has other assumptions that a NHT entry will be present only
for the "configured" peer. The API to create the entry ensures there are
no duplicates.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by:   Donald Sharp <sharpd@cumulusnetworks.com>
2019-08-18 22:12:06 -07:00
Marcel Röthke
24b7eb485d bgpd: fix bgp_table range lookup
In case the topmost node has a larger prefix length than the lookup
prefix it never matches even if it was still lower than maxlen

This also alters a test case to check for this bug.

Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
2019-08-16 16:42:11 +02:00
Marcel Röthke
798df969aa bgpd: remove initial sync timeout in rpki startup code
The initial sync timeout breaks config load and is not necessary anyway.

Fix #4827

Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
2019-08-16 16:39:03 +02:00
Dinesh Dutt
d7325ee773 bgpd: Display the imported route information for EVPN routes
For IPv4/v6 unicast routes that have been imported from EVPN Prefix
routes, display the information about where the route has been imported
from allowing for easy tracing of how a FIB/RIB entry got populated.

Signed-off-by: Dinesh G Dutt <5016467+ddutt@users.noreply.github.com>
2019-08-14 19:27:56 +00:00
Marton Kun-Szabo
7d8d0eabb4 bgpd: hook for bgp peer status change events
Generally available hook for plugging application-specific
code in for bgp peer change events.

This hook (peer_status_changed) replaces the previous, more
specific 'peer_established' hook with a more general-purpose one.
Also, 'bgp_dump_state' is now registered under this hook.

Signed-off-by: Marton Kun-Szabo <martonk@amazon.com>
2019-08-13 11:59:27 -07:00
Mark Stapp
595ad74b77
Merge pull request #4793 from qlyoung/fix-bgp-labeled-unicast-addpath
bgpd: tx addpath info for labeled unicast
2019-08-12 08:51:36 -04:00
Donald Sharp
3a6a0888f0
Merge pull request #4817 from NaveenThanikachalam/652
bgpd: Optimizing route-map's processing of dependencies.
2019-08-12 08:45:51 -04:00
Naveen Thanikachalam
47c8fa1f87 bgpd: Optimizing route-map's processing of dependencies.
Say for eg., 256 prefix-list entries are pasted to VTYSH.
This results in BGP processing the events for several minutes.

BGPD starts a timer for 5 seconds when the first dependency configuraion
is received. On timer expiry, BGP process dependent route-maps.
After this processing, BGPD reads the configurations received in the
next 5 seconds and then re-processes the route-maps from the beginning.
This cyclic re-processing consumes time and CPU cycles.

Instead of starting a timer when the first configuration is received,
everytime a configuration is received, the existing timer is reset.
This would mean that all the configurations are read first before the timer
expires. This eliminates the cyclic re-processing.

Signed-off-by: NaveenThanikachalam nthanikachal@vmware.com
2019-08-12 00:51:46 -07:00
Naveen Thanikachalam
82cdf28d2f bgpd: Large-communities CLI accepts configurations sans attributes.
BGP large-communities configuration CLI is successful even if
the command is configured without any attributes.
For ex., the below commands are successful.
         1) "bgp large-community-list standard TEST permit"
         2) "bgp large-community-list standard TEST deny"

The CLI definitions that allow these erroneous configurations need to be removed.

Signed-off-by: NaveenThanikachalam nthanikachal@vmware.com
2019-08-11 21:41:43 -07:00
Donald Sharp
1d6358e6cb
Merge pull request #4813 from NaveenThanikachalam/604
bgpd: Standard large-communities CLI does not return error when it's configured with reg-ex.
2019-08-11 16:46:33 -04:00
Naveen Thanikachalam
dfb6fd1dd1 bgpd: Assertion failed during shutdown.
A race condition causes the failure.
The function "make_info()" sets the path info's peer to
bgp instance's "peer_self" which is created when BGP is first
configured and deleted only when BGP is brought down completely.
A race condition causes the bgp instances's "peer_self" to be
removed before the routes are being pulled off from the aggregate
address.

If the bgp instance's "peer_self" is NULL or, if BGP is being deleted,
the aggregate route must not be reinstalled.

Signed-off-by: NaveenThanikachalam nthanikachal@vmware.com
2019-08-11 03:56:12 -07:00
Naveen Thanikachalam
6aee38481a bgpd: Standard large-communities CLI does not return error when it's configured with reg-ex.
The CLI to configure the standard format large-communities attribute
accepts regular expressions as well.
For ex., the below configuration is accepted.
         "bgp large-community-list standard TEST permit 1:1 100:*"

The code to parse the large-communities does identify the configuration
as invalid however, error returned isn't processed.
The code has to be modified to handle the error.

Signed-off-by: NaveenThanikachalam nthanikachal@vmware.com
2019-08-11 00:29:32 -07:00
Dinesh Dutt
dcc1615e1b bgpd: Display received and advertised EVPN routes from neighbors
"show bgp l2vpn evpn neighbors <neighbor> [advertised-routes|routes]' did
not work due to various bugs. First, the command only accepted IPv4
addresses as valid neighbor ID, thereby rejecting unnumbered BGP and IPv6
neighbor address. Second, the SAFI was hardcoded to MPLS_VPN even though
we were passing the safi. Third, "all" made no sense in the command context
and to make the command uniform across all address families, I removed the
"all" keyword from the command.

Signed-off-by: Dinesh G Dutt <ddps4u@gmail.com>
2019-08-08 04:17:26 +00:00
Quentin Young
ec15e1b588 bgpd: tx addpath info for labeled unicast
Labeled unicast needs path IDs too!

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
2019-08-06 21:46:46 +00:00
David Lamparter
fefa5e0ff5 *: fix ctype (isalpha & co.) casts
The correct cast for these is (unsigned char), because "char" could be
signed and thus have some negative value.  isalpha & co. expect an int
arg that is positive, i.e. 0-255.  So we need to cast to (unsigned char)
when calling any of these.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-08-06 16:54:52 +02:00
David Lamparter
ba7bff1150
bgpd: resolve memleak on show bgp vrf all ipv6 unicast summary… (#4772)
bgpd: resolve memleak on show bgp vrf all ipv6 unicast summary json
2019-08-06 10:49:09 +02:00
Quentin Young
8c79e94636
Merge pull request #4705 from ton31337/fix/set_comm-list_delete_into_config
bgpd: Strip `delete` keyword when looking up for large communities
2019-08-05 16:53:45 -04:00
Don Slice
3c13337daa bgpd: simplify json create/free for memleak fix
Ticket: CM-25616
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-08-05 05:53:13 -07:00
Don Slice
f86897b945 bgpd: resolve memleak on show bgp vrf all ipv6 unicast summary json
Problem reported with memory leak when the command "show bgp vrf all
ipv6 unicast summary json" is issued.  Found that the problem only
occurs if the configuration does not actually include the ipv6
address-family but does contain ipv4 unicast peers. If we didn't
match a peer in the address-family being displayed, we would create
the json object but never free it.  This fix actually stops creating
the json object in this section of code and lets the create happen
in the area where the match occurs.

Ticket: CM-25616
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-08-02 04:50:46 -07:00
Sri Mohana Singamsetty
b7655d8476
Merge pull request #4713 from ton31337/fix/set_comm-list_delete_into_config_memcpy
bgpd: Strip `delete` keyword when looking up for communities
2019-08-01 21:19:43 -07:00
Russ White
40236bf7c7
Merge pull request #4750 from dslicenc/bgp-remove-replace-as
bgpd: stop removing and replacing private asn if it matches the peer
2019-07-30 11:12:56 -04:00
Russ White
0db38652f7
Merge pull request #4721 from dslicenc/bgpd-fix-nexthop
bgpd: encode implicit next-hop-self in some vrf route leaking scenarios
2019-07-30 10:50:32 -04:00
Russ White
2d8b235823
Merge pull request #4582 from donaldsharp/do_not_warn
bgpd: Do not display to end user not found afi/safi's
2019-07-30 10:38:25 -04:00
Donald Sharp
e24e573519
Merge pull request #4560 from lkrishnamoor/filter_vni_changes_jun
bgp: Route-map VNI in-filter filters out all the routes for EVPN
2019-07-30 09:41:22 -04:00
Don Slice
bf26b80eba bgpd: stop removing and replacing private asn if it matches the peer
Problems reported that if multiple peers have "remove-private-AS
replace-AS" with each other and all are using private asns, the as-path
gets hosed and continues to grow when a prefix is removed.  This fix
disallows removing and replacing the private asn if it matches the
peer's ASN so that normal as-path loop prevention will operate correctly.

Ticket: CM-25489
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-07-29 12:27:03 -07:00
Quentin Young
a041a8fff2
Merge pull request #4728 from ton31337/fix/next-hop-self_force_alias_for_ipv6
bgpd: Add hidden `next-hop-self all` for all address families
2019-07-29 12:41:55 -04:00
Don Slice
8fa7d4447f bgpd: solve invalid error message when clearing interface peer
Problem reported that if "clear bgp swp1" is issued, an error
message is received saying the name or address is malformed. This
was because of a change in bgp_vty.c that removed the storing
and passing of the interface name for this command. Commit that
caused the problem was ac5dec7e88ce2f8cd2943bb61437046718fb34c2.

Ticket: CM-25737
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-07-26 16:48:22 +00:00
Donatas Abraitis
0743b61d60 bgpd: Convert to network byte order before passing value to community_del_val
community_val_get() returns ntohl(val) which is used in more places like
community_include(), community_add_val(), but community_del_val() is missing
back conversion htonl().

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-07-25 23:19:10 +03:00
Donatas Abraitis
2d94b6d1d2 bgpd: Add hidden next-hop-self all for all address families
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-07-25 15:14:40 +03:00
Don Slice
b96306f042 bgpd: encode implicit next-hop-self in some vrf route leaking scenarios
Problem reported that when vrf route-leaking between an unnumbered
peer in one vrf to a numbered peer in another vrf, the nexthop
attribute was missing from the update, causing the session to fail.
determined that we needed to expand the  mechanism for verifying if
the route has been learned in the other vrf without an ipv4 nexthop.

Ticket: CM-25610
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
2019-07-23 06:51:16 -07:00
Lakshman Krishnamoorthy
82b692c0cb bgpd: Route-map VNI in-filter filters out all the routes for EVPN
Issue1: When a vni in-filter eg:"neighbor X.X.X.X route-map RM-VNI-FILTER in"
is configured under evpn address-family, all the received routes are dropped
regardless of whether the route has a matching vni or not.
(Where RM-VNI-FILTER contains "match evpn vni 100")

Issue2: Routes with 2 labels are not filtered correctly

Issue3: This filter should not get applied for MPLS routes. For MPLS routes,
we need route-map to handle a 3rd state besides match/nomatch called: noop.

Fix1: The handler bgp_update() that services the received route ignored the
route's label while deciding whether to filter it or not.
As part of the fix, the handler now uses the label info to make the
decision about whether to filter the route or not.

Fix2: route_match_vni() now tries to match both the labels within the route

Fix3: route_match_vni() should return noop when it encounters an mpls based
route. For this, route_map library should handle this 3rd state: RMAP_NOOP.

Related fix : Extract tunnel type
This fix relies on PR 4314 #4314 to extract the tunnel type from bgp extended
communities. The information about the route's tunnel type (vxlan or mpls)
is needed to apply "match evpn vni xx" rule.  This rule is applicable to
vxlan routes, and should exit safely for mpls based evpn routes.

Signed-off-by: Lakshman Krishnamoorthy lkrishnamoor@vmware.com
2019-07-22 08:08:25 -07:00
Lakshman Krishnamoorthy
b68885f9b7 lib: Introducing a 3rd state for route-map match cmd: RMAP_NOOP
Introducing a 3rd state for route_map_apply library function: RMAP_NOOP

Traditionally route map MATCH rule apis  were designed to return
a binary response, consisting of either RMAP_MATCH or RMAP_NOMATCH.
(Route-map SET rule apis return RMAP_OKAY or RMAP_ERROR).
Depending on this response, the following statemachine decided the
course of action:

State1:
If match cmd returns RMAP_MATCH then, keep existing behaviour.
If routemap type is PERMIT, execute set cmds or call cmds if applicable,
otherwise PERMIT!
Else If routemap type is DENY, we DENYMATCH right away

State2:
If match cmd returns RMAP_NOMATCH, continue on to next route-map. If there
are no other rules or if all the rules return RMAP_NOMATCH, return DENYMATCH

We require a 3rd state because of the following situation:

The issue - what if, the rule api needs to abort or ignore a rule?:
"match evpn vni xx" route-map filter can be applied to incoming routes
regardless of whether the tunnel type is vxlan or mpls.
This rule should be N/A for mpls based evpn route, but applicable to only
vxlan based evpn route.
Also, this rule should be applicable for routes with VNI label only, and
not for routes without labels. For example, type 3 and type 4 EVPN routes
do not have labels, so, this match cmd should let them through.

Today, the filter produces either a match or nomatch response regardless of
whether it is mpls/vxlan, resulting in either permitting or denying the
route.. So an mpls evpn route may get filtered out incorrectly.
Eg: "route-map RM1 permit 10 ; match evpn vni 20" or
"route-map RM2 deny 20 ; match vni 20"

With the introduction of the 3rd state, we can abort this rule check safely.
How? The rules api can now return RMAP_NOOP to indicate
that it encountered an invalid check, and needs to abort just that rule,
but continue with other rules.

As a result we have a 3rd state:
State3:
If match cmd returned RMAP_NOOP
Then, proceed to other route-map, otherwise if there are no more
rules or if all the rules return RMAP_NOOP, then, return RMAP_PERMITMATCH.

Signed-off-by: Lakshman Krishnamoorthy <lkrishnamoor@vmware.com>
2019-07-22 08:08:13 -07:00
Donatas Abraitis
60762f8f19 bgpd: Strip delete keyword when looking up for communities
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-07-19 15:56:58 +03:00
Donatas Abraitis
caa5af30e1 bgpd: Strip delete keyword when looking up for lcommunities
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-07-19 15:48:44 +03:00
Renato Westphal
07a4ddf2b6
Merge pull request #4660 from manuhalo/label_manager_fixes
Label manager improvements + refactor
2019-07-12 17:09:33 -03:00
Sri Mohana Singamsetty
84f4f72638
Merge pull request #4670 from chiragshah6/evpn_dev1
bgpd: fix show bgp l2vpn evpn route json
2019-07-10 13:39:26 -07:00
Emanuele Di Pascale
0e3b6a926a lib, zebra: support label chunk requests for SRGB
For SRGB, we need to support chunk requests starting at a
specific point in the label space, rather than just asking
for any sufficiently large chunk. To this purpose, we extend
the label manager api to request a chunk with a base value;
if the base is set to 0, the label manager will behave as it
currently does, i.e. fetching the first free chunk big enough
to satisfy the request.

update all the existing calls to get chunks from the label
manager so that they use MPLS_LABEL_BASE_ANY as the base
for the requested chunk

Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
2019-07-10 15:20:27 +02:00
Matthew Smith
497b686a49 bgpd: honor max prefix timer on inbound sessions
When using the maximum-prefix restart option with a BGP peer,
if the peer exceeds the limit of prefixes, bgpd causes the
connection to be closed and sets a timer. It will not attempt
to connect to that peer until the timer expires. But if the
peer attempts to connect to it before the timer expires, it
accepts the connection and starts exchanging routes again.

When accepting a connection from a peer, reject the connection
if the max prefix restart timer is set.

Signed-off-by: Matthew Smith <mgsmith@netgate.com>
2019-07-10 07:53:05 -05:00
Chirag Shah
c684d47726 bgpd: fix show bgp l2vpn evpn route json
PR-4544 has introduced a new filed extended community
in show bgp l2vpn evpn route command.
The header has missed checking json is enabled.

Ticket:CM-25581
Reviewed By:
Testing Done:

TORS1# show bgp l2vpn evpn route json
{
  "27.0.0.15:8":{
    "rd":"27.0.0.15:8",
    "[2]:[0]:[48]:[00:02:00:00:00:0a]":{
      "prefix":"[2]:[0]:[48]:[00:02:00:00:00:0a]",
      "prefixLen":288,
      "paths":[
        [
          {
            "valid":true,
            "bestpath":true,
            "pathFrom":"external",
            "routeType":2,
            "ethTag":0,
            "macLen":48,
            "mac":"00:02:00:00:00:0a",
            "weight":32768,
            "peerId":"(unspec)",
            "aspath":"",
            "path":"",
            "origin":"IGP",
            "extendedCommunity":{
              "string":"ET:8 RT:5550:1002"
            },
            "nexthops":[
              {
                "ip":"27.0.0.15",
                "afi":"ipv4",
                "used":true
              }
            ]
          }
        ]
      ]
    },
   ...
  },
  "numPrefix":187,
  "numPaths":343
}

Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
2019-07-09 12:17:45 -07:00
Quentin Young
4bb3fb0920
Merge pull request #4609 from ton31337/fix/show_set_comm-list_delete
bgpd: Show `delete` sub-option for `set [l]comm-list <list> delete`
2019-07-09 11:25:10 -04:00
Russ White
5ace71fff7
Merge pull request #4511 from pguibert6WIND/flowspec_some_fixes
Flowspec some fixes
2019-07-09 10:12:21 -04:00
Emanuele Di Pascale
668cfa9812 bgpd: fix implicit declaration warning
Add header with prototype for bgp_path_info_unlock

Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
2019-07-08 18:45:14 +02:00
Lou Berger
376d7c5026 bgp: add hook_unregister to bgp_dump_finish
Signed-off-by: Lou Berger <lberger@labn.net>
2019-07-08 09:24:57 -04:00
Donald Sharp
2e59405f4c bgpd: extend bgp routemap prefix-list to flowspec entries
Some code to cleanup bgp routemap.c a bit.
Addint to this, if a bgp flowspec entry contains a destination IP address,
then the ip address is compared against the prefix-list referenced into
the route-map used.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Signed-off-by: Donald Sharp <sharpd@cumulunetworks.com>
2019-07-08 08:36:45 +02:00
Philippe Guibert
46b890002f bgpd: discard traffic when at least traffic-rate 0 is observed
when multiple action rules are analysed in the BGP flowspec entry, if at
least the traffic-rate set to 0 is seen, then immediately create a rule
with drop rule. Previously this was not the case in case a forwarding
rule was seen.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2019-07-08 08:36:45 +02:00
Philippe Guibert
f449d22396 bgp, zebra, lib: add protocol support for iptables
in addition to support for tcpflags, it is possible to filter on any
protocol. the filtering can then be based with iptables.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2019-07-08 08:36:45 +02:00
Quentin Young
b08c7022d8
Merge pull request #4640 from opensourcerouting/bmp-prep
bgpd: BMP preparations
2019-07-03 16:42:41 -04:00
Quentin Young
5787842b98
Merge pull request #4632 from manuhalo/fix_bgp_lu_update
bgpd: fix bgp-lu update bug
2019-07-03 14:25:18 -04:00
Quentin Young
9e420af742
Merge pull request #4629 from ton31337/fix/large_community_list_uint16_overflow
bgpd: Validate large-community-list against UINT_MAX
2019-07-03 12:30:21 -04:00
David Lamparter
6fd04594bb bgpd: add packet send hook
Unlike MRT dumps, BMP also provides packets sent by the router.  Add
another hook for that.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-07-03 16:59:12 +02:00
David Lamparter
584470fb5f bgpd: add & use bgp packet dump hook
The MRT dump code is already hooked in at the right places to write out
packets;  the BMP code needs exactly the same access so let's make this
a hook.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-07-03 16:58:26 +02:00
David Lamparter
2b9bcf306d bgpd: add instance delete & config write hooks
Both of these hooks are necessary for proper operation of extensions
that need to latch on to a particular instance.

- without the delete hook, it's impossible to get rid of stale
  references, leading to crashes with invalid instance pointers.
- the config-write hook is necessary because per-instance config needs
  to be written inside the "router bgp" block to have the appropriate
  context; adding a separate config node can't do that.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-07-03 16:56:22 +02:00
David Lamparter
2ed9fe4a2b bgpd: autocomplete "router bgp" ASN
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-07-03 16:55:24 +02:00
David Lamparter
4a11bf2c09 bgpd: add a hook before bgp_process()
BMP uses this to get notified about any changes to prefixes, at which
point it schedules its own processing to happen later.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-07-03 16:54:09 +02:00
David Lamparter
b4d46cc9b1 bgpd: count some per-peer stats (for BMP)
These counters are accessible through BMP and may be useful to monitor
bgpd.  A CLI to show them could also be added if people are interested.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-07-03 16:53:12 +02:00
David Lamparter
1a1f453436 bgpd: fix last_reset_cause setup
last_reset_cause_size is the length *used* in last_reset_cause[].  It's
straight up used wrong here; we're saving off a reset cause and need to
check against the *available* size in last_reset_cause[].

This could actually have led to (hopefully rare) crashes in the assert
there, since the assert condition might fail incorrectly.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2019-07-03 16:50:36 +02:00
Donald Sharp
611349b99f
Merge pull request #4550 from manuhalo/fix_bgp_label_cb
Fix bgp-lu label callback crash
2019-07-03 09:15:37 -04:00
Donatas Abraitis
5bd66e2dcc bgpd: Validate large-community-list against UINT_MAX
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2019-07-03 00:14:16 +03:00
Quentin Young
5f59000e3c
Merge pull request #4598 from bisdhdh/master
bgpd: 'show bgp ipv6 neighbors <X::Y> prefix-counts' prefix-count is not getting displayed
2019-07-02 13:52:54 -04:00
Emanuele Di Pascale
4195afbf08 bgpd: fix bgp-lu update bug
bgp update messages were not correctly calculating the size
for a labeled-unicast prefix, as they were not accounting
for the label. If the update message was large enough to
overflow the maximum packet size (4096 bytes) this could
cause bgpd to send a malformed update packet.

Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
2019-07-02 18:59:00 +02:00