Changeset View
Changeset View
Standalone View
Standalone View
sys/net80211/ieee80211_proto.c
Context not available. | |||||
void | void | ||||
ieee80211_proto_attach(struct ieee80211com *ic) | ieee80211_proto_attach(struct ieee80211com *ic) | ||||
{ | { | ||||
struct ifnet *ifp = ic->ic_ifp; | uint8_t hdrlen; | ||||
/* override the 802.3 setting */ | /* override the 802.3 setting */ | ||||
ifp->if_hdrlen = ic->ic_headroom | hdrlen = ic->ic_headroom | ||||
+ sizeof(struct ieee80211_qosframe_addr4) | + sizeof(struct ieee80211_qosframe_addr4) | ||||
+ IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN | + IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN | ||||
+ IEEE80211_WEP_EXTIVLEN; | + IEEE80211_WEP_EXTIVLEN; | ||||
/* XXX no way to recalculate on ifdetach */ | /* XXX no way to recalculate on ifdetach */ | ||||
if (ALIGN(ifp->if_hdrlen) > max_linkhdr) { | if (ALIGN(hdrlen) > max_linkhdr) { | ||||
/* XXX sanity check... */ | /* XXX sanity check... */ | ||||
max_linkhdr = ALIGN(ifp->if_hdrlen); | max_linkhdr = ALIGN(hdrlen); | ||||
max_hdr = max_linkhdr + max_protohdr; | max_hdr = max_linkhdr + max_protohdr; | ||||
max_datalen = MHLEN - max_hdr; | max_datalen = MHLEN - max_hdr; | ||||
} | } | ||||
ic->ic_protmode = IEEE80211_PROT_CTSONLY; | ic->ic_protmode = IEEE80211_PROT_CTSONLY; | ||||
TASK_INIT(&ic->ic_parent_task, 0, parent_updown, ifp); | TASK_INIT(&ic->ic_parent_task, 0, parent_updown, ic); | ||||
TASK_INIT(&ic->ic_mcast_task, 0, update_mcast, ic); | TASK_INIT(&ic->ic_mcast_task, 0, update_mcast, ic); | ||||
TASK_INIT(&ic->ic_promisc_task, 0, update_promisc, ic); | TASK_INIT(&ic->ic_promisc_task, 0, update_promisc, ic); | ||||
TASK_INIT(&ic->ic_chan_task, 0, update_channel, ic); | TASK_INIT(&ic->ic_chan_task, 0, update_channel, ic); | ||||
Context not available. | |||||
int i; | int i; | ||||
/* override the 802.3 setting */ | /* override the 802.3 setting */ | ||||
ifp->if_hdrlen = ic->ic_ifp->if_hdrlen; | ifp->if_hdrlen = ic->ic_headroom | ||||
+ sizeof(struct ieee80211_qosframe_addr4) | |||||
+ IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN | |||||
+ IEEE80211_WEP_EXTIVLEN; | |||||
vap->iv_rtsthreshold = IEEE80211_RTS_DEFAULT; | vap->iv_rtsthreshold = IEEE80211_RTS_DEFAULT; | ||||
vap->iv_fragthreshold = IEEE80211_FRAG_DEFAULT; | vap->iv_fragthreshold = IEEE80211_FRAG_DEFAULT; | ||||
Context not available. | |||||
static void | static void | ||||
parent_updown(void *arg, int npending) | parent_updown(void *arg, int npending) | ||||
{ | { | ||||
struct ifnet *parent = arg; | struct ieee80211com *ic = arg; | ||||
parent->if_ioctl(parent, SIOCSIFFLAGS, NULL); | ic->ic_parent(ic); | ||||
} | } | ||||
static void | static void | ||||
Context not available. | |||||
{ | { | ||||
struct ifnet *ifp = vap->iv_ifp; | struct ifnet *ifp = vap->iv_ifp; | ||||
struct ieee80211com *ic = vap->iv_ic; | struct ieee80211com *ic = vap->iv_ic; | ||||
struct ifnet *parent = ic->ic_ifp; | |||||
IEEE80211_LOCK_ASSERT(ic); | IEEE80211_LOCK_ASSERT(ic); | ||||
Context not available. | |||||
* We are not running; if this we are the first vap | * We are not running; if this we are the first vap | ||||
* to be brought up auto-up the parent if necessary. | * to be brought up auto-up the parent if necessary. | ||||
*/ | */ | ||||
if (ic->ic_nrunning++ == 0 && | if (ic->ic_nrunning++ == 0) { | ||||
(parent->if_drv_flags & IFF_DRV_RUNNING) == 0) { | |||||
IEEE80211_DPRINTF(vap, | IEEE80211_DPRINTF(vap, | ||||
IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG, | IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG, | ||||
"%s: up parent %s\n", __func__, parent->if_xname); | "%s: up parent %s\n", __func__, ic->ic_name); | ||||
parent->if_flags |= IFF_UP; | |||||
ieee80211_runtask(ic, &ic->ic_parent_task); | ieee80211_runtask(ic, &ic->ic_parent_task); | ||||
return; | return; | ||||
} | } | ||||
Context not available. | |||||
* If the parent is up and running, then kick the | * If the parent is up and running, then kick the | ||||
* 802.11 state machine as appropriate. | * 802.11 state machine as appropriate. | ||||
*/ | */ | ||||
if ((parent->if_drv_flags & IFF_DRV_RUNNING) && | if (vap->iv_roaming != IEEE80211_ROAMING_MANUAL) { | ||||
vap->iv_roaming != IEEE80211_ROAMING_MANUAL) { | |||||
if (vap->iv_opmode == IEEE80211_M_STA) { | if (vap->iv_opmode == IEEE80211_M_STA) { | ||||
#if 0 | #if 0 | ||||
/* XXX bypasses scan too easily; disable for now */ | /* XXX bypasses scan too easily; disable for now */ | ||||
Context not available. | |||||
{ | { | ||||
struct ieee80211com *ic = vap->iv_ic; | struct ieee80211com *ic = vap->iv_ic; | ||||
struct ifnet *ifp = vap->iv_ifp; | struct ifnet *ifp = vap->iv_ifp; | ||||
struct ifnet *parent = ic->ic_ifp; | |||||
IEEE80211_LOCK_ASSERT(ic); | IEEE80211_LOCK_ASSERT(ic); | ||||
Context not available. | |||||
ieee80211_new_state_locked(vap, IEEE80211_S_INIT, -1); | ieee80211_new_state_locked(vap, IEEE80211_S_INIT, -1); | ||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) { | if (ifp->if_drv_flags & IFF_DRV_RUNNING) { | ||||
ifp->if_drv_flags &= ~IFF_DRV_RUNNING; /* mark us stopped */ | ifp->if_drv_flags &= ~IFF_DRV_RUNNING; /* mark us stopped */ | ||||
if (--ic->ic_nrunning == 0 && | if (--ic->ic_nrunning == 0) { | ||||
(parent->if_drv_flags & IFF_DRV_RUNNING)) { | |||||
IEEE80211_DPRINTF(vap, | IEEE80211_DPRINTF(vap, | ||||
IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG, | IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG, | ||||
"down parent %s\n", parent->if_xname); | "down parent %s\n", ic->ic_name); | ||||
parent->if_flags &= ~IFF_UP; | |||||
ieee80211_runtask(ic, &ic->ic_parent_task); | ieee80211_runtask(ic, &ic->ic_parent_task); | ||||
} | } | ||||
} | } | ||||
Context not available. |