if (rtm->rtm_type != RTN_UNICAST)
return 0;
- table = rtm->rtm_table;
- if (!is_zebra_valid_kernel_table(table) && !is_zebra_main_routing_table(table))
- return 0;
-
- vrf_id = vrf_lookup_by_table(table);
-
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct rtmsg));
if (len < 0)
return -1;
if (rtm->rtm_src_len != 0)
return 0;
+ /* Table corresponding to route. */
+ if (tb[RTA_TABLE])
+ table = *(int *) RTA_DATA (tb[RTA_TABLE]);
+ else
+ table = rtm->rtm_table;
+
+ /* Map to VRF */
+ vrf_id = vrf_lookup_by_table(table);
+ if (vrf_id == VRF_DEFAULT)
+ {
+ if (!is_zebra_valid_kernel_table(table) &&
+ !is_zebra_main_routing_table(table))
+ return 0;
+ }
+
/* Route which inserted by Zebra. */
if (rtm->rtm_protocol == RTPROT_ZEBRA)
flags |= ZEBRA_FLAG_SELFROUTE;
return 0;
}
- table = rtm->rtm_table;
- if (!is_zebra_valid_kernel_table(table) && !is_zebra_main_routing_table(table))
- return 0;
-
- vrf_id = vrf_lookup_by_table(table);
-
len = h->nlmsg_len - NLMSG_LENGTH (sizeof (struct rtmsg));
if (len < 0)
return -1;
return 0;
}
+ /* Table corresponding to route. */
+ if (tb[RTA_TABLE])
+ table = *(int *) RTA_DATA (tb[RTA_TABLE]);
+ else
+ table = rtm->rtm_table;
+
+ /* Map to VRF */
+ vrf_id = vrf_lookup_by_table(table);
+ if (vrf_id == VRF_DEFAULT)
+ {
+ if (!is_zebra_valid_kernel_table(table) &&
+ !is_zebra_main_routing_table(table))
+ return 0;
+ }
+
index = 0;
metric = 0;
dest = NULL;
req.n.nlmsg_flags = NLM_F_CREATE | NLM_F_REQUEST;
req.n.nlmsg_type = cmd;
req.r.rtm_family = family;
- req.r.rtm_table = table;
req.r.rtm_dst_len = length;
req.r.rtm_protocol = RTPROT_ZEBRA;
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
if (dest)
addattr_l (&req.n, sizeof req, RTA_DST, dest, bytelen);
+ /* Table corresponding to this route. */
+ if (table < 256)
+ req.r.rtm_table = table;
+ else
+ {
+ req.r.rtm_table = RT_TABLE_UNSPEC;
+ addattr32(&req.n, sizeof req, RTA_TABLE, table);
+ }
+
if (!discard)
{
if (gate)
req.n.nlmsg_flags |= NLM_F_REPLACE;
req.n.nlmsg_type = cmd;
req.r.rtm_family = family;
- req.r.rtm_table = rib->table;
req.r.rtm_dst_len = p->prefixlen;
req.r.rtm_protocol = RTPROT_ZEBRA;
req.r.rtm_scope = RT_SCOPE_UNIVERSE;
*/
addattr32 (&req.n, sizeof req, RTA_PRIORITY, NL_DEFAULT_ROUTE_METRIC);
+ /* Table corresponding to this route. */
+ if (rib->table < 256)
+ req.r.rtm_table = rib->table;
+ else
+ {
+ req.r.rtm_table = RT_TABLE_UNSPEC;
+ addattr32(&req.n, sizeof req, RTA_TABLE, rib->table);
+ }
+
if (discard)
{
if (cmd == RTM_NEWROUTE)
}
}
+/* Lookup the routing table in a VRF based on both VRF-Id and table-id.
+ * NOTE: Table-id is relevant only in the Default VRF.
+ */
+static 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)
+{
+ struct route_table *table = NULL;
+
+ if (afi >= AFI_MAX || safi >= SAFI_MAX)
+ return NULL;
+
+ if (vrf_id == VRF_DEFAULT)
+ {
+ if (table_id == RT_TABLE_MAIN ||
+ table_id == zebrad.rtm_table_default)
+ table = zebra_vrf_table (afi, safi, vrf_id);
+ else
+ table = zebra_vrf_other_route_table (afi, table_id, vrf_id);
+ }
+ else
+ table = zebra_vrf_table (afi, safi, vrf_id);
+
+ return table;
+}
+
int
rib_add_ipv4 (int type, u_short instance, int flags, struct prefix_ipv4 *p,
struct in_addr *gate, struct in_addr *src,
struct nexthop *nexthop;
/* Lookup table. */
- if ((table_id == RT_TABLE_MAIN) || (table_id == zebrad.rtm_table_default))
- {
- table = zebra_vrf_table (AFI_IP, safi, vrf_id);
- }
- else
- {
- table = zebra_vrf_other_route_table (AFI_IP, table_id, vrf_id);
- }
+ table = zebra_vrf_table_with_table_id (AFI_IP, safi, vrf_id, table_id);
if (! table)
return 0;
int ret = 0;
/* Lookup table. */
- if ((rib->table == zebrad.rtm_table_default) || (rib->table == RT_TABLE_MAIN))
- {
- table = zebra_vrf_table (AFI_IP, safi, rib->vrf_id);
- }
- else
- {
- table = zebra_vrf_other_route_table (AFI_IP, rib->table, rib->vrf_id);
- }
+ table = zebra_vrf_table_with_table_id (AFI_IP, safi, rib->vrf_id, rib->table);
if (! table)
return 0;
char buf2[INET6_ADDRSTRLEN];
/* Lookup table. */
- if ((table_id == RT_TABLE_MAIN) || (table_id == zebrad.rtm_table_default))
- {
- table = zebra_vrf_table (AFI_IP, safi, vrf_id);
- }
- else
- {
- table = zebra_vrf_other_route_table(AFI_IP, table_id, vrf_id);
- }
+ table = zebra_vrf_table_with_table_id (AFI_IP, safi, vrf_id, table_id);
if (! table)
return 0;
struct nexthop *nexthop;
/* Lookup table. */
- if ((table_id == RT_TABLE_MAIN) || (table_id == zebrad.rtm_table_default))
- {
- table = zebra_vrf_table (AFI_IP6, safi, vrf_id);
- }
- else
- {
- table = zebra_vrf_other_route_table(AFI_IP6, table_id, vrf_id);
- }
+ table = zebra_vrf_table_with_table_id (AFI_IP6, safi, vrf_id, table_id);
if (! table)
return 0;
struct rib *same = NULL;
struct nexthop *nexthop;
int ret = 0;
- unsigned int table_id = 0;
if (p->family == AF_INET)
{
}
else
{
- if (rib)
- table_id = rib->table;
- else
+ if (!rib)
return 0; /* why are we getting called with NULL rib */
/* Lookup table. */
- if ((table_id == RT_TABLE_MAIN) || (table_id == zebrad.rtm_table_default))
- {
- table = zebra_vrf_table (AFI_IP6, safi, rib->vrf_id);
- }
- else
- {
- table = zebra_vrf_other_route_table(AFI_IP6, table_id, rib->vrf_id);
- }
-
+ table = zebra_vrf_table_with_table_id (AFI_IP6, safi, rib->vrf_id, rib->table);
if (! table)
return 0;
apply_mask_ipv6 (p);
/* Lookup table. */
- if ((table_id == RT_TABLE_MAIN) || (table_id == zebrad.rtm_table_default))
- {
- table = zebra_vrf_table (AFI_IP6, safi, vrf_id);
- }
- else
- {
- table = zebra_vrf_other_route_table(AFI_IP6, table_id, vrf_id);
- }
+ table = zebra_vrf_table_with_table_id (AFI_IP6, safi, vrf_id, table_id);
if (! table)
return 0;