]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Deleting IPv4 subnet routes and IPv6 prefixes now works on OpenBSD.
authorRoy Marples <roy@marples.name>
Thu, 6 Mar 2014 22:29:26 +0000 (22:29 +0000)
committerRoy Marples <roy@marples.name>
Thu, 6 Mar 2014 22:29:26 +0000 (22:29 +0000)
dhcpcd.c
if-bsd.c

index 88c895a9c74764130b1a4a6b1cee36ece504741b..6df6ff9ea673ed60b5caa4edde7195365f84e426 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -921,14 +921,14 @@ handle_signal1(void *arg)
 }
 
 static void
-handle_signal(__unused int sig, siginfo_t *siginfo, __unused void *context)
+handle_signal(int sig, siginfo_t *siginfo, __unused void *context)
 {
 
        /* So that we can operate safely under a signal we instruct
         * eloop to pass a copy of the siginfo structure to handle_signal1
         * as the very first thing to do. */
-       dhcpcd_siginfo.signo = siginfo->si_signo;
-       dhcpcd_siginfo.pid = siginfo->si_pid;
+       dhcpcd_siginfo.signo = sig;
+       dhcpcd_siginfo.pid = siginfo ? siginfo->si_pid : 0;
        eloop_timeout_add_now(dhcpcd_ctx->eloop,
            handle_signal1, &dhcpcd_siginfo);
 }
@@ -1409,12 +1409,6 @@ main(int argc, char **argv)
        syslog(LOG_WARNING, "FreeBSD errors that are worked around:");
        syslog(LOG_WARNING, "IPv4 subnet routes cannot be deleted");
 #endif
-#ifdef __OpenBSD__
-       syslog(LOG_WARNING, "OpenBSD errors that need to be fixed:");
-       syslog(LOG_WARNING,
-           "IPv4 subnet routes cannot be deleted");
-       syslog(LOG_WARNING, "IPv6 prefixes cannot be deleted");
-#endif
 
        ctx.ifc = argc - optind;
        ctx.ifv = argv + optind;
index b027315beb726a710b3c1c23a038987ae3dd0169..5a74b401c6f7006e6363170bf8fd17d1f8478f3e 100644 (file)
--- a/if-bsd.c
+++ b/if-bsd.c
@@ -283,22 +283,25 @@ if_route(const struct rt *rt, int action)
        memset(&rtm, 0, sizeof(rtm));
        rtm.hdr.rtm_version = RTM_VERSION;
        rtm.hdr.rtm_seq = 1;
+       rtm.hdr.rtm_addrs = RTA_DST;
        if (action == 0)
                rtm.hdr.rtm_type = RTM_CHANGE;
-       else if (action > 0)
+       else if (action > 0) {
                rtm.hdr.rtm_type = RTM_ADD;
-       else
+               rtm.hdr.rtm_addrs |= RTA_GATEWAY;
+       } else
                rtm.hdr.rtm_type = RTM_DELETE;
        rtm.hdr.rtm_flags = RTF_UP;
 #ifdef SIOCGIFPRIORITY
        rtm.hdr.rtm_priority = rt->metric;
 #endif
+       rtm.hdr.rtm_hdrlen = sizeof(rtm.hdr);
+
        /* None interface subnet routes are static. */
        if (rt->gate.s_addr != INADDR_ANY ||
            rt->net.s_addr != state->net.s_addr ||
            rt->dest.s_addr != (state->addr.s_addr & state->net.s_addr))
                rtm.hdr.rtm_flags |= RTF_STATIC;
-       rtm.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY;
        if (rt->dest.s_addr == rt->gate.s_addr &&
            rt->net.s_addr == INADDR_BROADCAST)
                rtm.hdr.rtm_flags |= RTF_HOST;
@@ -314,17 +317,19 @@ if_route(const struct rt *rt, int action)
        }
 
        ADDADDR(&rt->dest);
-       if ((rtm.hdr.rtm_flags & RTF_HOST &&
-           rt->gate.s_addr != htonl(INADDR_LOOPBACK)) ||
-           !(rtm.hdr.rtm_flags & RTF_STATIC))
-       {
-               /* Make us a link layer socket for the host gateway */
-               memset(&su, 0, sizeof(su));
-               su.sdl.sdl_len = sizeof(struct sockaddr_dl);
-               link_addr(rt->iface->name, &su.sdl);
-               ADDSU;
-       } else
-               ADDADDR(&rt->gate);
+       if (rtm.hdr.rtm_addrs & RTA_GATEWAY) {
+               if ((rtm.hdr.rtm_flags & RTF_HOST &&
+                   rt->gate.s_addr != htonl(INADDR_LOOPBACK)) ||
+                   !(rtm.hdr.rtm_flags & RTF_STATIC))
+               {
+                       /* Make us a link layer socket for the host gateway */
+                       memset(&su, 0, sizeof(su));
+                       su.sdl.sdl_len = sizeof(struct sockaddr_dl);
+                       link_addr(rt->iface->name, &su.sdl);
+                       ADDSU;
+               } else
+                       ADDADDR(&rt->gate);
+       }
 
        if (rtm.hdr.rtm_addrs & RTA_NETMASK)
                ADDADDR(&rt->net);
@@ -457,8 +462,8 @@ if_route6(const struct rt6 *rt, int action)
                rtm.hdr.rtm_type = RTM_ADD;
        else
                rtm.hdr.rtm_type = RTM_DELETE;
-
        rtm.hdr.rtm_flags = RTF_UP;
+       rtm.hdr.rtm_addrs = RTA_DST | RTA_NETMASK;
 #ifdef SIOCGIFPRIORITY
        rtm.hdr.rtm_priority = rt->metric;
 #endif
@@ -471,19 +476,21 @@ if_route6(const struct rt6 *rt, int action)
                rtm.hdr.rtm_flags |= RTF_CLONING;
 #endif
 
-       rtm.hdr.rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
        if (action >= 0)
-               rtm.hdr.rtm_addrs |= RTA_IFP | RTA_IFA;
+               rtm.hdr.rtm_addrs |= RTA_GATEWAY | RTA_IFP | RTA_IFA;
 
        ADDADDR(&rt->dest);
-       if (!(rtm.hdr.rtm_flags & RTF_GATEWAY)) {
-               lla = ipv6_linklocal(rt->iface);
-               if (lla == NULL) /* unlikely as we need a LL to get here */
-                       return -1;
-               ADDADDRS(&lla->addr, rt->iface->index);
-       } else {
-               lla = NULL;
-               ADDADDRS(&rt->gate, rt->iface->index);
+       lla = NULL;
+       if (rtm.hdr.rtm_addrs & RTA_GATEWAY) {
+               if (!(rtm.hdr.rtm_flags & RTF_GATEWAY)) {
+                       lla = ipv6_linklocal(rt->iface);
+                       if (lla == NULL) /* unlikely */
+                               return -1;
+                       ADDADDRS(&lla->addr, rt->iface->index);
+               } else {
+                       lla = NULL;
+                       ADDADDRS(&rt->gate, rt->iface->index);
+               }
        }
 
        if (rtm.hdr.rtm_addrs & RTA_NETMASK) {