zebra: add way to determine VRF/AFI/SAFI of table
Add some code that allows us to determine which VRF and AFI/SAFI a
given RIB table corresponds to.
* zebra/rib.h
Add rib_table_info_t structure, which contains information about
the VRF, AFI and SAFI that a table is for.
* zebra/zebra_rib.c
- Add the vrf_table_create() function, which creates a table and
sets its 'info' pointer to a newly created rib_table_info_t.
The 'info' pointer allows us to go from a route_node or a table
to the associated vrf.
- vrf_alloc(): Use vrf_create_table() to create tables.
* lib/memtypes.c
Add memory type for rib_table_info_t.
Signed-off-by: Avneesh Sachdev <avneesh@opensourcerouting.org>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
diff --git a/lib/memtypes.c b/lib/memtypes.c
index 76dece2..50b6fa4 100644
--- a/lib/memtypes.c
+++ b/lib/memtypes.c
@@ -83,6 +83,7 @@
{ MTYPE_STATIC_IPV4, "Static IPv4 route" },
{ MTYPE_STATIC_IPV6, "Static IPv6 route" },
{ MTYPE_RIB_DEST, "RIB destination" },
+ { MTYPE_RIB_TABLE_INFO, "RIB table info" },
{ -1, NULL },
};
diff --git a/zebra/rib.h b/zebra/rib.h
index 084f351..c98d99a 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -268,6 +268,24 @@
struct route_table *stable[AFI_MAX][SAFI_MAX];
};
+/*
+ * rib_table_info_t
+ *
+ * Structure that is hung off of a route_table that holds information about
+ * the table.
+ */
+typedef struct rib_table_info_t_
+{
+
+ /*
+ * Back pointer to vrf.
+ */
+ struct vrf *vrf;
+ afi_t afi;
+ safi_t safi;
+
+} rib_table_info_t;
+
extern struct nexthop *nexthop_ifindex_add (struct rib *, unsigned int);
extern struct nexthop *nexthop_ifname_add (struct rib *, char *);
extern struct nexthop *nexthop_blackhole_add (struct rib *);
@@ -362,6 +380,15 @@
*/
/*
+ * rib_table_info
+ */
+static inline rib_table_info_t *
+rib_table_info (struct route_table *table)
+{
+ return (rib_table_info_t *) table->info;
+}
+
+/*
* rib_dest_from_rnode
*/
static inline rib_dest_t *
@@ -417,4 +444,13 @@
return dest->rnode->table;
}
+/*
+ * rib_dest_vrf
+ */
+static inline struct vrf *
+rib_dest_vrf (rib_dest_t *dest)
+{
+ return rib_table_info (rib_dest_table (dest))->vrf;
+}
+
#endif /*_ZEBRA_RIB_H */
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index f0d5c9d..2cbee93 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -74,6 +74,27 @@
/* Vector for routing table. */
static vector vrf_vector;
+/*
+ * vrf_table_create
+ */
+static void
+vrf_table_create (struct vrf *vrf, afi_t afi, safi_t safi)
+{
+ rib_table_info_t *info;
+ struct route_table *table;
+
+ assert (!vrf->table[afi][safi]);
+
+ table = route_table_init ();
+ vrf->table[afi][safi] = table;
+
+ info = XCALLOC (MTYPE_RIB_TABLE_INFO, sizeof (*info));
+ info->vrf = vrf;
+ info->afi = afi;
+ info->safi = safi;
+ table->info = info;
+}
+
/* Allocate new VRF. */
static struct vrf *
vrf_alloc (const char *name)
@@ -87,12 +108,12 @@
vrf->name = XSTRDUP (MTYPE_VRF_NAME, name);
/* Allocate routing table and static table. */
- vrf->table[AFI_IP][SAFI_UNICAST] = route_table_init ();
- vrf->table[AFI_IP6][SAFI_UNICAST] = route_table_init ();
+ vrf_table_create (vrf, AFI_IP, SAFI_UNICAST);
+ vrf_table_create (vrf, AFI_IP6, SAFI_UNICAST);
vrf->stable[AFI_IP][SAFI_UNICAST] = route_table_init ();
vrf->stable[AFI_IP6][SAFI_UNICAST] = route_table_init ();
- vrf->table[AFI_IP][SAFI_MULTICAST] = route_table_init ();
- vrf->table[AFI_IP6][SAFI_MULTICAST] = route_table_init ();
+ vrf_table_create (vrf, AFI_IP, SAFI_MULTICAST);
+ vrf_table_create (vrf, AFI_IP6, SAFI_MULTICAST);
vrf->stable[AFI_IP][SAFI_MULTICAST] = route_table_init ();
vrf->stable[AFI_IP6][SAFI_MULTICAST] = route_table_init ();