41#ifdef IEEE80211_SUPPORT_TDMA
46#include <sys/malloc.h>
47#include <sys/kernel.h>
49#include <sys/socket.h>
50#include <sys/sockio.h>
51#include <sys/endian.h>
54#include <sys/sysctl.h>
57#include <net/if_media.h>
58#include <net/if_llc.h>
59#include <net/ethernet.h>
67#ifndef TDMA_SLOTLEN_DEFAULT
68#define TDMA_SLOTLEN_DEFAULT 10*1000
70#ifndef TDMA_SLOTCNT_DEFAULT
71#define TDMA_SLOTCNT_DEFAULT 2
73#ifndef TDMA_BINTVAL_DEFAULT
74#define TDMA_BINTVAL_DEFAULT 5
76#ifndef TDMA_TXRATE_11B_DEFAULT
77#define TDMA_TXRATE_11B_DEFAULT 2*11
79#ifndef TDMA_TXRATE_11G_DEFAULT
80#define TDMA_TXRATE_11G_DEFAULT 2*24
82#ifndef TDMA_TXRATE_11A_DEFAULT
83#define TDMA_TXRATE_11A_DEFAULT 2*24
85#ifndef TDMA_TXRATE_TURBO_DEFAULT
86#define TDMA_TXRATE_TURBO_DEFAULT 2*24
88#ifndef TDMA_TXRATE_HALF_DEFAULT
89#define TDMA_TXRATE_HALF_DEFAULT 2*12
91#ifndef TDMA_TXRATE_QUARTER_DEFAULT
92#define TDMA_TXRATE_QUARTER_DEFAULT 2*6
94#ifndef TDMA_TXRATE_11NA_DEFAULT
95#define TDMA_TXRATE_11NA_DEFAULT (4 | IEEE80211_RATE_MCS)
97#ifndef TDMA_TXRATE_11NG_DEFAULT
98#define TDMA_TXRATE_11NG_DEFAULT (4 | IEEE80211_RATE_MCS)
101#define TDMA_VERSION_VALID(_version) \
102 (TDMA_VERSION_V2 <= (_version) && (_version) <= TDMA_VERSION)
103#define TDMA_SLOTCNT_VALID(_slotcnt) \
104 (2 <= (_slotcnt) && (_slotcnt) <= TDMA_MAXSLOTS)
106#define TDMA_SLOTLEN_VALID(_slotlen) \
107 (2*100 <= (_slotlen) && (unsigned)(_slotlen) <= 0xfffff)
109#define TDMA_BINTVAL_VALID(_bintval) (1 <= (_bintval))
125 const u_int8_t *ie,
int rssi,
int nf,
const struct ieee80211_frame *wh);
155 (
"not a tdma vap, caps 0x%x", vap->
iv_caps));
161 printf(
"%s: cannot allocate TDMA state block\n", __func__);
163 vap->
iv_caps &= ~IEEE80211_C_TDMA;
187 setackpolicy(vap->
iv_ic, 1);
213 setackpolicy(vap->
iv_ic, 0);
308 "beacon miss, mode %u state %s\n",
346 if (scan.tdma == NULL) {
395 (void) tdma_process_params(ni, scan.tdma, rssi, nf, wh);
418 int slot, slotlen, update;
421 (
"not a tdma vap, caps 0x%x", vap->
iv_caps));
427 printf(
"%s: bad slot cnt %u\n",
435 if (!TDMA_SLOTLEN_VALID(slotlen)) {
437 printf(
"%s: bad slot len %u\n",
446 printf(
"%s: bad beacon interval %u\n",
461 printf(
"%s: no free slot, slotcnt %u inuse: 0x%x\n",
495 "%s: slot %u slotcnt %u slotlen %u us bintval %u\n",
535 (
"not a tdma vap, caps 0x%x", vap->
iv_caps));
537 if (len <
sizeof(*tdma) - 2) {
540 wh,
"tdma",
"too short, len %u", len);
546 wh,
"tdma",
"bad version %u (ours %u)",
559 wh,
"tdma",
"invalid slot %u", tdma->
tdma_slot);
570 "discovered in slot %u", tdma->
tdma_slot);
587 (void) tdma_update(vap, tdma, ni, 0);
592 uint32_t rstamp = (uint32_t) le64toh(rs->tsf);
602 rtt = rstamp - (le64toh(tstamp) & 0x7fff);
607 "tdma rtt %5u [rstamp %5u tstamp %llu]\n",
609 (
unsigned long long) le64toh(tstamp));
620 "slot %u collision rxtsf %llu tsf %llu\n",
626 (void) tdma_update(vap, tdma, ni, 1);
638 (
"not a tdma vap, caps 0x%x", vap->
iv_caps));
659 (void) tdma_update(vap, tdma, ni, 1);
672#define TDMA_OUI_BYTES 0x00, 0x03, 0x7f
679#define ADDSHORT(frm, v) do { \
680 frm[0] = (v) & 0xff; \
696 (
"not a tdma vap, caps 0x%x", vap->
iv_caps));
698 memcpy(frm, ¶m,
sizeof(param));
723 (
"not a tdma vap, caps 0x%x", vap->
iv_caps));
796 if (!TDMA_SLOTCNT_VALID(ireq->
i_val))
810 if (!TDMA_SLOTLEN_VALID(ireq->
i_val))
818 if (!TDMA_BINTVAL_VALID(ireq->
i_val))
@ IEEE80211_MODE_STURBO_A
@ IEEE80211_MODE_VHT_2GHZ
@ IEEE80211_MODE_VHT_5GHZ
#define IEEE80211_CHAN_ANYC
@ IEEE80211_STATUS_TIMEOUT
@ IEEE80211_REASON_IE_INVALID
@ IEEE80211_ELEMID_VENDOR
#define IEEE80211_FC0_SUBTYPE_BEACON
static void sta_leave(void *arg, struct ieee80211_node *ni)
CTASSERT((IEEE80211_KEY_COMMON &IEEE80211_KEY_DEVICE)==0)
void ieee80211_notify_node_join(struct ieee80211_node *ni, int newassoc)
void ieee80211_notify_node_leave(struct ieee80211_node *ni)
#define IEEE80211_M_NOWAIT
#define IEEE80211_IOCTL_SET(_name, _set)
#define IEEE80211_LOCK_ASSERT(_ic)
#define IEEE80211_IOCTL_GET(_name, _get)
#define IEEE80211_IOC_TDMA_BINTERVAL
#define IEEE80211_IOC_TDMA_SLOTLEN
#define IEEE80211_IOC_TDMA_SLOT
#define IEEE80211_IOC_TDMA_SLOTCNT
void ieee80211_node_leave(struct ieee80211_node *ni)
struct ieee80211_node * ieee80211_add_neighbor(struct ieee80211vap *vap, const struct ieee80211_frame *wh, const struct ieee80211_scanparams *sp)
int ieee80211_iterate_nodes_vap(struct ieee80211_node_table *nt, struct ieee80211vap *vap, ieee80211_iter_func *f, void *arg)
#define IEEE80211_NODE_QOS
#define IEEE80211_NODE_STAT(ni, stat)
void ieee80211_swbmiss(void *arg)
int ieee80211_new_state(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
const char * ieee80211_state_name[IEEE80211_S_MAX]
static __inline const char * ieee80211_mgt_subtype_name(uint8_t subtype)
void ieee80211_scan_assoc_fail(struct ieee80211vap *vap, const uint8_t mac[], int reason)
void ieee80211_cancel_scan(struct ieee80211vap *vap)
int ieee80211_check_scan(struct ieee80211vap *vap, int flags, u_int duration, u_int mindwell, u_int maxdwell, u_int nssid, const struct ieee80211_scan_ssid ssids[])
int ieee80211_check_scan_current(struct ieee80211vap *vap)
void ieee80211_tdma_vattach(struct ieee80211vap *)
#define TDMA_UPDATE_BINTVAL
int ieee80211_tdma_getslot(struct ieee80211vap *vap)
#define TDMA_SUBTYPE_PARAM
uint8_t * ieee80211_add_tdma(uint8_t *frm, struct ieee80211vap *vap)
#define TDMA_UPDATE_SLOTLEN
void ieee80211_parse_tdma(struct ieee80211_node *ni, const uint8_t *ie)
#define TDMA_UPDATE_SLOTCNT
void ieee80211_tdma_update_beacon(struct ieee80211vap *vap, struct ieee80211_beacon_offsets *bo)
#define IEEE80211_MSG_STATE
#define IEEE80211_DISCARD_IE(_vap, _m, _wh, _type, _fmt,...)
#define IEEE80211_MSG_ELEMID
#define IEEE80211_TU_TO_TICKS(x)
#define IEEE80211_FEXT_SWBMISS
#define IEEE80211_ADDR_EQ(a1, a2)
#define IEEE80211_MSG_DEBUG
#define IEEE80211_NOTE(_vap, _m, _ni, _fmt,...)
#define IEEE80211_MSG_TDMA
#define IEEE80211_DPRINTF(_vap, _m, _fmt,...)
#define IEEE80211_MSG_INPUT
#define IEEE80211_DISCARD(_vap, _m, _wh, _type, _fmt,...)
static __inline void ieee80211_beacon_notify(struct ieee80211vap *vap, int what)
#define IEEE80211_FEXT_SCANREQ
struct wmeParams cap_wmeParams[WME_NUM_AC]
uint8_t i_addr2[IEEE80211_ADDR_LEN]
uint8_t i_addr3[IEEE80211_ADDR_LEN]
struct ieee80211com * ni_ic
uint8_t ni_macaddr[IEEE80211_ADDR_LEN]
uint8_t ni_bssid[IEEE80211_ADDR_LEN]
struct ieee80211vap * ni_vap
union ieee80211_node::@24 ni_tstamp
struct ieee80211_ies ni_ies
uint32_t is_rx_mgtdiscard
void(* tdma_recv_mgmt)(struct ieee80211_node *, struct mbuf *, int, const struct ieee80211_rx_stats *rxs, int, int)
void(* tdma_opdetach)(struct ieee80211vap *)
struct timeval tdma_lastprint
int(* tdma_newstate)(struct ieee80211vap *, enum ieee80211_state, int arg)
struct chanAccParams wme_wmeChanParams
struct chanAccParams wme_chanParams
void(* ic_tdma_update)(struct ieee80211_node *, const struct ieee80211_tdma_param *, int)
struct ieee80211_node_table ic_sta
struct ieee80211_wme_state ic_wme
uint8_t ic_modecaps[IEEE80211_MODE_BYTES]
struct ieee80211_channel * ic_curchan
struct ieee80211com * iv_ic
struct ieee80211_node * iv_bss
uint8_t iv_bmissthreshold
enum ieee80211_opmode iv_opmode
struct ieee80211_channel * iv_des_chan
uint16_t iv_swbmiss_count
struct ieee80211_stats iv_stats
void(* iv_recv_mgmt)(struct ieee80211_node *, struct mbuf *, int, const struct ieee80211_rx_stats *, int, int)
u_int iv_scanreq_mindwell
enum ieee80211_state iv_state
u_int iv_scanreq_maxdwell
void(* iv_opdetach)(struct ieee80211vap *)
uint16_t iv_scanreq_flags
struct ieee80211_txparam iv_txparms[IEEE80211_MODE_MAX]
void(* iv_bmiss)(struct ieee80211vap *)
struct callout iv_swbmiss
struct ieee80211_scan_ssid iv_scanreq_ssid[IEEE80211_SCAN_MAX_SSID]
struct ieee80211_tdma_state * iv_tdma
uint16_t iv_swbmiss_period
u_int iv_scanreq_duration
int(* iv_newstate)(struct ieee80211vap *, enum ieee80211_state, int)