]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: ipv6 addressing uses netlink socket instead of standard ioctl
authorPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 11 Dec 2017 14:21:04 +0000 (15:21 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 13 Dec 2017 15:54:10 +0000 (16:54 +0100)
It is possible to configure IPv6 addresses from interfaces by using
netlink socket, intead of using standard sockets.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
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..b5ed3ede9714414339f9da1d1821fb6d0f68ed28 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,10 +462,12 @@ 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)
 {
+#ifdef HAVE_NETLINK
+       return kernel_address_add_ipv6 (ifp, ifc);
+#else /* ! HAVE_NETLINK */
        int ret;
        struct prefix_ipv6 *p;
        struct in6_ifreq ifreq;
@@ -479,10 +483,14 @@ int if_prefix_add_ipv6(struct interface *ifp, struct connected *ifc)
        ret = if_ioctl_ipv6(SIOCSIFADDR, (caddr_t)&ifreq);
 
        return ret;
+#endif /* ! HAVE_NETLINK */
 }
 
 int if_prefix_delete_ipv6(struct interface *ifp, struct connected *ifc)
 {
+#ifdef HAVE_NETLINK
+       return kernel_address_delete_ipv6 (ifp, ifc);
+#else /* ! HAVE_NETLINK */
        int ret;
        struct prefix_ipv6 *p;
        struct in6_ifreq ifreq;
@@ -498,6 +506,7 @@ int if_prefix_delete_ipv6(struct interface *ifp, struct connected *ifc)
        ret = if_ioctl_ipv6(SIOCDIFADDR, (caddr_t)&ifreq);
 
        return ret;
+#endif /* ! HAVE_NETLINK */
 }
 #else /* LINUX_IPV6 */
 #ifdef HAVE_STRUCT_IN6_ALIASREQ
index 6bbe69e983390ae25f17e01e99bedd00dc87f73b..cead9b8e60d6aaf656ddde6e8d40391cadcb7241 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);