aboutsummaryrefslogtreecommitdiff
path: root/sys/net80211/ieee80211_crypto_ccmp.c
diff options
context:
space:
mode:
authorSam Leffler <sam@FreeBSD.org>2005-12-12 19:07:48 +0000
committerSam Leffler <sam@FreeBSD.org>2005-12-12 19:07:48 +0000
commitd16441fde123bf9c7c3ea8fb4da5445f28a3fb37 (patch)
tree0cc2c12f18d71195ad0b62f0c438577cd06cce47 /sys/net80211/ieee80211_crypto_ccmp.c
parent1fd2349de846a8792cf07fb5c42880bc9408f95e (diff)
downloadsrc-d16441fde123bf9c7c3ea8fb4da5445f28a3fb37.tar.gz
src-d16441fde123bf9c7c3ea8fb4da5445f28a3fb37.zip
disallow module unload when there are dynamic references
MFC after: 1 week
Notes
Notes: svn path=/head/; revision=153353
Diffstat (limited to 'sys/net80211/ieee80211_crypto_ccmp.c')
-rw-r--r--sys/net80211/ieee80211_crypto_ccmp.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/net80211/ieee80211_crypto_ccmp.c b/sys/net80211/ieee80211_crypto_ccmp.c
index d0ccc9313474..2a372f1ee0b2 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;