/* array holding redistribute info about table redistribution */
/* bit AFI is set if that AFI is redistributing routes from this table */
-static int zebra_import_table_used[AFI_MAX][ZEBRA_KERNEL_TABLE_MAX];
-static uint32_t zebra_import_table_distance[AFI_MAX][ZEBRA_KERNEL_TABLE_MAX];
+static int zebra_import_table_used[AFI_MAX][SAFI_MAX][ZEBRA_KERNEL_TABLE_MAX];
+static uint32_t zebra_import_table_distance[AFI_MAX][SAFI_MAX][ZEBRA_KERNEL_TABLE_MAX];
-int is_zebra_import_table_enabled(afi_t afi, vrf_id_t vrf_id, uint32_t table_id)
+int is_zebra_import_table_enabled(afi_t afi, safi_t safi, vrf_id_t vrf_id, uint32_t table_id)
{
/*
* Make sure that what we are called with actualy makes sense
if (afi == AFI_MAX)
return 0;
+ if (safi == SAFI_MAX)
+ return 0;
+
if (is_zebra_valid_kernel_table(table_id) &&
table_id < ZEBRA_KERNEL_TABLE_MAX)
- return zebra_import_table_used[afi][table_id];
+ return zebra_import_table_used[afi][safi][table_id];
return 0;
}
}
}
-int zebra_add_import_table_entry(struct zebra_vrf *zvrf, struct route_node *rn,
+int zebra_add_import_table_entry(struct zebra_vrf *zvrf, safi_t safi, struct route_node *rn,
struct route_entry *re, const char *rmap_name)
{
struct route_entry *newre;
if (ret != RMAP_PERMITMATCH) {
UNSET_FLAG(re->flags, ZEBRA_FLAG_SELECTED);
- zebra_del_import_table_entry(zvrf, rn, re);
+ zebra_del_import_table_entry(zvrf, safi, rn, re);
return 0;
}
if (same) {
UNSET_FLAG(same->flags, ZEBRA_FLAG_SELECTED);
- zebra_del_import_table_entry(zvrf, rn, same);
+ zebra_del_import_table_entry(zvrf, safi, rn, same);
}
UNSET_FLAG(re->flags, ZEBRA_FLAG_RR_USE_DISTANCE);
- newre = zebra_rib_route_entry_new(
- 0, ZEBRA_ROUTE_TABLE, re->table, re->flags, re->nhe_id,
- zvrf->table_id, re->metric, re->mtu,
- zebra_import_table_distance[afi][re->table], re->tag);
+ newre = zebra_rib_route_entry_new(0, ZEBRA_ROUTE_TABLE, re->table, re->flags, re->nhe_id,
+ zvrf->table_id, re->metric, re->mtu,
+ zebra_import_table_distance[afi][safi][re->table],
+ re->tag);
ng = nexthop_group_new();
copy_nexthops(&ng->nexthop, re->nhe->nhg.nexthop, NULL);
- rib_add_multipath(afi, SAFI_UNICAST, &p, NULL, newre, ng, false);
+ rib_add_multipath(afi, safi, &p, NULL, newre, ng, false);
nexthop_group_delete(&ng);
return 0;
}
-int zebra_del_import_table_entry(struct zebra_vrf *zvrf, struct route_node *rn,
+int zebra_del_import_table_entry(struct zebra_vrf *zvrf, safi_t safi, struct route_node *rn,
struct route_entry *re)
{
struct prefix p;
afi = family2afi(rn->p.family);
prefix_copy(&p, &rn->p);
- rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_TABLE,
- re->table, re->flags, &p, NULL, re->nhe->nhg.nexthop,
- re->nhe_id, zvrf->table_id, re->metric, re->distance,
+ rib_delete(afi, safi, zvrf->vrf->vrf_id, ZEBRA_ROUTE_TABLE, re->table, re->flags, &p, NULL,
+ re->nhe->nhg.nexthop, re->nhe_id, zvrf->table_id, re->metric, re->distance,
false);
return 0;
}
/* Assuming no one calls this with the main routing table */
-int zebra_import_table(afi_t afi, vrf_id_t vrf_id, uint32_t table_id,
- uint32_t distance, const char *rmap_name, int add)
+int zebra_import_table(afi_t afi, safi_t safi, vrf_id_t vrf_id, uint32_t table_id,
+ uint32_t distance, const char *rmap_name, bool add)
{
struct route_table *table;
struct route_entry *re;
if (afi >= AFI_MAX)
return -1;
+ if (safi >= SAFI_MAX)
+ return -1;
+
+ /* Always import from the URIB sub-table */
table = zebra_vrf_get_table_with_table_id(afi, SAFI_UNICAST, vrf_id,
table_id);
if (table == NULL) {
return 0;
} else if (IS_ZEBRA_DEBUG_RIB) {
- zlog_debug("%s routes from table %d",
- add ? "Importing" : "Unimporting", table_id);
+ zlog_debug("%s routes from table %d into %s", add ? "Importing" : "Unimporting",
+ table_id, safi2str(safi));
}
if (add) {
if (rmap_name)
- zebra_add_import_table_route_map(afi, rmap_name,
- table_id);
+ zebra_add_import_table_route_map(afi, safi, rmap_name, table_id);
else {
- rmap_name =
- zebra_get_import_table_route_map(afi, table_id);
+ rmap_name = zebra_get_import_table_route_map(afi, safi, table_id);
if (rmap_name) {
- zebra_del_import_table_route_map(afi, table_id);
+ zebra_del_import_table_route_map(afi, safi, table_id);
rmap_name = NULL;
}
}
- zebra_import_table_used[afi][table_id] = 1;
- zebra_import_table_distance[afi][table_id] = distance;
+ zebra_import_table_used[afi][safi][table_id] = 1;
+ zebra_import_table_distance[afi][safi][table_id] = distance;
} else {
- zebra_import_table_used[afi][table_id] = 0;
- zebra_import_table_distance[afi][table_id] =
- ZEBRA_TABLE_DISTANCE_DEFAULT;
+ zebra_import_table_used[afi][safi][table_id] = 0;
+ zebra_import_table_distance[afi][safi][table_id] = ZEBRA_TABLE_DISTANCE_DEFAULT;
- rmap_name = zebra_get_import_table_route_map(afi, table_id);
+ rmap_name = zebra_get_import_table_route_map(afi, safi, table_id);
if (rmap_name) {
- zebra_del_import_table_route_map(afi, table_id);
+ zebra_del_import_table_route_map(afi, safi, table_id);
rmap_name = NULL;
}
}
if (((afi == AFI_IP) && (rn->p.family == AF_INET))
|| ((afi == AFI_IP6) && (rn->p.family == AF_INET6))) {
if (add)
- zebra_add_import_table_entry(zvrf, rn, re,
- rmap_name);
+ zebra_add_import_table_entry(zvrf, safi, rn, re, rmap_name);
else
- zebra_del_import_table_entry(zvrf, rn, re);
+ zebra_del_import_table_entry(zvrf, safi, rn, re);
}
}
return 0;
{
int i;
afi_t afi;
+ safi_t safi;
int write = 0;
char afi_str[AFI_MAX][10] = {"", "ip", "ipv6", "ethernet"};
const char *rmap_name;
- for (afi = AFI_IP; afi < AFI_MAX; afi++) {
+ FOREACH_AFI_SAFI (afi, safi) {
for (i = 1; i < ZEBRA_KERNEL_TABLE_MAX; i++) {
- if (!is_zebra_import_table_enabled(afi, vrf_id, i))
+ if (!is_zebra_import_table_enabled(afi, safi, vrf_id, i))
continue;
- if (zebra_import_table_distance[afi][i]
- != ZEBRA_TABLE_DISTANCE_DEFAULT) {
- vty_out(vty, "%s import-table %d distance %d",
- afi_str[afi], i,
- zebra_import_table_distance[afi][i]);
+ if (zebra_import_table_distance[afi][safi][i] !=
+ ZEBRA_TABLE_DISTANCE_DEFAULT) {
+ vty_out(vty, "%s import-table %d %sdistance %d", afi_str[afi], i,
+ (safi == SAFI_MULTICAST ? "mrib " : ""),
+ zebra_import_table_distance[afi][safi][i]);
} else {
- vty_out(vty, "%s import-table %d", afi_str[afi],
- i);
+ vty_out(vty, "%s import-table %d%s", afi_str[afi], i,
+ (safi == SAFI_MULTICAST ? " mrib" : ""));
}
- rmap_name = zebra_get_import_table_route_map(afi, i);
+ rmap_name = zebra_get_import_table_route_map(afi, safi, i);
if (rmap_name)
vty_out(vty, " route-map %s", rmap_name);
return write;
}
-static void zebra_import_table_rm_update_vrf_afi(struct zebra_vrf *zvrf,
- afi_t afi, int table_id,
- const char *rmap)
+static void zebra_import_table_rm_update_vrf_afi(struct zebra_vrf *zvrf, afi_t afi, safi_t safi,
+ int table_id, const char *rmap)
{
struct route_table *table;
struct route_entry *re;
struct route_node *rn;
const char *rmap_name;
- rmap_name = zebra_get_import_table_route_map(afi, table_id);
+ rmap_name = zebra_get_import_table_route_map(afi, safi, table_id);
if ((!rmap_name) || (strcmp(rmap_name, rmap) != 0))
return;
- table = zebra_vrf_get_table_with_table_id(afi, SAFI_UNICAST,
- zvrf->vrf->vrf_id, table_id);
+ table = zebra_vrf_get_table_with_table_id(afi, safi, zvrf->vrf->vrf_id, table_id);
if (!table) {
if (IS_ZEBRA_DEBUG_RIB_DETAILED)
zlog_debug("%s: Table id=%d not found", __func__,
if (((afi == AFI_IP) && (rn->p.family == AF_INET))
|| ((afi == AFI_IP6) && (rn->p.family == AF_INET6)))
- zebra_add_import_table_entry(zvrf, rn, re, rmap_name);
+ zebra_add_import_table_entry(zvrf, safi, rn, re, rmap_name);
}
return;
const char *rmap)
{
afi_t afi;
+ safi_t safi;
int i;
- for (afi = AFI_IP; afi < AFI_MAX; afi++) {
+ FOREACH_AFI_SAFI (afi, safi) {
for (i = 1; i < ZEBRA_KERNEL_TABLE_MAX; i++) {
- if (!is_zebra_import_table_enabled(
- afi, zvrf->vrf->vrf_id, i))
+ if (!is_zebra_import_table_enabled(afi, safi, zvrf->vrf->vrf_id, i))
continue;
- zebra_import_table_rm_update_vrf_afi(zvrf, afi, i,
- rmap);
+ zebra_import_table_rm_update_vrf_afi(zvrf, afi, safi, i, rmap);
}
}
}
{
rib_dest_t *dest;
afi_t afi;
+ safi_t safi;
const char *rmap_name;
assert(re && rn);
afi = (rn->p.family == AF_INET)
? AFI_IP
: (rn->p.family == AF_INET6) ? AFI_IP6 : AFI_MAX;
- if (is_zebra_import_table_enabled(afi, re->vrf_id, re->table)) {
- struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id);
+ for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
+ if (is_zebra_import_table_enabled(afi, safi, re->vrf_id, re->table)) {
+ struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id);
- rmap_name = zebra_get_import_table_route_map(afi, re->table);
- zebra_add_import_table_entry(zvrf, rn, re, rmap_name);
+ rmap_name = zebra_get_import_table_route_map(afi, safi, re->table);
+ zebra_add_import_table_entry(zvrf, safi, rn, re, rmap_name);
+ }
}
if (process)
void rib_delnode(struct route_node *rn, struct route_entry *re)
{
afi_t afi;
+ safi_t safi;
if (IS_ZEBRA_DEBUG_RIB)
rnode_debug(rn, re->vrf_id, "rn %p, re %p, removing",
afi = (rn->p.family == AF_INET)
? AFI_IP
: (rn->p.family == AF_INET6) ? AFI_IP6 : AFI_MAX;
- if (is_zebra_import_table_enabled(afi, re->vrf_id, re->table)) {
- struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id);
+ for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
+ if (is_zebra_import_table_enabled(afi, safi, re->vrf_id, re->table)) {
+ struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id);
- zebra_del_import_table_entry(zvrf, rn, re);
- /* Just clean up if non main table */
- if (IS_ZEBRA_DEBUG_RIB)
- zlog_debug("%s(%u):%pRN: Freeing route rn %p, re %p (%s)",
- vrf_id_to_name(re->vrf_id), re->vrf_id, rn,
- rn, re, zebra_route_string(re->type));
+ zebra_del_import_table_entry(zvrf, safi, rn, re);
+ /* Just clean up if non main table */
+ if (IS_ZEBRA_DEBUG_RIB)
+ zlog_debug("%s %s(%u):%pRN: Freeing route rn %p, re %p (%s)",
+ safi2str(safi), vrf_id_to_name(re->vrf_id), re->vrf_id,
+ rn, rn, re, zebra_route_string(re->type));
+ }
}
rib_queue_add(rn);
return write;
}
-DEFUN (ip_zebra_import_table_distance,
+DEFPY (ip_zebra_import_table_distance,
ip_zebra_import_table_distance_cmd,
- "ip import-table (1-252) [distance (1-255)] [route-map RMAP_NAME]",
+ "ip import-table (1-252)$table_id [mrib]$mrib [distance (1-255)$distance] [route-map RMAP_NAME$rmap]",
IP_STR
"import routes from non-main kernel table\n"
"kernel routing table id\n"
+ "Import into the MRIB instead of the URIB\n"
"Distance for imported routes\n"
"Default distance value\n"
"route-map for filtering\n"
"route-map name\n")
{
- uint32_t table_id = 0;
-
- table_id = strtoul(argv[2]->arg, NULL, 10);
- int distance = ZEBRA_TABLE_DISTANCE_DEFAULT;
- char *rmap =
- strmatch(argv[argc - 2]->text, "route-map")
- ? XSTRDUP(MTYPE_ROUTE_MAP_NAME, argv[argc - 1]->arg)
- : NULL;
- int ret;
+ safi_t safi = mrib ? SAFI_MULTICAST : SAFI_UNICAST;
- if (argc == 7 || (argc == 5 && !rmap))
- distance = strtoul(argv[4]->arg, NULL, 10);
+ if (distance_str == NULL)
+ distance = ZEBRA_TABLE_DISTANCE_DEFAULT;
if (!is_zebra_valid_kernel_table(table_id)) {
- vty_out(vty,
- "Invalid routing table ID, %d. Must be in range 1-252\n",
- table_id);
- if (rmap)
- XFREE(MTYPE_ROUTE_MAP_NAME, rmap);
+ vty_out(vty, "Invalid routing table ID, %ld. Must be in range 1-252\n", table_id);
return CMD_WARNING;
}
if (is_zebra_main_routing_table(table_id)) {
- vty_out(vty,
- "Invalid routing table ID, %d. Must be non-default table\n",
- table_id);
- if (rmap)
- XFREE(MTYPE_ROUTE_MAP_NAME, rmap);
+ vty_out(vty, "Invalid routing table ID, %ld. Must be non-default table\n", table_id);
return CMD_WARNING;
}
- ret = zebra_import_table(AFI_IP, VRF_DEFAULT, table_id,
- distance, rmap, 1);
- if (rmap)
- XFREE(MTYPE_ROUTE_MAP_NAME, rmap);
-
- return ret;
+ return zebra_import_table(AFI_IP, safi, VRF_DEFAULT, table_id, distance, rmap, true);
}
DEFUN_HIDDEN (zebra_packet_process,
return CMD_SUCCESS;
}
-DEFUN (no_ip_zebra_import_table,
+DEFPY (no_ip_zebra_import_table,
no_ip_zebra_import_table_cmd,
- "no ip import-table (1-252) [distance (1-255)] [route-map NAME]",
+ "no ip import-table (1-252)$table_id [mrib]$mrib [distance (1-255)] [route-map NAME]",
NO_STR
IP_STR
"import routes from non-main kernel table\n"
"kernel routing table id\n"
+ "Import into the MRIB instead of the URIB\n"
"Distance for imported routes\n"
"Default distance value\n"
"route-map for filtering\n"
"route-map name\n")
{
- uint32_t table_id = 0;
- table_id = strtoul(argv[3]->arg, NULL, 10);
+ safi_t safi = mrib ? SAFI_MULTICAST : SAFI_UNICAST;
if (!is_zebra_valid_kernel_table(table_id)) {
vty_out(vty,
}
if (is_zebra_main_routing_table(table_id)) {
- vty_out(vty,
- "Invalid routing table ID, %d. Must be non-default table\n",
- table_id);
+ vty_out(vty, "Invalid routing table ID, %ld. Must be non-default table\n", table_id);
return CMD_WARNING;
}
- if (!is_zebra_import_table_enabled(AFI_IP, VRF_DEFAULT, table_id))
+ if (!is_zebra_import_table_enabled(AFI_IP, safi, VRF_DEFAULT, table_id))
return CMD_SUCCESS;
- return (zebra_import_table(AFI_IP, VRF_DEFAULT, table_id, 0, NULL, 0));
+ return (zebra_import_table(AFI_IP, safi, VRF_DEFAULT, table_id, 0, NULL, false));
}
DEFPY (zebra_nexthop_group_keep,