There is no such thing as an IPv6 "broadcast" or "peer" address.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
/* Add connected IPv6 route to the interface. */
void connected_add_ipv6(struct interface *ifp, int flags, struct in6_addr *addr,
- u_char prefixlen, struct in6_addr *broad,
- const char *label)
+ u_char prefixlen, const char *label)
{
struct prefix_ipv6 *p;
struct connected *ifc;
p->prefixlen = prefixlen;
ifc->address = (struct prefix *)p;
- /* If there is broadcast or peer address. */
- if (broad) {
- if (IN6_IS_ADDR_UNSPECIFIED(broad))
- zlog_warn(
- "warning: %s called for interface %s with unspecified "
- "destination address; ignoring!",
- __func__, ifp->name);
- else {
- p = prefix_ipv6_new();
- p->family = AF_INET6;
- IPV6_ADDR_COPY(&p->prefix, broad);
- p->prefixlen = prefixlen;
- ifc->destination = (struct prefix *)p;
- }
- }
- if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_PEER) && !ifc->destination) {
- zlog_warn(
- "warning: %s called for interface %s "
- "with peer flag set, but no peer address supplied",
- __func__, ifp->name);
- UNSET_FLAG(ifc->flags, ZEBRA_IFA_PEER);
- }
-
/* Label of this address. */
if (label)
ifc->label = XSTRDUP(MTYPE_CONNECTED_LABEL, label);
}
void connected_delete_ipv6(struct interface *ifp, struct in6_addr *address,
- u_char prefixlen, struct in6_addr *broad)
+ u_char prefixlen)
{
struct prefix_ipv6 p;
struct connected *ifc;
extern void connected_add_ipv6(struct interface *ifp, int flags,
struct in6_addr *address, u_char prefixlen,
- struct in6_addr *broad, const char *label);
+ const char *label);
extern void connected_delete_ipv6(struct interface *ifp,
- struct in6_addr *address, u_char prefixlen,
- struct in6_addr *broad);
+ struct in6_addr *address, u_char prefixlen);
extern void connected_up_ipv6(struct interface *, struct connected *);
extern void connected_down_ipv6(struct interface *ifp, struct connected *);
dest_pnt = NULL;
- if (ifap->ifa_dstaddr
+ if (if_is_pointopoint(ifp) && ifap->ifa_dstaddr
&& !IPV4_ADDR_SAME(&addr->sin_addr,
&((struct sockaddr_in *)
ifap->ifa_dstaddr)
if (ifap->ifa_addr->sa_family == AF_INET6) {
struct sockaddr_in6 *addr;
struct sockaddr_in6 *mask;
- struct sockaddr_in6 *dest;
- struct in6_addr *dest_pnt;
int flags = 0;
addr = (struct sockaddr_in6 *)ifap->ifa_addr;
mask = (struct sockaddr_in6 *)ifap->ifa_netmask;
prefixlen = ip6_masklen(mask->sin6_addr);
- dest_pnt = NULL;
-
- if (ifap->ifa_dstaddr
- && !IPV6_ADDR_SAME(&addr->sin6_addr,
- &((struct sockaddr_in6 *)
- ifap->ifa_dstaddr)
- ->sin6_addr)) {
- dest = (struct sockaddr_in6 *)ifap->ifa_dstaddr;
- dest_pnt = &dest->sin6_addr;
- flags = ZEBRA_IFA_PEER;
- } else if (ifap->ifa_broadaddr
- && !IPV6_ADDR_SAME(
- &addr->sin6_addr,
- &((struct sockaddr_in6 *)
- ifap->ifa_broadaddr)
- ->sin6_addr)) {
- dest = (struct sockaddr_in6 *)
- ifap->ifa_broadaddr;
- dest_pnt = &dest->sin6_addr;
- }
-
#if defined(KAME)
if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr)) {
addr->sin6_scope_id =
#endif
connected_add_ipv6(ifp, flags, &addr->sin6_addr,
- prefixlen, dest_pnt, NULL);
+ prefixlen, NULL);
}
}
(struct in_addr *)dest_pnt, label);
else if (af == AF_INET6)
connected_add_ipv6(ifp, flags, &SIN6(addr)->sin6_addr,
- prefixlen, (struct in6_addr *)dest_pnt,
- label);
+ prefixlen, label);
return 0;
}
& (IFA_F_DADFAILED | IFA_F_TENTATIVE)))
connected_add_ipv6(
ifp, flags, (struct in6_addr *)addr,
- ifa->ifa_prefixlen,
- (struct in6_addr *)broad, label);
+ ifa->ifa_prefixlen, label);
} else
connected_delete_ipv6(ifp, (struct in6_addr *)addr,
- ifa->ifa_prefixlen,
- (struct in6_addr *)broad);
+ ifa->ifa_prefixlen);
}
return 0;
if (ifam->ifam_type == RTM_NEWADDR)
connected_add_ipv6(ifp, flags, &addr.sin6.sin6_addr,
ip6_masklen(mask.sin6.sin6_addr),
- &brd.sin6.sin6_addr,
(isalias ? ifname : NULL));
else
connected_delete_ipv6(ifp, &addr.sin6.sin6_addr,
- ip6_masklen(mask.sin6.sin6_addr),
- &brd.sin6.sin6_addr);
+ ip6_masklen(mask.sin6.sin6_addr));
break;
default:
/* Unsupported family silently ignore... */