disallow module unload when there are dynamic references

MFC after:	1 week
This commit is contained in:
Sam Leffler 2005-12-12 19:07:48 +00:00
parent 1fd2349de8
commit d16441fde1
3 changed files with 42 additions and 3 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;