Hi all,

I've re-tested it, now that the new package includes the patch, but
I'm left with the same behaviour as before - when I move around,
the laptop does not connect to any other APs. It *does* reconnect
to the AP it has originally associated with and, only then, do I
see any output in 'wpa_cli', which stays silent otherwise (i.e. as
I walk around the building).

I've tested both eduroam and one other 802.1x network.

I'd like to get this diagnosed but could do with some pointers...

Thanks in advance,

Raf

On Fri, Dec 28, 2018 at 06:05:59PM GMT, Peter Hessler wrote:
> I gave this a spin, and seems to work in my testing.
> 
> I did a few suspend/resumes, manual if down/up, forced a chan NN, and
> walked around to do some roaming between 8 bssids.  Recovery took a
> short period of time, but was as expected.
> 
> OK
> 
> 
> On 2018 Dec 28 (Fri) at 17:15:48 +0100 (+0100), Gregor Best wrote:
> :
> :Peter pointed out that my previous patch doesn't apply. Sorry for that,
> :a fixed one is below my signature.
> :
> :--
> :     Gregor
> :
> :Index: Makefile
> :===================================================================
> :RCS file: /home/cvs/ports/security/wpa_supplicant/Makefile,v
> :retrieving revision 1.39
> :diff -u -p -r1.39 Makefile
> :--- Makefile 24 Oct 2018 17:16:19 -0000      1.39
> :+++ Makefile 25 Dec 2018 23:19:24 -0000
> :@@ -3,7 +3,7 @@
> : COMMENT=    IEEE 802.1X supplicant
> : 
> : DISTNAME=   wpa_supplicant-2.6
> :-REVISION=   4
> :+REVISION=   5
> : CATEGORIES= security net
> : 
> : HOMEPAGE=   http://w1.fi/wpa_supplicant/
> :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       25 Dec 2018 23:05:46 
> -0000
> :@@ -1,24 +1,187 @@
> : $OpenBSD: patch-src_drivers_driver_openbsd_c,v 1.5 2016/05/17 08:29:27 
> dcoppa Exp $
> : 
> :-Fix includes
> :+Fix includes and react to NWID changes and suspend/resume.
> : 
> :---- 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_BUFSZ 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 (per routing msg) */
> :++   char addr[IEEE80211_ADDR_LEN]; /* Last seen BSSID (per routing msg) */
> :+ };
> :+ 
> :+ 
> :+@@ -90,10 +105,99 @@ wpa_driver_openbsd_set_key(const char *ifname, void *p
> :+    return 0;
> :+ }
> :+ 
> :+-static void *
> :+-wpa_driver_openbsd_init(void *ctx, const char *ifname)
> :++static void
> :++wpa_driver_openbsd_rtmsg_80211(struct if_ieee80211_data *ifie,
> :++       struct openbsd_driver_data *drv) {
> :++   if ((ifie->ifie_nwid_len != drv->nwid_len) ||
> :++       (os_memcmp(drv->nwid, ifie->ifie_nwid, ifie->ifie_nwid_len)) ||
> :++       (os_memcmp(drv->addr, ifie->ifie_addr, IEEE80211_ADDR_LEN))) {
> :++           wpa_printf(MSG_INFO, "SSID changed");
> :++           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;
> :++
> :++           wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
> :++   }
> :++}
> :++
> :++static void
> :++wpa_driver_openbsd_rtmsg_ifinfo(struct rt_msghdr *rtm,
> :++       struct openbsd_driver_data *drv) {
> :++   /* This is here so we can react to suspend/resume.
> :++
> :++      This is a bit rough, sometimes there are two or more IFINFOs
> :++      notifying us that the device just got "up" again. It doesn't
> :++      seem to hurt to issue multiple EVENT_ASSOC in those cases
> :++      though.
> :++   */
> :++
> :++   if (rtm->rtm_flags & RTF_UP)
> :++           wpa_supplicant_event(drv->ctx, EVENT_ASSOC, NULL);
> :++}
> :++
> :++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;
> :++   off_t offset;
> :++
> :++   rtmmsg = os_zalloc(RTM_BUFSZ);
> :++   if (rtmmsg == NULL) {
> :++           wpa_printf(MSG_ERROR, "Can't allocate space for routing msgs");
> :++           return;
> :++   }
> :++
> :++   do {
> :++           n = read(sock, rtmmsg, RTM_BUFSZ);
> :++   } while (n == -1 && errno == EINTR);
> :++
> :++   if (n == -1) {
> :++           wpa_printf(MSG_ERROR, "Failed to read from routing socket: %s",
> :++                      strerror(errno));
> :++           goto done;
> :++   }
> :++
> :++   for (offset = 0; offset < n;) {
> :++           rtm = (struct rt_msghdr *)(rtmmsg + offset);
> :++
> :++           if ((size_t)(n - offset) < sizeof(rtm->rtm_msglen) ||
> :++               (n - offset) < rtm->rtm_msglen ||
> :++               rtm->rtm_version != RTM_VERSION)
> :++                   goto done;
> :++           offset += rtm->rtm_msglen;
> :++
> :++           if (rtm->rtm_index != drv->ifindex)
> :++                   continue;
> :++
> :++           switch (rtm->rtm_type) {
> :++           case RTM_80211INFO:
> :++                   ifie = &((struct if_ieee80211_msghdr *)rtm)->ifim_ifie;
> :++                   wpa_driver_openbsd_rtmsg_80211(ifie, drv);
> :++                   break;
> :++           case RTM_IFINFO:
> :++                   wpa_driver_openbsd_rtmsg_ifinfo(rtm, drv);
> :++                   break;
> :++           default:
> :++                   wpa_printf(MSG_ERROR, "Unexpected route message of type"
> :++                              " %d received", rtm->rtm_type);
> :++                   break;
> :++           }
> :++   }
> :++
> :++done:
> :++   os_free(rtmmsg);
> :++}
> :++
> :++static void *
> :++wpa_driver_openbsd_init(void *ctx, const char *ifname) {
> :+    struct openbsd_driver_data *drv;
> :++   unsigned int rtfilter = ROUTE_FILTER(RTM_80211INFO) | \
> :++                           ROUTE_FILTER(RTM_IFINFO);
> :+ 
> :+    drv = os_zalloc(sizeof(*drv));
> :+    if (drv == NULL)
> :+@@ -103,9 +207,26 @@ 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;
> :++   if (setsockopt(drv->rtsock, PF_ROUTE, ROUTE_MSGFILTER,
> :++                  &rtfilter, sizeof(rtfilter)) == -1)
> :++           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 +240,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);
> :+ }
> :+ 
> :
> 
> -- 
> The camel has a single hump;
> The dromedary two;
> Or else the other way around.
> I'm never sure.  Are you?
>               -- Ogden Nash
> 

Reply via email to