Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/phil-wifi]: src/sys State save.



details:   https://anonhg.NetBSD.org/src/rev/65756278c0c0
branches:  phil-wifi
changeset: 850613:65756278c0c0
user:      phil <phil%NetBSD.org@localhost>
date:      Mon Jul 16 20:11:11 2018 +0000

description:
State save.
urtwn now can attach and shows up in the "ifconfig -a" list.

diffstat:

 sys/dev/usb/if_urtwn.c                |  179 ++++++++++++++++++++++++---------
 sys/dev/usb/if_urtwnvar.h             |    8 +-
 sys/net80211/ieee80211.c              |   46 +++++++-
 sys/net80211/ieee80211_acl.c          |   10 +-
 sys/net80211/ieee80211_amrr.c         |   10 +-
 sys/net80211/ieee80211_crypto.c       |   11 +-
 sys/net80211/ieee80211_crypto_tkip.c  |   12 ++-
 sys/net80211/ieee80211_crypto_wep.c   |    8 +-
 sys/net80211/ieee80211_ht.c           |    6 +-
 sys/net80211/ieee80211_hwmp.c         |    7 +-
 sys/net80211/ieee80211_input.c        |   10 +-
 sys/net80211/ieee80211_ioctl.c        |   13 ++-
 sys/net80211/ieee80211_mesh.c         |   20 +++-
 sys/net80211/ieee80211_netbsd.c       |   37 +++---
 sys/net80211/ieee80211_netbsd.h       |    5 +-
 sys/net80211/ieee80211_node.c         |   19 +++-
 sys/net80211/ieee80211_output.c       |    8 +-
 sys/net80211/ieee80211_proto.c        |   45 +++++++-
 sys/net80211/ieee80211_proto.h        |   15 ++-
 sys/net80211/ieee80211_ratectl.c      |   32 +++++-
 sys/net80211/ieee80211_ratectl.h      |    5 +-
 sys/net80211/ieee80211_ratectl_none.c |   11 +-
 sys/net80211/ieee80211_rssadapt.c     |   10 +-
 sys/net80211/ieee80211_scan.c         |   11 +-
 sys/net80211/ieee80211_scan_sta.c     |   11 +-
 sys/net80211/ieee80211_var.h          |    9 +-
 sys/net80211/ieee80211_xauth.c        |   10 +-
 27 files changed, 427 insertions(+), 141 deletions(-)

diffs (truncated from 1546 to 300 lines):

diff -r a52b59d21a58 -r 65756278c0c0 sys/dev/usb/if_urtwn.c
--- a/sys/dev/usb/if_urtwn.c    Thu Jul 12 16:35:33 2018 +0000
+++ b/sys/dev/usb/if_urtwn.c    Mon Jul 16 20:11:11 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_urtwn.c,v 1.59.2.1 2018/07/12 16:35:33 phil Exp $   */
+/*     $NetBSD: if_urtwn.c,v 1.59.2.2 2018/07/16 20:11:11 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.1 2018/07/12 16:35:33 phil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.59.2.2 2018/07/16 20:11:11 phil Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -37,6 +37,7 @@
 #include <sys/sysctl.h>
 #include <sys/mbuf.h>
 #include <sys/kernel.h>
+#include <sys/kmem.h>
 #include <sys/socket.h>
 #include <sys/systm.h>
 #include <sys/module.h>
@@ -92,7 +93,8 @@
 #define        DBG_RF          __BIT(5)
 #define        DBG_REG         __BIT(6)
 #define        DBG_ALL         0xffffffffU
-u_int urtwn_debug = 0;
+/* NNN Reset urtwn_debug to 0 when done debugging. */
+u_int urtwn_debug = DBG_INIT|DBG_FN|DBG_STM;
 #define DPRINTFN(n, s) \
        do { if (urtwn_debug & (n)) printf s; } while (/*CONSTCOND*/0)
 #else
@@ -258,7 +260,7 @@
 static void    urtwn_calib_to(void *);
 static void    urtwn_calib_to_cb(struct urtwn_softc *, void *);
 static void    urtwn_next_scan(void *);
