On Mon, Aug 02, 2021 at 11:36:47PM +0200, Jesper Wallin wrote:
> 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.
Err, scratch that last paragraph. If they're on the same network, why
would a DHCPREQUEST be needed?! Note to self, think before posting.
Too much Monday today.
> > > 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.
> >
>