diff options
| author | Nikhil Kelapure <nikhil.kelapure@broadcom.com> | 2021-09-12 12:25:00 -0700 | 
|---|---|---|
| committer | Nikhil Kelapure <nikhil.kelapure@broadcom.com> | 2021-09-13 08:39:43 -0700 | 
| commit | 316d2d52a25a4047f08952dd4aca6192be6240c7 (patch) | |
| tree | ba876a25f300bfdef2691f976d588cd79cf72145 /zebra/zebra_fpm.c | |
| parent | 7d18da967189913846ecf1a897f20071b663c90d (diff) | |
zebra: Fix IPv4 routes with IPv6 link local next hops install in FPM
Description: Currently IPv4 routes with IPv6 link local next hops are
not properly installed in FPM.
Reason is the netlink decoding truncates the ipv6 LL address to 4 byte
ipv4 address.
Ex : fe80:: is directly converted to ipv4 and it results in 254.128.0.0
as next hop for below routes
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, r - rejected, b - backup
B>* 2.1.0.0/16 [200/0] via fe80::268a:7ff:fed0:d40, Ethernet0, weight 1,
02:22:26
B>* 5.1.0.0/16 [200/0] via fe80::268a:7ff:fed0:d40, Ethernet0, weight 1,
02:22:26
B>* 10.1.0.2/32 [200/0] via fe80::268a:7ff:fed0:d40, Ethernet0, weight
1, 02:22:26
Hence this fix converts the ipv6-LL address to ipv4-LL (169.254.0.1)
address before sending it to FPM. This is inline with how these types of
routes are currently programmed into kernel.
Signed-off-by: Nikhil Kelapure <nikhil.kelapure@broadcom.com>
Diffstat (limited to 'zebra/zebra_fpm.c')
| -rw-r--r-- | zebra/zebra_fpm.c | 6 | 
1 files changed, 6 insertions, 0 deletions
diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c index 64366d6f4f..8caabf19e7 100644 --- a/zebra/zebra_fpm.c +++ b/zebra/zebra_fpm.c @@ -292,6 +292,9 @@ static void zfpm_start_connect_timer(const char *reason);  static void zfpm_start_stats_timer(void);  static void zfpm_mac_info_del(struct fpm_mac_info_t *fpm_mac); +static const char ipv4_ll_buf[16] = "169.254.0.1"; +union g_addr ipv4ll_gateway; +  /*   * zfpm_thread_should_yield   */ @@ -1993,6 +1996,9 @@ static int zfpm_init(struct thread_master *master)  	zfpm_stats_init(&zfpm_g->last_ivl_stats);  	zfpm_stats_init(&zfpm_g->cumulative_stats); +	memset(&ipv4ll_gateway, 0, sizeof(ipv4ll_gateway)); +	inet_pton(AF_INET, ipv4_ll_buf, &ipv4ll_gateway.ipv4); +  	install_node(&zebra_node);  	install_element(ENABLE_NODE, &show_zebra_fpm_stats_cmd);  	install_element(ENABLE_NODE, &clear_zebra_fpm_stats_cmd);  | 
