RB_PROTOTYPE(zebra_router_table_head, zebra_router_table,
zebra_router_table_entry, zebra_router_table_entry_compare)
+/* RPF lookup behaviour */
+enum multicast_mode {
+ MCAST_NO_CONFIG = 0, /* MIX_MRIB_FIRST, but no show in config write */
+ MCAST_MRIB_ONLY, /* MRIB only */
+ MCAST_URIB_ONLY, /* URIB only */
+ MCAST_MIX_MRIB_FIRST, /* MRIB, if nothing at all then URIB */
+ MCAST_MIX_DISTANCE, /* MRIB & URIB, lower distance wins */
+ MCAST_MIX_PFXLEN, /* MRIB & URIB, longer prefix wins */
+ /* on equal value, MRIB wins for last 2 */
+};
+
struct zebra_mlag_info {
/* Role this zebra router is playing */
enum mlag_role role;
};
struct zebra_router {
+ atomic_bool in_shutdown;
+
/* Thread master */
struct thread_master *master;
struct hash *iptable_hash;
-#if defined(HAVE_RTADV)
- struct rtadv rtadv;
-#endif /* HAVE_RTADV */
+ /* used if vrf backend is not network namespace */
+ int rtadv_sock;
/* A sequence number used for tracking routes */
_Atomic uint32_t sequence_num;
* The EVPN instance, if any
*/
struct zebra_vrf *evpn_vrf;
+
+ uint32_t multipath_num;
+
+ /* RPF Lookup behavior */
+ enum multicast_mode ipv4_multicast_mode;
+
+ /*
+ * Time for when we sweep the rib from old routes
+ */
+ time_t startup_time;
+
+ /*
+ * The hash of nexthop groups associated with this router
+ */
+ struct hash *nhgs;
+ struct hash *nhgs_id;
};
+#define GRACEFUL_RESTART_TIME 60
+
extern struct zebra_router zrouter;
extern void zebra_router_init(void);
extern int zebra_router_config_write(struct vty *vty);
-extern unsigned long zebra_router_score_proto(uint8_t proto,
- unsigned short instance);
extern void zebra_router_sweep_route(void);
extern void zebra_router_show_table_summary(struct vty *vty);
: zebra_vrf_lookup_by_id(VRF_DEFAULT);
}
+extern void multicast_mode_ipv4_set(enum multicast_mode mode);
+
+extern enum multicast_mode multicast_mode_ipv4_get(void);
+
#ifdef __cplusplus
}
#endif