Browse Source

nhrpd: announce ipv6 routes to zebra

Timo Teräs 1 year ago
parent
commit
7101ccb2a7
1 changed files with 40 additions and 2 deletions
  1. 40 2
      nhrpd/nhrp_route.c

+ 40 - 2
nhrpd/nhrp_route.c

@@ -90,7 +90,6 @@ void nhrp_route_update_nhrp(const struct prefix *p, struct interface *ifp)
 
 void nhrp_route_announce(int add, enum nhrp_cache_type type, const struct prefix *p, struct interface *ifp, const union sockunion *nexthop, uint32_t mtu)
 {
-	struct in_addr *nexthop_ipv4;
 	int flags = 0;
 
 	if (zclient->sock < 0)
@@ -113,6 +112,7 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type, const struct prefix
 	SET_FLAG(flags, ZEBRA_FLAG_INTERNAL);
 
 	if (p->family == AF_INET) {
+		struct in_addr *nexthop_ipv4;
 		struct zapi_ipv4 api;
 
 		memset(&api, 0, sizeof(api));
@@ -122,7 +122,6 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type, const struct prefix
 
 		SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
 		if (nexthop) {
-			SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
 			nexthop_ipv4 = (struct in_addr *) sockunion_get_addr(nexthop);
 			api.nexthop_num = 1;
 			api.nexthop = &nexthop_ipv4;
@@ -151,6 +150,45 @@ void nhrp_route_announce(int add, enum nhrp_cache_type type, const struct prefix
 		zapi_ipv4_route(
 			add ? ZEBRA_IPV4_ROUTE_ADD : ZEBRA_IPV4_ROUTE_DELETE,
 			zclient, (struct prefix_ipv4 *) p, &api);
+	} else if (p->family == AF_INET6) {
+		struct in6_addr *nexthop_ipv6;
+		struct zapi_ipv6 api;
+
+		memset(&api, 0, sizeof(api));
+		api.flags = flags;
+		api.type = ZEBRA_ROUTE_NHRP;
+		api.safi = SAFI_UNICAST;
+
+		SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP);
+		if (nexthop) {
+			nexthop_ipv6 = (struct in6_addr *) sockunion_get_addr(nexthop);
+			api.nexthop_num = 1;
+			api.nexthop = &nexthop_ipv6;
+		}
+		if (ifp) {
+			SET_FLAG(api.message, ZAPI_MESSAGE_IFINDEX);
+			api.ifindex_num = 1;
+			api.ifindex = &ifp->ifindex;
+		}
+		if (mtu) {
+			SET_FLAG(api.message, ZAPI_MESSAGE_MTU);
+			api.mtu = mtu;
+		}
+
+		if (unlikely(debug_flags & NHRP_DEBUG_ROUTE)) {
+			char buf[2][INET6_ADDRSTRLEN];
+			zlog_debug("Zebra send: IPv6 route %s %s/%d nexthop %s metric %u"
+				" count %d dev %s",
+				add ? "add" : "del",
+				inet_ntop(AF_INET6, &p->u.prefix6, buf[0], sizeof(buf[0])),
+				p->prefixlen,
+				nexthop ? inet_ntop(AF_INET6, api.nexthop[0], buf[1], sizeof(buf[1])) : "<onlink>",
+				api.metric, api.nexthop_num, ifp->name);
+		}
+
+		zapi_ipv6_route(
+			add ? ZEBRA_IPV6_ROUTE_ADD : ZEBRA_IPV6_ROUTE_DELETE,
+			zclient, (struct prefix_ipv6 *) p, &api);
 	}
 }