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

Reply via email to