On Mon, Aug 02, 2021 at 08:28:00PM +0200, Florian Obser wrote:
> 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?
Oh? I've used this configuration for little over 3 years now and I
thought the IP/configuration should be trunk0 based on the examples in
trunk(4) and https://www.openbsd.org/faq/faq6.html#Wireless.
I *could* do it the way you suggest, of course, but I thought this was a
bug/regression, as it worked fine with dhclient(8). In my network
configuration, of separating the wired and wireless network, it wouldn't
be an issue. On networks where the wired and wireless network are on
the same subnet though, it would be a shame to lose the ability to have
it seemlessly jump from one to another without losing any connections.
> > 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.
>