On 2021-07-28 23:02 +02, Jesper Wallin <[email protected]> wrote:
> 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

I don't think this is a correct configuration (I accidentally made this
work in 2019, sorry about that).
Can't you use
        inet autoconf
in hostname.re0 *and* hostname.iwm0?

> 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
>

-- 
I'm not entirely sure you are real.

Reply via email to