mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 06:03:10 +00:00
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>
This commit is contained in:
parent
9fd92e3c4b
commit
1b5ed1b054
@ -83,6 +83,7 @@ struct memory_list memory_list_zebra[] =
|
|||||||
{ MTYPE_STATIC_IPV4, "Static IPv4 route" },
|
{ MTYPE_STATIC_IPV4, "Static IPv4 route" },
|
||||||
{ MTYPE_STATIC_IPV6, "Static IPv6 route" },
|
{ MTYPE_STATIC_IPV6, "Static IPv6 route" },
|
||||||
{ MTYPE_RIB_DEST, "RIB destination" },
|
{ MTYPE_RIB_DEST, "RIB destination" },
|
||||||
|
{ MTYPE_RIB_TABLE_INFO, "RIB table info" },
|
||||||
{ -1, NULL },
|
{ -1, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
36
zebra/rib.h
36
zebra/rib.h
@ -268,6 +268,24 @@ struct vrf
|
|||||||
struct route_table *stable[AFI_MAX][SAFI_MAX];
|
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_ifindex_add (struct rib *, unsigned int);
|
||||||
extern struct nexthop *nexthop_ifname_add (struct rib *, char *);
|
extern struct nexthop *nexthop_ifname_add (struct rib *, char *);
|
||||||
extern struct nexthop *nexthop_blackhole_add (struct rib *);
|
extern struct nexthop *nexthop_blackhole_add (struct rib *);
|
||||||
@ -361,6 +379,15 @@ extern int rib_gc_dest (struct route_node *rn);
|
|||||||
* Inline functions.
|
* Inline functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
* rib_dest_from_rnode
|
||||||
*/
|
*/
|
||||||
@ -417,4 +444,13 @@ rib_dest_table (rib_dest_t *dest)
|
|||||||
return dest->rnode->table;
|
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 */
|
#endif /*_ZEBRA_RIB_H */
|
||||||
|
@ -74,6 +74,27 @@ static const struct
|
|||||||
/* Vector for routing table. */
|
/* Vector for routing table. */
|
||||||
static vector vrf_vector;
|
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. */
|
/* Allocate new VRF. */
|
||||||
static struct vrf *
|
static struct vrf *
|
||||||
vrf_alloc (const char *name)
|
vrf_alloc (const char *name)
|
||||||
@ -87,12 +108,12 @@ vrf_alloc (const char *name)
|
|||||||
vrf->name = XSTRDUP (MTYPE_VRF_NAME, name);
|
vrf->name = XSTRDUP (MTYPE_VRF_NAME, name);
|
||||||
|
|
||||||
/* Allocate routing table and static table. */
|
/* Allocate routing table and static table. */
|
||||||
vrf->table[AFI_IP][SAFI_UNICAST] = route_table_init ();
|
vrf_table_create (vrf, AFI_IP, SAFI_UNICAST);
|
||||||
vrf->table[AFI_IP6][SAFI_UNICAST] = route_table_init ();
|
vrf_table_create (vrf, AFI_IP6, SAFI_UNICAST);
|
||||||
vrf->stable[AFI_IP][SAFI_UNICAST] = route_table_init ();
|
vrf->stable[AFI_IP][SAFI_UNICAST] = route_table_init ();
|
||||||
vrf->stable[AFI_IP6][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_create (vrf, AFI_IP, SAFI_MULTICAST);
|
||||||
vrf->table[AFI_IP6][SAFI_MULTICAST] = route_table_init ();
|
vrf_table_create (vrf, AFI_IP6, SAFI_MULTICAST);
|
||||||
vrf->stable[AFI_IP][SAFI_MULTICAST] = route_table_init ();
|
vrf->stable[AFI_IP][SAFI_MULTICAST] = route_table_init ();
|
||||||
vrf->stable[AFI_IP6][SAFI_MULTICAST] = route_table_init ();
|
vrf->stable[AFI_IP6][SAFI_MULTICAST] = route_table_init ();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user