1dc4301aeSRui Paulo /*- 2dc4301aeSRui Paulo * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting 3dc4301aeSRui Paulo * All rights reserved. 4dc4301aeSRui Paulo * 5dc4301aeSRui Paulo * Redistribution and use in source and binary forms, with or without 6dc4301aeSRui Paulo * modification, are permitted provided that the following conditions 7dc4301aeSRui Paulo * are met: 8dc4301aeSRui Paulo * 1. Redistributions of source code must retain the above copyright 9dc4301aeSRui Paulo * notice, this list of conditions and the following disclaimer. 10dc4301aeSRui Paulo * 2. Redistributions in binary form must reproduce the above copyright 11dc4301aeSRui Paulo * notice, this list of conditions and the following disclaimer in the 12dc4301aeSRui Paulo * documentation and/or other materials provided with the distribution. 13dc4301aeSRui Paulo * 14dc4301aeSRui Paulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15dc4301aeSRui Paulo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16dc4301aeSRui Paulo * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17dc4301aeSRui Paulo * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18dc4301aeSRui Paulo * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19dc4301aeSRui Paulo * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20dc4301aeSRui Paulo * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21dc4301aeSRui Paulo * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22dc4301aeSRui Paulo * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23dc4301aeSRui Paulo * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24dc4301aeSRui Paulo * 25dc4301aeSRui Paulo * $FreeBSD: head/sbin/ifconfig/regdomain.h 188258 2009-02-07 01:12:51Z sam $ 26dc4301aeSRui Paulo */ 27dc4301aeSRui Paulo #ifndef _LIB80211_H_ 28dc4301aeSRui Paulo #define _LIB80211_H_ 29dc4301aeSRui Paulo 30dc4301aeSRui Paulo #include <sys/cdefs.h> 31dc4301aeSRui Paulo #include <sys/queue.h> 32dc4301aeSRui Paulo 33dc4301aeSRui Paulo #include <netproto/802_11/ieee80211_regdomain.h> 34dc4301aeSRui Paulo 35dc4301aeSRui Paulo __BEGIN_DECLS 36dc4301aeSRui Paulo 37dc4301aeSRui Paulo struct freqband { 38dc4301aeSRui Paulo uint16_t freqStart; /* starting frequency (MHz) */ 39dc4301aeSRui Paulo uint16_t freqEnd; /* ending frequency (MHz) */ 40dc4301aeSRui Paulo uint8_t chanWidth; /* channel width (MHz) */ 41dc4301aeSRui Paulo uint8_t chanSep; /* channel sepaaration (MHz) */ 42dc4301aeSRui Paulo uint32_t flags; /* common operational constraints */ 43dc4301aeSRui Paulo 44dc4301aeSRui Paulo const void *id; 45dc4301aeSRui Paulo LIST_ENTRY(freqband) next; 46dc4301aeSRui Paulo }; 47dc4301aeSRui Paulo 48dc4301aeSRui Paulo /* private flags, don't pass to os */ 49dc4301aeSRui Paulo #define REQ_ECM 0x1 /* enable if ECM set */ 50dc4301aeSRui Paulo #define REQ_INDOOR 0x2 /* enable only for indoor operation */ 51dc4301aeSRui Paulo #define REQ_OUTDOOR 0x4 /* enable only for outdoor operation */ 52dc4301aeSRui Paulo 53dc4301aeSRui Paulo #define REQ_FLAGS (REQ_ECM|REQ_INDOOR|REQ_OUTDOOR) 54dc4301aeSRui Paulo 55dc4301aeSRui Paulo struct netband { 56dc4301aeSRui Paulo const struct freqband *band; /* channel list description */ 57dc4301aeSRui Paulo uint8_t maxPower; /* regulatory cap on tx power (dBm) */ 58dc4301aeSRui Paulo uint8_t maxPowerDFS; /* regulatory cap w/ DFS (dBm) */ 59dc4301aeSRui Paulo uint8_t maxAntGain; /* max allowed antenna gain (.5 dBm) */ 60dc4301aeSRui Paulo uint32_t flags; /* net80211 channel flags */ 61dc4301aeSRui Paulo 62dc4301aeSRui Paulo LIST_ENTRY(netband) next; 63dc4301aeSRui Paulo }; 64dc4301aeSRui Paulo typedef LIST_HEAD(, netband) netband_head; 65dc4301aeSRui Paulo 66dc4301aeSRui Paulo struct country; 67dc4301aeSRui Paulo 68dc4301aeSRui Paulo struct regdomain { 69dc4301aeSRui Paulo enum RegdomainCode sku; /* regdomain code/SKU */ 70dc4301aeSRui Paulo const char *name; /* printable name */ 71dc4301aeSRui Paulo const struct country *cc; /* country code for 1-1/default map */ 72dc4301aeSRui Paulo 73dc4301aeSRui Paulo netband_head bands_11b; /* 11b operation */ 74dc4301aeSRui Paulo netband_head bands_11g; /* 11g operation */ 75dc4301aeSRui Paulo netband_head bands_11a; /* 11a operation */ 76dc4301aeSRui Paulo netband_head bands_11ng; /* 11ng operation */ 77dc4301aeSRui Paulo netband_head bands_11na; /* 11na operation */ 78*f1699cf2SAaron LI netband_head bands_11ac; /* 11ac 5GHz operation */ 79*f1699cf2SAaron LI netband_head bands_11acg; /* 11ac 2GHz operation */ 80dc4301aeSRui Paulo 81dc4301aeSRui Paulo LIST_ENTRY(regdomain) next; 82dc4301aeSRui Paulo }; 83dc4301aeSRui Paulo 84dc4301aeSRui Paulo struct country { 85dc4301aeSRui Paulo enum ISOCountryCode code; 86dc4301aeSRui Paulo #define NO_COUNTRY 0xffff 87dc4301aeSRui Paulo const struct regdomain *rd; 88dc4301aeSRui Paulo const char* isoname; 89dc4301aeSRui Paulo const char* name; 90dc4301aeSRui Paulo 91dc4301aeSRui Paulo LIST_ENTRY(country) next; 92dc4301aeSRui Paulo }; 93dc4301aeSRui Paulo 9446158ff5SAaron LI enum IdentType { DOMAIN, COUNTRY, FREQBAND }; 9546158ff5SAaron LI 9646158ff5SAaron LI struct ident { 9746158ff5SAaron LI const void *id; 9846158ff5SAaron LI void *p; 9946158ff5SAaron LI enum IdentType type; 10046158ff5SAaron LI }; 101dc4301aeSRui Paulo 102dc4301aeSRui Paulo struct regdata { 103dc4301aeSRui Paulo LIST_HEAD(, country) countries; /* country code table */ 104dc4301aeSRui Paulo LIST_HEAD(, regdomain) domains; /* regulatory domains */ 105dc4301aeSRui Paulo LIST_HEAD(, freqband) freqbands; /* frequency band table */ 106dc4301aeSRui Paulo struct ident *ident; /* identifier table */ 107dc4301aeSRui Paulo }; 108dc4301aeSRui Paulo 109dc4301aeSRui Paulo #define _PATH_REGDOMAIN "/etc/regdomain.xml" 110dc4301aeSRui Paulo 111dc4301aeSRui Paulo struct regdata *lib80211_alloc_regdata(void); 112dc4301aeSRui Paulo void lib80211_free_regdata(struct regdata *); 113dc4301aeSRui Paulo 114dc4301aeSRui Paulo int lib80211_regdomain_readconfig(struct regdata *, const void *, size_t); 115dc4301aeSRui Paulo void lib80211_regdomain_cleanup(struct regdata *); 116dc4301aeSRui Paulo 117dc4301aeSRui Paulo const struct regdomain *lib80211_regdomain_findbysku(const struct regdata *, 118dc4301aeSRui Paulo enum RegdomainCode); 119dc4301aeSRui Paulo const struct regdomain *lib80211_regdomain_findbyname(const struct regdata *, 120dc4301aeSRui Paulo const char *); 121dc4301aeSRui Paulo 122dc4301aeSRui Paulo const struct country *lib80211_country_findbycc(const struct regdata *, 123dc4301aeSRui Paulo enum ISOCountryCode); 124dc4301aeSRui Paulo const struct country *lib80211_country_findbyname(const struct regdata *, 125dc4301aeSRui Paulo const char *); 126dc4301aeSRui Paulo 127dc4301aeSRui Paulo __END_DECLS 128dc4301aeSRui Paulo 129dc4301aeSRui Paulo #endif /* _LIB80211_H_ */ 130