1/*- 2 * Copyright (c) 2003-2009 Sam Leffler, Errno Consulting 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 10 unchanged lines hidden (view full) --- 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> |
27__FBSDID("$FreeBSD: head/sys/net80211/ieee80211_freebsd.c 241610 2012-10-16 13:37:54Z glebius $"); |
28 29/* 30 * IEEE 802.11 support (FreeBSD-specific code) 31 */ 32#include "opt_wlan.h" 33 34#include <sys/param.h> 35#include <sys/kernel.h> --- 24 unchanged lines hidden (view full) --- 60#ifdef IEEE80211_DEBUG 61int ieee80211_debug = 0; 62SYSCTL_INT(_net_wlan, OID_AUTO, debug, CTLFLAG_RW, &ieee80211_debug, 63 0, "debugging printfs"); 64#endif 65 66static MALLOC_DEFINE(M_80211_COM, "80211com", "802.11 com state"); 67 |
68static const char wlanname[] = "wlan"; 69 70static struct if_clone *wlan_cloner; 71 |
72/* 73 * Allocate/free com structure in conjunction with ifnet; 74 * these routines are registered with if_register_com_alloc 75 * below and are called automatically by the ifnet code 76 * when the ifnet of the parent device is created. 77 */ 78static void * 79wlan_alloc(u_char type, struct ifnet *ifp) --- 48 unchanged lines hidden (view full) --- 128 (ic->ic_caps & IEEE80211_C_TDMA) == 0 129#else 130 (1) 131#endif 132 ) { 133 if_printf(ifp, "TDMA not supported\n"); 134 return EOPNOTSUPP; 135 } |
136 vap = ic->ic_vap_create(ic, wlanname, unit, |
137 cp.icp_opmode, cp.icp_flags, cp.icp_bssid, 138 cp.icp_flags & IEEE80211_CLONE_MACADDR ? 139 cp.icp_macaddr : (const uint8_t *)IF_LLADDR(ifp)); 140 return (vap == NULL ? EIO : 0); 141} 142 143static void 144wlan_clone_destroy(struct ifnet *ifp) 145{ 146 struct ieee80211vap *vap = ifp->if_softc; 147 struct ieee80211com *ic = vap->iv_ic; 148 149 ic->ic_vap_delete(vap); 150} |
151 152void 153ieee80211_vap_destroy(struct ieee80211vap *vap) 154{ |
155 if_clone_destroyif(wlan_cloner, vap->iv_ifp); |
156} 157 158int 159ieee80211_sysctl_msecs_ticks(SYSCTL_HANDLER_ARGS) 160{ 161 int msecs = ticks_to_msecs(*(int *)arg1); 162 int error, t; 163 --- 640 unchanged lines hidden (view full) --- 804 if (wlan_bpfevent == NULL) 805 return ENOMEM; 806 wlan_ifllevent = EVENTHANDLER_REGISTER(iflladdr_event, 807 wlan_iflladdr, NULL, EVENTHANDLER_PRI_ANY); 808 if (wlan_ifllevent == NULL) { 809 EVENTHANDLER_DEREGISTER(bpf_track, wlan_bpfevent); 810 return ENOMEM; 811 } |
812 wlan_cloner = if_clone_simple(wlanname, wlan_clone_create, 813 wlan_clone_destroy, 0); |
814 if_register_com_alloc(IFT_IEEE80211, wlan_alloc, wlan_free); 815 return 0; 816 case MOD_UNLOAD: 817 if_deregister_com_alloc(IFT_IEEE80211); |
818 if_clone_detach(wlan_cloner); |
819 EVENTHANDLER_DEREGISTER(bpf_track, wlan_bpfevent); 820 EVENTHANDLER_DEREGISTER(iflladdr_event, wlan_ifllevent); 821 return 0; 822 } 823 return EINVAL; 824} 825 826static moduledata_t wlan_mod = { |
827 wlanname, |
828 wlan_modevent, 829 0 830}; 831DECLARE_MODULE(wlan, wlan_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST); 832MODULE_VERSION(wlan, 1); 833MODULE_DEPEND(wlan, ether, 1, 1, 1); 834#ifdef IEEE80211_ALQ 835MODULE_DEPEND(wlan, alq, 1, 1, 1); 836#endif /* IEEE80211_ALQ */ 837 |