Commit Graph

26797 Commits

Author SHA1 Message Date
Renato Westphal
1bb2674ce4 ospfd: fix incorrect detection of topology changes in helper mode
This commit fixes a rather obscure bug that was causing the GR
topotest to fail on a frequent basis.

RFC 3623 specifies that a router acting as a helper to a restarting
neighbor should monitor topology changes and abort the GR procedures
when one is detected, falling back to normal OSPF operation.

ospfd uses the ospf_lsa_different() function to detect when the
content of an LSA has changed, which is considered as a topology
change. The problem is that ospf_lsa_different() can return true
even when the two LSAs passed as parameters are identical, provided
one LSA has the OSPF_LSA_RECEIVED flag set and the other not.

In the context of the ospf_gr_topo1 test, router rt6 performs
a graceful restart and a few seconds later acts as a helper for
router rt7. When it's acting as a helper for rt7, it still didn't
translate its NSSA Type-7 LSAs, something that happens only after 7
seconds (OSPF_ABR_TASK_DELAY) of the first SPF run. The translated
Type-5 LSAs on its LSDB were learned from the helping neighbors
(rt3 and rt7). It's then possible that the NSSA Type-7 LSAs might
be translated while rt6 is acting as helper for rt7, which causes
the daemon to detect a non-existent topology change only because
the OSPF_LSA_RECEIVED flag is unset in the recently originated
Type-5 LSA.

Fix this problem by ignoring the OSPF_LSA_RECEIVED flag when
comparing LSAs for the purpose of topology change detection.

In short, the bug would only show up when the restarting router
would start acting as a helper immediately after coming back up
(which would be hard to happen in the real world). The topotest
failures became more frequent after commit 6255aad0bc because of
the removal of the 'sleep' calls, which used to give ospfd more time
to converge before start acting as a helper for other routers. The
problem still occurred from time to time though.

Fixes #9983.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 15:31:39 -03:00
Renato Westphal
003d3dbead Revert "ospfd: remove commands for broken GR helper mode"
This reverts commit accef597df.
2021-11-23 15:31:39 -03:00
Renato Westphal
fe0f234d13 bgpd: add "json" option to "show ip bgp ... dampening parameters"
Also:
* rename show_ip_bgp_cmd to show_ip_bgp_dampening_params_cmd;
* rename show_ip_bgp_json_cmd to show_ip_bgp_cmd.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 15:14:08 -03:00
Renato Westphal
39c3c7364d bgpd: add "json" option to "show ip bgp ... longer-prefixes"
Move the "longer-prefixes" option from show_ip_bgp_cmd to
show_ip_bgp_json_cmd so that is has access to JSON output.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 15:14:08 -03:00
Renato Westphal
bf1a944ace bgpd: add "json" option to "show ip bgp ... route-map"
Move the "route-map" option from show_ip_bgp_cmd to
show_ip_bgp_json_cmd so that is has access to JSON output.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 15:14:08 -03:00
Renato Westphal
a71293475b bgpd: add "json" option to "show ip bgp ... filter-list"
Move the "filter-list" option from show_ip_bgp_cmd to
show_ip_bgp_json_cmd so that is has access to JSON output.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 15:14:08 -03:00
Renato Westphal
6deaf5794d bgpd: add "json" option to "show ip bgp ... prefix-list"
Move the "prefix-list" option from show_ip_bgp_cmd to
show_ip_bgp_json_cmd so that is has access to JSON output.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 15:14:08 -03:00
Renato Westphal
707999834a bgpd: add "json" option to "show ip bgp ... community-list"
Move the "community-list" option from show_ip_bgp_cmd to
show_ip_bgp_json_cmd so that is has access to JSON output.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 14:36:58 -03:00
Renato Westphal
2391833ecf bgpd: use void pointer to reduce code duplication
There's no need to have different calls to bgp_show() when the only
difference is one argument that corresponds to a "void *" parameter.

