diff options
author | sam <sam@FreeBSD.org> | 2008-05-12 00:15:30 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2008-05-12 00:15:30 +0000 |
commit | f663b621286051ac42452779cf814624994dae88 (patch) | |
tree | 3cf79416d2ad19b6945f31a06a6e43e73f0d5527 /sys/net80211/ieee80211_freebsd.c | |
parent | 544a240c14d88ab9e4515a136add5e80481a9d28 (diff) | |
download | FreeBSD-src-f663b621286051ac42452779cf814624994dae88.zip FreeBSD-src-f663b621286051ac42452779cf814624994dae88.tar.gz |
Minor cleanup of vap create work:
o add IEEE80211_C_STA capability to indicate sta mode is supported
(was previously assumed) and mark drivers as capable
o add ieee80211_opcap array to map an opmode to the equivalent capability bit
o move IEEE80211_C_OPMODE definition to where capabilities are defined so it's
clear it should be kept in sync (on future additions)
o check device capabilities in clone create before trying to create a vap;
this makes driver checks unneeded
o make error codes return on failed clone request unique
o temporarily add console printfs on clone request failures to aid in
debugging; these will move under DIAGNOSTIC or similar before release
Diffstat (limited to 'sys/net80211/ieee80211_freebsd.c')
-rw-r--r-- | sys/net80211/ieee80211_freebsd.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/net80211/ieee80211_freebsd.c b/sys/net80211/ieee80211_freebsd.c index d0b1b69..c0c1474 100644 --- a/sys/net80211/ieee80211_freebsd.c +++ b/sys/net80211/ieee80211_freebsd.c @@ -108,11 +108,22 @@ wlan_clone_create(struct if_clone *ifc, int unit, caddr_t params) ifp = ifunit(cp.icp_parent); if (ifp == NULL) return ENXIO; + /* XXX move printfs to DIAGNOSTIC before release */ if (ifp->if_type != IFT_IEEE80211) { if_printf(ifp, "%s: reject, not an 802.11 device\n", __func__); + return ENXIO; + } + if (cp.icp_opmode >= IEEE80211_OPMODE_MAX) { + if_printf(ifp, "%s: invalid opmode %d\n", + __func__, cp.icp_opmode); return EINVAL; } ic = ifp->if_l2com; + if ((ic->ic_caps & ieee80211_opcap[cp.icp_opmode]) == 0) { + if_printf(ifp, "%s mode not supported\n", + ieee80211_opmode_name[cp.icp_opmode]); + return EOPNOTSUPP; + } vap = ic->ic_vap_create(ic, ifc->ifc_name, unit, cp.icp_opmode, cp.icp_flags, cp.icp_bssid, cp.icp_flags & IEEE80211_CLONE_MACADDR ? |