1 /* Zebra Router header.
2 * Copyright (C) 2018 Cumulus Networks, Inc.
5 * This file is part of FRR.
7 * FRR is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * FRR is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with FRR; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22 #ifndef __ZEBRA_ROUTER_H__
23 #define __ZEBRA_ROUTER_H__
27 #include "zebra/zebra_ns.h"
34 * This header file contains the idea of a router and as such
35 * owns data that is associated with a router from zebra's
39 struct zebra_router_table
{
40 RB_ENTRY(zebra_router_table
) zebra_router_table_entry
;
47 struct route_table
*table
;
49 RB_HEAD(zebra_router_table_head
, zebra_router_table
);
50 RB_PROTOTYPE(zebra_router_table_head
, zebra_router_table
,
51 zebra_router_table_entry
, zebra_router_table_entry_compare
)
53 /* RPF lookup behaviour */
55 MCAST_NO_CONFIG
= 0, /* MIX_MRIB_FIRST, but no show in config write */
56 MCAST_MRIB_ONLY
, /* MRIB only */
57 MCAST_URIB_ONLY
, /* URIB only */
58 MCAST_MIX_MRIB_FIRST
, /* MRIB, if nothing at all then URIB */
59 MCAST_MIX_DISTANCE
, /* MRIB & URIB, lower distance wins */
60 MCAST_MIX_PFXLEN
, /* MRIB & URIB, longer prefix wins */
61 /* on equal value, MRIB wins for last 2 */
64 /* An interface can be error-disabled if a protocol (such as EVPN or
65 * VRRP) detects a problem with keeping it operationally-up.
66 * If any of the protodown bits are set protodown-on is programmed
67 * in the dataplane. This results in a carrier/L1 down on the
70 enum protodown_reasons
{
71 /* A process outside of FRR's control protodowned the interface */
72 ZEBRA_PROTODOWN_EXTERNAL
= (1 << 0),
73 /* On startup local ESs are held down for some time to
74 * allow the underlay to converge and EVPN routes to
77 ZEBRA_PROTODOWN_EVPN_STARTUP_DELAY
= (1 << 1),
78 /* If all the uplinks are down the switch has lost access
79 * to the VxLAN overlay and must shut down the access
80 * ports to allow servers to re-direct their traffic to
81 * other switches on the Ethernet Segment
83 ZEBRA_PROTODOWN_EVPN_UPLINK_DOWN
= (1 << 2),
84 ZEBRA_PROTODOWN_EVPN_ALL
= (ZEBRA_PROTODOWN_EVPN_UPLINK_DOWN
|
85 ZEBRA_PROTODOWN_EVPN_STARTUP_DELAY
),
86 ZEBRA_PROTODOWN_VRRP
= (1 << 3),
87 /* This reason used exclusively for testing */
88 ZEBRA_PROTODOWN_SHARP
= (1 << 4),
89 /* Just used to clear our fields on shutdown, externel not included */
90 ZEBRA_PROTODOWN_ALL
= (ZEBRA_PROTODOWN_EVPN_ALL
| ZEBRA_PROTODOWN_VRRP
|
91 ZEBRA_PROTODOWN_SHARP
)
93 #define ZEBRA_PROTODOWN_RC_STR_LEN 80
95 struct zebra_mlag_info
{
96 /* Role this zebra router is playing */
99 /* The peerlink being used for mlag */
101 ifindex_t peerlink_ifindex
;
103 /* The system mac being used */
106 * Zebra will open the communication channel with MLAGD only if any
107 * clients are interested and it is controlled dynamically based on
108 * client registers & un-registers.
110 uint32_t clients_interested_cnt
;
112 /* coomunication channel with MLAGD is established */
115 /* connection retry timer is running */
118 /* Holds the client data(unencoded) that need to be pushed to MCLAGD*/
119 struct stream_fifo
*mlag_fifo
;
122 * A new Kernel thread will be created to post the data to MCLAGD.
123 * where as, read will be performed from the zebra main thread, because
124 * read involves accessing client registartion data structures.
126 struct frr_pthread
*zebra_pth_mlag
;
128 /* MLAG Thread context 'master' */
129 struct thread_master
*th_master
;
132 * Event for Initial MLAG Connection setup & Data Read
133 * Read can be performed only after successful connection establishment,
137 struct thread
*t_read
;
138 /* Event for MLAG write */
139 struct thread
*t_write
;
142 struct zebra_router
{
143 atomic_bool in_shutdown
;
146 struct thread_master
*master
;
148 /* Lists of clients who have connected to us */
149 struct list
*client_list
;
151 /* List of clients in GR */
152 struct list
*stale_client_list
;
154 struct zebra_router_table_head tables
;
156 /* L3-VNI hash table (for EVPN). Only in default instance */
157 struct hash
*l3vni_table
;
159 /* Tables and other global info maintained for EVPN multihoming */
160 struct zebra_evpn_mh_info
*mh_info
;
162 /* EVPN MH broadcast domains indexed by the VID */
163 struct hash
*evpn_vlan_table
;
165 struct hash
*rules_hash
;
167 struct hash
*ipset_hash
;
169 struct hash
*ipset_entry_hash
;
171 struct hash
*iptable_hash
;
173 /* A sequence number used for tracking routes */
174 _Atomic
uint32_t sequence_num
;
177 #define ZEBRA_RIB_PROCESS_HOLD_TIME 10
178 #define ZEBRA_RIB_PROCESS_RETRY_TIME 1
179 struct work_queue
*ribq
;
181 /* Meta Queue Information */
182 struct meta_queue
*mq
;
185 struct work_queue
*lsp_process_q
;
187 #define ZEBRA_ZAPI_PACKETS_TO_PROCESS 1000
188 _Atomic
uint32_t packets_to_process
;
190 /* Mlag information for the router */
191 struct zebra_mlag_info mlag_info
;
194 * The EVPN instance, if any
196 struct zebra_vrf
*evpn_vrf
;
198 uint32_t multipath_num
;
200 /* RPF Lookup behavior */
201 enum multicast_mode ipv4_multicast_mode
;
204 * Time for when we sweep the rib from old routes
207 struct thread
*sweeper
;
210 * The hash of nexthop groups associated with this router
213 struct hash
*nhgs_id
;
216 * Does the underlying system provide an asic offload
224 #define GRACEFUL_RESTART_TIME 60
226 extern struct zebra_router zrouter
;
227 extern uint32_t rcvbufsize
;
229 extern void zebra_router_init(bool asic_offload
, bool notify_on_ack
);
230 extern void zebra_router_cleanup(void);
231 extern void zebra_router_terminate(void);
233 extern struct zebra_router_table
*zebra_router_find_zrt(struct zebra_vrf
*zvrf
,
235 afi_t afi
, safi_t safi
);
236 extern struct route_table
*zebra_router_find_table(struct zebra_vrf
*zvrf
,
237 uint32_t tableid
, afi_t afi
,
239 extern struct route_table
*zebra_router_get_table(struct zebra_vrf
*zvrf
,
240 uint32_t tableid
, afi_t afi
,
242 extern void zebra_router_release_table(struct zebra_vrf
*zvrf
, uint32_t tableid
,
243 afi_t afi
, safi_t safi
);
245 extern int zebra_router_config_write(struct vty
*vty
);
247 extern void zebra_router_sweep_route(void);
248 extern void zebra_router_sweep_nhgs(void);
250 extern void zebra_router_show_table_summary(struct vty
*vty
);
252 extern uint32_t zebra_router_get_next_sequence(void);
254 static inline vrf_id_t
zebra_vrf_get_evpn_id(void)
256 return zrouter
.evpn_vrf
? zvrf_id(zrouter
.evpn_vrf
) : VRF_DEFAULT
;
258 static inline struct zebra_vrf
*zebra_vrf_get_evpn(void)
260 return zrouter
.evpn_vrf
? zrouter
.evpn_vrf
261 : zebra_vrf_lookup_by_id(VRF_DEFAULT
);
264 extern void multicast_mode_ipv4_set(enum multicast_mode mode
);
266 extern enum multicast_mode
multicast_mode_ipv4_get(void);
268 extern bool zebra_router_notify_on_ack(void);
270 static inline void zebra_router_set_supports_nhgs(bool support
)
272 zrouter
.supports_nhgs
= support
;
275 /* zebra_northbound.c */
276 extern const struct frr_yang_module_info frr_zebra_info
;