Date: Fri, 1 Feb 2008 21:28:34 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 134606 for review Message-ID: <200802012128.m11LSYE7009234@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=134606 Change 134606 by sam@sam_ebb on 2008/02/01 21:27:39 add evil linker set hackery to handle files w/ multiple instances: o introduce _IEEE80211_PROFILE_MODULE to encapsulate the basic module glop o define other module wrappers in terms of _IEEE80211_PROFILE_MODULE and add wrappers to construct a linker set for sub-instances that the module event handler walks o add nrefs counters to modules since _IEEE80211_PROFILE_MODULE uses this to disallow kldunload when dynamic references are present (in the case of wlan_acl this needed to be done and was not but for some other modules there is no way to manage dynamic refs due to the current api's) o add stub module wrapper for rate control algorithms so we're ready when sephe bringins in his framework Affected files ... .. //depot/projects/vap/sys/net80211/ieee80211_acl.c#8 edit .. //depot/projects/vap/sys/net80211/ieee80211_amrr.c#6 edit .. //depot/projects/vap/sys/net80211/ieee80211_freebsd.h#15 edit .. //depot/projects/vap/sys/net80211/ieee80211_rssadapt.c#2 edit .. //depot/projects/vap/sys/net80211/ieee80211_scan_sta.c#16 edit .. //depot/projects/vap/sys/net80211/ieee80211_xauth.c#8 edit Differences ... ==== //depot/projects/vap/sys/net80211/ieee80211_acl.c#8 (text+ko) ==== @@ -91,6 +91,9 @@ static int acl_free_all(struct ieee80211vap *); +/* number of references from net80211 layer */ +static int nrefs = 0; + static int acl_attach(struct ieee80211vap *vap) { @@ -105,6 +108,7 @@ as->as_policy = ACL_POLICY_OPEN; as->as_vap = vap; vap->iv_as = as; + nrefs++; /* NB: we assume caller locking */ return 1; } @@ -113,6 +117,9 @@ { struct aclstate *as = vap->iv_as; + KASSERT(nrefs > 0, ("imbalanced attach/detach")); + nrefs--; /* NB: we assume caller locking */ + acl_free_all(vap); vap->iv_as = NULL; ACL_LOCK_DESTROY(as); ==== //depot/projects/vap/sys/net80211/ieee80211_amrr.c#6 (text+ko) ==== @@ -64,6 +64,9 @@ #define reset_cnt(amn) \ do { (amn)->amn_txcnt = (amn)->amn_retrycnt = 0; } while (0) +/* number of references from net80211 layer */ +static int nrefs = 0; + void ieee80211_amrr_init(struct ieee80211_amrr *amrr, struct ieee80211vap *vap, int amin, int amax) @@ -140,25 +143,4 @@ /* * Module glue. */ -static int -amrr_modevent(module_t mod, int type, void *unused) -{ - switch (type) { - case MOD_LOAD: - if (bootverbose) - printf("wlan_amrr: <AMRR Transmit Rate Control Algorithm>\n"); - return 0; - case MOD_UNLOAD: - return 0; - } - return EINVAL; -} - -static moduledata_t amrr_mod = { - "wlan_amrr", - amrr_modevent, - 0 -}; -DECLARE_MODULE(wlan_amrr, amrr_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); -MODULE_VERSION(wlan_amrr, 1); -MODULE_DEPEND(wlan_amrr, wlan, 1, 1, 1); +IEEE80211_RATE_MODULE(amrr, 1); ==== //depot/projects/vap/sys/net80211/ieee80211_freebsd.h#15 (text+ko) ==== @@ -283,13 +283,24 @@ void ieee80211_load_module(const char *); -#define IEEE80211_CRYPTO_MODULE(name, version) \ +/* + * A "policy module" is an adjunct module to net80211 that provides + * functionality that typically includes policy decisions. This + * modularity enables extensibility and vendor-supplied functionality. + */ +#define _IEEE80211_POLICY_MODULE(policy, name, version) \ +typedef void (*policy##_setup)(int); \ +SET_DECLARE(policy##_set, policy##_setup); \ static int \ -name##_modevent(module_t mod, int type, void *unused) \ +wlan_##name##_modevent(module_t mod, int type, void *unused) \ { \ + policy##_setup * const *iter, f; \ switch (type) { \ case MOD_LOAD: \ - ieee80211_crypto_register(&name); \ + SET_FOREACH(iter, policy##_set) { \ + f = (void*) *iter; \ + f(type); \ + } \ return 0; \ case MOD_UNLOAD: \ case MOD_QUIESCE: \ @@ -298,100 +309,100 @@ nrefs); \ return EBUSY; \ } \ - if (type == MOD_UNLOAD) \ - ieee80211_crypto_unregister(&name); \ + if (type == MOD_UNLOAD) { \ + SET_FOREACH(iter, policy##_set) { \ + f = (void*) *iter; \ + f(type); \ + } \ + } \ return 0; \ } \ return EINVAL; \ } \ static moduledata_t name##_mod = { \ "wlan_" #name, \ - name##_modevent, \ + wlan_##name##_modevent, \ 0 \ }; \ DECLARE_MODULE(wlan_##name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);\ MODULE_VERSION(wlan_##name, version); \ MODULE_DEPEND(wlan_##name, wlan, 1, 1, 1) -#define IEEE80211_SCANNER_MODULE(name, alg, v, version) \ -static int \ -name##alg##_modevent(module_t mod, int type, void *unused) \ +/* + * Crypto modules implement cipher support. + */ +#define IEEE80211_CRYPTO_MODULE(name, version) \ +_IEEE80211_POLICY_MODULE(crypto, name, version); \ +static void \ +name##_modevent(int type) \ +{ \ + if (type == MOD_LOAD) \ + ieee80211_crypto_register(&name); \ + else \ + ieee80211_crypto_unregister(&name); \ +} \ +TEXT_SET(crypto##_set, name##_modevent) + +/* + * Scanner modules provide scanning policy. + */ +#define IEEE80211_SCANNER_MODULE(name, version) \ + _IEEE80211_POLICY_MODULE(scanner, name, version) + +#define IEEE80211_SCANNER_ALG(name, alg, v) \ +static void \ +name##_modevent(int type) \ { \ - switch (type) { \ - case MOD_LOAD: \ + if (type == MOD_LOAD) \ ieee80211_scanner_register(alg, &v); \ - return 0; \ - case MOD_UNLOAD: \ - case MOD_QUIESCE: \ - if (nrefs) { \ - printf("wlan_##name: still in use (%u dynamic refs)\n",\ - nrefs); \ - return EBUSY; \ - } \ - if (type == MOD_UNLOAD) \ - ieee80211_scanner_unregister(&name); \ - return 0; \ - } \ - return EINVAL; \ + else \ + ieee80211_scanner_unregister(alg, &v); \ } \ -static moduledata_t name##_mod = { \ - "wlan_" #name, \ - name##_modevent, \ - 0 \ -}; \ -DECLARE_MODULE(wlan_##name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);\ -MODULE_VERSION(wlan_##name, version); \ -MODULE_DEPEND(wlan_##name, wlan, 1, 1, 1) +TEXT_SET(scanner_set, name##_modevent); \ +/* + * ACL modules implement acl policy. + */ #define IEEE80211_ACL_MODULE(name, alg, version) \ -static int \ -name##_modevent(module_t mod, int type, void *unused) \ +_IEEE80211_POLICY_MODULE(acl, name, version); \ +static void \ +alg##_modevent(int type) \ { \ - switch (type) { \ - case MOD_LOAD: \ + if (type == MOD_LOAD) \ ieee80211_aclator_register(&alg); \ - return 0; \ - case MOD_UNLOAD: \ - case MOD_QUIESCE: \ - if (type == MOD_UNLOAD) \ - ieee80211_aclator_unregister(&alg); \ - return 0; \ - } \ - return EINVAL; \ + else \ + ieee80211_aclator_unregister(&alg); \ +} \ +TEXT_SET(acl_set, alg##_modevent); \ + +/* + * Authenticator modules handle 802.1x/WPA authentication. + */ +#define IEEE80211_AUTH_MODULE(name, version) \ + _IEEE80211_POLICY_MODULE(auth, name, version) + +#define IEEE80211_AUTH_ALG(name, alg, v) \ +static void \ +name##_modevent(int type) \ +{ \ + if (type == MOD_LOAD) \ + ieee80211_authenticator_register(alg, &v); \ + else \ + ieee80211_authenticator_unregister(alg); \ } \ -static moduledata_t name##_mod = { \ - #name, \ - name##_modevent, \ - 0 \ -}; \ -DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); \ -MODULE_VERSION(name, version); \ -MODULE_DEPEND(name, wlan, 1, 1, 1) +TEXT_SET(auth_set, name##_modevent) -#define IEEE80211_AUTH_MODULE(name, alg, version) \ -static int \ -name##_modevent(module_t mod, int type, void *unused) \ +/* + * Rate control modules provide tx rate control support. + */ +#define IEEE80211_RATE_MODULE(alg, version) \ +_IEEE80211_POLICY_MODULE(rate, alg, version); \ +static void \ +alg##_modevent(int type) \ { \ - switch (type) { \ - case MOD_LOAD: \ - ieee80211_authenticator_register(alg, &name); \ - return 0; \ - case MOD_UNLOAD: \ - case MOD_QUIESCE: \ - if (type == MOD_UNLOAD) \ - ieee80211_authenticator_unregister(alg); \ - return 0; \ - } \ - return EINVAL; \ + /* XXX nothing to do until the rate control framework arrives */\ } \ -static moduledata_t name##_mod = { \ - #name, \ - name##_modevent, \ - 0 \ -}; \ -DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); \ -MODULE_VERSION(name, version); \ -MODULE_DEPEND(name, wlan, 1, 1, 1) +TEXT_SET(rate##_set, alg##_modevent) #endif /* _KERNEL */ /* XXX this stuff belongs elsewhere */ ==== //depot/projects/vap/sys/net80211/ieee80211_rssadapt.c#2 (text+ko) ==== @@ -71,6 +71,9 @@ (parm##_denom - parm##_old) * (new)) / \ parm##_denom) +/* number of references from net80211 layer */ +static int nrefs = 0; + void ieee80211_rssadapt_init(struct ieee80211_rssadapt *rs, struct ieee80211vap *vap) { @@ -220,3 +223,8 @@ else rssadapt_lower_rate(rn, pktlen, rate, rssi); } + +/* + * Module glue. + */ +IEEE80211_RATE_MODULE(rssadapt, 1); ==== //depot/projects/vap/sys/net80211/ieee80211_scan_sta.c#16 (text+ko) ==== @@ -1646,7 +1646,6 @@ IEEE80211_SCANNER_MODULE(adhoc, IEEE80211_M_IBSS, adhoc_default, 1); IEEE80211_SCANNER_MODULE(adhoc, IEEE80211_M_AHDEMO, adhoc_default, 1); IEEE80211_SCANNER_MODULE(ap, IEEE80211_M_HOSTAP, ap_default, 1); -#else static int wlan_scan_modevent(module_t mod, int type, void *unused) { @@ -1682,3 +1681,91 @@ MODULE_VERSION(wlan_scan_sta, 1); MODULE_DEPEND(wlan_scan_sta, wlan, 1, 1, 1); #endif +#if 0 +typedef void (*scanner_setup)(int); +SET_DECLARE(scanner_set, scanner_setup); + +static int +wlan_scan_modevent(module_t mod, int type, void *unused) +{ + scanner_setup * const *iter, f; + + switch (type) { + case MOD_LOAD: + SET_FOREACH(iter, scanner_set) { + f = (void*) *iter; + f(type); + } + return 0; + case MOD_UNLOAD: + case MOD_QUIESCE: + if (nrefs) { + printf("wlan_scan: still in use (%u dynamic refs)\n", + nrefs); + return EBUSY; + } + if (type == MOD_UNLOAD) { + SET_FOREACH(iter, scanner_set) { + f = (void*) *iter; + f(type); + } + } + return 0; + } + return EINVAL; +} +static moduledata_t wlan_scan_mod = { + "wlan_scan_sta", + wlan_scan_modevent, + 0 +}; +DECLARE_MODULE(wlan_scan_sta, wlan_scan_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); +MODULE_VERSION(wlan_scan_sta, 1); +MODULE_DEPEND(wlan_scan_sta, wlan, 1, 1, 1); + +static void +sta_modevent(int type) +{ + if (type == MOD_LOAD) + ieee80211_scanner_register(IEEE80211_M_STA, &sta_default); + else + ieee80211_scanner_unregister(IEEE80211_M_STA, &sta_default); +} +TEXT_SET(scanner_set, sta_modevent); + +static void +ibss_modevent(int type) +{ + if (type == MOD_LOAD) + ieee80211_scanner_register(IEEE80211_M_IBSS, &adhoc_default); + else + ieee80211_scanner_unregister(IEEE80211_M_IBSS, &adhoc_default); +} +TEXT_SET(scanner_set, ibss_modevent); + +static void +ahdemo_modevent(int type) +{ + if (type == MOD_LOAD) + ieee80211_scanner_register(IEEE80211_M_AHDEMO, &adhoc_default); + else + ieee80211_scanner_unregister(IEEE80211_M_AHDEMO, &adhoc_default); +} +TEXT_SET(scanner_set, ahdemo_modevent); + +static void +ap_modevent(int type) +{ + if (type == MOD_LOAD) + ieee80211_scanner_register(IEEE80211_M_HOSTAP, &ap_default); + else + ieee80211_scanner_unregister(IEEE80211_M_HOSTAP, &ap_default); +} +TEXT_SET(scanner_set, ap_modevent); +#else +IEEE80211_SCANNER_MODULE(sta, 1); +IEEE80211_SCANNER_ALG(sta, IEEE80211_M_STA, sta_default); +IEEE80211_SCANNER_ALG(ibss, IEEE80211_M_IBSS, adhoc_default); +IEEE80211_SCANNER_ALG(ahdemo, IEEE80211_M_AHDEMO, adhoc_default); +IEEE80211_SCANNER_ALG(ap, IEEE80211_M_HOSTAP, ap_default); +#endif ==== //depot/projects/vap/sys/net80211/ieee80211_xauth.c#8 (text+ko) ==== @@ -56,6 +56,9 @@ #include <net80211/ieee80211_var.h> +/* XXX number of references from net80211 layer; needed for module code */ +static int nrefs = 0; + /* * One module handles everything for now. May want * to split things up for embedded applications. @@ -68,34 +71,6 @@ .ia_node_leave = NULL, }; -#if 0 -IEEE80211_AUTH_MODULE(xauth, IEEE80211_AUTH_8021X, 1); -IEEE80211_AUTH_MODULE(xauth, IEEE80211_AUTH_WPA, 1); -#else -static int -wlan_xauth_modevent(module_t mod, int type, void *unused) -{ - switch (type) { - case MOD_LOAD: - ieee80211_authenticator_register(IEEE80211_AUTH_8021X, &xauth); - ieee80211_authenticator_register(IEEE80211_AUTH_WPA, &xauth); - return 0; - case MOD_UNLOAD: - case MOD_QUIESCE: - if (type == MOD_UNLOAD) { - ieee80211_authenticator_unregister(IEEE80211_AUTH_8021X); - ieee80211_authenticator_unregister(IEEE80211_AUTH_WPA); - } - return 0; - } - return EINVAL; -} -static moduledata_t wlan_xauth_mod = { - "wlan_xauth", - wlan_xauth_modevent, - 0 -}; -DECLARE_MODULE(wlan_xauth, wlan_xauth_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); -MODULE_VERSION(wlan_xauth, 1); -MODULE_DEPEND(wlan_xauth, wlan, 1, 1, 1); -#endif +IEEE80211_AUTH_MODULE(xauth, 1); +IEEE80211_AUTH_ALG(x8021x, IEEE80211_AUTH_8021X, xauth); +IEEE80211_AUTH_ALG(wpa, IEEE80211_AUTH_WPA, xauth);help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802012128.m11LSYE7009234>
