2023-02-08 13:17:09 +01:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2017-05-15 07:31:08 +02:00
|
|
|
/*
|
|
|
|
* Zebra Layer-2 interface Data structures and definitions
|
|
|
|
* Copyright (C) 2016, 2017 Cumulus Networks, Inc.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _ZEBRA_L2_H
|
|
|
|
#define _ZEBRA_L2_H
|
|
|
|
|
|
|
|
#include <zebra.h>
|
|
|
|
|
|
|
|
#include "if.h"
|
|
|
|
#include "vlan.h"
|
|
|
|
#include "vxlan.h"
|
2021-04-18 12:11:14 +02:00
|
|
|
#include "zebra/zebra_vrf.h"
|
2017-05-15 07:31:08 +02:00
|
|
|
|
2019-03-25 15:11:55 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2021-08-17 10:42:51 +02:00
|
|
|
#define ZEBRA_BRIDGE_NO_ACTION (0)
|
|
|
|
#define ZEBRA_BRIDGE_MASTER_MAC_CHANGE (1 << 1)
|
zebra: refresh vxlan evpn contexts, when bridge interface goes up
When using bgp evpn rt5 setup, after BGP configuration has been
loaded, if the user attempts to detach and reattach the bridged
vxlan interface from the bridge, then BGP loses its BGP EVPN
contexts, and a refresh of BGP configuration is necessary to
maintain consistency between linux configuration and BGP EVPN
contexts (RIB). The following command can lead to inconsistency:
ip netns exec cust1 ip link set dev vxlan1000 nomaster
ip netns exec cust1 ip link set dev vxlan1000 master br1000
consecutive to the, BGP l2vpn evpn RIB is empty, and the way to
solve this until now is to reconfigure EVPN like this:
vrf cust1
no vni 1000
vni 1000
exit-vrf
Actually, the link information is correctly handled. In fact,
at the time of link event, the lower link status of the bridge
interface was not yet up, thus preventing from establishing
BGP EVPN contexts. In fact, when a bridge interface does not
have any slave interface, the link status of the bridge interface
is down. That change of status comes a bit after, and is not
detected by slave interfaces, as this event is not intercepted.
This commit intercepts the bridge link up event, and triggers
a check on slaved vxlan interfaces.
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2021-08-17 10:56:32 +02:00
|
|
|
#define ZEBRA_BRIDGE_MASTER_UP (1 << 2)
|
2021-08-17 10:42:51 +02:00
|
|
|
|
2017-05-15 07:31:08 +02:00
|
|
|
/* zebra L2 interface information - bridge slave (linkage to bridge) */
|
|
|
|
struct zebra_l2info_brslave {
|
|
|
|
ifindex_t bridge_ifindex; /* Bridge Master */
|
|
|
|
struct interface *br_if; /* Pointer to master */
|
2019-10-03 17:11:37 +02:00
|
|
|
ns_id_t ns_id; /* network namespace where bridge is */
|
2017-05-15 07:31:08 +02:00
|
|
|
};
|
|
|
|
|
zebra: uplink tracking and startup delay for EVPN-MH
Local ethernet segments are held in a protodown or error-disabled state
if access to the VxLAN overlay is not ready -
1. When FRR comes up the local-ESs/access-port are kept protodown
for the startup-delay duration. During this time the underlay and
EVPN routes via it are expected to converge.
2. When all the uplinks/core-links attached to the underlay go down
the access-ports are similarly protodowned.
The ES-bond protodown state is propagated to each ES-bond member
and programmed in the dataplane/kernel (per-bond-member).
Configuring uplinks -
vtysh -c "conf t" vtysh -c "interface swp4" vtysh -c "evpn mh uplink"
Configuring startup delay -
vtysh -c "conf t" vtysh -c "evpn mh startup-delay 100"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EVPN protodown display -
========================
root@torm-11:mgmt:~# vtysh -c "show evpn"
L2 VNIs: 10
L3 VNIs: 3
Advertise gateway mac-ip: No
Advertise svi mac-ip: No
Duplicate address detection: Disable
Detection max-moves 5, time 180
EVPN MH:
mac-holdtime: 60s, neigh-holdtime: 60s
startup-delay: 180s, start-delay-timer: 00:01:14 <<<<<<<<<<<<
uplink-cfg-cnt: 4, uplink-active-cnt: 4
protodown: startup-delay <<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ES-bond protodown display -
===========================
root@torm-11:mgmt:~# vtysh -c "show interface hostbond1"
Interface hostbond1 is up, line protocol is down
Link ups: 0 last: (never)
Link downs: 1 last: 2020/04/26 20:38:03.53
PTM status: disabled
vrf: default
OS Description: Local Node/s torm-11 and Ports swp5 <==> Remote Node/s hostd-11 and Ports swp1
index 58 metric 0 mtu 9152 speed 4294967295
flags: <UP,BROADCAST,MULTICAST>
Type: Ethernet
HWaddr: 00:02:00:00:00:35
Interface Type bond
Master interface: bridge
EVPN-MH: ES id 1 ES sysmac 00:00:00:00:01:11
protodown: off rc: startup-delay <<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ES-bond member protodown display -
==================================
root@torm-11:mgmt:~# vtysh -c "show interface swp5"
Interface swp5 is up, line protocol is down
Link ups: 0 last: (never)
Link downs: 3 last: 2020/04/26 20:38:03.52
PTM status: disabled
vrf: default
index 7 metric 0 mtu 9152 speed 10000
flags: <UP,BROADCAST,MULTICAST>
Type: Ethernet
HWaddr: 00:02:00:00:00:35
Interface Type Other
Master interface: hostbond1
protodown: on rc: startup-delay <<<<<<<<<<<<<<<<
root@torm-11:mgmt:~#
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
2020-05-09 04:11:13 +02:00
|
|
|
struct zebra_l2info_bond {
|
|
|
|
struct list *mbr_zifs; /* slaves using this bond as a master */
|
|
|
|
};
|
|
|
|
|
2021-07-27 09:47:52 +02:00
|
|
|
struct zebra_l2_bridge_vlan {
|
|
|
|
vlanid_t vid;
|
|
|
|
struct zebra_evpn_access_bd *access_bd;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct zebra_l2_bridge_if_ctx {
|
|
|
|
/* input */
|
|
|
|
struct zebra_if *zif;
|
2021-07-27 18:29:00 +02:00
|
|
|
int (*func)(struct zebra_if *zif, struct zebra_l2_bridge_vlan *vlan,
|
|
|
|
void *arg);
|
2021-07-27 09:47:52 +02:00
|
|
|
|
|
|
|
/* input-output */
|
|
|
|
void *arg;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct zebra_l2_bridge_if {
|
|
|
|
uint8_t vlan_aware;
|
|
|
|
struct zebra_if *br_zif;
|
|
|
|
struct hash *vlan_table;
|
|
|
|
};
|
|
|
|
|
2017-05-15 07:31:08 +02:00
|
|
|
/* zebra L2 interface information - bridge interface */
|
|
|
|
struct zebra_l2info_bridge {
|
2021-07-27 09:47:52 +02:00
|
|
|
struct zebra_l2_bridge_if bridge;
|
2017-05-15 07:31:08 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/* zebra L2 interface information - VLAN interface */
|
|
|
|
struct zebra_l2info_vlan {
|
|
|
|
vlanid_t vid; /* VLAN id */
|
|
|
|
};
|
|
|
|
|
2019-12-19 18:33:56 +01:00
|
|
|
/* zebra L2 interface information - GRE interface */
|
|
|
|
struct zebra_l2info_gre {
|
|
|
|
struct in_addr vtep_ip; /* IFLA_GRE_LOCAL */
|
|
|
|
struct in_addr vtep_ip_remote; /* IFLA_GRE_REMOTE */
|
|
|
|
uint32_t ikey;
|
|
|
|
uint32_t okey;
|
|
|
|
ifindex_t ifindex_link; /* Interface index of interface
|
|
|
|
* linked with GRE
|
|
|
|
*/
|
|
|
|
ns_id_t link_nsid;
|
|
|
|
};
|
|
|
|
|
2021-07-27 09:44:15 +02:00
|
|
|
struct zebra_vxlan_vni {
|
2022-12-10 00:51:22 +01:00
|
|
|
vni_t vni; /* VNI */
|
2021-07-27 09:44:15 +02:00
|
|
|
vlanid_t access_vlan; /* Access VLAN - for VLAN-aware bridge. */
|
|
|
|
struct in_addr mcast_grp;
|
2023-04-27 05:02:09 +02:00
|
|
|
uint16_t flags;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct zebra_vxlan_vni_array {
|
|
|
|
uint16_t count;
|
|
|
|
struct zebra_vxlan_vni vnis[0];
|
2021-07-27 09:44:15 +02:00
|
|
|
};
|
|
|
|
|
2021-07-27 18:29:00 +02:00
|
|
|
enum {
|
2021-07-27 09:44:15 +02:00
|
|
|
ZEBRA_VXLAN_IF_VNI = 0, /* per vni vxlan if */
|
2022-12-10 00:51:22 +01:00
|
|
|
ZEBRA_VXLAN_IF_SVD /* single vxlan device */
|
2021-07-27 18:29:00 +02:00
|
|
|
};
|
2021-07-27 09:44:15 +02:00
|
|
|
|
|
|
|
struct zebra_vxlan_if_vlan_ctx {
|
|
|
|
vlanid_t vid;
|
|
|
|
struct zebra_vxlan_vni *vni;
|
|
|
|
};
|
|
|
|
|
2021-10-08 16:27:50 +02:00
|
|
|
struct zebra_vxlan_if_update_ctx {
|
|
|
|
uint16_t chgflags;
|
|
|
|
struct in_addr old_vtep_ip;
|
|
|
|
struct zebra_vxlan_vni old_vni;
|
|
|
|
struct hash *old_vni_table;
|
|
|
|
};
|
|
|
|
|
2021-07-27 09:44:15 +02:00
|
|
|
struct zebra_vxlan_if_ctx {
|
|
|
|
/* input */
|
|
|
|
struct zebra_if *zif;
|
2021-07-27 18:29:00 +02:00
|
|
|
int (*func)(struct zebra_if *zif, struct zebra_vxlan_vni *vni,
|
|
|
|
void *arg);
|
2021-07-27 09:44:15 +02:00
|
|
|
|
|
|
|
/* input-output */
|
|
|
|
void *arg;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct zebra_vxlan_vni_info {
|
2021-07-27 18:29:00 +02:00
|
|
|
int iftype;
|
2021-07-27 09:44:15 +02:00
|
|
|
union {
|
|
|
|
struct zebra_vxlan_vni vni; /* per vni vxlan device vni info */
|
|
|
|
struct hash
|
|
|
|
*vni_table; /* table of vni's assocated with this if */
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2017-05-15 07:31:08 +02:00
|
|
|
/* zebra L2 interface information - VXLAN interface */
|
|
|
|
struct zebra_l2info_vxlan {
|
2021-07-27 09:44:15 +02:00
|
|
|
struct zebra_vxlan_vni_info vni_info;
|
2017-05-15 07:31:08 +02:00
|
|
|
struct in_addr vtep_ip; /* Local tunnel IP */
|
2019-09-24 10:44:58 +02:00
|
|
|
ifindex_t ifindex_link; /* Interface index of interface
|
|
|
|
* linked with VXLAN
|
|
|
|
*/
|
|
|
|
ns_id_t link_nsid;
|
2017-05-15 07:31:08 +02:00
|
|
|
};
|
|
|
|
|
2018-11-10 21:54:43 +01:00
|
|
|
struct zebra_l2info_bondslave {
|
|
|
|
ifindex_t bond_ifindex; /* Bridge Master */
|
|
|
|
struct interface *bond_if; /* Pointer to master */
|
|
|
|
};
|
|
|
|
|
2017-05-15 07:31:08 +02:00
|
|
|
union zebra_l2if_info {
|
|
|
|
struct zebra_l2info_bridge br;
|
|
|
|
struct zebra_l2info_vlan vl;
|
|
|
|
struct zebra_l2info_vxlan vxl;
|
2019-12-19 18:33:56 +01:00
|
|
|
struct zebra_l2info_gre gre;
|
2017-05-15 07:31:08 +02:00
|
|
|
};
|
|
|
|
|
zebra: vlan to dplane Offload from main
Trigger: Zebra core seen when we convert l2vni to l3vni and back
BackTrace:
/usr/lib/x86_64-linux-gnu/frr/libfrr.so.0(_zlog_assert_failed+0xe9) [0x7f4af96989d9]
/usr/lib/frr/zebra(zebra_vxlan_if_vni_up+0x250) [0x5561022ae030]
/usr/lib/frr/zebra(netlink_vlan_change+0x2f4) [0x5561021fd354]
/usr/lib/frr/zebra(netlink_parse_info+0xff) [0x55610220d37f]
/usr/lib/frr/zebra(+0xc264a) [0x55610220d64a]
/usr/lib/x86_64-linux-gnu/frr/libfrr.so.0(thread_call+0x7d) [0x7f4af967e96d]
/usr/lib/x86_64-linux-gnu/frr/libfrr.so.0(frr_run+0xe8) [0x7f4af9637588]
/usr/lib/frr/zebra(main+0x402) [0x5561021f4d32]
/lib/x86_64-linux-gnu/libc.so.6(+0x2724a) [0x7f4af932624a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85) [0x7f4af9326305]
/usr/lib/frr/zebra(_start+0x21) [0x5561021f72f1]
Root Cause:
In working case,
- We get a RTM_NEWLINK whose ctx is enqueued by zebra dplane and
dequeued by zebra main and processed i.e.
(102000 is deleted from vxlan99) before we handle RTM_NEWVLAN.
- So in handling of NEWVLAN (vxlan99) we bail out since find with
vlan id 703 does not exist.
root@leaf2:mgmt:/var/log/frr# cat ~/raja_logs/working/nocras.log | grep "RTM_NEWLINK\|QUEUED\|vxlan99\|in thread"
2024/07/18 23:09:33.741105 ZEBRA: [KMXEB-K771Y] netlink_parse_info: netlink-dp-in (NS 0) type RTM_NEWLINK(16), len=616, seq=0, pid=0
2024/07/18 23:09:33.744061 ZEBRA: [K8FXY-V65ZJ] Intf dplane ctx 0x7f2244000cf0, op INTF_INSTALL, ifindex (65), result QUEUED
2024/07/18 23:09:33.767240 ZEBRA: [KMXEB-K771Y] netlink_parse_info: netlink-dp-in (NS 0) type RTM_NEWLINK(16), len=508, seq=0, pid=0
2024/07/18 23:09:33.767380 ZEBRA: [K8FXY-V65ZJ] Intf dplane ctx 0x7f2244000cf0, op INTF_INSTALL, ifindex (73), result QUEUED
2024/07/18 23:09:33.767389 ZEBRA: [NVFT0-HS1EX] INTF_INSTALL for vxlan99(73)
2024/07/18 23:09:33.767404 ZEBRA: [TQR2A-H2RFY] Vlan-Vni(1186:1186-6000002:6000002) update for VxLAN IF vxlan99(73)
2024/07/18 23:09:33.767422 ZEBRA: [TP4VP-XZ627] Del L2-VNI 102000 intf vxlan99(73)
2024/07/18 23:09:33.767858 ZEBRA: [QYXB9-6RNNK] RTM_NEWVLAN bridge IF vxlan99 NS 0
2024/07/18 23:09:33.767866 ZEBRA: [KKZGZ-8PCDW] Cannot find VNI for VID (703) IF vxlan99 for vlan state update >>>>BAIL OUT
In failure case,
- The NEWVLAN is received first even before processing RTM_NEWLINK.
- Since the vxlan id 102000 is not removed from the vxlan99,
the find with vlan id 703 returns the 102000 one and we invoke
zebra_vxlan_if_vni_up where the interfaces don't match and assert.
root@leaf2:mgmt:/var/log/frr# cat ~/raja_logs/noworking/crash.log | grep "RTM_NEWLINK\|QUEUED\|vxlan99\|in thread"
2024/07/18 22:26:43.829370 ZEBRA: [KMXEB-K771Y] netlink_parse_info: netlink-dp-in (NS 0) type RTM_NEWLINK(16), len=616, seq=0, pid=0
2024/07/18 22:26:43.829646 ZEBRA: [K8FXY-V65ZJ] Intf dplane ctx 0x7fe07c026d30, op INTF_INSTALL, ifindex (65), result QUEUED
2024/07/18 22:26:43.853930 ZEBRA: [QYXB9-6RNNK] RTM_NEWVLAN bridge IF vxlan99 NS 0
2024/07/18 22:26:43.853949 ZEBRA: [K61WJ-XQQ3X] Intf vxlan99(73) L2-VNI 102000 is UP >>> VLAN PROCESSED BEFORE INTF EVENT
2024/07/18 22:26:43.853951 ZEBRA: [SPV50-BX2RP] RAJA zevpn_vxlanif vxlan48 and ifp vxlan99
2024/07/18 22:26:43.854005 ZEBRA: [KMXEB-K771Y] netlink_parse_info: netlink-dp-in (NS 0) type RTM_NEWLINK(16), len=508, seq=0, pid=0
2024/07/18 22:26:43.854241 ZEBRA: [KMXEB-K771Y] netlink_parse_info: netlink-dp-in (NS 0) type RTM_NEWLINK(16), len=516, seq=0, pid=0
2024/07/18 22:26:43.854251 ZEBRA: [KMXEB-K771Y] netlink_parse_info: netlink-dp-in (NS 0) type RTM_NEWLINK(16), len=544, seq=0, pid=0
ZEBRA: in thread kernel_read scheduled from zebra/kernel_netlink.c:505 kernel_read()
Fix:
Similar to #13396, where link change
handling was offloaded to dplane, same is being done for vlan events.
Note: Prior to this change, zebra main thread was interested in the
RTNLGRP_BRVLAN. So all the kernel events pertaining to vlan was
handled by zebra main.
With this change change as well the handling of vlan events is still
with Zebra main. However we offload it via Dplane thread.
Ticket :#3878175
Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com>
2024-08-12 20:51:06 +02:00
|
|
|
struct zebra_vxlan_vlan {
|
|
|
|
uint8_t state;
|
|
|
|
uint32_t vrange;
|
|
|
|
vlanid_t vid;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct zebra_vxlan_vlan_array {
|
|
|
|
uint16_t count;
|
|
|
|
struct zebra_vxlan_vlan vlans[0];
|
|
|
|
};
|
|
|
|
|
2017-05-15 07:31:08 +02:00
|
|
|
/* NOTE: These macros are to be invoked only in the "correct" context.
|
|
|
|
* IOW, the macro VNI_FROM_ZEBRA_IF() will assume the interface is
|
|
|
|
* of type ZEBRA_IF_VXLAN.
|
|
|
|
*/
|
2021-07-27 09:44:15 +02:00
|
|
|
#define VNI_INFO_FROM_ZEBRA_IF(zif) (&((zif)->l2info.vxl.vni_info))
|
|
|
|
#define IS_ZEBRA_VXLAN_IF_SVD(zif) \
|
|
|
|
((zif)->l2info.vxl.vni_info.iftype == ZEBRA_VXLAN_IF_SVD)
|
|
|
|
#define IS_ZEBRA_VXLAN_IF_VNI(zif) \
|
|
|
|
((zif)->l2info.vxl.vni_info.iftype == ZEBRA_VXLAN_IF_VNI)
|
2017-05-15 07:31:08 +02:00
|
|
|
#define VLAN_ID_FROM_ZEBRA_IF(zif) (zif)->l2info.vl.vid
|
|
|
|
|
2021-07-27 09:47:52 +02:00
|
|
|
#define BRIDGE_FROM_ZEBRA_IF(zif) (&((zif)->l2info.br.bridge))
|
|
|
|
#define IS_ZEBRA_IF_BRIDGE_VLAN_AWARE(zif) \
|
|
|
|
((zif)->l2info.br.bridge.vlan_aware == 1)
|
2017-05-15 07:31:08 +02:00
|
|
|
|
zebra: map vxlan interface to bridge interface with correct ns id
an incoming bridge index has been found, that is linked with vxlan
interface, and the search for that bridge interface is done. In
vrf-lite, the search is done across the same default namespace, because
bridge and vxlan may not be in the same vrf. But this behaviour is wrong
when using vrf netns backend, as the bridge and the vxlan have to be in
the same vrf ( hence in the same network namespace). To comply with
that, use the netnamespace of the vxlan interface. Like that, the
appropriate nsid is passed as parameter, and consequently, the search is
correct, and the mac address passed to BGP will be ok too.
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
2019-10-01 11:07:13 +02:00
|
|
|
extern void zebra_l2_map_slave_to_bridge(struct zebra_l2info_brslave *br_slave,
|
|
|
|
struct zebra_ns *zns);
|
2017-05-15 07:31:08 +02:00
|
|
|
extern void
|
|
|
|
zebra_l2_unmap_slave_from_bridge(struct zebra_l2info_brslave *br_slave);
|
2023-04-27 05:02:09 +02:00
|
|
|
extern void
|
|
|
|
zebra_l2_bridge_add_update(struct interface *ifp,
|
|
|
|
const struct zebra_l2info_bridge *bridge_info);
|
2017-05-15 07:31:08 +02:00
|
|
|
extern void zebra_l2_bridge_del(struct interface *ifp);
|
|
|
|
extern void zebra_l2_vlanif_update(struct interface *ifp,
|
2023-04-27 05:02:09 +02:00
|
|
|
const struct zebra_l2info_vlan *vlan_info);
|
2019-12-19 18:33:56 +01:00
|
|
|
extern void zebra_l2_greif_add_update(struct interface *ifp,
|
2023-04-27 05:02:09 +02:00
|
|
|
const struct zebra_l2info_gre *vxlan_info,
|
2019-12-19 18:33:56 +01:00
|
|
|
int add);
|
2023-04-27 05:02:09 +02:00
|
|
|
extern void
|
|
|
|
zebra_l2_vxlanif_add_update(struct interface *ifp,
|
|
|
|
const struct zebra_l2info_vxlan *vxlan_info,
|
|
|
|
int add);
|
2017-05-15 07:31:08 +02:00
|
|
|
extern void zebra_l2_vxlanif_update_access_vlan(struct interface *ifp,
|
|
|
|
vlanid_t access_vlan);
|
2019-12-19 18:33:56 +01:00
|
|
|
extern void zebra_l2_greif_del(struct interface *ifp);
|
2017-05-15 07:31:08 +02:00
|
|
|
extern void zebra_l2_vxlanif_del(struct interface *ifp);
|
|
|
|
extern void zebra_l2if_update_bridge_slave(struct interface *ifp,
|
2019-10-03 17:11:37 +02:00
|
|
|
ifindex_t bridge_ifindex,
|
2021-08-17 10:42:51 +02:00
|
|
|
ns_id_t ns_id, uint8_t chgflags);
|
2017-05-15 07:31:08 +02:00
|
|
|
|
2018-11-10 21:54:43 +01:00
|
|
|
extern void zebra_l2if_update_bond_slave(struct interface *ifp,
|
2020-08-05 16:13:55 +02:00
|
|
|
ifindex_t bond_ifindex, bool bypass);
|
2020-03-28 01:14:45 +01:00
|
|
|
extern void zebra_vlan_bitmap_compute(struct interface *ifp,
|
|
|
|
uint32_t vid_start, uint16_t vid_end);
|
|
|
|
extern void zebra_vlan_mbr_re_eval(struct interface *ifp,
|
|
|
|
bitfield_t vlan_bitmap);
|
zebra: uplink tracking and startup delay for EVPN-MH
Local ethernet segments are held in a protodown or error-disabled state
if access to the VxLAN overlay is not ready -
1. When FRR comes up the local-ESs/access-port are kept protodown
for the startup-delay duration. During this time the underlay and
EVPN routes via it are expected to converge.
2. When all the uplinks/core-links attached to the underlay go down
the access-ports are similarly protodowned.
The ES-bond protodown state is propagated to each ES-bond member
and programmed in the dataplane/kernel (per-bond-member).
Configuring uplinks -
vtysh -c "conf t" vtysh -c "interface swp4" vtysh -c "evpn mh uplink"
Configuring startup delay -
vtysh -c "conf t" vtysh -c "evpn mh startup-delay 100"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EVPN protodown display -
========================
root@torm-11:mgmt:~# vtysh -c "show evpn"
L2 VNIs: 10
L3 VNIs: 3
Advertise gateway mac-ip: No
Advertise svi mac-ip: No
Duplicate address detection: Disable
Detection max-moves 5, time 180
EVPN MH:
mac-holdtime: 60s, neigh-holdtime: 60s
startup-delay: 180s, start-delay-timer: 00:01:14 <<<<<<<<<<<<
uplink-cfg-cnt: 4, uplink-active-cnt: 4
protodown: startup-delay <<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ES-bond protodown display -
===========================
root@torm-11:mgmt:~# vtysh -c "show interface hostbond1"
Interface hostbond1 is up, line protocol is down
Link ups: 0 last: (never)
Link downs: 1 last: 2020/04/26 20:38:03.53
PTM status: disabled
vrf: default
OS Description: Local Node/s torm-11 and Ports swp5 <==> Remote Node/s hostd-11 and Ports swp1
index 58 metric 0 mtu 9152 speed 4294967295
flags: <UP,BROADCAST,MULTICAST>
Type: Ethernet
HWaddr: 00:02:00:00:00:35
Interface Type bond
Master interface: bridge
EVPN-MH: ES id 1 ES sysmac 00:00:00:00:01:11
protodown: off rc: startup-delay <<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ES-bond member protodown display -
==================================
root@torm-11:mgmt:~# vtysh -c "show interface swp5"
Interface swp5 is up, line protocol is down
Link ups: 0 last: (never)
Link downs: 3 last: 2020/04/26 20:38:03.52
PTM status: disabled
vrf: default
index 7 metric 0 mtu 9152 speed 10000
flags: <UP,BROADCAST,MULTICAST>
Type: Ethernet
HWaddr: 00:02:00:00:00:35
Interface Type Other
Master interface: hostbond1
protodown: on rc: startup-delay <<<<<<<<<<<<<<<<
root@torm-11:mgmt:~#
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
2020-05-09 04:11:13 +02:00
|
|
|
extern void zebra_l2if_update_bond(struct interface *ifp, bool add);
|
2021-08-17 10:42:51 +02:00
|
|
|
extern void zebra_l2if_update_bridge(struct interface *ifp, uint8_t chgflags);
|
2019-03-25 15:11:55 +01:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2017-05-15 07:31:08 +02:00
|
|
|
#endif /* _ZEBRA_L2_H */
|