]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
If we a 3rd party removes our assigned address, drop our lease.
authorRoy Marples <roy@marples.name>
Sun, 11 Dec 2011 22:03:52 +0000 (22:03 +0000)
committerRoy Marples <roy@marples.name>
Sun, 11 Dec 2011 22:03:52 +0000 (22:03 +0000)
dhcpcd.c

index 23f8577490161b0a2f608cdac15d35d733ea390b..d9edab93ad9ad8c619a0fc8a8ff7caa349d6bb8a 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -1355,43 +1355,42 @@ handle_ifa(int type, const char *ifname,
                        break;
        if (ifp == NULL)
                return;
+
+       if (type == RTM_DELADDR) {
+               if (ifp->state->new &&
+                   ifp->state->new->yiaddr == addr->s_addr)
+                       drop_config(ifp, "EXPIRE");
+               return;
+       }
+
+       if (type != RTM_NEWADDR)
+               return;
+
        ifo = ifp->state->options;
        if ((ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC)) == 0 ||
            ifo->req_addr.s_addr != INADDR_ANY)
                return;
-       
-       switch (type) {
-       case RTM_DELADDR:
-               if (ifp->state->new &&
-                   ifp->state->new->yiaddr == addr->s_addr)
-                       drop_config(ifp, "EXPIRE");
-               break;
-       case RTM_NEWADDR:
-               free(ifp->state->old);
-               ifp->state->old = ifp->state->new;
-               ifp->state->new = dhcp_message_new(addr, net);
-               ifp->dst.s_addr = dst ? dst->s_addr : INADDR_ANY;
-               if (dst) {
-                       for (i = 1; i < 255; i++)
-                               if (i != DHO_ROUTER &&
-                                   has_option_mask(ifo->dstmask, i))
-                                       dhcp_message_add_addr(
-                                               ifp->state->new,
-                                               i, *dst);
-               }
-               ifp->state->reason = "STATIC";
-               build_routes();
-               run_script(ifp);
-               if (ifo->options & DHCPCD_INFORM) {
-                       ifp->state->state = DHS_INFORM;
-                       ifp->state->xid = dhcp_xid(ifp);
-                       ifp->state->lease.server.s_addr =
-                           dst ? dst->s_addr : INADDR_ANY;
-                       ifp->addr = *addr;
-                       ifp->net = *net;
-                       send_inform(ifp);
-               }
-               break;
+
+       free(ifp->state->old);
+       ifp->state->old = ifp->state->new;
+       ifp->state->new = dhcp_message_new(addr, net);
+       ifp->dst.s_addr = dst ? dst->s_addr : INADDR_ANY;
+       if (dst) {
+               for (i = 1; i < 255; i++)
+                       if (i != DHO_ROUTER && has_option_mask(ifo->dstmask,i))
+                               dhcp_message_add_addr(ifp->state->new, i, *dst);
+       }
+       ifp->state->reason = "STATIC";
+       build_routes();
+       run_script(ifp);
+       if (ifo->options & DHCPCD_INFORM) {
+               ifp->state->state = DHS_INFORM;
+               ifp->state->xid = dhcp_xid(ifp);
+               ifp->state->lease.server.s_addr =
+                   dst ? dst->s_addr : INADDR_ANY;
+               ifp->addr = *addr;
+               ifp->net = *net;
+               send_inform(ifp);
        }
 }