Lines Matching +full:m +full:- +full:mode
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
68 if (vap->iv_opmode == IEEE80211_M_HOSTAP || in ieee80211_power_vattach()
69 vap->iv_opmode == IEEE80211_M_IBSS) { in ieee80211_power_vattach()
71 vap->iv_update_ps = ieee80211_update_ps; in ieee80211_power_vattach()
72 vap->iv_set_tim = ieee80211_set_tim; in ieee80211_power_vattach()
74 vap->iv_node_ps = ieee80211_node_pwrsave; in ieee80211_power_vattach()
75 vap->iv_sta_ps = ieee80211_sta_pwrsave; in ieee80211_power_vattach()
83 * know adhoc mode doesn't support ATIM yet... in ieee80211_power_latevattach()
85 if (vap->iv_opmode == IEEE80211_M_HOSTAP) { in ieee80211_power_latevattach()
86 vap->iv_tim_len = howmany(vap->iv_max_aid,8) * sizeof(uint8_t); in ieee80211_power_latevattach()
87 vap->iv_tim_bitmap = (uint8_t *) IEEE80211_MALLOC(vap->iv_tim_len, in ieee80211_power_latevattach()
90 if (vap->iv_tim_bitmap == NULL) { in ieee80211_power_latevattach()
94 vap->iv_tim_len = 0; in ieee80211_power_latevattach()
102 if (vap->iv_tim_bitmap != NULL) { in ieee80211_power_vdetach()
103 IEEE80211_FREE(vap->iv_tim_bitmap, M_80211_POWER); in ieee80211_power_vdetach()
104 vap->iv_tim_bitmap = NULL; in ieee80211_power_vdetach()
112 psq->psq_maxlen = IEEE80211_PS_MAX_QUEUE; in ieee80211_psq_init()
113 IEEE80211_PSQ_INIT(psq, name); /* OS-dependent setup */ in ieee80211_psq_init()
122 KASSERT(psq->psq_len == 0, ("%d frames on ps q", psq->psq_len)); in ieee80211_psq_cleanup()
124 IEEE80211_PSQ_DESTROY(psq); /* OS-dependent cleanup */ in ieee80211_psq_cleanup()
133 struct ieee80211_psq *psq = &ni->ni_psq; in ieee80211_node_psq_dequeue()
135 struct mbuf *m; in ieee80211_node_psq_dequeue() local
138 qhead = &psq->psq_head[0]; in ieee80211_node_psq_dequeue()
140 if ((m = qhead->head) != NULL) { in ieee80211_node_psq_dequeue()
141 if ((qhead->head = m->m_nextpkt) == NULL) in ieee80211_node_psq_dequeue()
142 qhead->tail = NULL; in ieee80211_node_psq_dequeue()
143 KASSERT(qhead->len > 0, ("qhead len %d", qhead->len)); in ieee80211_node_psq_dequeue()
144 qhead->len--; in ieee80211_node_psq_dequeue()
145 KASSERT(psq->psq_len > 0, ("psq len %d", psq->psq_len)); in ieee80211_node_psq_dequeue()
146 psq->psq_len--; in ieee80211_node_psq_dequeue()
147 m->m_nextpkt = NULL; in ieee80211_node_psq_dequeue()
149 if (m == NULL && qhead == &psq->psq_head[0]) { in ieee80211_node_psq_dequeue()
150 /* Algol-68 style for loop */ in ieee80211_node_psq_dequeue()
151 qhead = &psq->psq_head[1]; in ieee80211_node_psq_dequeue()
155 *qlen = psq->psq_len; in ieee80211_node_psq_dequeue()
157 return m; in ieee80211_node_psq_dequeue()
165 psq_mfree(struct mbuf *m) in psq_mfree() argument
167 if (m->m_flags & M_ENCAP) { in psq_mfree()
168 struct ieee80211_node *ni = (void *) m->m_pkthdr.rcvif; in psq_mfree()
171 m->m_nextpkt = NULL; in psq_mfree()
172 m_freem(m); in psq_mfree()
183 struct mbuf *m; in psq_drain() local
187 qlen = psq->psq_len; in psq_drain()
188 qhead = &psq->psq_head[0]; in psq_drain()
190 while ((m = qhead->head) != NULL) { in psq_drain()
191 qhead->head = m->m_nextpkt; in psq_drain()
192 psq_mfree(m); in psq_drain()
194 qhead->tail = NULL; in psq_drain()
195 qhead->len = 0; in psq_drain()
196 if (qhead == &psq->psq_head[0]) { /* Algol-68 style for loop */ in psq_drain()
197 qhead = &psq->psq_head[1]; in psq_drain()
200 psq->psq_len = 0; in psq_drain()
213 return psq_drain(&ni->ni_psq); in ieee80211_node_psq_drain()
229 struct ieee80211_psq *psq = &ni->ni_psq; in ieee80211_node_psq_age()
232 if (psq->psq_len != 0) { in ieee80211_node_psq_age()
234 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_psq_age()
237 struct mbuf *m; in ieee80211_node_psq_age() local
240 qhead = &psq->psq_head[0]; in ieee80211_node_psq_age()
242 while ((m = qhead->head) != NULL && in ieee80211_node_psq_age()
243 M_AGE_GET(m) < IEEE80211_INACT_WAIT) { in ieee80211_node_psq_age()
245 "discard frame, age %u", M_AGE_GET(m)); in ieee80211_node_psq_age()
246 if ((qhead->head = m->m_nextpkt) == NULL) in ieee80211_node_psq_age()
247 qhead->tail = NULL; in ieee80211_node_psq_age()
248 KASSERT(qhead->len > 0, ("qhead len %d", qhead->len)); in ieee80211_node_psq_age()
249 qhead->len--; in ieee80211_node_psq_age()
250 KASSERT(psq->psq_len > 0, ("psq len %d", psq->psq_len)); in ieee80211_node_psq_age()
251 psq->psq_len--; in ieee80211_node_psq_age()
252 psq_mfree(m); in ieee80211_node_psq_age()
255 if (qhead == &psq->psq_head[0]) { /* Algol-68 style for loop */ in ieee80211_node_psq_age()
256 qhead = &psq->psq_head[1]; in ieee80211_node_psq_age()
259 if (m != NULL) in ieee80211_node_psq_age()
260 M_AGE_SUB(m, IEEE80211_INACT_WAIT); in ieee80211_node_psq_age()
277 KASSERT(vap->iv_opmode == IEEE80211_M_HOSTAP || in ieee80211_update_ps()
278 vap->iv_opmode == IEEE80211_M_IBSS, in ieee80211_update_ps()
279 ("operating mode %u", vap->iv_opmode)); in ieee80211_update_ps()
283 * Indicate whether there are frames queued for a station in power-save mode.
288 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_set_tim()
289 struct ieee80211com *ic = ni->ni_ic; in ieee80211_set_tim()
293 KASSERT(vap->iv_opmode == IEEE80211_M_HOSTAP || in ieee80211_set_tim()
294 vap->iv_opmode == IEEE80211_M_IBSS, in ieee80211_set_tim()
295 ("operating mode %u", vap->iv_opmode)); in ieee80211_set_tim()
297 aid = IEEE80211_AID(ni->ni_associd); in ieee80211_set_tim()
298 KASSERT(aid < vap->iv_max_aid, in ieee80211_set_tim()
299 ("bogus aid %u, max %u", aid, vap->iv_max_aid)); in ieee80211_set_tim()
302 changed = (set != (isset(vap->iv_tim_bitmap, aid) != 0)); in ieee80211_set_tim()
305 setbit(vap->iv_tim_bitmap, aid); in ieee80211_set_tim()
306 vap->iv_ps_pending++; in ieee80211_set_tim()
308 clrbit(vap->iv_tim_bitmap, aid); in ieee80211_set_tim()
309 vap->iv_ps_pending--; in ieee80211_set_tim()
312 vap->iv_update_beacon(vap, IEEE80211_BEACON_TIM); in ieee80211_set_tim()
320 * Save an outbound packet for a node in power-save sleep state.
325 ieee80211_pwrsave(struct ieee80211_node *ni, struct mbuf *m) in ieee80211_pwrsave() argument
327 struct ieee80211_psq *psq = &ni->ni_psq; in ieee80211_pwrsave()
328 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_pwrsave()
329 struct ieee80211com *ic = ni->ni_ic; in ieee80211_pwrsave()
334 if (psq->psq_len >= psq->psq_maxlen) { in ieee80211_pwrsave()
335 psq->psq_drops++; in ieee80211_pwrsave()
339 psq->psq_drops, psq->psq_len); in ieee80211_pwrsave()
342 ieee80211_dump_pkt(ni->ni_ic, mtod(m, caddr_t), in ieee80211_pwrsave()
343 m->m_len, -1, -1); in ieee80211_pwrsave()
345 psq_mfree(m); in ieee80211_pwrsave()
355 /* TU -> secs. XXX handle overflow? */ in ieee80211_pwrsave()
356 age = IEEE80211_TU_TO_MS((ni->ni_intval * ic->ic_bintval) << 2) / 1000; in ieee80211_pwrsave()
363 if (m->m_flags & M_ENCAP) in ieee80211_pwrsave()
364 qhead = &psq->psq_head[0]; in ieee80211_pwrsave()
366 qhead = &psq->psq_head[1]; in ieee80211_pwrsave()
367 if (qhead->tail == NULL) { in ieee80211_pwrsave()
370 qhead->head = m; in ieee80211_pwrsave()
377 if (qhead == &psq->psq_head[1]) { in ieee80211_pwrsave()
378 mh = psq->psq_head[0].head; in ieee80211_pwrsave()
380 age-= M_AGE_GET(mh); in ieee80211_pwrsave()
382 mh = psq->psq_head[1].head; in ieee80211_pwrsave()
384 int nage = M_AGE_GET(mh) - age; in ieee80211_pwrsave()
390 qhead->tail->m_nextpkt = m; in ieee80211_pwrsave()
391 age -= M_AGE_GET(qhead->head); in ieee80211_pwrsave()
394 M_AGE_SET(m, age); in ieee80211_pwrsave()
395 m->m_nextpkt = NULL; in ieee80211_pwrsave()
396 qhead->tail = m; in ieee80211_pwrsave()
397 qhead->len++; in ieee80211_pwrsave()
398 qlen = ++(psq->psq_len); in ieee80211_pwrsave()
404 if (qlen == 1 && vap->iv_set_tim != NULL) in ieee80211_pwrsave()
405 vap->iv_set_tim(ni, 1); in ieee80211_pwrsave()
419 struct ieee80211_psq *psq = &ni->ni_psq; in pwrsave_flushq()
420 struct ieee80211com *ic = ni->ni_ic; in pwrsave_flushq()
421 struct ieee80211vap *vap = ni->ni_vap; in pwrsave_flushq()
424 struct mbuf *m; in pwrsave_flushq() local
427 "flush ps queue, %u packets queued", psq->psq_len); in pwrsave_flushq()
430 qhead = &psq->psq_head[0]; /* 802.11 frames */ in pwrsave_flushq()
431 if (qhead->head != NULL) { in pwrsave_flushq()
435 parent_q = qhead->head; in pwrsave_flushq()
436 qhead->head = qhead->tail = NULL; in pwrsave_flushq()
437 qhead->len = 0; in pwrsave_flushq()
440 qhead = &psq->psq_head[1]; /* 802.3 frames */ in pwrsave_flushq()
441 if (qhead->head != NULL) { in pwrsave_flushq()
444 ifp_q = qhead->head; in pwrsave_flushq()
445 qhead->head = qhead->tail = NULL; in pwrsave_flushq()
446 qhead->len = 0; in pwrsave_flushq()
448 psq->psq_len = 0; in pwrsave_flushq()
455 m = parent_q; in pwrsave_flushq()
456 parent_q = m->m_nextpkt; in pwrsave_flushq()
457 m->m_nextpkt = NULL; in pwrsave_flushq()
459 KASSERT((m->m_flags & M_ENCAP), in pwrsave_flushq()
460 ("%s: parentq with non-M_ENCAP frame!\n", in pwrsave_flushq()
462 (void) ieee80211_parent_xmitpkt(ic, m); in pwrsave_flushq()
467 m = ifp_q; in pwrsave_flushq()
468 ifp_q = m->m_nextpkt; in pwrsave_flushq()
469 m->m_nextpkt = NULL; in pwrsave_flushq()
470 KASSERT((!(m->m_flags & M_ENCAP)), in pwrsave_flushq()
472 (void) ieee80211_vap_xmitpkt(vap, m); in pwrsave_flushq()
477 * Handle station power-save state change.
482 struct ieee80211vap *vap = ni->ni_vap; in ieee80211_node_pwrsave()
487 if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) == 0) { in ieee80211_node_pwrsave()
488 vap->iv_ps_sta++; in ieee80211_node_pwrsave()
491 ni->ni_flags |= IEEE80211_NODE_PWR_MGT; in ieee80211_node_pwrsave()
493 "power save mode on, %u sta's in ps mode", vap->iv_ps_sta); in ieee80211_node_pwrsave()
496 vap->iv_update_ps(vap, vap->iv_ps_sta); in ieee80211_node_pwrsave()
498 if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) { in ieee80211_node_pwrsave()
499 vap->iv_ps_sta--; in ieee80211_node_pwrsave()
502 ni->ni_flags &= ~IEEE80211_NODE_PWR_MGT; in ieee80211_node_pwrsave()
504 "power save mode off, %u sta's in ps mode", vap->iv_ps_sta); in ieee80211_node_pwrsave()
507 if (vap->iv_set_tim != NULL) in ieee80211_node_pwrsave()
508 vap->iv_set_tim(ni, 0); in ieee80211_node_pwrsave()
511 vap->iv_update_ps(vap, vap->iv_ps_sta); in ieee80211_node_pwrsave()
513 if (ni->ni_psq.psq_len != 0) in ieee80211_node_pwrsave()
519 * Handle power-save state change in station mode.
524 struct ieee80211_node *ni = vap->iv_bss; in ieee80211_sta_pwrsave()
526 if (!((enable != 0) ^ ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) != 0))) in ieee80211_sta_pwrsave()
530 "sta power save mode %s", enable ? "on" : "off"); in ieee80211_sta_pwrsave()
532 ni->ni_flags &= ~IEEE80211_NODE_PWR_MGT; in ieee80211_sta_pwrsave()
540 if (ni->ni_psq.psq_len != 0) in ieee80211_sta_pwrsave()
543 ni->ni_flags |= IEEE80211_NODE_PWR_MGT; in ieee80211_sta_pwrsave()
551 * This may schedule a transition from _SLEEP -> _RUN if it's appropriate.
553 * In STA mode, we may have put to sleep during scan and need to be dragged
554 * back out of powersave mode.
559 struct ieee80211com *ic = vap->iv_ic; in ieee80211_sta_tim_notify()
571 IEEE80211_LOCK(vap->iv_ic); in ieee80211_sta_tim_notify()
572 if (set == 1 && vap->iv_state == IEEE80211_S_SLEEP) { in ieee80211_sta_tim_notify()
576 } else if ((set == 1) && (ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN)) { in ieee80211_sta_tim_notify()
584 * We may be in BGSCAN mode - this means the VAP is in STA in ieee80211_sta_tim_notify()
585 * mode powersave. If it is, we need to wake it up so we in ieee80211_sta_tim_notify()
588 vap->iv_sta_ps(vap, 0); in ieee80211_sta_tim_notify()
590 IEEE80211_UNLOCK(vap->iv_ic); in ieee80211_sta_tim_notify()
596 * This may schedule a transition from _RUN -> _SLEEP if it's appropriate.
601 struct ieee80211com *ic = vap->iv_ic; in ieee80211_sta_ps_timer_check()
605 /* For no, only do this in STA mode */ in ieee80211_sta_ps_timer_check()
606 if (! (vap->iv_caps & IEEE80211_C_SWSLEEP)) in ieee80211_sta_ps_timer_check()
609 if (vap->iv_opmode != IEEE80211_M_STA) in ieee80211_sta_ps_timer_check()
613 if (vap->iv_state != IEEE80211_S_RUN) in ieee80211_sta_ps_timer_check()
618 __func__, (unsigned long long) ic->ic_lastdata, in ieee80211_sta_ps_timer_check()
622 if (! (vap->iv_flags & IEEE80211_F_PMGTON)) in ieee80211_sta_ps_timer_check()
626 /* XXX hard-coded to one second for now, ew! */ in ieee80211_sta_ps_timer_check()
627 if (ieee80211_time_after(ic->ic_lastdata + 500, ticks)) in ieee80211_sta_ps_timer_check()
634 if ((vap->iv_bss->ni_flags & IEEE80211_NODE_PWR_MGT) == 0) in ieee80211_sta_ps_timer_check()
635 vap->iv_sta_ps(vap, 1); in ieee80211_sta_ps_timer_check()
647 (int) ticks_to_msecs(ticks - ic->ic_lastdata)); in ieee80211_sta_ps_timer_check()