From owner-p4-projects@FreeBSD.ORG Wed Nov 10 21:14:33 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 35DAD16A4D0; Wed, 10 Nov 2004 21:14:33 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1110E16A4CE for ; Wed, 10 Nov 2004 21:14:33 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id D73E243D48 for ; Wed, 10 Nov 2004 21:14:32 +0000 (GMT) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.11/8.12.11) with ESMTP id iAALEWuF049567 for ; Wed, 10 Nov 2004 21:14:32 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.11/8.12.11/Submit) id iAALEWFl049564 for perforce@freebsd.org; Wed, 10 Nov 2004 21:14:32 GMT (envelope-from sam@freebsd.org) Date: Wed, 10 Nov 2004 21:14:32 GMT Message-Id: <200411102114.iAALEWFl049564@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Subject: PERFORCE change 64838 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Nov 2004 21:14:33 -0000 http://perforce.freebsd.org/chv.cgi?CH=64838 Change 64838 by sam@sam_ebb on 2004/11/10 21:13:51 o overhaul sysctl stuff; root everything under net.wlan and add dynamic mib vars o fixup debugging msgs to use the per-instance control o lock virtual ap list and add dumb vap numbering for the dynamic sysctls (need to fix to reuse previously unallocated but unused numbers) o remove inactivity timer ioctls; use sysctls instead o fix bug reclaiming embryonic node state; don't free directly; use the refcnt mechanism like everywhere else Affected files ... .. //depot/projects/wifi/sys/net80211/ieee80211.c#5 edit .. //depot/projects/wifi/sys/net80211/ieee80211_freebsd.c#3 edit .. //depot/projects/wifi/sys/net80211/ieee80211_freebsd.h#4 edit .. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#12 edit .. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#6 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.c#11 edit .. //depot/projects/wifi/sys/net80211/ieee80211_var.h#7 edit Differences ... ==== //depot/projects/wifi/sys/net80211/ieee80211.c#5 (text+ko) ==== @@ -40,7 +40,6 @@ #include #include #include -#include #include @@ -52,12 +51,6 @@ #include -#ifdef IEEE80211_DEBUG -int ieee80211_debug = 0; -SYSCTL_INT(_debug, OID_AUTO, ieee80211, CTLFLAG_RW, &ieee80211_debug, - 0, "IEEE 802.11 media debugging printfs"); -#endif - static void ieee80211_set11gbasicrates(struct ieee80211_rateset *, enum ieee80211_phymode); @@ -74,6 +67,9 @@ SLIST_HEAD(ieee80211_list, ieee80211com); static struct ieee80211_list ieee80211_list = SLIST_HEAD_INITIALIZER(ieee80211_list); +static int ieee80211_vap = 0; /* next avail vap number */ +static struct mtx ieee80211_vap_mtx; +MTX_SYSINIT(ieee80211, &ieee80211_vap_mtx, "net80211 instances", MTX_DEF); void ieee80211_ifattach(struct ieee80211com *ic) @@ -138,8 +134,12 @@ ieee80211_node_attach(ic); ieee80211_proto_attach(ic); - /* XXX lock */ + mtx_lock(&ieee80211_vap_mtx); + ic->ic_vap = ieee80211_vap++; /* XXX use bitmap */ SLIST_INSERT_HEAD(&ieee80211_list, ic, ic_next); + mtx_unlock(&ieee80211_vap_mtx); + + ieee80211_sysctl_attach(ic); /* NB: requires ic_vap */ } void @@ -147,9 +147,11 @@ { struct ifnet *ifp = ic->ic_ifp; - /* XXX lock */ + mtx_lock(&ieee80211_vap_mtx); SLIST_REMOVE(&ieee80211_list, ic, ieee80211com, ic_next); + mtx_unlock(&ieee80211_vap_mtx); + ieee80211_sysctl_detach(ic); ieee80211_proto_detach(ic); ieee80211_crypto_detach(ic); ieee80211_node_detach(ic); ==== //depot/projects/wifi/sys/net80211/ieee80211_freebsd.c#3 (text+ko) ==== @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -46,6 +47,78 @@ #include +SYSCTL_NODE(_net, OID_AUTO, wlan, CTLFLAG_RD, 0, "IEEE 80211 parameters"); + +#ifdef IEEE80211_DEBUG +int ieee80211_debug = 0; +SYSCTL_INT(_net_wlan, OID_AUTO, debug, CTLFLAG_RW, &ieee80211_debug, + 0, "debugging printfs"); +#endif + +static int +ieee80211_sysctl_inact(SYSCTL_HANDLER_ARGS) +{ + int inact = (*(int *)arg1) * IEEE80211_INACT_WAIT; + int error; + + error = sysctl_handle_int(oidp, &inact, 0, req); + if (error || !req->newptr) + return error; + *(int *)arg1 = inact / IEEE80211_INACT_WAIT; + return 0; +} + +void +ieee80211_sysctl_attach(struct ieee80211com *ic) +{ + struct sysctl_ctx_list *ctx; + struct sysctl_oid *oid; + char num[14]; /* sufficient for 32 bits */ + + MALLOC(ctx, struct sysctl_ctx_list *, sizeof(struct sysctl_ctx_list), + M_DEVBUF, M_NOWAIT | M_ZERO); + if (ctx == NULL) { + if_printf(ic->ic_ifp, "%s: cannot allocate sysctl context!\n", + __func__); + return; + } + sysctl_ctx_init(ctx); + snprintf(num, sizeof(num), "%u", ic->ic_vap); + /* XXX wlan.%d with vap support */ + oid = SYSCTL_ADD_NODE(ctx, &SYSCTL_NODE_CHILDREN(_net, wlan), + OID_AUTO, num, CTLFLAG_RD, NULL, ""); +#ifdef IEEE80211_DEBUG + ic->ic_debug = ieee80211_debug; + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "debug", CTLFLAG_RW, &ic->ic_debug, 0, + "control debugging printfs"); +#endif + /* XXX inherit from tunables */ + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "inact", CTLTYPE_INT | CTLFLAG_RW, &ic->ic_inact_run, 0, + ieee80211_sysctl_inact, "I", + "station inactivity timeout (sec)"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "inact_auth", CTLTYPE_INT | CTLFLAG_RW, &ic->ic_inact_auth, 0, + ieee80211_sysctl_inact, "I", + "station authentication timeout (sec)"); + SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(oid), OID_AUTO, + "inact_init", CTLTYPE_INT | CTLFLAG_RW, &ic->ic_inact_init, 0, + ieee80211_sysctl_inact, "I", + "station initial state timeout (sec)"); + ic->ic_sysctl = ctx; +} + +void +ieee80211_sysctl_detach(struct ieee80211com *ic) +{ + + if (ic->ic_sysctl != NULL) { + sysctl_ctx_free(ic->ic_sysctl); + ic->ic_sysctl = NULL; + } +} + int ieee80211_node_dectestref(struct ieee80211_node *ni) { ==== //depot/projects/wifi/sys/net80211/ieee80211_freebsd.h#4 (text+ko) ==== @@ -94,6 +94,12 @@ extern void get_random_bytes(void *, size_t); +struct ieee80211com; + +void ieee80211_sysctl_attach(struct ieee80211com *); +void ieee80211_sysctl_detach(struct ieee80211com *); + +/* XXX this stuff belongs elsewhere */ /* * Message formats for messages from the net80211 layer to user * applications via the routing socket. These messages are appended ==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#12 (text+ko) ==== @@ -1290,15 +1290,6 @@ case IEEE80211_IOC_STA_STATS: error = ieee80211_ioctl_getstastats(ic, ireq); break; - case IEEE80211_IOC_INACT: - ireq->i_val = ic->ic_inact_run * IEEE80211_INACT_WAIT; - break; - case IEEE80211_IOC_INACT_AUTH: - ireq->i_val = ic->ic_inact_auth * IEEE80211_INACT_WAIT; - break; - case IEEE80211_IOC_INACT_INIT: - ireq->i_val = ic->ic_inact_init * IEEE80211_INACT_WAIT; - break; case IEEE80211_IOC_STA_INFO: error = ieee80211_ioctl_getstainfo(ic, ireq); break; @@ -1974,15 +1965,6 @@ case IEEE80211_IOC_MACCMD: error = ieee80211_ioctl_maccmd(ic, ireq); break; - case IEEE80211_IOC_INACT: - ic->ic_inact_run = ireq->i_val / IEEE80211_INACT_WAIT; - break; - case IEEE80211_IOC_INACT_AUTH: - ic->ic_inact_auth = ireq->i_val / IEEE80211_INACT_WAIT; - break; - case IEEE80211_IOC_INACT_INIT: - ic->ic_inact_init = ireq->i_val / IEEE80211_INACT_WAIT; - break; default: error = EINVAL; break; ==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#6 (text+ko) ==== @@ -377,9 +377,7 @@ #define IEEE80211_IOC_WPAIE 39 /* WPA information element */ #define IEEE80211_IOC_STA_STATS 40 /* per-station statistics */ #define IEEE80211_IOC_MACCMD 41 /* MAC ACL operation */ -#define IEEE80211_IOC_INACT 42 /* station inactivity timeout */ -#define IEEE80211_IOC_INACT_AUTH 43 /* station auth inact timeout */ -#define IEEE80211_IOC_INACT_INIT 44 /* station init inact timeout */ +/* 42-44 available */ #define IEEE80211_IOC_STA_INFO 45 /* station/neighbor info */ #ifndef IEEE80211_CHAN_ANY ==== //depot/projects/wifi/sys/net80211/ieee80211_node.c#11 (text+ko) ==== @@ -163,7 +163,7 @@ { if (ic->ic_bss != NULL) { - ic->ic_node_free(ic->ic_bss); + ieee80211_free_node(ic->ic_bss); ic->ic_bss = NULL; } ieee80211_node_table_cleanup(&ic->ic_scan); @@ -1657,7 +1657,7 @@ ieee80211_node_table_reset(struct ieee80211_node_table *nt) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, + IEEE80211_DPRINTF(nt->nt_ic, IEEE80211_MSG_NODE, "%s %s table\n", __func__, nt->nt_name); IEEE80211_NODE_LOCK(nt); @@ -1670,7 +1670,7 @@ ieee80211_node_table_cleanup(struct ieee80211_node_table *nt) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, + IEEE80211_DPRINTF(nt->nt_ic, IEEE80211_MSG_NODE, "%s %s table\n", __func__, nt->nt_name); ieee80211_free_allnodes_locked(nt); @@ -1684,7 +1684,7 @@ ieee80211_node_table_free(struct ieee80211_node_table *nt) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, + IEEE80211_DPRINTF(nt->nt_ic, IEEE80211_MSG_NODE, "%s %s table\n", __func__, nt->nt_name); IEEE80211_NODE_LOCK(nt); ==== //depot/projects/wifi/sys/net80211/ieee80211_var.h#7 (text+ko) ==== @@ -187,12 +187,15 @@ #define IEEE80211_PS_MAX_QUEUE 50 /* maximum saved packets */ struct ieee80211_aclator; +struct sysctl_ctx_list; struct ieee80211com { SLIST_ENTRY(ieee80211com) ic_next; struct ifnet *ic_ifp; /* associated device */ struct ieee80211_stats ic_stats; /* statistics */ + struct sysctl_ctx_list *ic_sysctl; /* dynamic sysctl context */ u_int32_t ic_debug; /* debug msg flags */ + int ic_vap; /* virtual AP index */ int (*ic_reset)(struct ifnet *); void (*ic_recv_mgmt)(struct ieee80211com *, @@ -257,7 +260,7 @@ * Inactivity timer settings for nodes. */ int ic_inact_init; /* initial setting */ - int ic_inact_auth; /* assoc but not auth setting */ + int ic_inact_auth; /* auth but not assoc setting */ int ic_inact_run; /* authorized setting */ /* @@ -395,7 +398,6 @@ #define IEEE80211_MSG_ANY 0xffffffff /* anything */ #ifdef IEEE80211_DEBUG -#ifdef notyet #define IEEE80211_DPRINTF(_ic, _m, _fmt, ...) do { \ if (_ic->ic_debug & (_m)) \ printf(_fmt, __VA_ARGS__); \ @@ -415,27 +417,6 @@ #define ieee80211_msg_scan(_ic) \ ((_ic)->ic_debug & IEEE80211_MSG_SCAN) #else -extern int ieee80211_debug; -#define IEEE80211_DPRINTF(_ic, _m, _fmt, ...) do { \ - if (ieee80211_debug & (_m)) \ - printf(_fmt, __VA_ARGS__); \ -} while (0) -#define ieee80211_msg_debug(_ic) \ - (ieee80211_debug & IEEE80211_MSG_DEBUG) -#define ieee80211_msg_dumppkts(_ic) \ - (ieee80211_debug & IEEE80211_MSG_DUMPPKTS) -#define ieee80211_msg_input(_ic) \ - (ieee80211_debug & IEEE80211_MSG_INPUT) -#define ieee80211_msg_radius(_ic) \ - (ieee80211_debug & IEEE80211_MSG_RADIUS) -#define ieee80211_msg_dumpradius(_ic) \ - (ieee80211_debug & IEEE80211_MSG_RADDUMP) -#define ieee80211_msg_dumpradkeys(_ic) \ - (ieee80211_debug & IEEE80211_MSG_RADKEYS) -#define ieee80211_msg_scan(_ic) \ - (ieee80211_debug & IEEE80211_MSG_SCAN) -#endif -#else #define IEEE80211_DPRINTF(_ic, _m, _fmt, ...) #endif