]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #1546 from pguibert6WIND/issue__1537
authorDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 14 Dec 2017 15:23:54 +0000 (10:23 -0500)
committerGitHub <noreply@github.com>
Thu, 14 Dec 2017 15:23:54 +0000 (10:23 -0500)
Issue  1537

zebra/if_netlink.c
zebra/ioctl.c
zebra/rt.h

index af17e49231fa5b6278d1c5656fb1f9c7ce93104c..f73506bf9195a6abf3434517cd67c4d48c16aa2b 100644 (file)
@@ -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)
 {
index 58118ce006f014c9306b82e16816450e0c6abf96..8e3a1d1a036307ea1d024dda8124579556a8dc42 100644 (file)
@@ -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
index 424319878d4d87659a0faed84cb34d3045f5242b..7f5bb4dd3491ac173ffebfd632147bb9753bf7aa 100644 (file)
@@ -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);