summaryrefslogtreecommitdiffstats
path: root/sys/net80211
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2005-12-12 19:07:48 +0000
committersam <sam@FreeBSD.org>2005-12-12 19:07:48 +0000
commitf051015cb92da82137e08a0aeefe9a9a2b6e5dc2 (patch)
tree0cc2c12f18d71195ad0b62f0c438577cd06cce47 /sys/net80211
parenta106e1bec979c9af5d353ad29b0ebd7bd0249e4f (diff)
downloadFreeBSD-src-f051015cb92da82137e08a0aeefe9a9a2b6e5dc2.zip
FreeBSD-src-f051015cb92da82137e08a0aeefe9a9a2b6e5dc2.tar.gz
disallow module unload when there are dynamic references
MFC after: 1 week
Diffstat (limited to 'sys/net80211')
-rw-r--r--sys/net80211/ieee80211_crypto_ccmp.c15
-rw-r--r--sys/net80211/ieee80211_crypto_tkip.c15
-rw-r--r--sys/net80211/ieee80211_crypto_wep.c15
3 files changed, 42 insertions, 3 deletions
diff --git a/sys/net80211/ieee80211_crypto_ccmp.c b/sys/net80211/ieee80211_crypto_ccmp.c
index d0ccc93..2a372f1 100644
--- a/sys/net80211/ieee80211_crypto_ccmp.c
+++ b/sys/net80211/ieee80211_crypto_ccmp.c
@@ -91,6 +91,9 @@ static int ccmp_encrypt(struct ieee80211_key *, struct mbuf *, int hdrlen);
static int ccmp_decrypt(struct ieee80211_key *, u_int64_t pn,
struct mbuf *, int hdrlen);
+/* number of references from net80211 layer */
+static int nrefs = 0;
+
static void *
ccmp_attach(struct ieee80211com *ic, struct ieee80211_key *k)
{
@@ -103,6 +106,7 @@ ccmp_attach(struct ieee80211com *ic, struct ieee80211_key *k)
return NULL;
}
ctx->cc_ic = ic;
+ nrefs++; /* NB: we assume caller locking */
return ctx;
}
@@ -112,6 +116,8 @@ ccmp_detach(struct ieee80211_key *k)
struct ccmp_ctx *ctx = k->wk_private;
FREE(ctx, M_DEVBUF);
+ KASSERT(nrefs > 0, ("imbalanced attach/detach"));
+ nrefs--; /* NB: we assume caller locking */
}
static int
@@ -637,7 +643,14 @@ ccmp_modevent(module_t mod, int type, void *unused)
ieee80211_crypto_register(&ccmp);
return 0;
case MOD_UNLOAD:
- ieee80211_crypto_unregister(&ccmp);
+ case MOD_QUIESCE:
+ if (nrefs) {
+ printf("wlan_ccmp: still in use (%u dynamic refs)\n",
+ nrefs);
+ return EBUSY;
+ }
+ if (type == MOD_UNLOAD)
+ ieee80211_crypto_unregister(&ccmp);
return 0;
}
return EINVAL;
diff --git a/sys/net80211/ieee80211_crypto_tkip.c b/sys/net80211/ieee80211_crypto_tkip.c
index 6775ee7..e3c5de91e 100644
--- a/sys/net80211/ieee80211_crypto_tkip.c
+++ b/sys/net80211/ieee80211_crypto_tkip.c
@@ -106,6 +106,9 @@ static int tkip_encrypt(struct tkip_ctx *, struct ieee80211_key *,
static int tkip_decrypt(struct tkip_ctx *, struct ieee80211_key *,
struct mbuf *, int hdr_len);
+/* number of references from net80211 layer */
+static int nrefs = 0;
+
static void *
tkip_attach(struct ieee80211com *ic, struct ieee80211_key *k)
{
@@ -119,6 +122,7 @@ tkip_attach(struct ieee80211com *ic, struct ieee80211_key *k)
}
ctx->tc_ic = ic;
+ nrefs++; /* NB: we assume caller locking */
return ctx;
}
@@ -128,6 +132,8 @@ tkip_detach(struct ieee80211_key *k)
struct tkip_ctx *ctx = k->wk_private;
FREE(ctx, M_DEVBUF);
+ KASSERT(nrefs > 0, ("imbalanced attach/detach"));
+ nrefs--; /* NB: we assume caller locking */
}
static int
@@ -978,7 +984,14 @@ tkip_modevent(module_t mod, int type, void *unused)
ieee80211_crypto_register(&tkip);
return 0;
case MOD_UNLOAD:
- ieee80211_crypto_unregister(&tkip);
+ case MOD_QUIESCE:
+ if (nrefs) {
+ printf("wlan_tkip: still in use (%u dynamic refs)\n",
+ nrefs);
+ return EBUSY;
+ }
+ if (type == MOD_UNLOAD)
+ ieee80211_crypto_unregister(&tkip);
return 0;
}
return EINVAL;
diff --git a/sys/net80211/ieee80211_crypto_wep.c b/sys/net80211/ieee80211_crypto_wep.c
index 45132419..eb8ad8a 100644
--- a/sys/net80211/ieee80211_crypto_wep.c
+++ b/sys/net80211/ieee80211_crypto_wep.c
@@ -82,6 +82,9 @@ struct wep_ctx {
u_int32_t wc_iv; /* initial vector for crypto */
};
+/* number of references from net80211 layer */
+static int nrefs = 0;
+
static void *
wep_attach(struct ieee80211com *ic, struct ieee80211_key *k)
{
@@ -96,6 +99,7 @@ wep_attach(struct ieee80211com *ic, struct ieee80211_key *k)
ctx->wc_ic = ic;
get_random_bytes(&ctx->wc_iv, sizeof(ctx->wc_iv));
+ nrefs++; /* NB: we assume caller locking */
return ctx;
}
@@ -105,6 +109,8 @@ wep_detach(struct ieee80211_key *k)
struct wep_ctx *ctx = k->wk_private;
FREE(ctx, M_DEVBUF);
+ KASSERT(nrefs > 0, ("imbalanced attach/detach"));
+ nrefs--; /* NB: we assume caller locking */
}
static int
@@ -481,7 +487,14 @@ wep_modevent(module_t mod, int type, void *unused)
ieee80211_crypto_register(&wep);
return 0;
case MOD_UNLOAD:
- ieee80211_crypto_unregister(&wep);
+ case MOD_QUIESCE:
+ if (nrefs) {
+ printf("wlan_wep: still in use (%u dynamic refs)\n",
+ nrefs);
+ return EBUSY;
+ }
+ if (type == MOD_UNLOAD)
+ ieee80211_crypto_unregister(&wep);
return 0;
}
return EINVAL;
OpenPOWER on IntegriCloud