110ad9a77SSam Leffler /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3fe267a55SPedro F. Giffuni * 410ad9a77SSam Leffler * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting 510ad9a77SSam Leffler * Copyright (c) 2007-2009 Intel Corporation 610ad9a77SSam Leffler * All rights reserved. 710ad9a77SSam Leffler * 810ad9a77SSam Leffler * Redistribution and use in source and binary forms, with or without 910ad9a77SSam Leffler * modification, are permitted provided that the following conditions 1010ad9a77SSam Leffler * are met: 1110ad9a77SSam Leffler * 1. Redistributions of source code must retain the above copyright 1210ad9a77SSam Leffler * notice, this list of conditions and the following disclaimer. 1310ad9a77SSam Leffler * 2. Redistributions in binary form must reproduce the above copyright 1410ad9a77SSam Leffler * notice, this list of conditions and the following disclaimer in the 1510ad9a77SSam Leffler * documentation and/or other materials provided with the distribution. 1610ad9a77SSam Leffler * 1710ad9a77SSam Leffler * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1810ad9a77SSam Leffler * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1910ad9a77SSam Leffler * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2010ad9a77SSam Leffler * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2110ad9a77SSam Leffler * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2210ad9a77SSam Leffler * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310ad9a77SSam Leffler * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410ad9a77SSam Leffler * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510ad9a77SSam Leffler * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2610ad9a77SSam Leffler * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710ad9a77SSam Leffler */ 2810ad9a77SSam Leffler #ifndef _NET80211_IEEE80211_TDMA_H_ 2910ad9a77SSam Leffler #define _NET80211_IEEE80211_TDMA_H_ 3010ad9a77SSam Leffler 3110ad9a77SSam Leffler /* 3210ad9a77SSam Leffler * TDMA-mode implementation definitions. 3310ad9a77SSam Leffler */ 349d90db93SSam Leffler 359d90db93SSam Leffler #define TDMA_SUBTYPE_PARAM 0x01 369d90db93SSam Leffler #define TDMA_VERSION_V2 2 379d90db93SSam Leffler #define TDMA_VERSION TDMA_VERSION_V2 389d90db93SSam Leffler 399d90db93SSam Leffler /* NB: we only support 2 right now but protocol handles up to 8 */ 409d90db93SSam Leffler #define TDMA_MAXSLOTS 2 /* max slots/sta's */ 419d90db93SSam Leffler 429d90db93SSam Leffler #define TDMA_PARAM_LEN_V2 sizeof(struct ieee80211_tdma_param) 439d90db93SSam Leffler 449d90db93SSam Leffler /* 459d90db93SSam Leffler * TDMA information element. 469d90db93SSam Leffler */ 479d90db93SSam Leffler struct ieee80211_tdma_param { 489d90db93SSam Leffler u_int8_t tdma_id; /* IEEE80211_ELEMID_VENDOR */ 499d90db93SSam Leffler u_int8_t tdma_len; 509d90db93SSam Leffler u_int8_t tdma_oui[3]; /* TDMA_OUI */ 519d90db93SSam Leffler u_int8_t tdma_type; /* TDMA_OUI_TYPE */ 529d90db93SSam Leffler u_int8_t tdma_subtype; /* TDMA_SUBTYPE_PARAM */ 539d90db93SSam Leffler u_int8_t tdma_version; /* spec revision */ 549d90db93SSam Leffler u_int8_t tdma_slot; /* station slot # [0..7] */ 559d90db93SSam Leffler u_int8_t tdma_slotcnt; /* bss slot count [1..8] */ 569d90db93SSam Leffler u_int16_t tdma_slotlen; /* bss slot len (100us) */ 579d90db93SSam Leffler u_int8_t tdma_bintval; /* beacon interval (superframes) */ 589d90db93SSam Leffler u_int8_t tdma_inuse[1]; /* slot occupancy map */ 599d90db93SSam Leffler u_int8_t tdma_pad[2]; 609d90db93SSam Leffler u_int8_t tdma_tstamp[8]; /* timestamp from last beacon */ 619d90db93SSam Leffler } __packed; 629d90db93SSam Leffler 639d90db93SSam Leffler #ifdef _KERNEL 649d90db93SSam Leffler /* 659d90db93SSam Leffler * Implementation state. 669d90db93SSam Leffler */ 6710ad9a77SSam Leffler struct ieee80211_tdma_state { 6810ad9a77SSam Leffler u_int tdma_slotlen; /* bss slot length (us) */ 692bc3ce77SSam Leffler uint8_t tdma_version; /* protocol version to use */ 7010ad9a77SSam Leffler uint8_t tdma_slotcnt; /* bss slot count */ 7110ad9a77SSam Leffler uint8_t tdma_bintval; /* beacon interval (slots) */ 7210ad9a77SSam Leffler uint8_t tdma_slot; /* station slot # */ 7310ad9a77SSam Leffler uint8_t tdma_inuse[1]; /* mask of slots in use */ 7410ad9a77SSam Leffler uint8_t tdma_active[1]; /* mask of active slots */ 7510ad9a77SSam Leffler int tdma_count; /* active/inuse countdown */ 76f9b5a72fSSam Leffler void *tdma_peer; /* peer station cookie */ 77f9b5a72fSSam Leffler struct timeval tdma_lastprint; /* time of last rate-limited printf */ 78f9b5a72fSSam Leffler int tdma_fails; /* fail count for rate-limiting */ 7910ad9a77SSam Leffler 8010ad9a77SSam Leffler /* parent method pointers */ 8110ad9a77SSam Leffler int (*tdma_newstate)(struct ieee80211vap *, enum ieee80211_state, 8210ad9a77SSam Leffler int arg); 8310ad9a77SSam Leffler void (*tdma_recv_mgmt)(struct ieee80211_node *, 84c79f192cSAdrian Chadd struct mbuf *, int, 85c79f192cSAdrian Chadd const struct ieee80211_rx_stats *rxs, int, int); 8610ad9a77SSam Leffler void (*tdma_opdetach)(struct ieee80211vap *); 8710ad9a77SSam Leffler }; 8810ad9a77SSam Leffler 892bc3ce77SSam Leffler #define TDMA_UPDATE_SLOT 0x0001 /* tdma_slot changed */ 902bc3ce77SSam Leffler #define TDMA_UPDATE_SLOTCNT 0x0002 /* tdma_slotcnt changed */ 912bc3ce77SSam Leffler #define TDMA_UPDATE_SLOTLEN 0x0004 /* tdma_slotlen changed */ 922bc3ce77SSam Leffler #define TDMA_UPDATE_BINTVAL 0x0008 /* tdma_bintval changed */ 932bc3ce77SSam Leffler 9410ad9a77SSam Leffler void ieee80211_tdma_vattach(struct ieee80211vap *); 9510ad9a77SSam Leffler 9610ad9a77SSam Leffler int ieee80211_tdma_getslot(struct ieee80211vap *vap); 9710ad9a77SSam Leffler void ieee80211_parse_tdma(struct ieee80211_node *ni, const uint8_t *ie); 9810ad9a77SSam Leffler uint8_t *ieee80211_add_tdma(uint8_t *frm, struct ieee80211vap *vap); 9910ad9a77SSam Leffler struct ieee80211_beacon_offsets; 10010ad9a77SSam Leffler void ieee80211_tdma_update_beacon(struct ieee80211vap *vap, 10110ad9a77SSam Leffler struct ieee80211_beacon_offsets *bo); 1029d90db93SSam Leffler #endif /* _KERNEL */ 10310ad9a77SSam Leffler #endif /* !_NET80211_IEEE80211_TDMA_H_ */ 104