On 2018 Nov 28 (Wed) at 18:56:46 +0100 (+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 :
I'm not able to test this yet, but this looks OK to me (with a REVISION bump, of course) :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); :+ } :+ -- A sine curve goes off to infinity or at least the end of the blackboard. -- Prof. Steiner