-static int     urtwn_newstate(struct urtwn_softc *, enum ieee80211_state,
+static int     urtwn_newstate(struct ieee80211vap *, enum ieee80211_state,
                    int);
 static void    urtwn_newstate_cb(struct urtwn_softc *, void *);
 static int     urtwn_wme_update(struct ieee80211com *);
@@ -275,7 +277,6 @@
                urtwn_get_tx_data(struct urtwn_softc *, size_t);
 static void    urtwn_start(struct ifnet *);
 static void    urtwn_watchdog(struct ifnet *);
-static int     urtwn_ioctl(struct ifnet *, u_long, void *);
 static int     urtwn_r92c_power_on(struct urtwn_softc *);
 static int     urtwn_r92e_power_on(struct urtwn_softc *);
 static int     urtwn_r88e_power_on(struct urtwn_softc *);
@@ -306,10 +307,17 @@
 static void    urtwn_temp_calib(struct urtwn_softc *);
 static int     urtwn_init(struct ifnet *);
 static void    urtwn_stop(struct ifnet *, int);
-static int     urtwn_reset(struct ifnet *);
+static int     urtwn_reset(struct ieee80211vap *, u_long);
 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);
+static struct ieee80211vap *
+               urtwn_vap_create(struct ieee80211com *,
+                   const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
+                   const uint8_t [IEEE80211_ADDR_LEN],
+                   const uint8_t [IEEE80211_ADDR_LEN]);
+static void    urtwn_vap_delete(struct ieee80211vap *);
+static int     urtwn_ioctl(struct ifnet *, u_long, void *);
 
 /* Aliases. */
 #define        urtwn_bb_write  urtwn_write_4
