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);
+ }
+ 

Reply via email to