Hi tech@

I've setup my machine to use trunk(4) with re(4) and iwm(4) as failover,
to make life easier when switching between wired and wireless
networking.  The wired network at home is on a different subnet from
the wireless network, so when I unplug the cable, a DHCP request is
required to get my connection to work again.  Before, dhcpleased(8),
dhclient(8) handled this as expected.

I skimmed through the code to try to understand how dhclient(8) handles
this, but I'm not sure I fully understand this.  My first take was to
change the rtfilter, as I noticed dhclient(8) was listening for way more
things.  But after some testing I learned that RTM_IFINFO was enough,
even if trunk(4) remains "active" and UP when the cable is unplugged.

This solution might not be optimal, as I've basically just removed some
of the checks in engine_update_iface() that return early if nothing has
changed on the interface.  At least it solves my issue with trunk(4) and
so far I haven't managed to spawn any dragons from this.  Though, this
might cause engine_update_iface() to fully more often?

Thoughts?


Index: engine.c
===================================================================
RCS file: /cvs/src/sbin/dhcpleased/engine.c,v
retrieving revision 1.22
diff -u -p -r1.22 engine.c
--- engine.c    26 Jul 2021 09:26:36 -0000      1.22
+++ engine.c    28 Jul 2021 20:39:45 -0000
@@ -586,7 +586,6 @@ void
 engine_update_iface(struct imsg_ifinfo *imsg_ifinfo)
 {
        struct dhcpleased_iface *iface;
-       int                      need_refresh = 0;
 
        iface = get_dhcpleased_iface_by_id(imsg_ifinfo->if_index);
 
@@ -604,32 +603,14 @@ engine_update_iface(struct imsg_ifinfo *
                memcpy(&iface->hw_address, &imsg_ifinfo->hw_address,
                    sizeof(struct ether_addr));
                LIST_INSERT_HEAD(&dhcpleased_interfaces, iface, entries);
-               need_refresh = 1;
        } else {
-               if (memcmp(&iface->hw_address, &imsg_ifinfo->hw_address,
-                   sizeof(struct ether_addr)) != 0) {
-                       memcpy(&iface->hw_address, &imsg_ifinfo->hw_address,
-                           sizeof(struct ether_addr));
-                       need_refresh = 1;
-               }
-               if (imsg_ifinfo->rdomain != iface->rdomain) {
-                       iface->rdomain = imsg_ifinfo->rdomain;
-                       need_refresh = 1;
-               }
-               if (imsg_ifinfo->running != iface->running) {
-                       iface->running = imsg_ifinfo->running;
-                       need_refresh = 1;
-               }
-
-               if (imsg_ifinfo->link_state != iface->link_state) {
-                       iface->link_state = imsg_ifinfo->link_state;
-                       need_refresh = 1;
-               }
+               memcpy(&iface->hw_address, &imsg_ifinfo->hw_address,
+                   sizeof(struct ether_addr));
+               iface->rdomain = imsg_ifinfo->rdomain;
+               iface->running = imsg_ifinfo->running;
+               iface->link_state = imsg_ifinfo->link_state;
        }
 
-       if (!need_refresh)
-               return;
-
        if (iface->running && LINK_STATE_IS_UP(iface->link_state)) {
                if (iface->requested_ip.s_addr == INADDR_ANY)
                        parse_lease(iface, imsg_ifinfo);
@@ -641,6 +622,7 @@ engine_update_iface(struct imsg_ifinfo *
        } else
                state_transition(iface, IF_DOWN);
 }
+
 struct dhcpleased_iface*
 get_dhcpleased_iface_by_id(uint32_t if_index)
 {
Index: frontend.c
===================================================================
RCS file: /cvs/src/sbin/dhcpleased/frontend.c,v
retrieving revision 1.15
diff -u -p -r1.15 frontend.c
--- frontend.c  27 Jul 2021 18:17:37 -0000      1.15
+++ frontend.c  28 Jul 2021 20:39:45 -0000
@@ -605,11 +605,9 @@ update_iface(struct if_msghdr *ifm, stru
                }
        }
 
-       if (memcmp(&iface->ifinfo, &ifinfo, sizeof(iface->ifinfo)) != 0) {
-               memcpy(&iface->ifinfo, &ifinfo, sizeof(iface->ifinfo));
-               frontend_imsg_compose_main(IMSG_UPDATE_IF, 0, &iface->ifinfo,
-                   sizeof(iface->ifinfo));
-       }
+       memcpy(&iface->ifinfo, &ifinfo, sizeof(iface->ifinfo));
+       frontend_imsg_compose_main(IMSG_UPDATE_IF, 0, &iface->ifinfo,
+           sizeof(iface->ifinfo));
 }
 
 void

Reply via email to