mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-10-27 17:26:07 +00:00 
			
		
		
		
	 316d2d52a2
			
		
	
	
		316d2d52a2
		
	
	
	
	
		
			
			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>
		
			
				
	
	
		
			107 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Private header file for the zebra FPM module.
 | |
|  *
 | |
|  * Copyright (C) 2012 by Open Source Routing.
 | |
|  * Copyright (C) 2012 by Internet Systems Consortium, Inc. ("ISC")
 | |
|  *
 | |
|  * This file is part of GNU Zebra.
 | |
|  *
 | |
|  * GNU Zebra is free software; you can redistribute it and/or modify it
 | |
|  * under the terms of the GNU General Public License as published by
 | |
|  * the Free Software Foundation; either version 2, or (at your option)
 | |
|  * any later version.
 | |
|  *
 | |
|  * GNU Zebra is distributed in the hope that it will be useful, but
 | |
|  * WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU General Public License along
 | |
|  * with this program; see the file COPYING; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  */
 | |
| 
 | |
| #ifndef _ZEBRA_FPM_PRIVATE_H
 | |
| #define _ZEBRA_FPM_PRIVATE_H
 | |
| 
 | |
| #include "zebra/debug.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
 | |
| 
 | |
| #define zfpm_debug(...)                                                        \
 | |
| 	do {                                                                   \
 | |
| 		if (IS_ZEBRA_DEBUG_FPM)                                        \
 | |
| 			zlog_debug("FPM: " __VA_ARGS__);                       \
 | |
| 	} while (0)
 | |
| 
 | |
| #elif defined __GNUC__
 | |
| 
 | |
| #define zfpm_debug(_args...)                                                   \
 | |
| 	do {                                                                   \
 | |
| 		if (IS_ZEBRA_DEBUG_FPM)                                        \
 | |
| 			zlog_debug("FPM: " _args);                             \
 | |
| 	} while (0)
 | |
| 
 | |
| #else
 | |
| static inline void zfpm_debug(const char *format, ...)
 | |
| {
 | |
| 	return;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /* This structure contains the MAC addresses enqueued for FPM processing. */
 | |
| struct fpm_mac_info_t {
 | |
| 	struct ethaddr macaddr;
 | |
| 	uint32_t zebra_flags; /* Could be used to build FPM messages */
 | |
| 	vni_t vni;
 | |
| 	ifindex_t vxlan_if;
 | |
| 	ifindex_t svi_if; /* L2 or L3 Bridge interface */
 | |
| 	struct in_addr r_vtep_ip; /* Remote VTEP IP */
 | |
| 
 | |
| 	/* Linkage to put MAC on the FPM processing queue. */
 | |
| 	TAILQ_ENTRY(fpm_mac_info_t) fpm_mac_q_entries;
 | |
| 
 | |
| 	uint8_t fpm_flags;
 | |
| 
 | |
| #define ZEBRA_MAC_UPDATE_FPM 0x1 /* This flag indicates if we want to upadte
 | |
| 				  * data plane for this MAC. If a MAC is added
 | |
| 				  * and then deleted immediately, we do not want
 | |
| 				  * to update data plane for such operation.
 | |
| 				  * Unset the ZEBRA_MAC_UPDATE_FPM flag in this
 | |
| 				  * case. FPM thread while processing the queue
 | |
| 				  * node will check this flag and dequeue the
 | |
| 				  * node silently without sending any update to
 | |
| 				  * the data plane.
 | |
| 				  */
 | |
| #define ZEBRA_MAC_DELETE_FPM 0x2 /* This flag is set if it is a delete operation
 | |
| 				  * for the MAC.
 | |
| 				  */
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Externs
 | |
|  */
 | |
| extern int zfpm_netlink_encode_route(int cmd, rib_dest_t *dest,
 | |
| 				     struct route_entry *re, char *in_buf,
 | |
| 				     size_t in_buf_len);
 | |
| 
 | |
| extern int zfpm_protobuf_encode_route(rib_dest_t *dest, struct route_entry *re,
 | |
| 				      uint8_t *in_buf, size_t in_buf_len);
 | |
| 
 | |
| extern int zfpm_netlink_encode_mac(struct fpm_mac_info_t *mac, char *in_buf,
 | |
| 				   size_t in_buf_len);
 | |
| 
 | |
| extern struct route_entry *zfpm_route_for_update(rib_dest_t *dest);
 | |
| 
 | |
| extern union g_addr ipv4ll_gateway;
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* _ZEBRA_FPM_PRIVATE_H */
 |