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);
> + }
> +
No comments:
Post a Comment