summaryrefslogtreecommitdiff
path: root/zebra/connected.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2018-04-15 10:57:19 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2018-04-15 10:57:19 -0400
commit60c0687a9a0608f828ce36134638ea6974d733ea (patch)
treea2b5bb2695f5871d1811ccf58042648c0be27635 /zebra/connected.c
parenta6528075a83492062ed31564256dce010e8d1b3b (diff)
zebra: Fix crash with certain types of tunnels
Zebra did not have a handler for tunnels in v6 for some reason. Add code to handle the broadcast address for both addition and deletion. This appears to fix the crash. There might still need to be some work to make the code `work` properly for this type of tunnel. Fixes: #2063 Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'zebra/connected.c')
-rw-r--r--zebra/connected.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/zebra/connected.c b/zebra/connected.c
index 2198ddf5ea..35b3b0f4a9 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -495,7 +495,8 @@ void connected_delete_ipv4(struct interface *ifp, int flags,
/* Add connected IPv6 route to the interface. */
void connected_add_ipv6(struct interface *ifp, int flags, struct in6_addr *addr,
- uint8_t prefixlen, const char *label)
+ struct in6_addr *broad, uint8_t prefixlen,
+ const char *label)
{
struct prefix_ipv6 *p;
struct connected *ifc;
@@ -518,6 +519,14 @@ void connected_add_ipv6(struct interface *ifp, int flags, struct in6_addr *addr,
p->prefixlen = prefixlen;
ifc->address = (struct prefix *)p;
+ if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER)) {
+ p = prefix_ipv6_new();
+ p->family = AF_INET6;
+ IPV6_ADDR_COPY(&p->prefix, broad);
+ p->prefixlen = prefixlen;
+ ifc->destination = (struct prefix *)p;
+ }
+
/* Label of this address. */
if (label)
ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
@@ -536,9 +545,9 @@ void connected_add_ipv6(struct interface *ifp, int flags, struct in6_addr *addr,
}
void connected_delete_ipv6(struct interface *ifp, struct in6_addr *address,
- uint8_t prefixlen)
+ struct in6_addr *broad, uint8_t prefixlen)
{
- struct prefix p;
+ struct prefix p, d;
struct connected *ifc;
memset(&p, 0, sizeof(struct prefix));
@@ -546,7 +555,14 @@ void connected_delete_ipv6(struct interface *ifp, struct in6_addr *address,
memcpy(&p.u.prefix6, address, sizeof(struct in6_addr));
p.prefixlen = prefixlen;
- ifc = connected_check(ifp, &p);
+ if (broad) {
+ memset(&d, 0, sizeof(struct prefix));
+ d.family = AF_INET6;
+ IPV6_ADDR_COPY(&d.u.prefix, broad);
+ d.prefixlen = prefixlen;
+ ifc = connected_check_ptp(ifp, &p, &d);
+ } else
+ ifc = connected_check_ptp(ifp, &p, NULL);
connected_delete_helper(ifc, &p);
}