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.