Hi Gregor,

When I boot my laptop up, it connects to eduroam just fine.

However, when I move around the building, it does not associate
with any other AP.

I can't even make it associate if I manually run:

        sh /etc/netstart

While running wpa_cli(8) in another tmux(1) window, I see a constant
stream of:

        <3>CTRL-EVENT-DISCONNECTED bssid=12:34:56:ab:cd:ef reason=3 
locally_generated=1
        <3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0

I don't think this is related to wpa_supplicant(8) but mentioning
it here just in case.

In order to be able to associate with any other IP, I have to run:

        ifconfig urtwn0 -nwid

Only then does the laptop reconnect.

I thought that I'll be able to simply use:

        ifconfig urtwn0 -joinlist

followed by:

        sh /etc/netstart

but, after I run the '-joinlist' option, I see this in ifconfig(8)
output:

        ieee80211: nwid eduroam chan 1 bssid 12:34:56:ab:cd:ef -76dBm wpaprotos 
wpa2 wpaakms 802.1x wpaciphers ccmp wpagroupcipher ccmp

This seemed a bit strange since I don't use 'nwid' anywhere in my
hostname.if file - only 'join' - but I guess this is how 'join'
works "under the hood"(?).

To sum it up, unfortunately, the diff doesn't work for me.

Regards,

Raf

