Thursday, December 06, 2018

Re: security/wpa_supplicant: Reassoc on NWID change

On 2018 Nov 28 (Wed) at 18:56:46 +0100 (+0100), Gregor Best wrote:
:Peter Hessler <phessler@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

No comments:

Post a Comment