Module Name: src
Committed By: phil
Date: Fri Jul 20 20:33:05 UTC 2018
Modified Files:
src/sys/dev/usb [phil-wifi]: if_urtwn.c
src/sys/net80211 [phil-wifi]: ieee80211.c ieee80211_amrr.c
ieee80211_ioctl.c ieee80211_ioctl.h ieee80211_netbsd.c
ieee80211_netbsd.h ieee80211_proto.c ieee80211_rssadapt.c
ieee80211_scan_sw.c ieee80211_var.h
Log Message:
State save:
urtwn: ifp->if_softc points to a vap, not the urtwn softc, fix code for this.
add missing routines, need to get them filled out correctly.
80211: Add back some NetBSD ioctls, start working on the sysctl tree.
To generate a diff of this commit:
cvs rdiff -u -r1.59.2.2 -r1.59.2.3 src/sys/dev/usb/if_urtwn.c
cvs rdiff -u -r1.56.18.3 -r1.56.18.4 src/sys/net80211/ieee80211.c
cvs rdiff -u -r1.3.18.3 -r1.3.18.4 src/sys/net80211/ieee80211_amrr.c
cvs rdiff -u -r1.60.18.3 -r1.60.18.4 src/sys/net80211/ieee80211_ioctl.c
cvs rdiff -u -r1.24.2.3 -r1.24.2.4 src/sys/net80211/ieee80211_ioctl.h
cvs rdiff -u -r1.31.2.3 -r1.31.2.4 src/sys/net80211/ieee80211_netbsd.c
cvs rdiff -u -r1.21.2.4 -r1.21.2.5 src/sys/net80211/ieee80211_netbsd.h
cvs rdiff -u -r1.34.14.3 -r1.34.14.4 src/sys/net80211/ieee80211_proto.c
cvs rdiff -u -r1.21.16.3 -r1.21.16.4 src/sys/net80211/ieee80211_rssadapt.c
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/net80211/ieee80211_scan_sw.c
cvs rdiff -u -r1.33.2.4 -r1.33.2.5 src/sys/net80211/ieee80211_var.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/usb/if_urtwn.c
diff -u src/sys/dev/usb/if_urtwn.c:1.59.2.2 src/sys/dev/usb/if_urtwn.c:1.59.2.3
--- src/sys/dev/usb/if_urtwn.c:1.59.2.2 Mon Jul 16 20:11:11 2018
+++ src/sys/dev/usb/if_urtwn.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_urtwn.c,v 1.59.2.2 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: if_urtwn.c,v 1.59.2.3 2018/07/20 20:33:05 phil Exp $ */
/* $OpenBSD: if_urtwn.c,v 1.42 2015/02/10 23:25:46 mpi Exp $ */
/*-
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.59.2.2 2018/07/16 20:11:11 phil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.59.2.3 2018/07/20 20:33:05 phil Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -311,6 +311,7 @@ static int urtwn_reset(struct ieee80211v
static void urtwn_chip_stop(struct urtwn_softc *);
static void urtwn_newassoc(struct ieee80211_node *, int);
static void urtwn_delay_ms(struct urtwn_softc *, int ms);
+/* Functions for wifi refresh */
static struct ieee80211vap *
urtwn_vap_create(struct ieee80211com *,
const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
@@ -318,6 +319,14 @@ static struct ieee80211vap *
const uint8_t [IEEE80211_ADDR_LEN]);
static void urtwn_vap_delete(struct ieee80211vap *);
static int urtwn_ioctl(struct ifnet *, u_long, void *);
+static void urtwn_parent(struct ieee80211com *);
+static void urtwn_scan_start(struct ieee80211com *);
+static void urtwn_scan_end(struct ieee80211com *);
+static void urtwn_set_channel(struct ieee80211com *);
+static int urtwn_transmit(struct ieee80211com *, struct mbuf *);
+static int urtwn_raw_xmit(struct ieee80211_node *, struct mbuf *,
+ const struct ieee80211_bpf_params *);
+
/* Aliases. */
#define urtwn_bb_write urtwn_write_4
@@ -357,6 +366,9 @@ urtwn_attach(device_t parent, device_t s
sc->sc_dev = self;
sc->sc_udev = uaa->uaa_device;
+ /* Name the ic. */
+ ic->ic_name = "urtwn";
+
sc->chip = 0;
dev = urtwn_lookup(urtwn_devs, uaa->uaa_vendor, uaa->uaa_product);
if (dev != NULL && ISSET(dev->flags, FLAG_RTL8188E))
@@ -491,6 +503,13 @@ urtwn_attach(device_t parent, device_t s
ic->ic_wme.wme_update = urtwn_wme_update;
ic->ic_vap_create = urtwn_vap_create;
ic->ic_vap_delete = urtwn_vap_delete;
+ ic->ic_parent = urtwn_parent;
+ ic->ic_scan_start = urtwn_scan_start;
+ ic->ic_scan_end = urtwn_scan_end;
+ ic->ic_set_channel = urtwn_set_channel;
+ ic->ic_transmit = urtwn_transmit;
+ ic->ic_raw_xmit = urtwn_raw_xmit;
+
/* Shouldn't do it, but call vap_create??? */
uint8_t bssid[IEEE80211_ADDR_LEN] = {0};
@@ -507,6 +526,9 @@ urtwn_attach(device_t parent, device_t s
goto fail;
}
+ /* Debug all! NNN */
+ vap->iv_debug = IEEE80211_MSG_ANY;
+
bpf_attach2(vap->iv_ifp, DLT_IEEE802_11_RADIO,
sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
&sc->sc_drvbpf);
@@ -1489,7 +1511,8 @@ static __unused int
urtwn_media_change(struct ifnet *ifp)
{
#ifdef URTWN_DEBUG
- struct urtwn_softc *sc = ifp->if_softc;
+ struct ieee80211vap *vap = ifp->if_softc;
+ struct urtwn_softc *sc = vap->iv_ic->ic_softc;
#endif
int error;
@@ -1808,6 +1831,7 @@ urtwn_calib_to_cb(struct urtwn_softc *sc
static void
urtwn_next_scan(void *arg)
{
+ printf ("urtwn_next_scan called....\n");
#ifdef notyet
struct urtwn_softc *sc = arg;
int s;
@@ -1942,6 +1966,7 @@ urtwn_newstate_cb(struct urtwn_softc *sc
case IEEE80211_S_CAC:
case IEEE80211_S_CSA:
case IEEE80211_S_SLEEP:
+ printf ("URTWN UNKNOWN oSTATE: %d\n", ostate);
/* NNN what do we do in these states? XXX */
break;
}
@@ -2151,6 +2176,7 @@ urtwn_newstate_cb(struct urtwn_softc *sc
case IEEE80211_S_CSA:
case IEEE80211_S_SLEEP:
/* NNN what do we do in these states? XXX */
+ printf ("URTWN UNKNOWN nSTATE: %d\n", nstate);
break;
}
@@ -2824,12 +2850,12 @@ urtwn_get_tx_data(struct urtwn_softc *sc
static void
urtwn_start(struct ifnet *ifp)
{
- struct urtwn_softc *sc = ifp->if_softc;
- struct ieee80211com *ic = &sc->sc_ic;
+ struct ieee80211vap *vap = ifp->if_softc;
+ struct ieee80211com *ic = vap->iv_ic;
+ struct urtwn_softc *sc = ic->ic_softc;
struct urtwn_tx_data *data;
struct ether_header *eh;
struct ieee80211_node *ni;
- struct ieee80211vap *vap;
struct mbuf *m;
DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
@@ -2837,15 +2863,6 @@ urtwn_start(struct ifnet *ifp)
if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
return;
- /* Find the associated vap. NEED A BETTER WAY! */
- vap = TAILQ_FIRST(&ic->ic_vaps);
- while (vap != NULL) {
- if (vap->iv_ifp == ifp)
- break;
- vap = TAILQ_NEXT(vap, iv_next);
- }
- KASSERT(vap != NULL);
-
data = NULL;
for (;;) {
/* Send pending management frames first. */
@@ -2939,7 +2956,8 @@ urtwn_start(struct ifnet *ifp)
static void
urtwn_watchdog(struct ifnet *ifp)
{
- struct urtwn_softc *sc = ifp->if_softc;
+ struct ieee80211vap *vap = ifp->if_softc;
+ struct urtwn_softc *sc = vap->iv_ic->ic_softc;
DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
@@ -2955,7 +2973,7 @@ urtwn_watchdog(struct ifnet *ifp)
}
ifp->if_timer = 1;
}
-//NNN ieee80211_watchdog(&sc->sc_ic); Not sure what is happening!
+ // ieee80211_watchdog(&sc->sc_ic);
}
/*
@@ -2998,12 +3016,10 @@ urtwn_vap_create(struct ieee80211com *ic
ifp->if_ioctl = urtwn_ioctl;
ifp->if_start = urtwn_start;
ifp->if_watchdog = urtwn_watchdog;
+ ifp->if_extflags |= IFEF_MPSAFE;
IFQ_SET_READY(&ifp->if_snd);
memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
- /* NNN needed ??? */
- /* if_attach(ifp); */
-
/* Override state transition machine. */
sc->sc_newstate = vap->iv_newstate;
vap->iv_newstate = urtwn_newstate;
@@ -3031,6 +3047,69 @@ urtwn_vap_delete(struct ieee80211vap *va
kmem_free(vap, sizeof(struct ieee80211vap));
}
+static void
+urtwn_parent(struct ieee80211com *ic)
+{
+ struct urtwn_softc *sc __unused = ic->ic_softc;
+
+ DPRINTFN(DBG_FN, ("%s: %s\n",device_xname(sc->sc_dev), __func__));
+
+ /* Not sure what to do here yet. */
+}
+
+static void
+urtwn_scan_start(struct ieee80211com *ic)
+{
+ struct urtwn_softc *sc __unused = ic->ic_softc;
+
+ DPRINTFN(DBG_FN, ("%s: %s\n",device_xname(sc->sc_dev), __func__));
+
+ /* Not sure what to do here yet. */
+}
+
+static void
+urtwn_scan_end(struct ieee80211com *ic)
+{
+ struct urtwn_softc *sc __unused = ic->ic_softc;
+
+ DPRINTFN(DBG_FN, ("%s: %s\n",device_xname(sc->sc_dev), __func__));
+
+ /* Not sure what to do here yet. */
+}
+
+static void
+urtwn_set_channel(struct ieee80211com *ic)
+{
+ struct urtwn_softc *sc = ic->ic_softc;
+
+ DPRINTFN(DBG_FN, ("%s: %s\n",device_xname(sc->sc_dev), __func__));
+
+ urtwn_set_chan(sc, ic->ic_curchan, IEEE80211_HTINFO_2NDCHAN_NONE);
+}
+
+static int
+urtwn_transmit(struct ieee80211com *ic, struct mbuf *m)
+{
+ struct urtwn_softc *sc = ic->ic_softc;
+
+ DPRINTFN(DBG_FN, ("%s: %s\n",device_xname(sc->sc_dev), __func__));
+
+ return EIO;
+}
+
+static int
+urtwn_raw_xmit(struct ieee80211_node *ni , struct mbuf *m,
+ const struct ieee80211_bpf_params *bpfp)
+{
+ struct ieee80211com *ic = ni->ni_ic;
+ struct urtwn_softc *sc = ic->ic_softc;
+
+ DPRINTFN(DBG_FN, ("%s: %s\n",device_xname(sc->sc_dev), __func__));
+
+ return EIO;
+}
+
+
static int
urtwn_ioctl(struct ifnet *ifp, u_long cmd, void *data)
{
@@ -3050,11 +3129,14 @@ urtwn_ioctl(struct ifnet *ifp, u_long cm
break;
switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) {
case IFF_UP | IFF_RUNNING:
+ printf (" up and running...\n");
break;
case IFF_UP:
+ printf (" just up ... will start\n");
urtwn_init(ifp);
break;
case IFF_RUNNING:
+ printf (" just running .. will stop\n");
urtwn_stop(ifp, 1);
break;
case 0:
@@ -4765,9 +4847,9 @@ urtwn_temp_calib(struct urtwn_softc *sc)
static int
urtwn_init(struct ifnet *ifp)
{
- struct urtwn_softc *sc = ifp->if_softc;
- struct ieee80211com *ic = &sc->sc_ic;
- struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
+ struct ieee80211vap *vap = ifp->if_softc;
+ struct ieee80211com *ic = vap->iv_ic;
+ struct urtwn_softc *sc = ic->ic_softc;
struct urtwn_rx_data *data;
uint32_t reg;
size_t i;
@@ -5036,9 +5118,9 @@ urtwn_init(struct ifnet *ifp)
static void
urtwn_stop(struct ifnet *ifp, int disable)
{
- struct urtwn_softc *sc = ifp->if_softc;
- struct ieee80211com *ic = &sc->sc_ic;
- struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
+ struct ieee80211vap *vap = ifp->if_softc;
+ struct ieee80211com *ic = vap->iv_ic;
+ struct urtwn_softc *sc = ic->ic_softc;
size_t i;
int s;
Index: src/sys/net80211/ieee80211.c
diff -u src/sys/net80211/ieee80211.c:1.56.18.3 src/sys/net80211/ieee80211.c:1.56.18.4
--- src/sys/net80211/ieee80211.c:1.56.18.3 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211.c,v 1.56.18.3 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211.c,v 1.56.18.4 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
#ifdef __FreeBSD__
#include <machine/stdarg.h>
#elif __NetBSD__
+#include <sys/once.h>
#include <sys/stdarg.h>
#else
#error
@@ -330,8 +331,6 @@ static struct mtx ic_list_mtx;
MTX_SYSINIT(ic_list, &ic_list_mtx, "ieee80211com list", MTX_DEF);
#elif __NetBSD__
static kmutex_t ic_list_mtx;
-static uint ic_list_mtx_needsinit = 1;
-static uint ic_list_mtx_ready = 0;
#endif
#if notyet
@@ -365,6 +364,16 @@ SYSCTL_PROC(_net_wlan, OID_AUTO, devices
sysctl_ieee80211coms, "A", "names of available 802.11 devices");
#endif
+#if __NetBSD__
+static int
+ic_list_mtx_init (void)
+{
+ mutex_init(&ic_list_mtx, MUTEX_DEFAULT, IPL_NET);
+ ieee80211_auth_setup();
+ return 0;
+}
+#endif
+
/*
* Attach/setup the common net80211 state. Called by
* the driver on attach to prior to creating any vap's.
@@ -373,21 +382,8 @@ void
ieee80211_ifattach(struct ieee80211com *ic)
{
#if __NetBSD__
- /* Initialize the ic_list_mtx the first time here.
- * Only want to use the big lock on first try to initialize.
- * Once initialized, it won't use the big lock any more.
- */
- if (ic_list_mtx_needsinit) {
- KERNEL_LOCK(1, NULL);
- if (!ic_list_mtx_ready) {
- mutex_init(&ic_list_mtx, MUTEX_DEFAULT, IPL_NET);
- ic_list_mtx_ready = 1;
- ic_list_mtx_needsinit = 0;
- /* Doing this one-time initialization here also. */
- ieee80211_auth_setup();
- }
- KERNEL_UNLOCK_ONE(NULL);
- }
+ static ONCE_DECL(ic_list_mtx_once);
+ RUN_ONCE(&ic_list_mtx_once, ic_list_mtx_init);
#endif
IEEE80211_LOCK_INIT(ic, ic->ic_name);
@@ -2011,6 +2007,7 @@ ieee80211_announce(struct ieee80211com *
for (mode = IEEE80211_MODE_AUTO+1; mode < IEEE80211_MODE_11NA; mode++) {
if (isclr(ic->ic_modecaps, mode))
continue;
+ printf ("[%d/%s]", mode, ieee80211_phymode_name[mode]);
ic_printf(ic, "%s rates: ", ieee80211_phymode_name[mode]);
rs = &ic->ic_sup_rates[mode];
for (i = 0; i < rs->rs_nrates; i++) {
Index: src/sys/net80211/ieee80211_amrr.c
diff -u src/sys/net80211/ieee80211_amrr.c:1.3.18.3 src/sys/net80211/ieee80211_amrr.c:1.3.18.4
--- src/sys/net80211/ieee80211_amrr.c:1.3.18.3 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211_amrr.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_amrr.c,v 1.3.18.3 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211_amrr.c,v 1.3.18.4 2018/07/20 20:33:05 phil Exp $ */
/* $OpenBSD: ieee80211_amrr.c,v 1.1 2006/06/17 19:07:19 damien Exp $ */
@@ -90,8 +90,10 @@ static void amrr_tx_complete(const struc
static void amrr_tx_update_cb(void *, struct ieee80211_node *);
static void amrr_tx_update(struct ieee80211vap *vap,
struct ieee80211_ratectl_tx_stats *);
+#ifdef notyet
static void amrr_sysctlattach(struct ieee80211vap *,
struct sysctl_ctx_list *, struct sysctl_oid *);
+#endif
static void amrr_node_stats(struct ieee80211_node *ni, struct sbuf *s);
/* number of references from net80211 layer */
@@ -149,7 +151,9 @@ amrr_init(struct ieee80211vap *vap)
amrr->amrr_min_success_threshold = IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD;
amrr->amrr_max_success_threshold = IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD;
amrr_setinterval(vap, 500 /* ms */);
+#ifdef notyet
amrr_sysctlattach(vap, vap->iv_sysctl, vap->iv_oid);
+#endif
}
static void
@@ -454,11 +458,11 @@ amrr_sysctl_interval(SYSCTL_HANDLER_ARGS
}
#endif
+#ifdef notyet
static void
amrr_sysctlattach(struct ieee80211vap *vap,
struct sysctl_ctx_list *ctx, struct sysctl_oid *tree)
{
-#ifdef notyet
struct ieee80211_amrr *amrr = vap->iv_rs;
SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
@@ -471,8 +475,8 @@ amrr_sysctlattach(struct ieee80211vap *v
SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
"amrr_min_sucess_threshold", CTLFLAG_RW,
&amrr->amrr_min_success_threshold, 0, "");
-#endif
}
+#endif
static void
amrr_node_stats(struct ieee80211_node *ni, struct sbuf *s)
Index: src/sys/net80211/ieee80211_ioctl.c
diff -u src/sys/net80211/ieee80211_ioctl.c:1.60.18.3 src/sys/net80211/ieee80211_ioctl.c:1.60.18.4
--- src/sys/net80211/ieee80211_ioctl.c:1.60.18.3 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211_ioctl.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_ioctl.c,v 1.60.18.3 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211_ioctl.c,v 1.60.18.4 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -784,9 +784,9 @@ IEEE80211_IOCTL_GET(dummy, dummy_ioctl_g
static int
ieee80211_ioctl_getdefault(struct ieee80211vap *vap, struct ieee80211req *ireq)
{
+ int error;
#if notyet
ieee80211_ioctl_getfunc * const *get;
- int error;
SET_FOREACH(get, ieee80211_ioctl_getset) {
error = (*get)(vap, ireq);
@@ -794,9 +794,10 @@ ieee80211_ioctl_getdefault(struct ieee80
return error;
}
#else
- printf ("i33380211_ioctl_getdefault called\n");
+ printf ("ieee80211_ioctl_getdefault called\n");
+ error = dummy_ioctl_get(vap, ireq);
#endif
- return EINVAL;
+ return error;
}
static int
@@ -3044,7 +3045,14 @@ ieee80211_ioctl_set80211(struct ieee8021
case IEEE80211_IOC_SCAN_CANCEL:
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
"%s: cancel scan\n", __func__);
+#if __NetBSD__
+ /* Bug in FreeBSD? */
+ IEEE80211_LOCK(ic);
+#endif
ieee80211_cancel_scan(vap);
+#if __NetBSD__
+ IEEE80211_UNLOCK(ic);
+#endif
break;
case IEEE80211_IOC_HTCONF:
if (ireq->i_val & 1)
@@ -3519,11 +3527,23 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
int error = 0, wait = 0;
struct ifreq *ifr;
struct ifaddr *ifa; /* XXX */
+#if __NetBSD__
+ struct ieee80211_nwid nwid;
+ // struct ieee80211_nwkey *nwkey;
+ // struct ieee80211_power *power;
+ // struct ieee80211chanreq *chanreq;
+
+ ifr = (struct ifreq *)data;
+#endif
+
+ printf ("ieee80211_ioctl: cmd is 0x%lx. ('%c', %ld)\n", cmd,
+ (char) ((cmd>>8) & 0xff), cmd & 0xff );
switch (cmd) {
case SIOCSIFFLAGS:
IEEE80211_LOCK(ic);
if ((ifp->if_flags ^ vap->iv_ifflags) & IFF_PROMISC) {
+ printf (" promisc mode\n");
/*
* Enable promiscuous mode when:
* 1. Interface is not a member of bridge, or
@@ -3541,10 +3561,12 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
}
}
if ((ifp->if_flags ^ vap->iv_ifflags) & IFF_ALLMULTI) {
+ printf (" allmulti\n");
ieee80211_allmulti(vap, ifp->if_flags & IFF_ALLMULTI);
vap->iv_ifflags ^= IFF_ALLMULTI;
}
if (ifp->if_flags & IFF_UP) {
+ printf (" up flag\n");
/*
* Bring ourself up unless we're already operational.
* If we're the first vap and the parent is not up
@@ -3554,7 +3576,9 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
if (vap->iv_state == IEEE80211_S_INIT) {
if (ic->ic_nrunning == 0)
wait = 1;
- ieee80211_start_locked(vap);
+ printf ("Should call start_locked ...\n");
+ wait = 0;
+ // ieee80211_start_locked(vap);
}
#if __FreeBSD__
} else if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
@@ -3649,6 +3673,45 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
break;
}
break;
+#if __NetBSD__
+ case SIOCS80211NWID:
+ if ((error = copyin(ifr->ifr_data, &nwid, sizeof(nwid))) != 0)
+ break;
+ if (nwid.i_len > IEEE80211_NWID_LEN) {
+ error = EINVAL;
+ break;
+ }
+ memset(vap->iv_des_ssid, 0, IEEE80211_NWID_LEN);
+ vap->iv_des_ssid[0].len = nwid.i_len;
+ memcpy(vap->iv_des_ssid[0].ssid, nwid.i_nwid, nwid.i_len);
+ error = ENETRESET;
+ break;
+ case SIOCG80211NWID:
+ memset(&nwid, 0, sizeof(nwid));
+ switch (vap->iv_state) {
+ case IEEE80211_S_INIT:
+ case IEEE80211_S_SCAN:
+ nwid.i_len = vap->iv_des_ssid[0].len;
+ memcpy(nwid.i_nwid, vap->iv_des_ssid[0].ssid,
+ nwid.i_len);
+ break;
+ default:
+ nwid.i_len = vap->iv_bss->ni_esslen;
+ memcpy(nwid.i_nwid, vap->iv_bss->ni_essid, nwid.i_len);
+ break;
+ }
+ error = copyout(&nwid, ifr->ifr_data, sizeof(nwid));
+ break;
+ case SIOCS80211NWKEY:
+ case SIOCG80211NWKEY:
+ printf ("NetBSD NWKEY ioctl\n");
+ error = ENOTTY;
+ break;
+ case SIOCS80211POWER:
+ printf ("NEtBSD POWER ioctl\n");
+ error = ENOTTY;
+ break;
+#endif
default:
/*
* Pass unknown ioctls first to the driver, and if it
@@ -3658,6 +3721,8 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
(error = ic->ic_ioctl(ic, cmd, data)) != ENOTTY)
break;
error = ether_ioctl(ifp, cmd, data);
+ if (error == ENOTTY)
+ printf ("Unknown 802.11 IOCTL.\n"); /* NNN */
break;
}
return (error);
Index: src/sys/net80211/ieee80211_ioctl.h
diff -u src/sys/net80211/ieee80211_ioctl.h:1.24.2.3 src/sys/net80211/ieee80211_ioctl.h:1.24.2.4
--- src/sys/net80211/ieee80211_ioctl.h:1.24.2.3 Thu Jul 12 16:35:34 2018
+++ src/sys/net80211/ieee80211_ioctl.h Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_ioctl.h,v 1.24.2.3 2018/07/12 16:35:34 phil Exp $ */
+/* $NetBSD: ieee80211_ioctl.h,v 1.24.2.4 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -888,7 +888,7 @@ struct ieee80211_clone_params {
#define IEEE80211_CLONE_MACADDR 0x0008 /* use specified mac addr */
#define IEEE80211_CLONE_TDMA 0x0010 /* operate in TDMA mode */
-#ifdef __NetBSD__
+#if __NetBSD__
/* nwid is pointed at by ifr.ifr_data */
struct ieee80211_nwid {
u_int8_t i_len;
Index: src/sys/net80211/ieee80211_netbsd.c
diff -u src/sys/net80211/ieee80211_netbsd.c:1.31.2.3 src/sys/net80211/ieee80211_netbsd.c:1.31.2.4
--- src/sys/net80211/ieee80211_netbsd.c:1.31.2.3 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211_netbsd.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_netbsd.c,v 1.31.2.3 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211_netbsd.c,v 1.31.2.4 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -29,7 +29,7 @@
#include <sys/cdefs.h>
/* __FBSDID("$FreeBSD$"); */
-__KERNEL_RCSID(0, "$NetBSD: ieee80211_netbsd.c,v 1.31.2.3 2018/07/16 20:11:11 phil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ieee80211_netbsd.c,v 1.31.2.4 2018/07/20 20:33:05 phil Exp $");
/*
* IEEE 802.11 support (NetBSD-specific code)
@@ -61,21 +61,31 @@ __KERNEL_RCSID(0, "$NetBSD: ieee80211_ne
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_input.h>
-#ifdef notyet
-SYSCTL_NODE(_net, OID_AUTO, wlan, CTLFLAG_RD, 0, "IEEE 80211 parameters");
+static const struct sysctlnode *
+ ieee80211_sysctl_treetop(struct sysctllog **log);
+static void ieee80211_sysctl_setup(void);
+
+/* NNN in .h file? */
+#define SYSCTL_HANDLER_ARGS SYSCTLFN_ARGS
#ifdef IEEE80211_DEBUG
static int ieee80211_debug = 0;
-SYSCTL_INT(_net_wlan, OID_AUTO, debug, CTLFLAG_RW, &ieee80211_debug,
- 0, "debugging printfs");
#endif
+#ifdef notyet
static struct if_clone *wlan_cloner;
#endif
/* notyet */
static const char wlanname[] = "wlan";
+int
+ieee80211_init0(void)
+{
+ ieee80211_sysctl_setup();
+ return 0;
+}
+
static __unused int
wlan_clone_create(struct if_clone *ifc, int unit, void * params)
{
@@ -166,15 +176,23 @@ ieee80211_sysctl_inact(SYSCTL_HANDLER_AR
*(int *)arg1 = inact / IEEE80211_INACT_WAIT;
return 0;
}
+#endif
static int
-ieee80211_sysctl_parent(SYSCTL_HANDLER_ARGS)
+ieee80211_sysctl_parent(SYSCTLFN_ARGS)
{
- struct ieee80211com *ic = arg1;
+ struct ieee80211vap *vap;
+ char pname[IFNAMSIZ];
+ struct sysctlnode node;
- return SYSCTL_OUT_STR(req, ic->ic_name);
+ node = *rnode;
+ vap = node.sysctl_data;
+ strlcpy(pname, vap->iv_ifp->if_xname, IFNAMSIZ);
+ node.sysctl_data = pname;
+ return sysctl_lookup(SYSCTLFN_CALL(&node));
}
+#ifdef notyet
static int
ieee80211_sysctl_radar(SYSCTL_HANDLER_ARGS)
{
@@ -221,9 +239,99 @@ ieee80211_sysctl_detach(struct ieee80211
{
}
+/*
+ * Setup sysctl(3) MIB, net.ieee80211.*
+ *
+ * TBD condition CTLFLAG_PERMANENT on being a module or not
+ */
+static struct sysctllog *ieee80211_sysctllog;
+static void
+ieee80211_sysctl_setup(void)
+{
+ int rc;
+ const struct sysctlnode *rnode;
+
+ if ((rnode = ieee80211_sysctl_treetop(&ieee80211_sysctllog)) == NULL)
+ return;
+
+#ifdef notyet
+ if ((rc = sysctl_createv(&ieee80211_sysctllog, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "nodes", "client/peer stations",
+ ieee80211_sysctl_node, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
+ goto err;
+#endif
+
+#ifdef IEEE80211_DEBUG
+ /* control debugging printfs */
+ if ((rc = sysctl_createv(&ieee80211_sysctllog, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
+ "debug", SYSCTL_DESCR("control debugging printfs"),
+ NULL, 0, &ieee80211_debug, 0, CTL_CREATE, CTL_EOL)) != 0)
+ goto err;
+#endif
+
+#ifdef notyet
+ ieee80211_rssadapt_sysctl_setup(&ieee80211_sysctllog);
+#endif
+
+ return;
+err:
+ printf("%s: sysctl_createv failed (rc = %d)\n", __func__, rc);
+}
+
+/*
+ * Create or get top of sysctl tree net.link.ieee80211.
+ */
+static const struct sysctlnode *
+ieee80211_sysctl_treetop(struct sysctllog **log)
+{
+ int rc;
+ const struct sysctlnode *rnode;
+
+ if ((rc = sysctl_createv(log, 0, NULL, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "link",
+ "link-layer statistics and controls",
+ NULL, 0, NULL, 0, CTL_NET, PF_LINK, CTL_EOL)) != 0)
+ goto err;
+
+ if ((rc = sysctl_createv(log, 0, &rnode, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "ieee80211",
+ "IEEE 802.11 WLAN statistics and controls",
+ NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
+ goto err;
+
+ return rnode;
+err:
+ printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
+ return NULL;
+}
+
void
ieee80211_sysctl_vattach(struct ieee80211vap *vap)
{
+ int rc;
+ const struct sysctlnode *cnode, *rnode;
+ char num[sizeof("vap") + 14]; /* sufficient for 32 bits */
+
+ if ((rnode = ieee80211_sysctl_treetop(NULL)) == NULL)
+ return;
+
+ snprintf(num, sizeof(num), "vap%u", vap->iv_ifp->if_index);
+
+ if ((rc = sysctl_createv(&vap->iv_sysctllog, 0, &rnode, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, num, SYSCTL_DESCR("virtual AP"),
+ NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
+ goto err;
+
+ /* control debugging printfs */
+ if ((rc = sysctl_createv(&vap->iv_sysctllog, 0, &rnode, &cnode,
+ CTLFLAG_PERMANENT|CTLFLAG_READONLY, CTLTYPE_STRING,
+ "parent", SYSCTL_DESCR("parent device"),
+ ieee80211_sysctl_parent, 0, (void *)vap, IFNAMSIZ,
+ CTL_CREATE, CTL_EOL)) != 0)
+ goto err;
+
+
#ifdef notyet
struct ifnet *ifp = vap->iv_ifp;
struct sysctl_ctx_list *ctx;
@@ -305,6 +413,9 @@ ieee80211_sysctl_vattach(struct ieee8021
vap->iv_sysctl = ctx;
vap->iv_oid = oid;
#endif
+ return;
+err:
+ printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
}
void
Index: src/sys/net80211/ieee80211_netbsd.h
diff -u src/sys/net80211/ieee80211_netbsd.h:1.21.2.4 src/sys/net80211/ieee80211_netbsd.h:1.21.2.5
--- src/sys/net80211/ieee80211_netbsd.h:1.21.2.4 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211_netbsd.h Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_netbsd.h,v 1.21.2.4 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211_netbsd.h,v 1.21.2.5 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -825,6 +825,13 @@ struct ieee80211_channel_survey {
/* XXX TODO: the type fields */
/*
+ * Startup function for NetBSD
+ */
+
+int ieee80211_init0(void);
+
+
+/*
* Functions FreeBSD uses that NetBSD doesn't have ...
*/
Index: src/sys/net80211/ieee80211_proto.c
diff -u src/sys/net80211/ieee80211_proto.c:1.34.14.3 src/sys/net80211/ieee80211_proto.c:1.34.14.4
--- src/sys/net80211/ieee80211_proto.c:1.34.14.3 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211_proto.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_proto.c,v 1.34.14.3 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211_proto.c,v 1.34.14.4 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#ifdef __NetBSD__
#include <sys/mbuf.h>
+#include <sys/once.h>
#endif
#include <sys/socket.h>
@@ -1543,6 +1544,9 @@ ieee80211_start_locked(struct ieee80211v
IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG,
"start running, %d vaps running\n", ic->ic_nrunning);
+ printf ("returning from start_locked too soon.\n");
+ return;
+
#if __FreeBSD__
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
#elif __NetBSD__
@@ -1566,7 +1570,7 @@ ieee80211_start_locked(struct ieee80211v
* to be brought up auto-up the parent if necessary.
*/
if (ic->ic_nrunning++ == 0) {
-
+ printf (" calling start_check_reset_chan\n");
/* reset the channel to a known good channel */
if (ieee80211_start_check_reset_chan(vap))
ieee80211_start_reset_chan(vap);
@@ -1601,6 +1605,7 @@ ieee80211_start_locked(struct ieee80211v
ieee80211_new_state_locked(vap,
IEEE80211_S_SCAN, 0);
} else {
+ printf (" first vap??? \n");
/*
* For monitor+wds mode there's nothing to do but
* start running. Otherwise if this is the first
@@ -1641,10 +1646,13 @@ int
ieee80211_init(struct ifnet *ifp)
{
struct ieee80211vap *vap = ifp->if_softc;
+ static ONCE_DECL(ieee80211_init_once);
IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG,
"%s\n", __func__);
+ RUN_ONCE(&ieee80211_init_once, ieee80211_init0);
+
IEEE80211_LOCK(vap->iv_ic);
ieee80211_start_locked(vap);
IEEE80211_UNLOCK(vap->iv_ic);
Index: src/sys/net80211/ieee80211_rssadapt.c
diff -u src/sys/net80211/ieee80211_rssadapt.c:1.21.16.3 src/sys/net80211/ieee80211_rssadapt.c:1.21.16.4
--- src/sys/net80211/ieee80211_rssadapt.c:1.21.16.3 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211_rssadapt.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_rssadapt.c,v 1.21.16.3 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211_rssadapt.c,v 1.21.16.4 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-3-Clause
@@ -107,8 +107,10 @@ static void rssadapt_raise_rate(struct i
int, int);
static void rssadapt_tx_complete(const struct ieee80211_node *,
const struct ieee80211_ratectl_tx_status *);
+#ifdef notyet
static void rssadapt_sysctlattach(struct ieee80211vap *,
struct sysctl_ctx_list *, struct sysctl_oid *);
+#endif
/* number of references from net80211 layer */
static int nrefs = 0;
@@ -164,7 +166,9 @@ rssadapt_init(struct ieee80211vap *vap)
}
rs->vap = vap;
rssadapt_setinterval(vap, 500 /* msecs */);
+#ifdef notyet
rssadapt_sysctlattach(vap, vap->iv_sysctl, vap->iv_oid);
+#endif
}
static void
@@ -376,15 +380,13 @@ rssadapt_sysctl_interval(SYSCTL_HANDLER_
rssadapt_setinterval(vap, msecs);
return 0;
}
-#endif
static void
rssadapt_sysctlattach(struct ieee80211vap *vap,
struct sysctl_ctx_list *ctx, struct sysctl_oid *tree)
{
-#ifdef notyet
SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
"rssadapt_rate_interval", CTLTYPE_INT | CTLFLAG_RW, vap,
0, rssadapt_sysctl_interval, "I", "rssadapt operation interval (ms)");
-#endif
}
+#endif
Index: src/sys/net80211/ieee80211_scan_sw.c
diff -u src/sys/net80211/ieee80211_scan_sw.c:1.1.2.2 src/sys/net80211/ieee80211_scan_sw.c:1.1.2.3
--- src/sys/net80211/ieee80211_scan_sw.c:1.1.2.2 Thu Jul 12 16:35:34 2018
+++ src/sys/net80211/ieee80211_scan_sw.c Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_scan_sw.c,v 1.1.2.2 2018/07/12 16:35:34 phil Exp $ */
+/* $NetBSD: ieee80211_scan_sw.c,v 1.1.2.3 2018/07/20 20:33:05 phil Exp $ */
/*-
* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
@@ -442,7 +442,12 @@ cancel_scan(struct ieee80211vap *vap, in
struct scan_state *ss_priv = SCAN_PRIVATE(ss);
int signal;
+#if __FreeBSD__
IEEE80211_LOCK(ic);
+#elif __NetBSD__
+ /* Is this a lock bug in FreeBSD? */
+ IEEE80211_LOCK_ASSERT(ic);
+#endif
signal = any ? ISCAN_PAUSE : ISCAN_CANCEL;
if ((ic->ic_flags & IEEE80211_F_SCAN) &&
(any || ss->ss_vap == vap) &&
@@ -465,7 +470,9 @@ cancel_scan(struct ieee80211vap *vap, in
(ss->ss_vap == vap ? "match" : "nomatch"),
!! (ss_priv->ss_iflags & signal));
}
+#if __FreeBSD__
IEEE80211_UNLOCK(ic);
+#endif
}
/*
Index: src/sys/net80211/ieee80211_var.h
diff -u src/sys/net80211/ieee80211_var.h:1.33.2.4 src/sys/net80211/ieee80211_var.h:1.33.2.5
--- src/sys/net80211/ieee80211_var.h:1.33.2.4 Mon Jul 16 20:11:11 2018
+++ src/sys/net80211/ieee80211_var.h Fri Jul 20 20:33:05 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_var.h,v 1.33.2.4 2018/07/16 20:11:11 phil Exp $ */
+/* $NetBSD: ieee80211_var.h,v 1.33.2.5 2018/07/20 20:33:05 phil Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -387,8 +387,12 @@ struct ieee80211vap {
struct ifmedia iv_media; /* interface media config */
struct ifnet *iv_ifp; /* associated device */
struct bpf_if *iv_rawbpf; /* packet filter structure */
+#if __FreeBSD__
struct sysctl_ctx_list *iv_sysctl; /* dynamic sysctl context */
struct sysctl_oid *iv_oid; /* net.wlan.X sysctl oid */
+#elif __NetBSD__
+ struct sysctllog *iv_sysctllog; /* for destroying sysctl tree */
+#endif
TAILQ_ENTRY(ieee80211vap) iv_next; /* list of vap instances */
struct ieee80211com *iv_ic; /* back ptr to common state */