On Mon, Dec 10, 2018 at 02:07:32PM GMT, Mikolaj Kucharski wrote:
> Hi Gregor,
> 
> I've tested your diff in recent days and in my case most often
> when I change the physical location (and hence AP) I put my
> laptop into suspend. I've noticed that with your diff wpa
> supplicant is not abble to reassoc to the AP on resume. However
> it looks to me more like wpa supplicant problem than your diff.
> 
> It ends up in infinite loop of:
> 
> 1544442781.550029: iwn0: RX EAPOL from 04:bd:88:4a:11:50
> 1544442781.550061: RX EAPOL - hexdump(len=46): 01 00 00 05 01 01 00 05 01 00 
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> 00 00 00 00 00 00 00 00 00 00
> 1544442781.550103: iwn0: Not associated - Delay processing of received EAPOL 
> frame (state=COMPLETED bssid=6c:f3:7f:d6:5e:f0)
> 1544442786.575010: iwn0: RX EAPOL from 04:bd:88:4a:11:50
> 1544442786.575042: RX EAPOL - hexdump(len=46): 01 00 00 05 01 01 00 05 01 00 
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> 00 00 00 00 00 00 00 00 00 00
> 1544442786.575085: iwn0: Not associated - Delay processing of received EAPOL 
> frame (state=COMPLETED bssid=6c:f3:7f:d6:5e:f0)
> 1544442791.593955: iwn0: RX EAPOL from 04:bd:88:4a:11:50
> 1544442791.593986: RX EAPOL - hexdump(len=46): 01 00 00 05 01 02 00 05 01 00 
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> 00 00 00 00 00 00 00 00 00 00
> 1544442791.594030: iwn0: Not associated - Delay processing of received EAPOL 
> frame (state=COMPLETED bssid=6c:f3:7f:d6:5e:f0)
> 1544442796.618836: iwn0: RX EAPOL from 04:bd:88:4a:11:50
> 1544442796.618867: RX EAPOL - hexdump(len=46): 01 00 00 05 01 02 00 05 01 00 
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> 00 00 00 00 00 00 00 00 00 00
> 1544442796.618910: iwn0: Not associated - Delay processing of received EAPOL 
> frame (state=COMPLETED bssid=6c:f3:7f:d6:5e:f0)
> 1544442801.641262: iwn0: RX EAPOL from 04:bd:88:4a:11:50
> 1544442801.641293: RX EAPOL - hexdump(len=46): 01 00 00 05 01 02 00 05 01 00 
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> 00 00 00 00 00 00 00 00 00 00
> 1544442801.641335: iwn0: Not associated - Delay processing of received EAPOL 
> frame (state=COMPLETED bssid=6c:f3:7f:d6:5e:f0)
> 1544442806.684327: iwn0: RX EAPOL from 04:bd:88:4a:11:50
> 1544442806.684358: RX EAPOL - hexdump(len=46): 01 00 00 05 01 01 00 05 01 00 
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> 00 00 00 00 00 00 00 00 00 00
> 1544442806.684402: iwn0: Not associated - Delay processing of received EAPOL 
> frame (state=COMPLETED bssid=6c:f3:7f:d6:5e:f0)
> 1544442811.738381: iwn0: RX EAPOL from 04:bd:88:4a:11:50
> 1544442811.738412: RX EAPOL - hexdump(len=46): 01 00 00 05 01 01 00 05 01 00 
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> 00 00 00 00 00 00 00 00 00 00
> 
> in the same time iwn0 interface shows:
> 
>       status: no network
>       ieee80211: join lighthouse chan 132 bssid 04:bd:88:4a:31:50 -52dBm 
> wpaprotos wpa2 wpaakms 802.1x wpaciphers ccmp wpagroupcipher ccmp
> 
> bssid is visible, however status is no network. I also should mention, that
> the problem of reassociating to AP after resume works sometimes.
> 
> However, I can say I don't see any negative effects from your diff, as problem
> of reassociation after resume was always there with wpa supplicant.
> 
> Regards,
>  Mikolaj
> 
> On Wed, Nov 28, 2018 at 06:56:46PM +0100, Gregor Best wrote:
> > Peter Hessler <phess...@theapt.org> writes:
> > 
> > > This looks really cool, thank you for looking at it!
> > >
> > > One thing that you may also need, is to may also need to reassoc when
> > > the bssid changes (roaming between different APs).  Can you also test
> > > that when you do your join testing?
> > > [...]
> > 
> > Good call. That does turn out to be necessary, so I've amended my
> > original patch. An updated patch is attached below my signature.
> > 
> > I've tested this with a two-AP 802.1x network now, but since the APs are
> > more or less sitting on top of each other, I can't really move out of
> > range of only one of them to test organic handover. I've emulated that
> > by adding the SSID to my `iwm0`'s joinlist and manually exchanging the
> > BSSID.
> > 
> > I'll try to see if I can squeeze in some time at my local eduroam
> > network tomorrow to check out how this works in the "I got out of range
> > of one AP and the kernel switched me over to another"-scenario.
> > 
> > --
> >     Gregor
> > 
> > Index: patches/patch-src_drivers_driver_openbsd_c
> > ===================================================================
> > RCS file: 
> > /home/cvs/ports/security/wpa_supplicant/patches/patch-src_drivers_driver_openbsd_c,v
> > retrieving revision 1.5
> > diff -u -p -r1.5 patch-src_drivers_driver_openbsd_c
> > --- patches/patch-src_drivers_driver_openbsd_c      17 May 2016 08:29:27 
> > -0000      1.5
> > +++ patches/patch-src_drivers_driver_openbsd_c      28 Nov 2018 17:51:30 
> > -0000
> > @@ -2,23 +2,137 @@ $OpenBSD: patch-src_drivers_driver_openb
> >  
> >  Fix includes
> >  
> > ---- src/drivers/driver_openbsd.c.orig      Sun Sep 27 21:02:05 2015
> > -+++ src/drivers/driver_openbsd.c   Mon Sep 28 09:51:53 2015
> > -@@ -9,13 +9,14 @@
> > +Index: src/drivers/driver_openbsd.c
> > +--- src/drivers/driver_openbsd.c.orig
> > ++++ src/drivers/driver_openbsd.c
> > +@@ -9,19 +9,34 @@
> >   #include "includes.h"
> >   #include <sys/ioctl.h>
> >   
> >  +#include "common.h"
> >  +#include "driver.h"
> > ++#include "eloop.h"
> >  +
> > ++#include <sys/socket.h>
> >   #include <net/if.h>
> >  +#include <net/if_var.h>
> > ++#include <net/route.h>
> >   #include <net80211/ieee80211.h>
> >   #include <net80211/ieee80211_crypto.h>
> >   #include <net80211/ieee80211_ioctl.h>
> > --
> > + 
> >  -#include "common.h"
> >  -#include "driver.h"
> > ++#define RTM_READSZ 2048
> >   
> >   struct openbsd_driver_data {
> > -   char ifname[IFNAMSIZ + 1];
> > +-  char ifname[IFNAMSIZ + 1];
> > +   void *ctx;
> > + 
> > +-  int sock;                       /* open socket for 802.11 ioctls */
> > ++  char ifname[IFNAMSIZ + 1];
> > ++  int ifindex;  /* Ifindex of the configured interface */
> > ++
> > ++  int sock;     /* open socket for 802.11 ioctls */
> > ++  int rtsock;   /* routing socket for interface state messages */
> > ++
> > ++  /* These fields are used to track the last seen (and associated) access 
> > point
> > ++     to determine whether we should kick off an association event */
> > ++  int nwid_len; /* Length of last seen SSID (as per routing message) */
> > ++  char nwid[IEEE80211_NWID_LEN]; /* Last seen SSID (as per routing 
> > message) */
> > ++  char addr[IEEE80211_ADDR_LEN]; /* Last seen BSSID (as per routing 
> > message) */
> > + };
> > + 
> > + 
> > +@@ -90,6 +105,57 @@ wpa_driver_openbsd_set_key(const char *ifname, void *p
> > +   return 0;
> > + }
> > + 
> > ++static void
> > ++wpa_driver_openbsd_event_receive(int sock, void *global, void *sock_ctx)
> > ++{
> > ++  struct openbsd_driver_data *drv = sock_ctx;
> > ++  struct rt_msghdr *rtm;
> > ++  struct if_ieee80211_data *ifie;
> > ++  char *rtmmsg;
> > ++  ssize_t n;
> > ++
> > ++  rtmmsg = os_zalloc(RTM_READSZ);
> > ++  if (rtmmsg == NULL) {
> > ++          wpa_printf(MSG_ERROR, "Can't allocate space for routing 
> > message");
> > ++          return;
> > ++  }
> > ++
> > ++  do {
> > ++          n = read(sock, rtmmsg, RTM_READSZ);
> > ++  } while (n == -1 && errno == EINTR);
> > ++
> > ++  if (n == -1)
> > ++          goto done;
> > ++
> > ++  rtm = (struct rt_msghdr *)rtmmsg;
> > ++
> > ++  if ((size_t)n < sizeof(rtm->rtm_msglen) ||
> > ++      n < rtm->rtm_msglen ||
> > ++      rtm->rtm_version != RTM_VERSION)
> > ++          goto done;
> > ++
> > ++  if ((rtm->rtm_type != RTM_80211INFO) ||
> > ++      (rtm->rtm_index != drv->ifindex))
> > ++          goto done;
> > ++
> > ++  ifie = &((struct if_ieee80211_msghdr *)rtm)->ifim_ifie;
> > ++
> > ++  if ((ifie->ifie_nwid_len != drv->nwid_len) ||
> > ++      (os_memcmp(drv->nwid, ifie->ifie_nwid, ifie->ifie_nwid_len) != 0) ||
> > ++      (os_memcmp(drv->addr, ifie->ifie_addr, IEEE80211_ADDR_LEN) != 0)) {
> > ++          os_memcpy(drv->addr, ifie->ifie_addr, IEEE80211_ADDR_LEN);
> > ++
> > ++          os_memcpy(drv->nwid, ifie->ifie_nwid, ifie->ifie_nwid_len);
> > ++          drv->nwid_len = ifie->ifie_nwid_len;
> > ++
> > ++          /* Emit ASSOC event */
> > ++          wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
> > ++  }
> > ++
> > ++done:
> > ++  os_free(rtmmsg);
> > ++}
> > ++
> > + static void *
> > + wpa_driver_openbsd_init(void *ctx, const char *ifname)
> > + {
> > +@@ -103,9 +169,21 @@ wpa_driver_openbsd_init(void *ctx, const char *ifname)
> > +   if (drv->sock < 0)
> > +           goto fail;
> > + 
> > ++  drv->rtsock = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
> > ++  if (drv->rtsock < 0)
> > ++          goto fail;
> > ++
> > +   drv->ctx = ctx;
> > +   os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname));
> > + 
> > ++  drv->ifindex = if_nametoindex(drv->ifname);
> > ++  if (drv->ifindex == 0) /* No interface with that name */
> > ++          goto fail;
> > ++
> > ++  drv->nwid_len = wpa_driver_openbsd_get_ssid(drv, drv->nwid);
> > ++  wpa_driver_openbsd_get_bssid(drv, drv->addr);
> > ++
> > ++  eloop_register_read_sock(drv->rtsock, wpa_driver_openbsd_event_receive, 
> > NULL, drv);
> > +   return drv;
> > + 
> > + fail:
> > +@@ -119,7 +197,11 @@ wpa_driver_openbsd_deinit(void *priv)
> > + {
> > +   struct openbsd_driver_data *drv = priv;
> > + 
> > ++  eloop_unregister_read_sock(drv->rtsock);
> > ++
> > +   close(drv->sock);
> > ++  close(drv->rtsock);
> > ++
> > +   os_free(drv);
> > + }
> > + 
> 
> 

Reply via email to