xref: /freebsd/lib/lib80211/lib80211_regdomain.h (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1127be1a7SAdrian Chadd /*-
2127be1a7SAdrian Chadd  * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting
3127be1a7SAdrian Chadd  * All rights reserved.
4127be1a7SAdrian Chadd  *
5127be1a7SAdrian Chadd  * Redistribution and use in source and binary forms, with or without
6127be1a7SAdrian Chadd  * modification, are permitted provided that the following conditions
7127be1a7SAdrian Chadd  * are met:
8127be1a7SAdrian Chadd  * 1. Redistributions of source code must retain the above copyright
9127be1a7SAdrian Chadd  *    notice, this list of conditions and the following disclaimer.
10127be1a7SAdrian Chadd  * 2. Redistributions in binary form must reproduce the above copyright
11127be1a7SAdrian Chadd  *    notice, this list of conditions and the following disclaimer in the
12127be1a7SAdrian Chadd  *    documentation and/or other materials provided with the distribution.
13127be1a7SAdrian Chadd  *
14127be1a7SAdrian Chadd  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15127be1a7SAdrian Chadd  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16127be1a7SAdrian Chadd  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17127be1a7SAdrian Chadd  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18127be1a7SAdrian Chadd  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19127be1a7SAdrian Chadd  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20127be1a7SAdrian Chadd  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21127be1a7SAdrian Chadd  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22127be1a7SAdrian Chadd  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23127be1a7SAdrian Chadd  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24127be1a7SAdrian Chadd  */
25127be1a7SAdrian Chadd #ifndef _LIB80211_REGDOMAIN_H_
26127be1a7SAdrian Chadd #define _LIB80211_REGDOMAIN_H_
27127be1a7SAdrian Chadd 
28127be1a7SAdrian Chadd #include <sys/cdefs.h>
29127be1a7SAdrian Chadd #include <sys/queue.h>
30127be1a7SAdrian Chadd 
31127be1a7SAdrian Chadd #include <net80211/ieee80211_regdomain.h>
32127be1a7SAdrian Chadd 
33127be1a7SAdrian Chadd __BEGIN_DECLS
34127be1a7SAdrian Chadd 
35127be1a7SAdrian Chadd struct freqband {
36127be1a7SAdrian Chadd 	uint16_t	freqStart;	/* starting frequency (MHz) */
37127be1a7SAdrian Chadd 	uint16_t	freqEnd;	/* ending frequency (MHz) */
38127be1a7SAdrian Chadd 	uint8_t		chanWidth;	/* channel width (MHz) */
39127be1a7SAdrian Chadd 	uint8_t		chanSep;	/* channel sepaaration (MHz) */
40127be1a7SAdrian Chadd 	uint32_t	flags;		/* common operational constraints */
41127be1a7SAdrian Chadd 
42127be1a7SAdrian Chadd 	const void	*id;
43127be1a7SAdrian Chadd 	LIST_ENTRY(freqband) next;
44127be1a7SAdrian Chadd };
45127be1a7SAdrian Chadd 
46127be1a7SAdrian Chadd /* private flags, don't pass to os */
47127be1a7SAdrian Chadd #define	REQ_ECM		0x1		/* enable if ECM set */
48127be1a7SAdrian Chadd #define	REQ_INDOOR	0x2		/* enable only for indoor operation */
49127be1a7SAdrian Chadd #define	REQ_OUTDOOR	0x4		/* enable only for outdoor operation */
50127be1a7SAdrian Chadd 
51127be1a7SAdrian Chadd #define	REQ_FLAGS	(REQ_ECM|REQ_INDOOR|REQ_OUTDOOR)
52127be1a7SAdrian Chadd 
53127be1a7SAdrian Chadd struct netband {
54127be1a7SAdrian Chadd 	const struct freqband *band;	/* channel list description */
55127be1a7SAdrian Chadd 	uint8_t		maxPower;	/* regulatory cap on tx power (dBm) */
56127be1a7SAdrian Chadd 	uint8_t		maxPowerDFS;	/* regulatory cap w/ DFS (dBm) */
57127be1a7SAdrian Chadd 	uint8_t		maxAntGain;	/* max allowed antenna gain (.5 dBm) */
58127be1a7SAdrian Chadd 	uint32_t	flags;		/* net80211 channel flags */
59127be1a7SAdrian Chadd 
60127be1a7SAdrian Chadd 	LIST_ENTRY(netband) next;
61127be1a7SAdrian Chadd };
62127be1a7SAdrian Chadd typedef LIST_HEAD(, netband) netband_head;
63127be1a7SAdrian Chadd 
64127be1a7SAdrian Chadd struct country;
65127be1a7SAdrian Chadd 
66127be1a7SAdrian Chadd struct regdomain {
67127be1a7SAdrian Chadd 	enum RegdomainCode	sku;	/* regdomain code/SKU */
68127be1a7SAdrian Chadd 	const char		*name;	/* printable name */
69127be1a7SAdrian Chadd 	const struct country	*cc;	/* country code for 1-1/default map */
70127be1a7SAdrian Chadd 
71127be1a7SAdrian Chadd 	netband_head	 bands_11b;	/* 11b operation */
72127be1a7SAdrian Chadd 	netband_head	 bands_11g;	/* 11g operation */
73127be1a7SAdrian Chadd 	netband_head	 bands_11a;	/* 11a operation */
74127be1a7SAdrian Chadd 	netband_head	 bands_11ng;	/* 11ng operation */
75127be1a7SAdrian Chadd 	netband_head	 bands_11na;	/* 11na operation */
76*36ea5759SAdrian Chadd 	netband_head	 bands_11ac;	/* 11ac 5GHz operation */
77*36ea5759SAdrian Chadd 	netband_head	 bands_11acg;	/* 11ac 2GHz operation */
78127be1a7SAdrian Chadd 
79127be1a7SAdrian Chadd 	LIST_ENTRY(regdomain)	next;
80127be1a7SAdrian Chadd };
81127be1a7SAdrian Chadd 
82127be1a7SAdrian Chadd struct country {
83127be1a7SAdrian Chadd 	enum ISOCountryCode	code;
84127be1a7SAdrian Chadd #define	NO_COUNTRY	0xffff
85127be1a7SAdrian Chadd 	const struct regdomain	*rd;
86127be1a7SAdrian Chadd 	const char*		isoname;
87127be1a7SAdrian Chadd 	const char*		name;
88127be1a7SAdrian Chadd 
89127be1a7SAdrian Chadd 	LIST_ENTRY(country)	next;
90127be1a7SAdrian Chadd };
91127be1a7SAdrian Chadd 
92127be1a7SAdrian Chadd struct ident;
93127be1a7SAdrian Chadd 
94127be1a7SAdrian Chadd struct regdata {
95127be1a7SAdrian Chadd 	LIST_HEAD(, country)	countries;	/* country code table */
96127be1a7SAdrian Chadd 	LIST_HEAD(, regdomain)	domains;	/* regulatory domains */
97127be1a7SAdrian Chadd 	LIST_HEAD(, freqband)	freqbands;	/* frequency band table */
98127be1a7SAdrian Chadd 	struct ident		*ident;		/* identifier table */
99127be1a7SAdrian Chadd };
100127be1a7SAdrian Chadd 
101127be1a7SAdrian Chadd #define	_PATH_REGDOMAIN	"/etc/regdomain.xml"
102127be1a7SAdrian Chadd 
103127be1a7SAdrian Chadd struct regdata *lib80211_alloc_regdata(void);
104127be1a7SAdrian Chadd void	lib80211_free_regdata(struct regdata *);
105127be1a7SAdrian Chadd 
106127be1a7SAdrian Chadd int	lib80211_regdomain_readconfig(struct regdata *, const void *, size_t);
107127be1a7SAdrian Chadd void	lib80211_regdomain_cleanup(struct regdata *);
108127be1a7SAdrian Chadd 
109127be1a7SAdrian Chadd const struct regdomain *lib80211_regdomain_findbysku(const struct regdata *,
110127be1a7SAdrian Chadd 	enum RegdomainCode);
111127be1a7SAdrian Chadd const struct regdomain *lib80211_regdomain_findbyname(const struct regdata *,
112127be1a7SAdrian Chadd 	const char *);
113127be1a7SAdrian Chadd 
114127be1a7SAdrian Chadd const struct country *lib80211_country_findbycc(const struct regdata *,
115127be1a7SAdrian Chadd 	enum ISOCountryCode);
116127be1a7SAdrian Chadd const struct country *lib80211_country_findbyname(const struct regdata *,
117127be1a7SAdrian Chadd 	const char *);
118127be1a7SAdrian Chadd 
119127be1a7SAdrian Chadd __END_DECLS
120127be1a7SAdrian Chadd 
121127be1a7SAdrian Chadd #endif /* _LIB80211_REGDOMAIN_H_ */
122