2023-02-08 13:17:09 +01:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2012-11-13 23:48:59 +01:00
|
|
|
/*
|
|
|
|
* Private header file for the zebra FPM module.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012 by Open Source Routing.
|
|
|
|
* Copyright (C) 2012 by Internet Systems Consortium, Inc. ("ISC")
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _ZEBRA_FPM_PRIVATE_H
|
|
|
|
#define _ZEBRA_FPM_PRIVATE_H
|
|
|
|
|
|
|
|
#include "zebra/debug.h"
|
|
|
|
|
2019-03-25 15:11:55 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2012-11-13 23:48:59 +01:00
|
|
|
#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
|
|
|
|
|
2019-05-16 22:28:25 +02:00
|
|
|
/* 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.
|
|
|
|
*/
|
|
|
|
};
|
2012-11-13 23:48:59 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Externs
|
|
|
|
*/
|
2017-06-01 13:26:25 +02:00
|
|
|
extern int zfpm_netlink_encode_route(int cmd, rib_dest_t *dest,
|
|
|
|
struct route_entry *re, char *in_buf,
|
2012-11-13 23:48:59 +01:00
|
|
|
size_t in_buf_len);
|
|
|
|
|
2017-06-01 13:26:25 +02:00
|
|
|
extern int zfpm_protobuf_encode_route(rib_dest_t *dest, struct route_entry *re,
|
2016-04-04 19:54:58 +02:00
|
|
|
uint8_t *in_buf, size_t in_buf_len);
|
|
|
|
|
Zebra: Build nelink message for RMAC updates
- Function "zfpm_netlink_encode_mac()" builds a netlink message for RMAC updates.
- To build a netlink message for RMAC updates, we use "ndmsg" in rtlink.
- FPM Message structure is:
FPM header -> nlmsg header -> ndmsg fields -> ndmsg attributes
- Netlink message will look like:
{'ndm_type': 0, 'family': 7, '__pad': (), 'header': {'flags': 1281,
'length':64, 'type': 28, 'pid': 0, 'sequence_number': 0}, 'state': 2,
'flags': 22, 'attrs': [('NDA_LLADDR', 'b2:66:eb:b9:5b:d3'),
('NDA_DST', '10.100.0.2'), ('NDA_MASTER', 11), ('NDA_VNI', 1000)],
'ifindex': 18}
- Message details:
nlmsghdr.nlmsg_type = RTM_NEWNEIGH(28) or RTM_DELNEIGH(29)
nlmsghdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_REPLACE for "add" ,
"NLM_F_REQUEST" for delete.
ndmsg.ndm_family = AF_BRIDGE
ndmsg.ndm_ifindex = vxlan_if (ifindex)
ndmsg.ndm_state = NUD_REACHABLE
ndmsg.ndm_flags |= NTF_SELF | NTF_MASTER | NTF_EXT_LEARNED
Attribute "NDA_LLADDR" for MAC address
Attribute "NDA_DST" for remote vtep ip
Attribute "NDA_MASTER" for bridge interface ifindex.
Attribute "NDA_VNI" for VNI id.
Signed-off-by: Ameya Dharkar <adharkar@vmware.com>
2019-05-17 02:29:08 +02:00
|
|
|
extern int zfpm_netlink_encode_mac(struct fpm_mac_info_t *mac, char *in_buf,
|
|
|
|
size_t in_buf_len);
|
|
|
|
|
2017-06-01 13:26:25 +02:00
|
|
|
extern struct route_entry *zfpm_route_for_update(rib_dest_t *dest);
|
2019-03-25 15:11:55 +01:00
|
|
|
|
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>
2021-09-12 21:25:00 +02:00
|
|
|
extern union g_addr ipv4ll_gateway;
|
|
|
|
|
2019-03-25 15:11:55 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-11-13 23:48:59 +01:00
|
|
|
#endif /* _ZEBRA_FPM_PRIVATE_H */
|