summaryrefslogtreecommitdiff
path: root/ospf6d/ospf6_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d/ospf6_zebra.c')
-rw-r--r--ospf6d/ospf6_zebra.c133
1 files changed, 75 insertions, 58 deletions
diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c
index 62e0e149b8..b6c712176a 100644
--- a/ospf6d/ospf6_zebra.c
+++ b/ospf6d/ospf6_zebra.c
@@ -39,6 +39,7 @@
#include "ospf6_asbr.h"
#include "ospf6_zebra.h"
#include "ospf6d.h"
+#include "ospf6_area.h"
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_DISTANCE, "OSPF6 distance")
@@ -47,16 +48,49 @@ unsigned char conf_debug_ospf6_zebra = 0;
/* information about zebra. */
struct zclient *zclient = NULL;
+void ospf6_zebra_vrf_register(struct ospf6 *ospf6)
+{
+ if (!zclient || zclient->sock < 0 || !ospf6)
+ return;
+
+ if (ospf6->vrf_id != VRF_UNKNOWN) {
+ if (IS_OSPF6_DEBUG_ZEBRA(RECV)) {
+ zlog_debug("%s: Register VRF %s id %u", __func__,
+ ospf6_vrf_id_to_name(ospf6->vrf_id),
+ ospf6->vrf_id);
+ }
+ zclient_send_reg_requests(zclient, ospf6->vrf_id);
+ }
+}
+
+void ospf6_zebra_vrf_deregister(struct ospf6 *ospf6)
+{
+ if (!zclient || zclient->sock < 0 || !ospf6)
+ return;
+
+ if (ospf6->vrf_id != VRF_DEFAULT && ospf6->vrf_id != VRF_UNKNOWN) {
+ if (IS_OSPF6_DEBUG_ZEBRA(RECV)) {
+ zlog_debug("%s: De-Register VRF %s id %u to Zebra.",
+ __func__,
+ ospf6_vrf_id_to_name(ospf6->vrf_id),
+ ospf6->vrf_id);
+ }
+ /* Deregister for router-id, interfaces,
+ * redistributed routes. */
+ zclient_send_dereg_requests(zclient, ospf6->vrf_id);
+ }
+}
+
/* Router-id update message from zebra. */
static int ospf6_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
{
struct prefix router_id;
- struct ospf6 *o = ospf6;
+ struct ospf6 *o;
zebra_router_id_update_read(zclient->ibuf, &router_id);
om6->zebra_router_id = router_id.u.prefix4.s_addr;
-
+ o = ospf6_lookup_by_vrf_id(vrf_id);
if (o == NULL)
return 0;
@@ -69,7 +103,7 @@ static int ospf6_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
INET_ADDRSTRLEN));
}
- ospf6_router_id_update();
+ ospf6_router_id_update(o);
return 0;
}
@@ -99,7 +133,6 @@ void ospf6_zebra_no_redistribute(int type, vrf_id_t vrf_id)
static int ospf6_zebra_if_address_update_add(ZAPI_CALLBACK_ARGS)
{
struct connected *c;
- char buf[128];
c = zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_ADD,
zclient->ibuf, vrf_id);
@@ -107,11 +140,9 @@ static int ospf6_zebra_if_address_update_add(ZAPI_CALLBACK_ARGS)
return 0;
if (IS_OSPF6_DEBUG_ZEBRA(RECV))
- zlog_debug("Zebra Interface address add: %s %5s %s/%d",
+ zlog_debug("Zebra Interface address add: %s %5s %pFX",
c->ifp->name, prefix_family_str(c->address),
- inet_ntop(c->address->family, &c->address->u.prefix,
- buf, sizeof(buf)),
- c->address->prefixlen);
+ c->address);
if (c->address->family == AF_INET6) {
ospf6_interface_state_update(c->ifp);
@@ -123,7 +154,6 @@ static int ospf6_zebra_if_address_update_add(ZAPI_CALLBACK_ARGS)
static int ospf6_zebra_if_address_update_delete(ZAPI_CALLBACK_ARGS)
{
struct connected *c;
- char buf[128];
c = zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_DELETE,
zclient->ibuf, vrf_id);
@@ -131,11 +161,9 @@ static int ospf6_zebra_if_address_update_delete(ZAPI_CALLBACK_ARGS)
return 0;
if (IS_OSPF6_DEBUG_ZEBRA(RECV))
- zlog_debug("Zebra Interface address delete: %s %5s %s/%d",
+ zlog_debug("Zebra Interface address delete: %s %5s %pFX",
c->ifp->name, prefix_family_str(c->address),
- inet_ntop(c->address->family, &c->address->u.prefix,
- buf, sizeof(buf)),
- c->address->prefixlen);
+ c->address);
if (c->address->family == AF_INET6) {
ospf6_interface_connected_route_update(c->ifp);
@@ -152,6 +180,9 @@ static int ospf6_zebra_read_route(ZAPI_CALLBACK_ARGS)
struct zapi_route api;
unsigned long ifindex;
struct in6_addr *nexthop;
+ struct ospf6 *ospf6;
+
+ ospf6 = ospf6_lookup_by_vrf_id(vrf_id);
if (ospf6 == NULL)
return 0;
@@ -169,25 +200,21 @@ static int ospf6_zebra_read_route(ZAPI_CALLBACK_ARGS)
ifindex = api.nexthops[0].ifindex;
nexthop = &api.nexthops[0].gate.ipv6;
- if (IS_OSPF6_DEBUG_ZEBRA(RECV)) {
- char prefixstr[PREFIX2STR_BUFFER], nexthopstr[128];
-
- prefix2str(&api.prefix, prefixstr, sizeof(prefixstr));
- inet_ntop(AF_INET6, nexthop, nexthopstr, sizeof(nexthopstr));
-
+ if (IS_OSPF6_DEBUG_ZEBRA(RECV))
zlog_debug(
- "Zebra Receive route %s: %s %s nexthop %s ifindex %ld tag %" ROUTE_TAG_PRI,
+ "Zebra Receive route %s: %s %pFX nexthop %pI6 ifindex %ld tag %" ROUTE_TAG_PRI,
(cmd == ZEBRA_REDISTRIBUTE_ROUTE_ADD ? "add"
: "delete"),
- zebra_route_string(api.type), prefixstr, nexthopstr,
+ zebra_route_string(api.type), &api.prefix, nexthop,
ifindex, api.tag);
- }
if (cmd == ZEBRA_REDISTRIBUTE_ROUTE_ADD)
ospf6_asbr_redistribute_add(api.type, ifindex, &api.prefix,
- api.nexthop_num, nexthop, api.tag);
+ api.nexthop_num, nexthop, api.tag,
+ ospf6);
else
- ospf6_asbr_redistribute_remove(api.type, ifindex, &api.prefix);
+ ospf6_asbr_redistribute_remove(api.type, ifindex, &api.prefix,
+ ospf6);
return 0;
}
@@ -222,19 +249,17 @@ DEFUN (show_zebra,
#define ADD 0
#define REM 1
-static void ospf6_zebra_route_update(int type, struct ospf6_route *request)
+static void ospf6_zebra_route_update(int type, struct ospf6_route *request,
+ struct ospf6 *ospf6)
{
struct zapi_route api;
- char buf[PREFIX2STR_BUFFER];
int nhcount;
int ret = 0;
struct prefix *dest;
- if (IS_OSPF6_DEBUG_ZEBRA(SEND)) {
- prefix2str(&request->prefix, buf, sizeof(buf));
- zlog_debug("Send %s route: %s",
- (type == REM ? "remove" : "add"), buf);
- }
+ if (IS_OSPF6_DEBUG_ZEBRA(SEND))
+ zlog_debug("Send %s route: %pFX",
+ (type == REM ? "remove" : "add"), &request->prefix);
if (zclient->sock < 0) {
if (IS_OSPF6_DEBUG_ZEBRA(SEND))
@@ -295,8 +320,8 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request)
}
SET_FLAG(api.message, ZAPI_MESSAGE_DISTANCE);
- api.distance =
- ospf6_distance_apply((struct prefix_ipv6 *)dest, request);
+ api.distance = ospf6_distance_apply((struct prefix_ipv6 *)dest, request,
+ ospf6);
if (type == REM)
ret = zclient_route_send(ZEBRA_ROUTE_DELETE, zclient, &api);
@@ -312,20 +337,21 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request)
return;
}
-void ospf6_zebra_route_update_add(struct ospf6_route *request)
+void ospf6_zebra_route_update_add(struct ospf6_route *request,
+ struct ospf6 *ospf6)
{
- ospf6_zebra_route_update(ADD, request);
+ ospf6_zebra_route_update(ADD, request, ospf6);
}
-void ospf6_zebra_route_update_remove(struct ospf6_route *request)
+void ospf6_zebra_route_update_remove(struct ospf6_route *request,
+ struct ospf6 *ospf6)
{
- ospf6_zebra_route_update(REM, request);
+ ospf6_zebra_route_update(REM, request, ospf6);
}
-void ospf6_zebra_add_discard(struct ospf6_route *request)
+void ospf6_zebra_add_discard(struct ospf6_route *request, struct ospf6 *ospf6)
{
struct zapi_route api;
- char buf[INET6_ADDRSTRLEN];
struct prefix *dest = &request->prefix;
if (!CHECK_FLAG(request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED)) {
@@ -339,26 +365,21 @@ void ospf6_zebra_add_discard(struct ospf6_route *request)
zclient_route_send(ZEBRA_ROUTE_ADD, zclient, &api);
if (IS_OSPF6_DEBUG_ZEBRA(SEND))
- zlog_debug("Zebra: Route add discard %s/%d",
- inet_ntop(AF_INET6, &dest->u.prefix6, buf,
- INET6_ADDRSTRLEN),
- dest->prefixlen);
+ zlog_debug("Zebra: Route add discard %pFX", dest);
SET_FLAG(request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED);
} else {
if (IS_OSPF6_DEBUG_ZEBRA(SEND))
zlog_debug(
- "Zebra: Blackhole route present already %s/%d",
- inet_ntop(AF_INET6, &dest->u.prefix6, buf,
- INET6_ADDRSTRLEN),
- dest->prefixlen);
+ "Zebra: Blackhole route present already %pFX",
+ dest);
}
}
-void ospf6_zebra_delete_discard(struct ospf6_route *request)
+void ospf6_zebra_delete_discard(struct ospf6_route *request,
+ struct ospf6 *ospf6)
{
struct zapi_route api;
- char buf[INET6_ADDRSTRLEN];
struct prefix *dest = &request->prefix;
if (CHECK_FLAG(request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED)) {
@@ -372,19 +393,14 @@ void ospf6_zebra_delete_discard(struct ospf6_route *request)
zclient_route_send(ZEBRA_ROUTE_DELETE, zclient, &api);
if (IS_OSPF6_DEBUG_ZEBRA(SEND))
- zlog_debug("Zebra: Route delete discard %s/%d",
- inet_ntop(AF_INET6, &dest->u.prefix6, buf,
- INET6_ADDRSTRLEN),
- dest->prefixlen);
+ zlog_debug("Zebra: Route delete discard %pFX", dest);
UNSET_FLAG(request->flag, OSPF6_ROUTE_BLACKHOLE_ADDED);
} else {
if (IS_OSPF6_DEBUG_ZEBRA(SEND))
zlog_debug(
- "Zebra: Blackhole route already deleted %s/%d",
- inet_ntop(AF_INET6, &dest->u.prefix6, buf,
- INET6_ADDRSTRLEN),
- dest->prefixlen);
+ "Zebra: Blackhole route already deleted %pFX",
+ dest);
}
}
@@ -489,7 +505,8 @@ void ospf6_distance_reset(struct ospf6 *o)
}
}
-uint8_t ospf6_distance_apply(struct prefix_ipv6 *p, struct ospf6_route * or)
+uint8_t ospf6_distance_apply(struct prefix_ipv6 *p, struct ospf6_route * or,
+ struct ospf6 *ospf6)
{
struct ospf6 *o;