Code duplication should be reduced to a minimum to avoid bugs like
the one fixed in the previous commit.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 14:27:25 -03:00
Renato Westphal
db58b09fea bgpd: fix crash in "show ip bgp ... all alias ALIAS"
Like done in the other places (when "all" isn't used), pass the
actual alias name to bgp_show() instead of a null pointer.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
2021-11-23 14:27:25 -03:00
Mark Stapp
002930f7bb zebra: add installed nexthop-group id value
In some cases, zebra may install a nexthop-group id that is
different from the id of the nhe struct attached to a
route-entry. This happens for a singleton recursive nexthop,
for example, where a route is installed with the resolving
nexthop's id.

The installed value is the most useful value - that corresponds
to information in the kernel on linux/netlink platforms that
support nhgs. Display both values if they differ in ascii
output, and include both values in the json form.

Signed-off-by: Mark Stapp <mstapp@nvidia.com>
2021-11-23 11:23:26 -05:00
Igor Ryzhov
6e5532187f
Merge pull request #10112 from ton31337/feature/route-map_autocomplete
lib: Use autocomplete for `route-map <name> <action> <seq>`
2021-11-23 19:05:27 +03:00
Donatas Abraitis
8f241168b7 lib: Use autocomplete for route-map <name> <action> <seq>
```
exit1-debian-11(config)# route-map ?
  RMAP_NAME  Route map tag
     belekas testas
```

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-23 16:10:10 +02:00
Donatas Abraitis
688ea06910 bgpd: Add missing LLGR capability handling stuff
```
OPEN has (no message found) capability (71), length 14
```

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-23 15:51:53 +02:00
Igor Ryzhov
4ac61f7a2a
Merge pull request #10024 from ton31337/feature/match_ipv6_next-hop_access-list
bgpd: match ipv6 next-hop
2021-11-23 16:45:25 +03:00
Donatas Abraitis
390cde0afc tests: Test if match ipv6 next-hop works
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-23 13:47:27 +02:00
Donatas Abraitis
bc63ba980f bgpd: Add an ability to match ipv6 next-hop by access-list
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-23 13:47:26 +02:00
Igor Ryzhov
574445ecaf lib, yang: remove vrf from the interface list key
This is needed for the following two reasons:

1. To be able to remove the northbound HACK in if_update_to_new_vrf. It
   is totally wrong to rewrite the configuration datastore when some
   operational state changes. It is a hard blocker for storing a
   configuration data in a management daemon which knows nothing about
   the operational state.
2. To allow changing the VRF of the interface using FRR CLI or any other
   frontend in the future. If the VRF is a part of the key, it can't be
   changed. If the VRF is a simple leaf, it becomes possible to change
   it and thus move the interface between VRFs. For now I mark the leaf
   as a "config false" as it's not yet possible to control it from FRR.

But we can't simply remove the VRF from the key, because it is needed to
distinguish interfaces when using netns based VRFs, as it is possible to
have multiple interfaces with the same name in different namespaces. To
handle this, I came up with an idea to store both VRF and an interface
name in the "name" leaf using the pattern "vrfname:ifname". For example,
if there's an interface "eth0" in VRF "red" then its "name" leaf will be
"red:eth0".

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
2021-11-23 12:57:52 +03:00
Igor Ryzhov
e122fe6b50 staticd: remove unnecessary function call
When the VRF interface is coming up, we don't need to fixup VRF ids - it
was already done in static_vrf_enable when the interface was created.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
2021-11-23 12:46:21 +03:00
Donatas Abraitis
0ecdbedbf9
Merge pull request #10040 from idryzhov/ifp-vrf-id-cleanup
*: cleanup ifp->vrf_id
2021-11-23 11:43:48 +02:00
Philippe Guibert
c742573b67 lib: resolver per vrf support
add a parameter to resolver api that is the vrf identifier. this permits
to make resolution self to each vrf. in case vrf netns backend is used,
this is very practical, since resolution can happen on one netns, while
it is not the case in an other one.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2021-11-23 09:02:23 +01:00
Donatas Abraitis
f7517a8b44 doc: Add match ipv6 next-hop ACCESS6_NAME
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-23 08:27:50 +02:00
Donald Sharp
f1189d7374
Merge pull request #9919 from mobash-rasool/pim-upst-3
pimd: STAR inherited Flag not properly set in certain scenarios
2021-11-22 14:42:56 -05:00
Igor Ryzhov
096f7609f9 *: cleanup ifp->vrf_id
Since f60a1188 we store a pointer to the VRF in the interface structure.
There's no need anymore to store a separate vrf_id field.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
2021-11-22 20:47:23 +03:00
Donald Sharp
d32c92a4c0
Merge pull request #10057 from ton31337/fix/we_shouldn_send_LLA_for_RS
bgpd: Do not send LLA for route-server-client peers
2021-11-22 12:06:36 -05:00
Donald Sharp
9d5a61264a
Merge pull request #10076 from idryzhov/if-is-loopback-or-vrf
*: unify if_is_loopback/if_is_loopback_or_vrf
2021-11-22 12:02:21 -05:00
Quentin Young
7b532137c3
Merge pull request #10070 from idryzhov/ospf6-memcmp-cleanup 2021-11-22 09:33:52 -05:00
Donald Sharp
7a27d523aa
Merge pull request #10083 from karelvanhecke/master
redhat: check if frr.conf already exists
2021-11-22 09:02:49 -05:00
Donatas Abraitis
039fb41165
Merge pull request #10096 from mjstapp/fix_ted_free
lib: use _safe iteration during link_state/ted cleanup
2021-11-22 15:38:05 +02:00
Donatas Abraitis
bfe6156ab0 tests: Check if Extended Optional Parameters Length works for BGP
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-22 15:34:47 +02:00
Donatas Abraitis
ad7d219da1 doc: Add neighbor ADDR extended-optional-parameters command
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-22 15:34:47 +02:00
Donatas Abraitis
ada41a34ba doc: Add rfc9072 as implemented
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-22 15:34:47 +02:00
Donatas Abraitis
d08c0c8077 bgpd: Implement rfc9072
Related: https://datatracker.ietf.org/doc/html/rfc9072

Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
2021-11-22 15:34:46 +02:00
Donald Sharp
cfbf74a9a1
Merge pull request #10088 from opensourcerouting/pim-forward-stop
pimd: fix stale forwarding entries left around after join goes away
2021-11-22 08:30:18 -05:00
Donatas Abraitis
e59d8139ae
Merge pull request #10102 from idryzhov/match-ip-nexthop
bgpd, lib: fix inconsistency of match ip/ipv6 next-hop commands
2021-11-22 15:24:33 +02:00
Donatas Abraitis
7b7d413445
Merge pull request #10103 from donaldsharp/python_exabgp_fun
tests: Explicitly call out which version of python we need
2021-11-22 14:08:19 +02:00
Donald Sharp
f1f0bd0911 tests: Fix tests using exabgp to explicitly call out which python to use
There exist systems that do not explicity have a python soft-link
on their system.  Let's explicity call out which python we want
to be using with exabgp.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2021-11-20 19:36:40 -05:00
Igor Ryzhov
587cf8f170
Merge pull request #9683 from volta-networks/sr-minor-fixes
ospfd, isisd: minor SR fixes
2021-11-20 14:53:09 +03:00
Igor Ryzhov
03030106ce bgpd, lib: fix inconsistency of match ip/ipv6 next-hop commands
For IPv4 matching, we have "match ip next-hop address A.B.C.D".
For IPv6 matching, we have "match ipv6 next-hop X:X::X:X".

To have consistency, let's add "address" keyword to IPv6 commands.
Old commands are preserved as hidden for backward compatibility.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
2021-11-19 21:11:52 +03:00
Donald Sharp
b044947820 tests: Split up the bgp GR topotests
The bgp gr topotests had run times that were greater than 10 minutes each.
Just brute force break up the tests to 4 different sub parts.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2021-11-19 07:53:12 -05:00
Donatas Abraitis
41eec96003
Merge pull request #10097 from pguibert6WIND/ipv6_fix_ecom_list
bgpd: support redirect import more than one route-target ipv6
2021-11-19 14:50:01 +02:00
Igor Ryzhov
0609190219
Merge pull request #10074 from opensourcerouting/assorted-20211116
lib/vtysh/ospf6d: assorted small bits
2021-11-19 15:43:10 +03:00
Donald Sharp
90a215ad3f
Merge pull request #9970 from mobash-rasool/pim-upst-1
pimd : packet processing optimization on rp change
2021-11-19 06:19:28 -05:00
rgirada
bf4b7559a0 ospfd: ospf routing table update upon Changing area from normal to nssa
Description:
	When changing the area from normal to NSSA, previous area's
	ASBR router's type-5 also calculated and added to routing table along
	with Type-7 lsas.
	Made a change in route calculation such that it will not consider Type-5
	lsas in calculation if it is originated from NSSA ASBR router.
	These lsas will be age out at MAX age.

  log:
  frr(config-router)# do 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, F - PBR,
         f - OpenFabric,
         > - selected route, * - FIB route, q - queued, r - rejected, b - backup
         t - trapped, o - offload failure

	K>* 0.0.0.0/0 [0/0] via 10.112.157.253, ens160, 00:32:47
	C>* 10.112.156.0/23 is directly connected, ens160, 00:32:47
	S>* 22.22.22.2/32 [1/0] is directly connected, ens192, weight 1, 00:20:03
	O>* 33.33.33.0/24 [110/20] via 100.1.1.220, ens192, weight 1, 00:08:55
				   via 100.1.1.220, ens192, weight 1, 00:08:55
	O   100.1.1.0/24 [110/10] is directly connected, ens192, weight 1, 00:21:32
	C>* 100.1.1.0/24 is directly connected, ens192, 00:23:11
  frr(config-router)# do show ip ospf  route
	============ OSPF network routing table ============
	N    100.1.1.0/24          [10] area: 0.0.0.1
                           directly attached to ens192

	============ OSPF router routing table =============
	R    2.2.2.2               [10] area: 0.0.0.1, ASBR
                           via 100.1.1.220, ens192

	============ OSPF external routing table ===========
	N E2 33.33.33.0/24         [10/20] tag: 0
                           via 100.1.1.220, ens192
                           via 100.1.1.220, ens192

Signed-off-by: Rajesh Girada <rgirada@vmware.com>
2021-11-19 00:09:29 -08:00
Mobashshera Rasool
62596d9a1f pimd : packet processing optimization on rp change
Problem Statement:
==================
on rp_change, PIM processes all the upstream in a loop and for selected
upstreams PIM has to send join/prune based on the RPF changed.
join and prune packets are not getting aggregated in a single packet.

Root Cause Analysis:
====================
on pim_rp_change pim_upstream_update() gets called for selected upstreams.
This API calculates to whom it has to send join and to whom it has to
send prune via API pim_zebra_upstream_rpf_changed(). This API peprares
the upstream_switch_list list per interface and inserts the group and
sources.
Now PIM is still in the pim_upstream_update() API context, i.e PIM
is still processing the same upstream. In the last there is a
call to pim_zebra_update_all_interfaces() which processes the
upstream_switch_list list, sends the packets out and clears the list.

Fix:
====
Don't process the upstream_switch_list in the upstream context.
process all the upstreams prepare the upstream_switch_list and then
process in one go. This will club all the S,G entries.
It also saves list cleanup with respect to memory allocation and
deallocation multiple times.

Signed-off-by: Vishal Dhingra <rac.vishaldhingra@gmail.com>
Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
2021-11-18 21:46:07 -08:00
Iqra Siddiqui
4812a35649 tests: Fix test_bgp_l3vpn_to_bgp_vrf
Description:
- Changing the expected output for selected route in the script.
- With our changes for VRF-Lite fix best path selection,
  during best path selection, while comparing the paths for imported routes,
  we should correctly refer to the original route i.e. the ultimate path.
  In this case, when we have ibgp route and imported ibgp route
  for the same prefix, we do compare IGP metric which is same for both,
  So we proceed to comparing router-ids and selecting the best path.
- Before our changes, ibgp route was preferred because of IGP metric.
  With our fix, expected output for selected route is changed to
  imported ibgp route because of the lower router-id.
- Corresponding changes for expected advertised route and
  the large community are made.

Co-authored-by: Kantesh Mundaragi <kmundaragi@vmware.com>
Signed-off-by: Iqra Siddiqui <imujeebsiddi@vmware.com>
2021-11-19 07:33:22 +05:30
Iqra Siddiqui
89c3ebe6ca bgpd: NULL check for original bgp info
Description:
EVPN routes marked as imported routes,
having bgp path info's extra, where as
they are not truly imported routes,
so original bgp info will be null.

Co-authored-by: Kantesh Mundaragi <kmundaragi@vmware.com>
Signed-off-by: Iqra Siddiqui <imujeebsiddi@vmware.com>
2021-11-19 07:33:22 +05:30
Iqra Siddiqui
687c62fc2a topotests: Add supported topotests for bgpd vrf-lite best path selection
Co-authored-by: Kuldeep Kashyap <kashyapk@vmware.com>
Signed-off-by: Iqra Siddiqui <imujeebsiddi@vmware.com>
2021-11-19 07:33:22 +05:30
Iqra Siddiqui
ad1844f7bd bgpd: Few code optimisations
Description:
Added a macro which optimises some part of the code.

Co-authored-by: Santosh P K <sapk@vmware.com>
Co-authored-by: Kantesh Mundaragi <kmundaragi@vmware.com>
Signed-off-by: Iqra Siddiqui <imujeebsiddi@vmware.com>
2021-11-19 07:33:22 +05:30
Kantesh Mundaragi
da0c0ef70c bgpd: VRF-Lite fix best path selection
Description:
Incorrect behavior during best path selection for the imported routes.
Imported routes are always treated as eBGP routes.

Change is intended for fixing the issues related to
bgp best path selection for leaked routes:
- FRR does ecmp for the imported routes,
  even without any ecmp related config.
  If the same prefix is imported from two different VRFs,
  then we configure the route with ecmp even without
  any ecmp related config.
- Locally imported routes are preferred over imported
  eBGP routes.
  If there is a local route and eBGP learned route
  for the same prefix, if we import both the routes,
  imported local route is selected as best path.
- Same route is imported from multiple tenant VRFs,
  both imported routes point to the same VRF in nexthop.
- When the same route with same nexthop in two different VRFs
  is imported from those two VRFs, route is not installed as ecmp,
  even though we had ecmp config.

- During best path selection, while comparing the paths for imported routes,
  we should correctly refer to the original route i.e. the ultimate path.
- When the same route is imported from multiple VRF,
  use the correct VRF while installing in the FIB.
- When same route is imported from two different tenant VRFs,
  while comparing bgp path info as part of bgp best path selection,
  we should ideally also compare corresponding VRFs.

See-also: https://github.com/FRRouting/frr/files/7169555/FRR.and.Cisco.VRF-Lite.Behaviour.pdf

Co-authored-by: Santosh P K <sapk@vmware.com>
Co-authored-by: Kantesh Mundaragi <kmundaragi@vmware.com>
Signed-off-by: Iqra Siddiqui <imujeebsiddi@vmware.com>
2021-11-19 07:33:22 +05:30