summaryrefslogtreecommitdiffstats
path: root/zebra
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-08-31 22:07:36 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2017-08-31 22:11:17 +0200
commitf8c175f3185b52d6e2e5bc13360dd87d9e5a95a1 (patch)
tree35ac475feecdf48db57d398ccada72bfe5438f2a /zebra
parent*: Cleanup multiple is_default... code (diff)
downloadfrr-f8c175f3185b52d6e2e5bc13360dd87d9e5a95a1.tar.xz
frr-f8c175f3185b52d6e2e5bc13360dd87d9e5a95a1.zip
zebra: Add v6 support for import-table
Now that all rib functions are afi/safi independent, allow import-table to work with v6 routes too. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'zebra')
-rw-r--r--zebra/redistribute.c104
1 files changed, 49 insertions, 55 deletions
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index 9db879c18..ce86b6c1e 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -489,10 +489,12 @@ int zebra_add_import_table_entry(struct route_node *rn, struct route_entry *re,
struct route_entry *same;
struct prefix p;
route_map_result_t ret = RMAP_MATCH;
+ afi_t afi;
+ afi = family2afi(rn->p.family);
if (rmap_name)
ret = zebra_import_table_route_map_check(
- AFI_IP, re->type, &rn->p, re->nexthop, re->vrf_id,
+ afi, re->type, &rn->p, re->nexthop, re->vrf_id,
re->tag, rmap_name);
if (ret != RMAP_MATCH) {
@@ -500,72 +502,64 @@ int zebra_add_import_table_entry(struct route_node *rn, struct route_entry *re,
return 0;
}
- if (rn->p.family == AF_INET) {
- p.family = AF_INET;
- p.prefixlen = rn->p.prefixlen;
- p.u.prefix4 = rn->p.u.prefix4;
+ prefix_copy(&p, &rn->p);
- RNODE_FOREACH_RE(rn, same)
- {
- if (CHECK_FLAG(same->status,
- ROUTE_ENTRY_REMOVED))
- continue;
+ RNODE_FOREACH_RE(rn, same)
+ {
+ if (CHECK_FLAG(same->status,
+ ROUTE_ENTRY_REMOVED))
+ continue;
- if (same->type == re->type
- && same->instance == re->instance
- && same->table == re->table
- && same->type != ZEBRA_ROUTE_CONNECT)
- break;
- }
+ if (same->type == re->type
+ && same->instance == re->instance
+ && same->table == re->table
+ && same->type != ZEBRA_ROUTE_CONNECT)
+ break;
+ }
- if (same)
- zebra_del_import_table_entry(rn, same);
-
- if (re->nexthop_num == 1) {
- rib_add(AFI_IP, SAFI_UNICAST, re->vrf_id,
- ZEBRA_ROUTE_TABLE, re->table, 0, &p,
- NULL, re->nexthop,
- zebrad.rtm_table_default, re->metric,
- re->mtu,
- zebra_import_table_distance[AFI_IP]
- [re->table]);
- } else if (re->nexthop_num > 1) {
- newre = XCALLOC(MTYPE_RE,
- sizeof(struct route_entry));
- newre->type = ZEBRA_ROUTE_TABLE;
- newre->distance =
- zebra_import_table_distance[AFI_IP][re->table];
- newre->flags = re->flags;
- newre->metric = re->metric;
- newre->mtu = re->mtu;
- newre->table = zebrad.rtm_table_default;
- newre->nexthop_num = 0;
- newre->uptime = time(NULL);
- newre->instance = re->table;
- route_entry_copy_nexthops(newre, re->nexthop);
-
- rib_add_multipath(AFI_IP, SAFI_UNICAST, &p,
- NULL, newre);
- }
+ if (same)
+ zebra_del_import_table_entry(rn, same);
+
+ if (re->nexthop_num == 1) {
+ rib_add(afi, SAFI_UNICAST, re->vrf_id,
+ ZEBRA_ROUTE_TABLE, re->table, 0, &p,
+ NULL, re->nexthop,
+ zebrad.rtm_table_default, re->metric,
+ re->mtu,
+ zebra_import_table_distance[afi]
+ [re->table]);
+ } else if (re->nexthop_num > 1) {
+ newre = XCALLOC(MTYPE_RE,
+ sizeof(struct route_entry));
+ newre->type = ZEBRA_ROUTE_TABLE;
+ newre->distance =
+ zebra_import_table_distance[afi][re->table];
+ newre->flags = re->flags;
+ newre->metric = re->metric;
+ newre->mtu = re->mtu;
+ newre->table = zebrad.rtm_table_default;
+ newre->nexthop_num = 0;
+ newre->uptime = time(NULL);
+ newre->instance = re->table;
+ route_entry_copy_nexthops(newre, re->nexthop);
+
+ rib_add_multipath(afi, SAFI_UNICAST, &p,
+ NULL, newre);
}
- /* DD: Add IPv6 code */
return 0;
}
int zebra_del_import_table_entry(struct route_node *rn, struct route_entry *re)
{
struct prefix p;
+ afi_t afi;
- if (rn->p.family == AF_INET) {
- p.family = AF_INET;
- p.prefixlen = rn->p.prefixlen;
- p.u.prefix4 = rn->p.u.prefix4;
+ afi = family2afi(rn->p.family);
+ prefix_copy(&p, &rn->p);
- rib_delete(AFI_IP, SAFI_UNICAST, re->vrf_id, ZEBRA_ROUTE_TABLE,
- re->table, re->flags, &p, NULL, NULL,
- zebrad.rtm_table_default, re->metric);
- }
- /* DD: Add IPv6 code */
+ rib_delete(afi, SAFI_UNICAST, re->vrf_id, ZEBRA_ROUTE_TABLE,
+ re->table, re->flags, &p, NULL, NULL,
+ zebrad.rtm_table_default, re->metric);
return 0;
}