Comment inlined about RTM_IFINFO

On Wed, Nov 28, 2018 at 06:56:46PM +0100, Gregor Best wrote:
> 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) ||

I'm currently testing your diff with additional condition to also
handle RTM_IFINFO, as I see it happening just after resume:

1544537117.597172: XXX wpa_driver_openbsd_event_receive() start
1544537117.597197: XXX evnt_rcv: name=iwn0, type=0xe

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


Reply via email to