本文整理汇总了C++中IEEE80211_LOCK_ASSERT函数的典型用法代码示例。如果您正苦于以下问题:C++ IEEE80211_LOCK_ASSERT函数的具体用法?C++ IEEE80211_LOCK_ASSERT怎么用?C++ IEEE80211_LOCK_ASSERT使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了IEEE80211_LOCK_ASSERT函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: tdma_beacon_miss
static void
tdma_beacon_miss(struct ieee80211vap *vap)
{
struct ieee80211_tdma_state *ts = vap->iv_tdma;
IEEE80211_LOCK_ASSERT(vap->iv_ic);
KASSERT((vap->iv_ic->ic_flags & IEEE80211_F_SCAN) == 0, ("scanning"));
KASSERT(vap->iv_state == IEEE80211_S_RUN,
("wrong state %d", vap->iv_state));
IEEE80211_DPRINTF(vap,
IEEE80211_MSG_STATE | IEEE80211_MSG_TDMA | IEEE80211_MSG_DEBUG,
"beacon miss, mode %u state %s\n",
vap->iv_opmode, ieee80211_state_name[vap->iv_state]);
callout_stop(&vap->iv_swbmiss);
if (ts->tdma_peer != NULL) { /* XXX? can this be null? */
ieee80211_notify_node_leave(vap->iv_bss);
ts->tdma_peer = NULL;
/*
* Treat beacon miss like an associate failure wrt the
* scan policy; this forces the entry in the scan cache
* to be ignored after several tries.
*/
ieee80211_scan_assoc_fail(vap, vap->iv_bss->ni_macaddr,
IEEE80211_STATUS_TIMEOUT);
}
#if 0
ts->tdma_inuse = 0; /* clear slot usage */
#endif
ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
}
示例2: monitor_newstate
/*
* IEEE80211_M_MONITOR vap state machine handler.
*/
static int
monitor_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
{
struct ieee80211com *ic = vap->iv_ic;
enum ieee80211_state ostate;
IEEE80211_LOCK_ASSERT(ic);
ostate = vap->iv_state;
IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE, "%s: %s -> %s (%d)\n",
__func__, ieee80211_state_name[ostate],
ieee80211_state_name[nstate], arg);
vap->iv_state = nstate; /* state transition */
if (nstate == IEEE80211_S_RUN) {
switch (ostate) {
case IEEE80211_S_INIT:
ieee80211_create_ibss(vap, ic->ic_curchan);
break;
default:
break;
}
/*
* NB: this shouldn't be here but many people use
* monitor mode for raw packets; once we switch
* them over to adhoc demo mode remove this.
*/
ieee80211_node_authorize(vap->iv_bss);
}
return 0;
}
示例3: scan_signal
static void
scan_signal(void *arg)
{
struct ieee80211_scan_state *ss = (struct ieee80211_scan_state *) arg;
IEEE80211_LOCK_ASSERT(ss->ss_ic);
cv_signal(&SCAN_PRIVATE(ss)->ss_scan_cv);
}
示例4: ieee80211_swscan_scan_done
/*
* Manually stop a scan that is currently running.
* Provided for drivers that are not able to scan single channels
* (e.g. for firmware-based devices).
*/
static void
ieee80211_swscan_scan_done(struct ieee80211vap *vap)
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_scan_state *ss = ic->ic_scan;
IEEE80211_LOCK_ASSERT(ic);
scan_signal_locked(ss, 0);
}
示例5: ieee80211_swscan_vdetach
static void
ieee80211_swscan_vdetach(struct ieee80211vap *vap)
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_scan_state *ss = ic->ic_scan;
IEEE80211_LOCK_ASSERT(ic);
if (ss != NULL && ss->ss_vap == vap &&
(ic->ic_flags & IEEE80211_F_SCAN))
scan_signal_locked(ss, ISCAN_ABORT);
}
示例6: ieee80211_swscan_check_scan
/*
* Check the scan cache for an ap/channel to use; if that
* fails then kick off a new scan.
*
* Called with the comlock held.
*
* XXX TODO: split out!
*/
static int
ieee80211_swscan_check_scan(const struct ieee80211_scanner *scan,
struct ieee80211vap *vap, int flags,
u_int duration, u_int mindwell, u_int maxdwell,
u_int nssid, const struct ieee80211_scan_ssid ssids[])
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_scan_state *ss = ic->ic_scan;
int result;
IEEE80211_LOCK_ASSERT(ic);
if (ss->ss_ops != NULL) {
/* XXX verify ss_ops matches vap->iv_opmode */
if ((flags & IEEE80211_SCAN_NOSSID) == 0) {
/*
* Update the ssid list and mark flags so if
* we call start_scan it doesn't duplicate work.
*/
ieee80211_scan_copy_ssid(vap, ss, nssid, ssids);
flags |= IEEE80211_SCAN_NOSSID;
}
if ((ic->ic_flags & IEEE80211_F_SCAN) == 0 &&
(flags & IEEE80211_SCAN_FLUSH) == 0 &&
ieee80211_time_before(ticks, ic->ic_lastscan + vap->iv_scanvalid)) {
/*
* We're not currently scanning and the cache is
* deemed hot enough to consult. Lock out others
* by marking IEEE80211_F_SCAN while we decide if
* something is already in the scan cache we can
* use. Also discard any frames that might come
* in while temporarily marked as scanning.
*/
SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_DISCARD;
ic->ic_flags |= IEEE80211_F_SCAN;
/* NB: need to use supplied flags in check */
ss->ss_flags = flags & 0xff;
result = ss->ss_ops->scan_end(ss, vap);
ic->ic_flags &= ~IEEE80211_F_SCAN;
SCAN_PRIVATE(ss)->ss_iflags &= ~ISCAN_DISCARD;
if (result) {
ieee80211_notify_scan_done(vap);
return 1;
}
}
}
result = ieee80211_swscan_start_scan_locked(scan, vap, flags, duration,
mindwell, maxdwell, nssid, ssids);
return result;
}
示例7: ieee80211_swscan_set_scan_duration
static void
ieee80211_swscan_set_scan_duration(struct ieee80211vap *vap, u_int duration)
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_scan_state *ss = ic->ic_scan;
IEEE80211_LOCK_ASSERT(ic);
/* NB: flush frames rx'd before 1st channel change */
SCAN_PRIVATE(ss)->ss_iflags |= ISCAN_DISCARD;
SCAN_PRIVATE(ss)->ss_duration = duration;
}
示例8: ieee80211_dfs_cac_start
/*
* Initiate the CAC timer. The driver is responsible
* for setting up the hardware to scan for radar on the
* channnel, we just handle timing things out.
*/
void
ieee80211_dfs_cac_start(struct ieee80211vap *vap)
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_dfs_state *dfs = &ic->ic_dfs;
IEEE80211_LOCK_ASSERT(ic);
callout_reset(&dfs->cac_timer, CAC_TIMEOUT, cac_timeout, vap);
if_printf(vap->iv_ifp, "start %d second CAC timer on channel %u (%u MHz)\n",
ticks_to_secs(CAC_TIMEOUT),
ic->ic_curchan->ic_ieee, ic->ic_curchan->ic_freq);
ieee80211_notify_cac(ic, ic->ic_curchan, IEEE80211_NOTIFY_CAC_START);
}
示例9: cac_timeout
static void
cac_timeout(void *arg)
{
struct ieee80211vap *vap = arg;
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_dfs_state *dfs = &ic->ic_dfs;
int i;
IEEE80211_LOCK_ASSERT(ic);
if (vap->iv_state != IEEE80211_S_CAC) /* NB: just in case */
return;
/*
* When radar is detected during a CAC we are woken
* up prematurely to switch to a new channel.
* Check the channel to decide how to act.
*/
if (IEEE80211_IS_CHAN_RADAR(ic->ic_curchan)) {
ieee80211_notify_cac(ic, ic->ic_curchan,
IEEE80211_NOTIFY_CAC_RADAR);
if_printf(vap->iv_ifp,
"CAC timer on channel %u (%u MHz) stopped due to radar\n",
ic->ic_curchan->ic_ieee, ic->ic_curchan->ic_freq);
/* XXX clobbers any existing desired channel */
/* NB: dfs->newchan may be NULL, that's ok */
vap->iv_des_chan = dfs->newchan;
/* XXX recursive lock need ieee80211_new_state_locked */
ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
} else {
if_printf(vap->iv_ifp,
"CAC timer on channel %u (%u MHz) expired; "
"no radar detected\n",
ic->ic_curchan->ic_ieee, ic->ic_curchan->ic_freq);
/*
* Mark all channels with the current frequency
* as having completed CAC; this keeps us from
* doing it again until we change channels.
*/
for (i = 0; i < ic->ic_nchans; i++) {
struct ieee80211_channel *c = &ic->ic_channels[i];
if (c->ic_freq == ic->ic_curchan->ic_freq)
c->ic_state |= IEEE80211_CHANSTATE_CACDONE;
}
ieee80211_notify_cac(ic, ic->ic_curchan,
IEEE80211_NOTIFY_CAC_EXPIRE);
ieee80211_cac_completeswitch(vap);
}
}
示例10: scan_signal_locked
static void
scan_signal_locked(struct ieee80211_scan_state *ss, int iflags)
{
struct scan_state *ss_priv = SCAN_PRIVATE(ss);
struct timeout_task *scan_task = &ss_priv->ss_scan_curchan;
struct ieee80211com *ic = ss->ss_ic;
IEEE80211_LOCK_ASSERT(ic);
ss_priv->ss_iflags |= iflags;
if (ss_priv->ss_iflags & ISCAN_RUNNING) {
if (taskqueue_cancel_timeout(ic->ic_tq, scan_task, NULL) == 0)
taskqueue_enqueue_timeout(ic->ic_tq, scan_task, 0);
}
}
示例11: ieee80211_dfs_cac_stop
/*
* Clear the CAC timer.
*/
void
ieee80211_dfs_cac_stop(struct ieee80211vap *vap)
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_dfs_state *dfs = &ic->ic_dfs;
IEEE80211_LOCK_ASSERT(ic);
/* NB: racey but not important */
if (callout_pending(&dfs->cac_timer)) {
if_printf(vap->iv_ifp, "stop CAC timer on channel %u (%u MHz)\n",
ic->ic_curchan->ic_ieee, ic->ic_curchan->ic_freq);
ieee80211_notify_cac(ic, ic->ic_curchan,
IEEE80211_NOTIFY_CAC_STOP);
}
callout_stop(&dfs->cac_timer);
}
示例12: scan_update_locked
/*
* Update common scanner state to reflect the current
* operating mode. This is called when the state machine
* is transitioned to RUN state w/o scanning--e.g. when
* operating in monitor mode. The purpose of this is to
* ensure later callbacks find ss_ops set to properly
* reflect current operating mode.
*/
static void
scan_update_locked(struct ieee80211vap *vap,
const struct ieee80211_scanner *scan)
{
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211_scan_state *ss = ic->ic_scan;
IEEE80211_LOCK_ASSERT(ic);
#ifdef IEEE80211_DEBUG
if (ss->ss_vap != vap || ss->ss_ops != scan) {
IEEE80211_DPRINTF(vap, IEEE80211_MSG_SCAN,
"%s: current scanner is <%s:%s>, switch to <%s:%s>\n",
__func__,
ss->ss_vap != NULL ?
ss->ss_vap->iv_ifp->if_xname : "none",
ss->ss_vap != NULL ?
ieee80211_opmode_name[ss->ss_vap->iv_opmode] : "none",
vap->iv_ifp->if_xname,
ieee80211_opmode_name[vap->iv_opmode]);
}
#endif
ss->ss_vap = vap;
if (ss->ss_ops != scan) {
/*
* Switch scanners; detach old, attach new. Special
* case where a single scan module implements multiple
* policies by using different scan ops but a common
* core. We assume if the old and new attach methods
* are identical then it's ok to just change ss_ops
* and not flush the internal state of the module.
*/
if (scan == NULL || ss->ss_ops == NULL ||
ss->ss_ops->scan_attach != scan->scan_attach) {
if (ss->ss_ops != NULL)
ss->ss_ops->scan_detach(ss);
if (scan != NULL && !scan->scan_attach(ss)) {
/* XXX attach failure */
/* XXX stat+msg */
scan = NULL;
}
}
ss->ss_ops = scan;
}
}
示例13: ieee80211_syncflag_ext_locked
/*
* Synchronize flags_ext bit state in the com structure
* according to the state of all vap's. This is used,
* for example, to handle state changes via ioctls.
*/
static void
ieee80211_syncflag_ext_locked(struct ieee80211com *ic, int flag)
{
struct ieee80211vap *vap;
int bit;
IEEE80211_LOCK_ASSERT(ic);
bit = 0;
TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
if (vap->iv_flags_ext & flag) {
bit = 1;
break;
}
if (bit)
ic->ic_flags_ext |= flag;
else
ic->ic_flags_ext &= ~flag;
}
示例14: ieee80211_scan_pickchannel
/*
* Check the scan cache for an ap/channel to use; if that
* fails then kick off a new scan.
*/
struct ieee80211_channel *
ieee80211_scan_pickchannel(struct ieee80211com *ic, int flags)
{
struct ieee80211_scan_state *ss = ic->ic_scan;
IEEE80211_LOCK_ASSERT(ic);
if (ss == NULL || ss->ss_ops == NULL || ss->ss_vap == NULL) {
/* XXX printf? */
return NULL;
}
if (ss->ss_ops->scan_pickchan == NULL) {
IEEE80211_DPRINTF(ss->ss_vap, IEEE80211_MSG_SCAN,
"%s: scan module does not support picking a channel, "
"opmode %s\n", __func__, ss->ss_vap->iv_opmode);
return NULL;
}
return ss->ss_ops->scan_pickchan(ss, flags);
}
示例15: ieee80211_syncifflag_locked
/*
* Synchronize flag bit state in the parent ifnet structure
* according to the state of all vap ifnet's. This is used,
* for example, to handle IFF_PROMISC and IFF_ALLMULTI.
*/
void
ieee80211_syncifflag_locked(struct ieee80211com *ic, int flag)
{
struct ifnet *ifp = ic->ic_ifp;
struct ieee80211vap *vap;
int bit, oflags;
IEEE80211_LOCK_ASSERT(ic);
bit = 0;
TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next)
if (vap->iv_ifp->if_flags & flag) {
/*
* XXX the bridge sets PROMISC but we don't want to
* enable it on the device, discard here so all the
* drivers don't need to special-case it
*/
if (flag == IFF_PROMISC &&
!(vap->iv_opmode == IEEE80211_M_MONITOR ||
(vap->iv_opmode == IEEE80211_M_AHDEMO &&
(vap->iv_caps & IEEE80211_C_TDMA) == 0)))
continue;
bit = 1;
break;
}
oflags = ifp->if_flags;
if (bit)
ifp->if_flags |= flag;
else
ifp->if_flags &= ~flag;
if ((ifp->if_flags ^ oflags) & flag) {
/* XXX should we return 1/0 and let caller do this? */
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
if (flag == IFF_PROMISC)
ieee80211_runtask(ic, &ic->ic_promisc_task);
else if (flag == IFF_ALLMULTI)
ieee80211_runtask(ic, &ic->ic_mcast_task);
}
}
}