@@ -339,7 +347,6 @@
 {
        struct urtwn_softc *sc = device_private(self);
        struct ieee80211com *ic = &sc->sc_ic;
-       struct ifnet *ifp = &sc->sc_if;
        struct usb_attach_arg *uaa = aux;
        char *devinfop;
        const struct urtwn_dev *dev;
@@ -447,8 +454,7 @@
        /*
         * Setup the 802.11 device.
         */
-       /* ic->ic_ifp = ifp; NNN need to do this later... */
-       /* ic->ic_state = IEEE80211_S_INIT; NNN do this to the vap */
+       ic->ic_softc = sc;
        ic->ic_phytype = IEEE80211_T_OFDM;      /* Not only, but not used. */
        ic->ic_opmode = IEEE80211_M_STA;        /* Default to BSS mode. */
 
@@ -462,8 +468,11 @@
            IEEE80211_C_WME |           /* 802.11e */
            IEEE80211_C_WPA;            /* 802.11i */
 
+       ic->ic_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+
        /* Set supported .11b and .11g channels (1 through 14). */
-       for (i = 1; i <= 14; i++) {
+       ic->ic_nchans = 14;  /* NNN ? get this from somewhere? */
+       for (i = 0; i < 14; i++) {
                ic->ic_channels[i].ic_freq =
                    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
                ic->ic_channels[i].ic_flags =
@@ -471,33 +480,34 @@
                    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
        }
 
-       ifp->if_softc = sc;
-       ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
-       ifp->if_init = urtwn_init;
-       ifp->if_ioctl = urtwn_ioctl;
-       ifp->if_start = urtwn_start;
-       ifp->if_watchdog = urtwn_watchdog;
-       IFQ_SET_READY(&ifp->if_snd);
-       memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
-
-       if_attach(ifp);
+       printf ("eurtwn: Calling ieee80211_ifattach()\n");
+
        ieee80211_ifattach(ic);
 
+       printf ("urtwn: Returned from ieee80211_ifattach().\n");
+
        /* override default methods NNN Need a lot more here!!! */
        ic->ic_newassoc = urtwn_newassoc;
        ic->ic_wme.wme_update = urtwn_wme_update;
-
-#if  0
-       /* XXX .... vap routines ... in vap_create? */
-       vap->iv_reset = urtwn_reset;
-
-       /* Override state transition machine. */
-       sc->sc_newstate = ic->ic_newstate;
-       ic->ic_newstate = urtwn_newstate;
-       ieee80211_media_init(ic, urtwn_media_change, ieee80211_media_status);
-#endif
-
-       bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
+       ic->ic_vap_create = urtwn_vap_create;
+       ic->ic_vap_delete = urtwn_vap_delete;
+
+       /* Shouldn't do it, but call vap_create??? */
+       uint8_t bssid[IEEE80211_ADDR_LEN] = {0};
+
+       struct ieee80211vap *vap =
+           urtwn_vap_create(ic, device_xname(sc->sc_dev),
+               device_unit(sc->sc_dev), IEEE80211_M_IBSS,
+               IEEE80211_CLONE_MACADDR, bssid, ic->ic_macaddr);
+
+       if (vap == NULL) {
+               /* Didn't work ... now what! */
+               printf ("vap_create didn't work ...\n");
+               ieee80211_ifdetach(ic);
+               goto fail;
+       }
+
+       bpf_attach2(vap->iv_ifp, DLT_IEEE802_11_RADIO,
            sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
            &sc->sc_drvbpf);
 
@@ -517,6 +527,7 @@
                aprint_error_dev(self, "couldn't establish power handler\n");
 
        SET(sc->sc_flags, URTWN_FLAG_ATTACHED);
+printf ("urtwn: Finished attach.\n");
        return;
 
  fail:
@@ -528,7 +539,6 @@
 urtwn_detach(device_t self, int flags)
 {
        struct urtwn_softc *sc = device_private(self);
-       struct ifnet *ifp = &sc->sc_if;
        int s;
 
        DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
@@ -544,12 +554,8 @@
 
        if (ISSET(sc->sc_flags, URTWN_FLAG_ATTACHED)) {
                usb_rem_task(sc->sc_udev, &sc->sc_task);
-               urtwn_stop(ifp, 0);
-
-               ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
-               bpf_detach(ifp);
+
                ieee80211_ifdetach(&sc->sc_ic);
-               if_detach(ifp);
 
                /* Close Tx/Rx pipes.  Abort done by urtwn_stop. */
                urtwn_close_pipes(sc);
@@ -574,18 +580,14 @@
 static int
 urtwn_activate(device_t self, enum devact act)
 {
-#if notyet
        struct urtwn_softc *sc = device_private(self);
-#endif
 
        DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
 
        switch (act) {
        case DVACT_DEACTIVATE:
-#if notyet
-               FOR_EACH(vap in  sc->sc_vaps)  ???
-               if_deactivate(vap->iv_ifp);
-#endif
+               if_deactivate(TAILQ_FIRST(&(sc->sc_ic.ic_vaps))->iv_ifp);
+
                return 0;
        default:
                return EOPNOTSUPP;
@@ -1832,8 +1834,9 @@
 }
 
 static __unused int
-urtwn_newstate(struct urtwn_softc *sc, enum ieee80211_state nstate, int arg)
+urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
 {
+       struct urtwn_softc *sc = vap->iv_ic->ic_softc;
        struct urtwn_cmd_newstate cmd;
 
        DPRINTFN(DBG_FN, ("%s: %s: nstate=%s(%d), arg=%d\n",
@@ -2151,7 +2154,7 @@
                break;
        }
 
-       (*sc->sc_newstate)(ic, nstate, cmd->arg);
+       (*sc->sc_newstate)(vap, nstate, cmd->arg);
 
        mutex_exit(&sc->sc_write_mtx);
        splx(s);
@@ -2561,7 +2564,7 @@
 {
        struct urtwn_tx_data *data = priv;
        struct urtwn_softc *sc = data->sc;
-       struct ifnet *ifp = &sc->sc_if;
+       struct ifnet *ifp = TAILQ_FIRST(&sc->sc_ic.ic_vaps)->iv_ifp;
        size_t pidx = data->pidx;
        int s;
 
@@ -2955,10 +2958,85 @@
 //NNN  ieee80211_watchdog(&sc->sc_ic);  Not sure what is happening!
 }
 
+/*
+ *  Create a VAP node for use with the urtwn driver.
+ */
+
+static struct ieee80211vap *
+urtwn_vap_create(struct ieee80211com *ic,  const char name[IFNAMSIZ],
+    int  unit, enum ieee80211_opmode opmode, int flags,
+    const uint8_t bssid[IEEE80211_ADDR_LEN],
+    const uint8_t macaddr[IEEE80211_ADDR_LEN])
+{
+       printf ("in urtwn_vap_create ... \n");
+
+       struct urtwn_softc *sc = ic->ic_softc;
+       struct ifnet *ifp;
+       struct ieee80211vap *vap;
+
+       DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
+
+       /* Allow only one VAP for the urtwn driver. */
+       if (!TAILQ_EMPTY(&ic->ic_vaps))
+               return NULL;
+
+       /* Allocate the vap and setup. */
+       vap = kmem_zalloc(sizeof(struct ieee80211vap), KM_SLEEP);
+       if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
+           flags | IEEE80211_CLONE_NOBEACONS, bssid) != 0) {
+               kmem_free(vap, sizeof(struct ieee80211vap));
+               return NULL;
+       }
+
+       printf ("vap_create:  after vap_setup\n");
+
+       /* Local setup */
+       vap->iv_reset = urtwn_reset;
+
+       ifp = vap->iv_ifp;
+       ifp->if_init = urtwn_init;
+       ifp->if_ioctl = urtwn_ioctl;
+       ifp->if_start = urtwn_start;
+       ifp->if_watchdog = urtwn_watchdog;
+       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;
+
+       /* Finish setup */
+       ieee80211_vap_attach(vap, urtwn_media_change,
+           ieee80211_media_status, macaddr);
+       ic->ic_opmode = opmode;
+
+       return vap;



Home | Main Index | Thread Index | Old Index