1*f186073cSJoerg Sonnenberger /* 2*f186073cSJoerg Sonnenberger * Copyright (c) 2001 Atsushi Onoe 3*f186073cSJoerg Sonnenberger * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting 4*f186073cSJoerg Sonnenberger * All rights reserved. 5*f186073cSJoerg Sonnenberger * 6*f186073cSJoerg Sonnenberger * Redistribution and use in source and binary forms, with or without 7*f186073cSJoerg Sonnenberger * modification, are permitted provided that the following conditions 8*f186073cSJoerg Sonnenberger * are met: 9*f186073cSJoerg Sonnenberger * 1. Redistributions of source code must retain the above copyright 10*f186073cSJoerg Sonnenberger * notice, this list of conditions and the following disclaimer. 11*f186073cSJoerg Sonnenberger * 2. Redistributions in binary form must reproduce the above copyright 12*f186073cSJoerg Sonnenberger * notice, this list of conditions and the following disclaimer in the 13*f186073cSJoerg Sonnenberger * documentation and/or other materials provided with the distribution. 14*f186073cSJoerg Sonnenberger * 3. The name of the author may not be used to endorse or promote products 15*f186073cSJoerg Sonnenberger * derived from this software without specific prior written permission. 16*f186073cSJoerg Sonnenberger * 17*f186073cSJoerg Sonnenberger * Alternatively, this software may be distributed under the terms of the 18*f186073cSJoerg Sonnenberger * GNU General Public License ("GPL") version 2 as published by the Free 19*f186073cSJoerg Sonnenberger * Software Foundation. 20*f186073cSJoerg Sonnenberger * 21*f186073cSJoerg Sonnenberger * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22*f186073cSJoerg Sonnenberger * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23*f186073cSJoerg Sonnenberger * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24*f186073cSJoerg Sonnenberger * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25*f186073cSJoerg Sonnenberger * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26*f186073cSJoerg Sonnenberger * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*f186073cSJoerg Sonnenberger * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*f186073cSJoerg Sonnenberger * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*f186073cSJoerg Sonnenberger * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30*f186073cSJoerg Sonnenberger * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*f186073cSJoerg Sonnenberger * 32*f186073cSJoerg Sonnenberger * $FreeBSD: src/sys/net80211/ieee80211_node.h,v 1.10 2004/04/05 22:10:26 sam Exp $ 33*f186073cSJoerg Sonnenberger * $DragonFly: src/sys/netproto/802_11/ieee80211_node.h,v 1.1 2004/07/26 16:30:17 joerg Exp $ 34*f186073cSJoerg Sonnenberger */ 35*f186073cSJoerg Sonnenberger 36*f186073cSJoerg Sonnenberger #ifndef _NETPROTO_802_11_IEEE80211_NODE_H_ 37*f186073cSJoerg Sonnenberger #define _NETPROTO_802_11_IEEE80211_NODE_H_ 38*f186073cSJoerg Sonnenberger 39*f186073cSJoerg Sonnenberger #define IEEE80211_PSCAN_WAIT 5 /* passive scan wait */ 40*f186073cSJoerg Sonnenberger #define IEEE80211_TRANS_WAIT 5 /* transition wait */ 41*f186073cSJoerg Sonnenberger #define IEEE80211_INACT_WAIT 5 /* inactivity timer interval */ 42*f186073cSJoerg Sonnenberger #define IEEE80211_INACT_MAX (300/IEEE80211_INACT_WAIT) 43*f186073cSJoerg Sonnenberger 44*f186073cSJoerg Sonnenberger #define IEEE80211_NODE_HASHSIZE 32 45*f186073cSJoerg Sonnenberger /* simple hash is enough for variation of macaddr */ 46*f186073cSJoerg Sonnenberger #define IEEE80211_NODE_HASH(addr) \ 47*f186073cSJoerg Sonnenberger (((uint8_t *)(addr))[IEEE80211_ADDR_LEN - 1] % IEEE80211_NODE_HASHSIZE) 48*f186073cSJoerg Sonnenberger 49*f186073cSJoerg Sonnenberger #define IEEE80211_RATE_SIZE 8 /* 802.11 standard */ 50*f186073cSJoerg Sonnenberger #define IEEE80211_RATE_MAXSIZE 15 /* max rates we'll handle */ 51*f186073cSJoerg Sonnenberger 52*f186073cSJoerg Sonnenberger struct ieee80211_rateset { 53*f186073cSJoerg Sonnenberger uint8_t rs_nrates; 54*f186073cSJoerg Sonnenberger uint8_t rs_rates[IEEE80211_RATE_MAXSIZE]; 55*f186073cSJoerg Sonnenberger }; 56*f186073cSJoerg Sonnenberger 57*f186073cSJoerg Sonnenberger /* 58*f186073cSJoerg Sonnenberger * Node specific information. Note that drivers are expected 59*f186073cSJoerg Sonnenberger * to derive from this structure to add device-specific per-node 60*f186073cSJoerg Sonnenberger * state. This is done by overriding the ic_node_* methods in 61*f186073cSJoerg Sonnenberger * the ieee80211com structure. 62*f186073cSJoerg Sonnenberger */ 63*f186073cSJoerg Sonnenberger struct ieee80211_node { 64*f186073cSJoerg Sonnenberger TAILQ_ENTRY(ieee80211_node) ni_list; 65*f186073cSJoerg Sonnenberger LIST_ENTRY(ieee80211_node) ni_hash; 66*f186073cSJoerg Sonnenberger u_int ni_refcnt; 67*f186073cSJoerg Sonnenberger u_int ni_scangen; /* gen# for timeout scan */ 68*f186073cSJoerg Sonnenberger 69*f186073cSJoerg Sonnenberger /* hardware */ 70*f186073cSJoerg Sonnenberger uint32_t ni_rstamp; /* recv timestamp */ 71*f186073cSJoerg Sonnenberger uint8_t ni_rssi; /* recv ssi */ 72*f186073cSJoerg Sonnenberger 73*f186073cSJoerg Sonnenberger /* header */ 74*f186073cSJoerg Sonnenberger uint8_t ni_macaddr[IEEE80211_ADDR_LEN]; 75*f186073cSJoerg Sonnenberger uint8_t ni_bssid[IEEE80211_ADDR_LEN]; 76*f186073cSJoerg Sonnenberger 77*f186073cSJoerg Sonnenberger /* beacon, probe response */ 78*f186073cSJoerg Sonnenberger uint8_t ni_tstamp[8]; /* from last rcv'd beacon */ 79*f186073cSJoerg Sonnenberger uint16_t ni_intval; /* beacon interval */ 80*f186073cSJoerg Sonnenberger uint16_t ni_capinfo; /* capabilities */ 81*f186073cSJoerg Sonnenberger uint8_t ni_esslen; 82*f186073cSJoerg Sonnenberger uint8_t ni_essid[IEEE80211_NWID_LEN]; 83*f186073cSJoerg Sonnenberger struct ieee80211_rateset ni_rates; /* negotiated rate set */ 84*f186073cSJoerg Sonnenberger uint8_t *ni_country; /* country information XXX */ 85*f186073cSJoerg Sonnenberger struct ieee80211_channel *ni_chan; 86*f186073cSJoerg Sonnenberger uint16_t ni_fhdwell; /* FH only */ 87*f186073cSJoerg Sonnenberger uint8_t ni_fhindex; /* FH only */ 88*f186073cSJoerg Sonnenberger uint8_t ni_erp; /* 11g only */ 89*f186073cSJoerg Sonnenberger 90*f186073cSJoerg Sonnenberger #ifdef notyet 91*f186073cSJoerg Sonnenberger /* DTIM and contention free period (CFP) */ 92*f186073cSJoerg Sonnenberger uint8_t ni_dtimperiod; 93*f186073cSJoerg Sonnenberger uint8_t ni_cfpperiod; /* # of DTIMs between CFPs */ 94*f186073cSJoerg Sonnenberger uint16_t ni_cfpduremain; /* remaining cfp duration */ 95*f186073cSJoerg Sonnenberger uint16_t ni_cfpmaxduration;/* max CFP duration in TU */ 96*f186073cSJoerg Sonnenberger uint16_t ni_nextdtim; /* time to next DTIM */ 97*f186073cSJoerg Sonnenberger uint16_t ni_timoffset; 98*f186073cSJoerg Sonnenberger #endif 99*f186073cSJoerg Sonnenberger 100*f186073cSJoerg Sonnenberger /* others */ 101*f186073cSJoerg Sonnenberger uint16_t ni_associd; /* assoc response */ 102*f186073cSJoerg Sonnenberger uint16_t ni_txseq; /* seq to be transmitted */ 103*f186073cSJoerg Sonnenberger uint16_t ni_rxseq; /* seq previous received */ 104*f186073cSJoerg Sonnenberger int ni_fails; /* failure count to associate */ 105*f186073cSJoerg Sonnenberger int ni_inact; /* inactivity mark count */ 106*f186073cSJoerg Sonnenberger int ni_txrate; /* index to ni_rates[] */ 107*f186073cSJoerg Sonnenberger }; 108*f186073cSJoerg Sonnenberger 109*f186073cSJoerg Sonnenberger static __inline struct ieee80211_node * 110*f186073cSJoerg Sonnenberger ieee80211_ref_node(struct ieee80211_node *ni) 111*f186073cSJoerg Sonnenberger { 112*f186073cSJoerg Sonnenberger atomic_add_int(&ni->ni_refcnt, 1); 113*f186073cSJoerg Sonnenberger return ni; 114*f186073cSJoerg Sonnenberger } 115*f186073cSJoerg Sonnenberger 116*f186073cSJoerg Sonnenberger static __inline void 117*f186073cSJoerg Sonnenberger ieee80211_unref_node(struct ieee80211_node **ni) 118*f186073cSJoerg Sonnenberger { 119*f186073cSJoerg Sonnenberger atomic_subtract_int(&(*ni)->ni_refcnt, 1); 120*f186073cSJoerg Sonnenberger *ni = NULL; /* guard against use */ 121*f186073cSJoerg Sonnenberger } 122*f186073cSJoerg Sonnenberger 123*f186073cSJoerg Sonnenberger struct ieee80211com; 124*f186073cSJoerg Sonnenberger 125*f186073cSJoerg Sonnenberger #ifdef MALLOC_DECLARE 126*f186073cSJoerg Sonnenberger MALLOC_DECLARE(M_80211_NODE); 127*f186073cSJoerg Sonnenberger #endif 128*f186073cSJoerg Sonnenberger 129*f186073cSJoerg Sonnenberger extern void ieee80211_node_attach(struct ifnet *); 130*f186073cSJoerg Sonnenberger extern void ieee80211_node_lateattach(struct ifnet *); 131*f186073cSJoerg Sonnenberger extern void ieee80211_node_detach(struct ifnet *); 132*f186073cSJoerg Sonnenberger 133*f186073cSJoerg Sonnenberger extern void ieee80211_begin_scan(struct ifnet *); 134*f186073cSJoerg Sonnenberger extern void ieee80211_next_scan(struct ifnet *); 135*f186073cSJoerg Sonnenberger extern void ieee80211_end_scan(struct ifnet *); 136*f186073cSJoerg Sonnenberger extern struct ieee80211_node *ieee80211_alloc_node(struct ieee80211com *, 137*f186073cSJoerg Sonnenberger uint8_t *); 138*f186073cSJoerg Sonnenberger extern struct ieee80211_node *ieee80211_dup_bss(struct ieee80211com *, 139*f186073cSJoerg Sonnenberger uint8_t *); 140*f186073cSJoerg Sonnenberger extern struct ieee80211_node *ieee80211_find_node(struct ieee80211com *, 141*f186073cSJoerg Sonnenberger uint8_t *); 142*f186073cSJoerg Sonnenberger extern struct ieee80211_node *ieee80211_find_txnode(struct ieee80211com *, 143*f186073cSJoerg Sonnenberger uint8_t *); 144*f186073cSJoerg Sonnenberger extern struct ieee80211_node * ieee80211_lookup_node(struct ieee80211com *, 145*f186073cSJoerg Sonnenberger uint8_t *macaddr, struct ieee80211_channel *); 146*f186073cSJoerg Sonnenberger extern void ieee80211_free_node(struct ieee80211com *, 147*f186073cSJoerg Sonnenberger struct ieee80211_node *); 148*f186073cSJoerg Sonnenberger extern void ieee80211_free_allnodes(struct ieee80211com *); 149*f186073cSJoerg Sonnenberger typedef void ieee80211_iter_func(void *, struct ieee80211_node *); 150*f186073cSJoerg Sonnenberger extern void ieee80211_iterate_nodes(struct ieee80211com *ic, 151*f186073cSJoerg Sonnenberger ieee80211_iter_func *, void *); 152*f186073cSJoerg Sonnenberger extern void ieee80211_timeout_nodes(struct ieee80211com *); 153*f186073cSJoerg Sonnenberger 154*f186073cSJoerg Sonnenberger extern void ieee80211_create_ibss(struct ieee80211com* , 155*f186073cSJoerg Sonnenberger struct ieee80211_channel *); 156*f186073cSJoerg Sonnenberger #endif /* _NETPROTO_802_11_IEEE80211_NODE_H_ */ 157