diff options
| -rw-r--r-- | zebra/if_netlink.c | 10 | ||||
| -rw-r--r-- | zebra/ioctl.c | 39 | ||||
| -rw-r--r-- | zebra/rt.h | 2 |
3 files changed, 20 insertions, 31 deletions
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index af17e49231..f73506bf91 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -838,6 +838,16 @@ int kernel_address_delete_ipv4(struct interface *ifp, struct connected *ifc) return netlink_address(RTM_DELADDR, AF_INET, ifp, ifc); } +int kernel_address_add_ipv6 (struct interface *ifp, struct connected *ifc) +{ + return netlink_address (RTM_NEWADDR, AF_INET6, ifp, ifc); +} + +int kernel_address_delete_ipv6 (struct interface *ifp, struct connected *ifc) +{ + return netlink_address (RTM_DELADDR, AF_INET6, ifp, ifc); +} + int netlink_interface_addr(struct sockaddr_nl *snl, struct nlmsghdr *h, ns_id_t ns_id, int startup) { diff --git a/zebra/ioctl.c b/zebra/ioctl.c index 58118ce006..8e3a1d1a03 100644 --- a/zebra/ioctl.c +++ b/zebra/ioctl.c @@ -78,6 +78,7 @@ int if_ioctl(u_long request, caddr_t buffer) return 0; } +#ifndef HAVE_NETLINK static int if_ioctl_ipv6(u_long request, caddr_t buffer) { int sock; @@ -108,6 +109,7 @@ static int if_ioctl_ipv6(u_long request, caddr_t buffer) } return 0; } +#endif /* ! HAVE_NETLINK */ /* * get interface metric @@ -460,44 +462,19 @@ struct in6_ifreq { int ifr6_ifindex; }; #endif /* _LINUX_IN6_H */ - /* Interface's address add/delete functions. */ int if_prefix_add_ipv6(struct interface *ifp, struct connected *ifc) { - int ret; - struct prefix_ipv6 *p; - struct in6_ifreq ifreq; - - p = (struct prefix_ipv6 *)ifc->address; - - memset(&ifreq, 0, sizeof(struct in6_ifreq)); - - memcpy(&ifreq.ifr6_addr, &p->prefix, sizeof(struct in6_addr)); - ifreq.ifr6_ifindex = ifp->ifindex; - ifreq.ifr6_prefixlen = p->prefixlen; - - ret = if_ioctl_ipv6(SIOCSIFADDR, (caddr_t)&ifreq); - - return ret; +#ifdef HAVE_NETLINK + return kernel_address_add_ipv6 (ifp, ifc); +#endif /* HAVE_NETLINK */ } int if_prefix_delete_ipv6(struct interface *ifp, struct connected *ifc) { - int ret; - struct prefix_ipv6 *p; - struct in6_ifreq ifreq; - - p = (struct prefix_ipv6 *)ifc->address; - - memset(&ifreq, 0, sizeof(struct in6_ifreq)); - - memcpy(&ifreq.ifr6_addr, &p->prefix, sizeof(struct in6_addr)); - ifreq.ifr6_ifindex = ifp->ifindex; - ifreq.ifr6_prefixlen = p->prefixlen; - - ret = if_ioctl_ipv6(SIOCDIFADDR, (caddr_t)&ifreq); - - return ret; +#ifdef HAVE_NETLINK + return kernel_address_delete_ipv6 (ifp, ifc); +#endif /* HAVE_NETLINK */ } #else /* LINUX_IPV6 */ #ifdef HAVE_STRUCT_IN6_ALIASREQ diff --git a/zebra/rt.h b/zebra/rt.h index 424319878d..7f5bb4dd34 100644 --- a/zebra/rt.h +++ b/zebra/rt.h @@ -74,6 +74,8 @@ extern void kernel_route_rib_pass_fail(struct prefix *p, extern int kernel_address_add_ipv4(struct interface *, struct connected *); extern int kernel_address_delete_ipv4(struct interface *, struct connected *); +extern int kernel_address_add_ipv6 (struct interface *, struct connected *); +extern int kernel_address_delete_ipv6 (struct interface *, struct connected *); extern int kernel_neigh_update(int, int, uint32_t, char *, int); extern int kernel_interface_set_master(struct interface *master, struct interface *slave); |
