Hi David and ports@,

I've built a little patch to security/wpa_supplicant that lets it listen to
changes in the associated network SSID (thanks to Ken's RTM_80211INFO) and
reassociate itself.

This essentially means that now you can run `wpa_supplicant` in the background
and configure e.g. eduroam like `ifconfig iwm0 join eduroam wpaakms 802.1x`
without having to manually kick wpa_supplicant by restarting it or running
`wpa_cli reassoc`.

I'll be out of range of my usual eduroam access points until next week, so I
haven't tested this beyond "wpa_supplicant doesn't crash and it tries to reassoc
if the NWID changes".

I'd be really grateful if a few of you who do run wpa_supplicant for wireless
802.1x networks could give this a spin. All that's needed is applying the patch
below my signature to `/usr/ports/security/wpa_supplicant` and running `make
reinstall`.

--
        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 -u -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  20 Nov 2018 17:59:00 -0000
@@ -2,23 +2,130 @@ $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,31 @@
  #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 */
++
++      int nwid_len; /* Length of last seen SSID (as per routing message) */
++      char nwid[IEEE80211_NWID_LEN]; /* Last seen SSID (as per routing 
message) */
+ };
+
+
+@@ -90,6 +102,54 @@ 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_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 +163,20 @@ 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);
++
++      eloop_register_read_sock(drv->rtsock, wpa_driver_openbsd_event_receive, 
NULL, drv);
+       return drv;
+
+ fail:
+@@ -119,7 +190,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);
+ }
+

Attachment: signature.asc
Description: PGP signature

Reply via email to