/*
* Zebra Vrf Header
* Copyright (C) 2016 Cumulus Networks
- * Donald Sahrp
+ * Donald Sharp
*
* This file is part of Quagga.
*
* 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
*/
-#if !defined(__ZEBRA_RIB_H__)
-#define __ZEBRA_RIB_H__
+#if !defined(__ZEBRA_VRF_H__)
+#define __ZEBRA_VRF_H__
+
+#include "vxlan.h"
#include <zebra/zebra_ns.h>
#include <zebra/zebra_pw.h>
/* MPLS (Segment Routing) global block */
typedef struct mpls_srgb_t_ {
- u_int32_t start_label;
- u_int32_t end_label;
+ uint32_t start_label;
+ uint32_t end_label;
} mpls_srgb_t;
+struct zebra_rmap {
+ char *name;
+ struct route_map *map;
+};
+
/* Routing table instance. */
struct zebra_vrf {
/* Back pointer */
char *desc;
/* FIB identifier. */
- u_char fib_id;
+ uint8_t fib_id;
/* Flags. */
- u_int16_t flags;
+ uint16_t flags;
#define ZEBRA_VRF_RIB_SCHEDULED (1 << 0)
#define ZEBRA_VRF_RETAIN (2 << 0)
- u_int32_t table_id;
+ uint32_t table_id;
/* Routing table. */
struct route_table *table[AFI_MAX][SAFI_MAX];
- /* Static route configuration. */
- struct route_table *stable[AFI_MAX][SAFI_MAX];
-
/* Recursive Nexthop table */
struct route_table *rnh_table[AFI_MAX];
/* Import check table (used mostly by BGP */
struct route_table *import_check_table[AFI_MAX];
- /* Routing tables off of main table for redistribute table */
- struct route_table *other_table[AFI_MAX][ZEBRA_KERNEL_TABLE_MAX];
-
/* 2nd pointer type used primarily to quell a warning on
* ALL_LIST_ELEMENTS_RO
*/
struct zebra_pw_head pseudowires;
struct zebra_static_pw_head static_pseudowires;
+ struct zebra_rmap proto_rm[AFI_MAX][ZEBRA_ROUTE_MAX + 1];
+ struct zebra_rmap nht_rm[AFI_MAX][ZEBRA_ROUTE_MAX + 1];
+
/* MPLS processing flags */
- u_int16_t mpls_flags;
+ uint16_t mpls_flags;
#define MPLS_FLAG_SCHEDULE_LSPS (1 << 0)
/*
/* l3-vni info */
vni_t l3vni;
+ bool dup_addr_detect;
+
+ int dad_time;
+ uint32_t dad_max_moves;
+ bool dad_freeze;
+ uint32_t dad_freeze_time;
+
+ /*
+ * Flooding mechanism for BUM packets for VxLAN-EVPN.
+ */
+ enum vxlan_flood_control vxlan_flood_ctrl;
+
/* Route Installs */
uint64_t installs;
uint64_t removals;
+ uint64_t installs_queued;
+ uint64_t removals_queued;
uint64_t neigh_updates;
uint64_t lsp_installs;
uint64_t lsp_removals;
};
+#define PROTO_RM_NAME(zvrf, afi, rtype) zvrf->proto_rm[afi][rtype].name
+#define NHT_RM_NAME(zvrf, afi, rtype) zvrf->nht_rm[afi][rtype].name
+#define PROTO_RM_MAP(zvrf, afi, rtype) zvrf->proto_rm[afi][rtype].map
+#define NHT_RM_MAP(zvrf, afi, rtype) zvrf->nht_rm[afi][rtype].map
+
+/*
+ * special macro to allow us to get the correct zebra_vrf
+ */
+#define ZEBRA_DECLVAR_CONTEXT(A, B) \
+ struct vrf *A = VTY_GET_CONTEXT(vrf); \
+ struct zebra_vrf *B = (A) ? A->info : vrf_info_lookup(VRF_DEFAULT)
static inline vrf_id_t zvrf_id(struct zebra_vrf *zvrf)
{
+ if (!zvrf || !zvrf->vrf)
+ return VRF_UNKNOWN;
return zvrf->vrf->vrf_id;
}
+static inline const char *zvrf_ns_name(struct zebra_vrf *zvrf)
+{
+ if (!zvrf->vrf || !zvrf->vrf->ns_ctxt)
+ return NULL;
+ return ns_get_name((struct ns *)zvrf->vrf->ns_ctxt);
+}
+
static inline const char *zvrf_name(struct zebra_vrf *zvrf)
{
return zvrf->vrf->name;
}
+static inline bool zvrf_is_active(struct zebra_vrf *zvrf)
+{
+ return zvrf->vrf->status & VRF_ACTIVE;
+}
+
struct route_table *zebra_vrf_table_with_table_id(afi_t afi, safi_t safi,
vrf_id_t vrf_id,
- u_int32_t table_id);
+ uint32_t table_id);
extern void zebra_vrf_update_all(struct zserv *client);
extern struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id);
extern struct zebra_vrf *zebra_vrf_lookup_by_name(const char *);
extern struct zebra_vrf *zebra_vrf_alloc(void);
extern struct route_table *zebra_vrf_table(afi_t, safi_t, vrf_id_t);
-extern struct route_table *zebra_vrf_static_table(afi_t, safi_t,
- struct zebra_vrf *zvrf);
+
extern struct route_table *
-zebra_vrf_other_route_table(afi_t afi, u_int32_t table_id, vrf_id_t vrf_id);
+zebra_vrf_other_route_table(afi_t afi, uint32_t table_id, vrf_id_t vrf_id);
extern int zebra_vrf_has_config(struct zebra_vrf *zvrf);
extern void zebra_vrf_init(void);
-#endif
+
+extern void zebra_rtable_node_cleanup(struct route_table *table,
+ struct route_node *node);
+#endif /* ZEBRA_VRF_H */