aboutsummaryrefslogtreecommitdiff
path: root/lib/lib80211
diff options
context:
space:
mode:
Diffstat (limited to 'lib/lib80211')
-rw-r--r--lib/lib80211/Makefile17
-rw-r--r--lib/lib80211/Makefile.depend17
-rw-r--r--lib/lib80211/lib80211.3117
-rw-r--r--lib/lib80211/lib80211_ioctl.c157
-rw-r--r--lib/lib80211/lib80211_ioctl.h69
-rw-r--r--lib/lib80211/lib80211_regdomain.c737
-rw-r--r--lib/lib80211/lib80211_regdomain.h121
-rw-r--r--lib/lib80211/regdomain.xml2485
8 files changed, 3720 insertions, 0 deletions
diff --git a/lib/lib80211/Makefile b/lib/lib80211/Makefile
new file mode 100644
index 000000000000..78819cb9cfac
--- /dev/null
+++ b/lib/lib80211/Makefile
@@ -0,0 +1,17 @@
+PACKAGE= runtime
+CONFS= regdomain.xml
+LIB= 80211
+SHLIBDIR?= /lib
+SHLIB_MAJOR= 1
+SRCS= lib80211_regdomain.c lib80211_ioctl.c
+
+INCSDIR= ${INCLUDEDIR}/lib80211
+INCS= lib80211_regdomain.h lib80211_ioctl.h
+
+LIBADD= sbuf bsdxml
+
+MAN= lib80211.3
+
+CFLAGS+=-I${.CURDIR}
+
+.include <bsd.lib.mk>
diff --git a/lib/lib80211/Makefile.depend b/lib/lib80211/Makefile.depend
new file mode 100644
index 000000000000..9a89b5f28736
--- /dev/null
+++ b/lib/lib80211/Makefile.depend
@@ -0,0 +1,17 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+ include \
+ include/xlocale \
+ lib/${CSU_DIR} \
+ lib/libc \
+ lib/libcompiler_rt \
+ lib/libexpat \
+ lib/libsbuf \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/lib/lib80211/lib80211.3 b/lib/lib80211/lib80211.3
new file mode 100644
index 000000000000..bf90dd9189dc
--- /dev/null
+++ b/lib/lib80211/lib80211.3
@@ -0,0 +1,117 @@
+.\" Copyright (c) 2015 Adrian Chadd.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.Dd December 15, 2015
+.Dt 80211 3
+.Os
+.Sh NAME
+.Nm lib80211_alloc_regdata ,
+.Nm lib80211_free_regdata ,
+.Nm lib80211_regdomain_readconfig ,
+.Nm lib80211_regdomain_cleanup ,
+.Nm lib80211_regdomain_findbysku ,
+.Nm lib80211_regdomain_findbyname ,
+.Nm lib80211_country_findbycc ,
+.Nm lib80211_country_findbyname
+.Nd manage net80211 configuration and regulatory database
+.Sh LIBRARY
+.Lb lib80211
+.Sh SYNOPSIS
+.In lib80211/lib80211_regdomain.h
+.In lib80211/lib80211_ioctl.h
+.Ft struct regdata *
+.Fn lib80211_alloc_regdata void
+.Ft void
+.Fn lib80211_free_regdata "struct regdata *reg"
+.Ft int
+.Fn lib80211_regdomain_readconfig "struct regdata *reg" "const void *config" "size_t size"
+.Ft void
+.Fn lib80211_regdomain_cleanup "struct regdata *reg"
+.Ft const struct regdomain *
+.Fn lib80211_regdomain_findbysku "const struct regdata *reg" "enumRegDomainCode"
+.Ft const struct regdomain *
+.Fn lib80211_regdomain_findbyname "const struct regdata *reg" "const char *sku"
+.Ft const struct country *
+.Fn lib80211_country_findbycc "const struct regdata *reg" "enum ISOCountryCode"
+.Ft const struct country *
+.Fn lib80211_country_findbyname "const struct regdata *reg" "const char *cc"
+.Sh DESCRIPTION
+The
+.Nm lib80211
+library is an interface to the
+.Xr net80211 4
+infrastructure.
+It implements wrappers around the
+.Xr net80211 4
+ioctl command, as well as providing a convenient API to access the regulatory
+database.
+.Pp
+The
+.Fn lib80211_alloc_regdata
+and
+.Fn lib80211_free_regdata
+function allocates / frees a regdata structure to store regulatory domain
+information in.
+.Pp
+The
+.Fn lib80211_regdomain_readconfig
+and
+.Fn lib80211_regdomain_cleanup
+functions read in the regulatory database XML configuration and free it when
+finished.
+.Pp
+The
+.Fn lib80211_regdomain_findbysku
+and
+.Fn lib80211_regdomain_findbyname
+functions look up a regulatory domain entry by SKU enum and SKU name
+respectively.
+.Pp
+The
+.Fn lib80211_country_findbycc
+and
+.Fn lib80211_country_findbyname
+functions look up a country information entry by ISO country enum and
+ISO country code string respectively.
+.Sh RETURN VALUES
+The
+.Fn lib80211_alloc_regdata ,
+.Fn lib80211_regdomain_readconfig ,
+.Fn lib80211_regdomain_findbysku ,
+.Fn lib80211_regdomain_findbyname ,
+.Fn lib80211_country_findbycc ,
+.Fn lib80211_country_findbyname
+return
+.Dv NULL
+upon error.
+.Sh SEE ALSO
+.Xr net80211 4 ,
+.Xr ifconfig 8
+.Sh HISTORY
+The
+.Nm lib80211
+library first appeared in
+.Fx 11.0 .
+.Sh AUTHORS
+.An Adrian Chadd
diff --git a/lib/lib80211/lib80211_ioctl.c b/lib/lib80211/lib80211_ioctl.c
new file mode 100644
index 000000000000..b284f0a4c108
--- /dev/null
+++ b/lib/lib80211/lib80211_ioctl.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2001 The Aerospace Corporation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of The Aerospace Corporation may not be used to endorse or
+ * promote products derived from this software.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AEROSPACE CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AEROSPACE CORPORATION BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*-
+ * Copyright (c) 1997, 1998, 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sysctl.h>
+#include <sys/time.h>
+
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+#include <net/if_media.h>
+#include <net/route.h>
+
+#include <net80211/ieee80211_ioctl.h>
+#include <net80211/ieee80211_freebsd.h>
+#include <net80211/ieee80211_superg.h>
+#include <net80211/ieee80211_tdma.h>
+#include <net80211/ieee80211_mesh.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stddef.h> /* NB: for offsetof */
+
+#include "lib80211_ioctl.h"
+
+/*
+ * These implement basic net80211 accessor methods to wrap the IOCTL
+ * calls.
+ */
+
+int
+lib80211_get80211(int s, const char *name, int type, void *data, int len)
+{
+ struct ieee80211req ireq;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = type;
+ ireq.i_data = data;
+ ireq.i_len = len;
+ return ioctl(s, SIOCG80211, &ireq);
+}
+
+int
+lib80211_get80211len(int s, const char *name, int type, void *data, int len, int *plen)
+{
+ struct ieee80211req ireq;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = type;
+ ireq.i_len = len;
+ assert(ireq.i_len == len); /* NB: check for 16-bit truncation */
+ ireq.i_data = data;
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ return -1;
+ *plen = ireq.i_len;
+ return 0;
+}
+
+int
+lib80211_get80211val(int s, const char *name, int type, int *val)
+{
+ struct ieee80211req ireq;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = type;
+ if (ioctl(s, SIOCG80211, &ireq) < 0)
+ return -1;
+ *val = ireq.i_val;
+ return 0;
+}
+
+int
+lib80211_set80211(int s, const char *name, int type, int val, int len, void *data)
+{
+ struct ieee80211req ireq;
+
+ (void) memset(&ireq, 0, sizeof(ireq));
+ (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name));
+ ireq.i_type = type;
+ ireq.i_val = val;
+ ireq.i_len = len;
+ assert(ireq.i_len == len); /* NB: check for 16-bit truncation */
+ ireq.i_data = data;
+ if (ioctl(s, SIOCS80211, &ireq) < 0)
+ return (-1);
+ return (0);
+}
+
diff --git a/lib/lib80211/lib80211_ioctl.h b/lib/lib80211/lib80211_ioctl.h
new file mode 100644
index 000000000000..f41b0c59b0b4
--- /dev/null
+++ b/lib/lib80211/lib80211_ioctl.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2001 The Aerospace Corporation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of The Aerospace Corporation may not be used to endorse or
+ * promote products derived from this software.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AEROSPACE CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AEROSPACE CORPORATION BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*-
+ * Copyright (c) 1997, 1998, 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __LIB80211_IOCTL_H__
+#define __LIB80211_IOCTL_H__
+
+extern int lib80211_get80211(int s, const char *name, int type, void *data,
+ int len);
+extern int lib80211_get80211len(int s, const char *name, int type, void *data,
+ int len, int *plen);
+extern int lib80211_get80211val(int s, const char *name, int type, int *val);
+extern int lib80211_set80211(int s, const char *name, int type, int val,
+ int len, void *data);
+
+#endif /* __LIB80211_IOCTL_H__ */
diff --git a/lib/lib80211/lib80211_regdomain.c b/lib/lib80211/lib80211_regdomain.c
new file mode 100644
index 000000000000..db353a69f4d9
--- /dev/null
+++ b/lib/lib80211/lib80211_regdomain.c
@@ -0,0 +1,737 @@
+/*-
+ * Copyright (c) 2008 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <sys/errno.h>
+#include <sys/param.h>
+#include <sys/mman.h>
+#include <sys/sbuf.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <err.h>
+#include <unistd.h>
+
+#include <bsdxml.h>
+
+#include "lib80211_regdomain.h"
+
+#include <net80211/_ieee80211.h>
+
+#define MAXLEVEL 20
+
+struct mystate {
+ XML_Parser parser;
+ struct regdata *rdp;
+ struct regdomain *rd; /* current domain */
+ struct netband *netband; /* current netband */
+ struct freqband *freqband; /* current freqband */
+ struct country *country; /* current country */
+ netband_head *curband; /* current netband list */
+ int level;
+ struct sbuf *sbuf[MAXLEVEL];
+ int nident;
+};
+
+struct ident {
+ const void *id;
+ void *p;
+ enum { DOMAIN, COUNTRY, FREQBAND } type;
+};
+
+static void
+start_element(void *data, const char *name, const char **attr)
+{
+#define iseq(a,b) (strcasecmp(a,b) == 0)
+ struct mystate *mt;
+ const void *id, *ref, *mode;
+ int i;
+
+ mt = data;
+ if (++mt->level == MAXLEVEL) {
+ /* XXX force parser to abort */
+ return;
+ }
+ mt->sbuf[mt->level] = sbuf_new_auto();
+ id = ref = mode = NULL;
+ for (i = 0; attr[i] != NULL; i += 2) {
+ if (iseq(attr[i], "id")) {
+ id = attr[i+1];
+ } else if (iseq(attr[i], "ref")) {
+ ref = attr[i+1];
+ } else if (iseq(attr[i], "mode")) {
+ mode = attr[i+1];
+ } else
+ printf("%*.*s[%s = %s]\n", mt->level + 1,
+ mt->level + 1, "", attr[i], attr[i+1]);
+ }
+ if (iseq(name, "rd") && mt->rd == NULL) {
+ if (mt->country == NULL) {
+ mt->rd = calloc(1, sizeof(struct regdomain));
+ mt->rd->name = strdup(id);
+ mt->nident++;
+ LIST_INSERT_HEAD(&mt->rdp->domains, mt->rd, next);
+ } else
+ mt->country->rd = (void *)strdup(ref);
+ return;
+ }
+ if (iseq(name, "defcc") && mt->rd != NULL) {
+ mt->rd->cc = (void *)strdup(ref);
+ return;
+ }
+ if (iseq(name, "netband") && mt->curband == NULL && mt->rd != NULL) {
+ if (mode == NULL) {
+ warnx("no mode for netband at line %ld",
+ XML_GetCurrentLineNumber(mt->parser));
+ return;
+ }
+ if (iseq(mode, "11b"))
+ mt->curband = &mt->rd->bands_11b;
+ else if (iseq(mode, "11g"))
+ mt->curband = &mt->rd->bands_11g;
+ else if (iseq(mode, "11a"))
+ mt->curband = &mt->rd->bands_11a;
+ else if (iseq(mode, "11ng"))
+ mt->curband = &mt->rd->bands_11ng;
+ else if (iseq(mode, "11na"))
+ mt->curband = &mt->rd->bands_11na;
+ else if (iseq(mode, "11ac"))
+ mt->curband = &mt->rd->bands_11ac;
+ else if (iseq(mode, "11acg"))
+ mt->curband = &mt->rd->bands_11acg;
+ else
+ warnx("unknown mode \"%s\" at line %ld",
+ __DECONST(char *, mode),
+ XML_GetCurrentLineNumber(mt->parser));
+ return;
+ }
+ if (iseq(name, "band") && mt->netband == NULL) {
+ if (mt->curband == NULL) {
+ warnx("band without enclosing netband at line %ld",
+ XML_GetCurrentLineNumber(mt->parser));
+ return;
+ }
+ mt->netband = calloc(1, sizeof(struct netband));
+ LIST_INSERT_HEAD(mt->curband, mt->netband, next);
+ return;
+ }
+ if (iseq(name, "freqband") && mt->freqband == NULL && mt->netband != NULL) {
+ /* XXX handle inlines and merge into table? */
+ if (mt->netband->band != NULL) {
+ warnx("duplicate freqband at line %ld ignored",
+ XML_GetCurrentLineNumber(mt->parser));
+ /* XXX complain */
+ } else
+ mt->netband->band = (void *)strdup(ref);
+ return;
+ }
+
+ if (iseq(name, "country") && mt->country == NULL) {
+ mt->country = calloc(1, sizeof(struct country));
+ mt->country->isoname = strdup(id);
+ mt->country->code = NO_COUNTRY;
+ mt->nident++;
+ LIST_INSERT_HEAD(&mt->rdp->countries, mt->country, next);
+ return;
+ }
+
+ if (iseq(name, "freqband") && mt->freqband == NULL) {
+ mt->freqband = calloc(1, sizeof(struct freqband));
+ mt->freqband->id = strdup(id);
+ mt->nident++;
+ LIST_INSERT_HEAD(&mt->rdp->freqbands, mt->freqband, next);
+ return;
+ }
+#undef iseq
+}
+
+static int
+decode_flag(struct mystate *mt, const char *p, int len)
+{
+#define iseq(a,b) (strcasecmp(a,b) == 0)
+ static const struct {
+ const char *name;
+ int len;
+ uint32_t value;
+ } flags[] = {
+#define FLAG(x) { #x, sizeof(#x)-1, x }
+ FLAG(IEEE80211_CHAN_A),
+ FLAG(IEEE80211_CHAN_B),
+ FLAG(IEEE80211_CHAN_G),
+ FLAG(IEEE80211_CHAN_HT20),
+ FLAG(IEEE80211_CHAN_HT40),
+ FLAG(IEEE80211_CHAN_VHT20),
+ FLAG(IEEE80211_CHAN_VHT40),
+ FLAG(IEEE80211_CHAN_VHT80),
+ FLAG(IEEE80211_CHAN_VHT160),
+ /*
+ * XXX VHT80P80? This likely should be done by
+ * 80MHz chan logic in net80211 / ifconfig.
+ */
+ FLAG(IEEE80211_CHAN_ST),
+ FLAG(IEEE80211_CHAN_TURBO),
+ FLAG(IEEE80211_CHAN_PASSIVE),
+ FLAG(IEEE80211_CHAN_DFS),
+ FLAG(IEEE80211_CHAN_CCK),
+ FLAG(IEEE80211_CHAN_OFDM),
+ FLAG(IEEE80211_CHAN_2GHZ),
+ FLAG(IEEE80211_CHAN_5GHZ),
+ FLAG(IEEE80211_CHAN_DYN),
+ FLAG(IEEE80211_CHAN_GFSK),
+ FLAG(IEEE80211_CHAN_GSM),
+ FLAG(IEEE80211_CHAN_STURBO),
+ FLAG(IEEE80211_CHAN_HALF),
+ FLAG(IEEE80211_CHAN_QUARTER),
+ FLAG(IEEE80211_CHAN_HT40U),
+ FLAG(IEEE80211_CHAN_HT40D),
+ FLAG(IEEE80211_CHAN_4MSXMIT),
+ FLAG(IEEE80211_CHAN_NOADHOC),
+ FLAG(IEEE80211_CHAN_NOHOSTAP),
+ FLAG(IEEE80211_CHAN_11D),
+ FLAG(IEEE80211_CHAN_FHSS),
+ FLAG(IEEE80211_CHAN_PUREG),
+ FLAG(IEEE80211_CHAN_108A),
+ FLAG(IEEE80211_CHAN_108G),
+#undef FLAG
+ { "ECM", 3, REQ_ECM },
+ { "INDOOR", 6, REQ_INDOOR },
+ { "OUTDOOR", 7, REQ_OUTDOOR },
+ };
+ unsigned int i;
+
+ for (i = 0; i < nitems(flags); i++)
+ if (len == flags[i].len && iseq(p, flags[i].name))
+ return flags[i].value;
+ warnx("unknown flag \"%.*s\" at line %ld ignored",
+ len, p, XML_GetCurrentLineNumber(mt->parser));
+ return 0;
+#undef iseq
+}
+
+static void
+end_element(void *data, const char *name)
+{
+#define iseq(a,b) (strcasecmp(a,b) == 0)
+ struct mystate *mt;
+ int len;
+ char *p;
+
+ mt = data;
+ sbuf_finish(mt->sbuf[mt->level]);
+ p = sbuf_data(mt->sbuf[mt->level]);
+ len = sbuf_len(mt->sbuf[mt->level]);
+
+ /* <freqband>...</freqband> */
+ if (iseq(name, "freqstart") && mt->freqband != NULL) {
+ mt->freqband->freqStart = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "freqend") && mt->freqband != NULL) {
+ mt->freqband->freqEnd = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "chanwidth") && mt->freqband != NULL) {
+ mt->freqband->chanWidth = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "chansep") && mt->freqband != NULL) {
+ mt->freqband->chanSep = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "flags")) {
+ if (mt->freqband != NULL)
+ mt->freqband->flags |= decode_flag(mt, p, len);
+ else if (mt->netband != NULL)
+ mt->netband->flags |= decode_flag(mt, p, len);
+ else {
+ warnx("flags without freqband or netband at line %ld ignored",
+ XML_GetCurrentLineNumber(mt->parser));
+ }
+ goto done;
+ }
+
+ /* <rd> ... </rd> */
+ if (iseq(name, "name") && mt->rd != NULL) {
+ mt->rd->name = strdup(p);
+ goto done;
+ }
+ if (iseq(name, "sku") && mt->rd != NULL) {
+ mt->rd->sku = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "netband") && mt->rd != NULL) {
+ mt->curband = NULL;
+ goto done;
+ }
+
+ /* <band> ... </band> */
+ if (iseq(name, "freqband") && mt->netband != NULL) {
+ /* XXX handle inline freqbands */
+ goto done;
+ }
+ if (iseq(name, "maxpower") && mt->netband != NULL) {
+ mt->netband->maxPower = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "maxpowerdfs") && mt->netband != NULL) {
+ mt->netband->maxPowerDFS = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "maxantgain") && mt->netband != NULL) {
+ mt->netband->maxAntGain = strtoul(p, NULL, 0);
+ goto done;
+ }
+
+ /* <country>...</country> */
+ if (iseq(name, "isocc") && mt->country != NULL) {
+ mt->country->code = strtoul(p, NULL, 0);
+ goto done;
+ }
+ if (iseq(name, "name") && mt->country != NULL) {
+ mt->country->name = strdup(p);
+ goto done;
+ }
+
+ if (len != 0) {
+ warnx("unexpected XML token \"%s\" data \"%s\" at line %ld",
+ name, p, XML_GetCurrentLineNumber(mt->parser));
+ /* XXX goto done? */
+ }
+ /* </freqband> */
+ if (iseq(name, "freqband") && mt->freqband != NULL) {
+ /* XXX must have start/end frequencies */
+ /* XXX must have channel width/sep */
+ mt->freqband = NULL;
+ goto done;
+ }
+ /* </rd> */
+ if (iseq(name, "rd") && mt->rd != NULL) {
+ mt->rd = NULL;
+ goto done;
+ }
+ /* </band> */
+ if (iseq(name, "band") && mt->netband != NULL) {
+ if (mt->netband->band == NULL) {
+ warnx("no freqbands for band at line %ld",
+ XML_GetCurrentLineNumber(mt->parser));
+ }
+ if (mt->netband->maxPower == 0) {
+ warnx("no maxpower for band at line %ld",
+ XML_GetCurrentLineNumber(mt->parser));
+ }
+ /* default max power w/ DFS to max power */
+ if (mt->netband->maxPowerDFS == 0)
+ mt->netband->maxPowerDFS = mt->netband->maxPower;
+ mt->netband = NULL;
+ goto done;
+ }
+ /* </netband> */
+ if (iseq(name, "netband") && mt->netband != NULL) {
+ mt->curband = NULL;
+ goto done;
+ }
+ /* </country> */
+ if (iseq(name, "country") && mt->country != NULL) {
+ /* XXX NO_COUNTRY should be in the net80211 country enum */
+ if ((int) mt->country->code == NO_COUNTRY) {
+ warnx("no ISO cc for country at line %ld",
+ XML_GetCurrentLineNumber(mt->parser));
+ }
+ if (mt->country->name == NULL) {
+ warnx("no name for country at line %ld",
+ XML_GetCurrentLineNumber(mt->parser));
+ }
+ if (mt->country->rd == NULL) {
+ warnx("no regdomain reference for country at line %ld",
+ XML_GetCurrentLineNumber(mt->parser));
+ }
+ mt->country = NULL;
+ goto done;
+ }
+done:
+ sbuf_delete(mt->sbuf[mt->level]);
+ mt->sbuf[mt->level--] = NULL;
+#undef iseq
+}
+
+static void
+char_data(void *data, const XML_Char *s, int len)
+{
+ struct mystate *mt;
+ const char *b, *e;
+
+ mt = data;
+
+ b = s;
+ e = s + len-1;
+ for (; isspace(*b) && b < e; b++)
+ ;
+ for (; isspace(*e) && e > b; e++)
+ ;
+ if (e != b || (*b != '\0' && !isspace(*b)))
+ sbuf_bcat(mt->sbuf[mt->level], b, e-b+1);
+}
+
+static void *
+findid(struct regdata *rdp, const void *id, int type)
+{
+ struct ident *ip;
+
+ for (ip = rdp->ident; ip->id != NULL; ip++)
+ if ((int) ip->type == type && strcasecmp(ip->id, id) == 0)
+ return ip->p;
+ return NULL;
+}
+
+/*
+ * Parse an regdomain XML configuration and build the internal representation.
+ */
+int
+lib80211_regdomain_readconfig(struct regdata *rdp, const void *p, size_t len)
+{
+ struct mystate *mt;
+ struct regdomain *dp;
+ struct country *cp;
+ struct freqband *fp;
+ struct netband *nb;
+ const void *id;
+ int i, errors;
+
+ memset(rdp, 0, sizeof(struct regdata));
+ mt = calloc(1, sizeof(struct mystate));
+ if (mt == NULL)
+ return ENOMEM;
+ /* parse the XML input */
+ mt->rdp = rdp;
+ mt->parser = XML_ParserCreate(NULL);
+ XML_SetUserData(mt->parser, mt);
+ XML_SetElementHandler(mt->parser, start_element, end_element);
+ XML_SetCharacterDataHandler(mt->parser, char_data);
+ if (XML_Parse(mt->parser, p, len, 1) != XML_STATUS_OK) {
+ warnx("%s: %s at line %ld", __func__,
+ XML_ErrorString(XML_GetErrorCode(mt->parser)),
+ XML_GetCurrentLineNumber(mt->parser));
+ return -1;
+ }
+ XML_ParserFree(mt->parser);
+
+ /* setup the identifer table */
+ rdp->ident = calloc(mt->nident + 1, sizeof(struct ident));
+ if (rdp->ident == NULL)
+ return ENOMEM;
+ free(mt);
+
+ errors = 0;
+ i = 0;
+ LIST_FOREACH(dp, &rdp->domains, next) {
+ rdp->ident[i].id = dp->name;
+ rdp->ident[i].p = dp;
+ rdp->ident[i].type = DOMAIN;
+ i++;
+ }
+ LIST_FOREACH(fp, &rdp->freqbands, next) {
+ rdp->ident[i].id = fp->id;
+ rdp->ident[i].p = fp;
+ rdp->ident[i].type = FREQBAND;
+ i++;
+ }
+ LIST_FOREACH(cp, &rdp->countries, next) {
+ rdp->ident[i].id = cp->isoname;
+ rdp->ident[i].p = cp;
+ rdp->ident[i].type = COUNTRY;
+ i++;
+ }
+
+ /* patch references */
+ LIST_FOREACH(dp, &rdp->domains, next) {
+ if (dp->cc != NULL) {
+ id = dp->cc;
+ dp->cc = findid(rdp, id, COUNTRY);
+ if (dp->cc == NULL) {
+ warnx("undefined country \"%s\"",
+ __DECONST(char *, id));
+ errors++;
+ }
+ free(__DECONST(char *, id));
+ }
+ LIST_FOREACH(nb, &dp->bands_11b, next) {
+ id = findid(rdp, nb->band, FREQBAND);
+ if (id == NULL) {
+ warnx("undefined 11b band \"%s\"",
+ __DECONST(char *, nb->band));
+ errors++;
+ }
+ nb->band = id;
+ }
+ LIST_FOREACH(nb, &dp->bands_11g, next) {
+ id = findid(rdp, nb->band, FREQBAND);
+ if (id == NULL) {
+ warnx("undefined 11g band \"%s\"",
+ __DECONST(char *, nb->band));
+ errors++;
+ }
+ nb->band = id;
+ }
+ LIST_FOREACH(nb, &dp->bands_11a, next) {
+ id = findid(rdp, nb->band, FREQBAND);
+ if (id == NULL) {
+ warnx("undefined 11a band \"%s\"",
+ __DECONST(char *, nb->band));
+ errors++;
+ }
+ nb->band = id;
+ }
+ LIST_FOREACH(nb, &dp->bands_11ng, next) {
+ id = findid(rdp, nb->band, FREQBAND);
+ if (id == NULL) {
+ warnx("undefined 11ng band \"%s\"",
+ __DECONST(char *, nb->band));
+ errors++;
+ }
+ nb->band = id;
+ }
+ LIST_FOREACH(nb, &dp->bands_11na, next) {
+ id = findid(rdp, nb->band, FREQBAND);
+ if (id == NULL) {
+ warnx("undefined 11na band \"%s\"",
+ __DECONST(char *, nb->band));
+ errors++;
+ }
+ nb->band = id;
+ }
+ LIST_FOREACH(nb, &dp->bands_11ac, next) {
+ id = findid(rdp, nb->band, FREQBAND);
+ if (id == NULL) {
+ warnx("undefined 11ac band \"%s\"",
+ __DECONST(char *, nb->band));
+ errors++;
+ }
+ nb->band = id;
+ }
+ LIST_FOREACH(nb, &dp->bands_11acg, next) {
+ id = findid(rdp, nb->band, FREQBAND);
+ if (id == NULL) {
+ warnx("undefined 11acg band \"%s\"",
+ __DECONST(char *, nb->band));
+ errors++;
+ }
+ nb->band = id;
+ }
+ }
+ LIST_FOREACH(cp, &rdp->countries, next) {
+ id = cp->rd;
+ cp->rd = findid(rdp, id, DOMAIN);
+ if (cp->rd == NULL) {
+ warnx("undefined country \"%s\"",
+ __DECONST(char *, id));
+ errors++;
+ }
+ free(__DECONST(char *, id));
+ }
+
+ return errors ? EINVAL : 0;
+}
+
+static void
+cleanup_bands(netband_head *head)
+{
+ struct netband *nb;
+
+ for (;;) {
+ nb = LIST_FIRST(head);
+ if (nb == NULL)
+ break;
+ LIST_REMOVE(nb, next);
+ free(nb);
+ }
+}
+
+/*
+ * Cleanup state/resources for a previously parsed regdomain database.
+ */
+void
+lib80211_regdomain_cleanup(struct regdata *rdp)
+{
+
+ free(rdp->ident);
+ rdp->ident = NULL;
+ for (;;) {
+ struct regdomain *dp = LIST_FIRST(&rdp->domains);
+ if (dp == NULL)
+ break;
+ LIST_REMOVE(dp, next);
+ cleanup_bands(&dp->bands_11b);
+ cleanup_bands(&dp->bands_11g);
+ cleanup_bands(&dp->bands_11a);
+ cleanup_bands(&dp->bands_11ng);
+ cleanup_bands(&dp->bands_11na);
+ cleanup_bands(&dp->bands_11ac);
+ cleanup_bands(&dp->bands_11acg);
+ if (dp->name != NULL)
+ free(__DECONST(char *, dp->name));
+ }
+ for (;;) {
+ struct country *cp = LIST_FIRST(&rdp->countries);
+ if (cp == NULL)
+ break;
+ LIST_REMOVE(cp, next);
+ if (cp->name != NULL)
+ free(__DECONST(char *, cp->name));
+ free(cp);
+ }
+ for (;;) {
+ struct freqband *fp = LIST_FIRST(&rdp->freqbands);
+ if (fp == NULL)
+ break;
+ LIST_REMOVE(fp, next);
+ free(fp);
+ }
+}
+
+struct regdata *
+lib80211_alloc_regdata(void)
+{
+ struct regdata *rdp;
+ struct stat sb;
+ void *xml;
+ int fd;
+
+ rdp = calloc(1, sizeof(struct regdata));
+
+ fd = open(_PATH_REGDOMAIN, O_RDONLY);
+ if (fd < 0) {
+#ifdef DEBUG
+ warn("%s: open(%s)", __func__, _PATH_REGDOMAIN);
+#endif
+ free(rdp);
+ return NULL;
+ }
+ if (fstat(fd, &sb) < 0) {
+#ifdef DEBUG
+ warn("%s: fstat(%s)", __func__, _PATH_REGDOMAIN);
+#endif
+ close(fd);
+ free(rdp);
+ return NULL;
+ }
+ xml = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ if (xml == MAP_FAILED) {
+#ifdef DEBUG
+ warn("%s: mmap", __func__);
+#endif
+ close(fd);
+ free(rdp);
+ return NULL;
+ }
+ if (lib80211_regdomain_readconfig(rdp, xml, sb.st_size) != 0) {
+#ifdef DEBUG
+ warn("%s: error reading regulatory database", __func__);
+#endif
+ munmap(xml, sb.st_size);
+ close(fd);
+ free(rdp);
+ return NULL;
+ }
+ munmap(xml, sb.st_size);
+ close(fd);
+
+ return rdp;
+}
+
+void
+lib80211_free_regdata(struct regdata *rdp)
+{
+ lib80211_regdomain_cleanup(rdp);
+ free(rdp);
+}
+
+/*
+ * Lookup a regdomain by SKU.
+ */
+const struct regdomain *
+lib80211_regdomain_findbysku(const struct regdata *rdp, enum RegdomainCode sku)
+{
+ const struct regdomain *dp;
+
+ LIST_FOREACH(dp, &rdp->domains, next) {
+ if (dp->sku == sku)
+ return dp;
+ }
+ return NULL;
+}
+
+/*
+ * Lookup a regdomain by name.
+ */
+const struct regdomain *
+lib80211_regdomain_findbyname(const struct regdata *rdp, const char *name)
+{
+ const struct regdomain *dp;
+
+ LIST_FOREACH(dp, &rdp->domains, next) {
+ if (strcasecmp(dp->name, name) == 0)
+ return dp;
+ }
+ return NULL;
+}
+
+/*
+ * Lookup a country by ISO country code.
+ */
+const struct country *
+lib80211_country_findbycc(const struct regdata *rdp, enum ISOCountryCode cc)
+{
+ const struct country *cp;
+
+ LIST_FOREACH(cp, &rdp->countries, next) {
+ if (cp->code == cc)
+ return cp;
+ }
+ return NULL;
+}
+
+/*
+ * Lookup a country by ISO/long name.
+ */
+const struct country *
+lib80211_country_findbyname(const struct regdata *rdp, const char *name)
+{
+ const struct country *cp;
+ int len;
+
+ len = strlen(name);
+ LIST_FOREACH(cp, &rdp->countries, next) {
+ if (strcasecmp(cp->isoname, name) == 0)
+ return cp;
+ }
+ LIST_FOREACH(cp, &rdp->countries, next) {
+ if (strncasecmp(cp->name, name, len) == 0)
+ return cp;
+ }
+ return NULL;
+}
diff --git a/lib/lib80211/lib80211_regdomain.h b/lib/lib80211/lib80211_regdomain.h
new file mode 100644
index 000000000000..3f08f33b2aec
--- /dev/null
+++ b/lib/lib80211/lib80211_regdomain.h
@@ -0,0 +1,121 @@
+/*-
+ * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef _LIB80211_REGDOMAIN_H_
+#define _LIB80211_REGDOMAIN_H_
+
+#include <sys/cdefs.h>
+#include <sys/queue.h>
+
+#include <net80211/ieee80211_regdomain.h>
+
+__BEGIN_DECLS
+
+struct freqband {
+ uint16_t freqStart; /* starting frequency (MHz) */
+ uint16_t freqEnd; /* ending frequency (MHz) */
+ uint8_t chanWidth; /* channel width (MHz) */
+ uint8_t chanSep; /* channel sepaaration (MHz) */
+ uint32_t flags; /* common operational constraints */
+
+ const void *id;
+ LIST_ENTRY(freqband) next;
+};
+
+/* private flags, don't pass to os */
+#define REQ_ECM 0x1 /* enable if ECM set */
+#define REQ_INDOOR 0x2 /* enable only for indoor operation */
+#define REQ_OUTDOOR 0x4 /* enable only for outdoor operation */
+
+#define REQ_FLAGS (REQ_ECM|REQ_INDOOR|REQ_OUTDOOR)
+
+struct netband {
+ const struct freqband *band; /* channel list description */
+ uint8_t maxPower; /* regulatory cap on tx power (dBm) */
+ uint8_t maxPowerDFS; /* regulatory cap w/ DFS (dBm) */
+ uint8_t maxAntGain; /* max allowed antenna gain (.5 dBm) */
+ uint32_t flags; /* net80211 channel flags */
+
+ LIST_ENTRY(netband) next;
+};
+typedef LIST_HEAD(, netband) netband_head;
+
+struct country;
+
+struct regdomain {
+ enum RegdomainCode sku; /* regdomain code/SKU */
+ const char *name; /* printable name */
+ const struct country *cc; /* country code for 1-1/default map */
+
+ netband_head bands_11b; /* 11b operation */
+ netband_head bands_11g; /* 11g operation */
+ netband_head bands_11a; /* 11a operation */
+ netband_head bands_11ng; /* 11ng operation */
+ netband_head bands_11na; /* 11na operation */
+ netband_head bands_11ac; /* 11ac 5GHz operation */
+ netband_head bands_11acg; /* 11ac 2GHz operation */
+
+ LIST_ENTRY(regdomain) next;
+};
+
+struct country {
+ enum ISOCountryCode code;
+#define NO_COUNTRY 0xffff
+ const struct regdomain *rd;
+ const char* isoname;
+ const char* name;
+
+ LIST_ENTRY(country) next;
+};
+
+struct ident;
+
+struct regdata {
+ LIST_HEAD(, country) countries; /* country code table */
+ LIST_HEAD(, regdomain) domains; /* regulatory domains */
+ LIST_HEAD(, freqband) freqbands; /* frequency band table */
+ struct ident *ident; /* identifier table */
+};
+
+#define _PATH_REGDOMAIN "/etc/regdomain.xml"
+
+struct regdata *lib80211_alloc_regdata(void);
+void lib80211_free_regdata(struct regdata *);
+
+int lib80211_regdomain_readconfig(struct regdata *, const void *, size_t);
+void lib80211_regdomain_cleanup(struct regdata *);
+
+const struct regdomain *lib80211_regdomain_findbysku(const struct regdata *,
+ enum RegdomainCode);
+const struct regdomain *lib80211_regdomain_findbyname(const struct regdata *,
+ const char *);
+
+const struct country *lib80211_country_findbycc(const struct regdata *,
+ enum ISOCountryCode);
+const struct country *lib80211_country_findbyname(const struct regdata *,
+ const char *);
+
+__END_DECLS
+
+#endif /* _LIB80211_REGDOMAIN_H_ */
diff --git a/lib/lib80211/regdomain.xml b/lib/lib80211/regdomain.xml
new file mode 100644
index 000000000000..16b74445f429
--- /dev/null
+++ b/lib/lib80211/regdomain.xml
@@ -0,0 +1,2485 @@
+<!--
+ Copyright (c) 2007-2008 Sam Leffler, Errno Consulting
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<regulatory-data>
+
+<!-- Regdomain/SKU definitions -->
+
+<regulatory-domains>
+
+<!--
+ DEBUG holds all available channels; the driver/device
+ defines what the capabilities and tx power caps are.
+ Regdomain code gets this information with the
+ IEEE80211_IOC_DRIVERCAPS ioctl.
+-->
+<rd id="debug">
+ <name>DEBUG</name>
+ <sku>0x1ff</sku>
+</rd>
+
+<rd id="fcc">
+ <name>FCC</name>
+ <sku>0x10</sku>
+ <defcc ref="US"/>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5825_5825"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11ac">
+ <band>
+ <freqband ref="AC1_5180_5240_20"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ </band>
+ <band>
+ <freqband ref="AC1_5180_5240_40"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ </band>
+ <band>
+ <freqband ref="AC1_5180_5240_80"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ </band>
+ <band>
+ <freqband ref="AC1_5745_5805_20"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ </band>
+ <band>
+ <freqband ref="AC1_5745_5805_40"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ </band>
+ <band>
+ <freqband ref="AC1_5745_5805_80"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ </band>
+ </netband>
+</rd>
+
+<!-- FCC3 is FCC w/ DFS on Upper-UNI -->
+
+<rd id="fcc3">
+ <name>FCC3</name>
+ <sku>0x3a</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5580"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5660_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5825_5825"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5580"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5580"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5660_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5660_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+</rd>
+
+<!-- FCC4 is 2.4GHz FCC w/ Public Safety Band (PSB) -->
+
+<rd id="fcc4">
+ <name>FCC4</name>
+ <sku>0x12</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_4950_4980"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_4945_4985_10"/>
+ <maxpower>27</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_4942_4987_5"/>
+ <maxpower>30</maxpower>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="japan">
+ <name>JAPAN</name>
+ <sku>0x40</sku>
+ <defcc ref="JP"/>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ <band>
+ <freqband ref="F1_2484_2484"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_4920_4980"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5040_5080"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2472"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_4920_4980"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_4920_4980"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5040_5080"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5040_5080"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5180_5240"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5680"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="etsi">
+ <name>ETSI</name>
+ <sku>0x30</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="A20_5745_5865"/>
+ <maxpower>13</maxpower>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5680"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="NA20_5745_5865"/>
+ <maxpower>13</maxpower>
+ </band>
+ <band>
+ <freqband ref="NA40_5745_5845"/>
+ <maxpower>13</maxpower>
+ </band>
+ </netband>
+ <netband mode="11ac">
+ <!-- 5150-5250/80, 200 mW, indoor -->
+ <band>
+ <freqband ref="AC2_5160_5240_20"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ <flags>INDOOR</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5180_5240_40"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ <flags>INDOOR</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5180_5240_80"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ <flags>INDOOR</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5180_5320_160"/>
+ <maxpower>22</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT160</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+
+ <!-- 5250-5350/80, 100 mW, indoor, DFS -->
+ <band>
+ <freqband ref="AC2_5260_5340_20"/>
+ <maxpower>20</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ <flags>INDOOR</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5260_5320_40"/>
+ <maxpower>20</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ <flags>INDOOR</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5260_5320_80"/>
+ <maxpower>20</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ <flags>INDOOR</flags>
+ </band>
+
+ <!-- 5470-5725/160, 500 mW, DFS -->
+ <band>
+ <freqband ref="AC2_5480_5700_20"/>
+ <maxpower>26</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5500_5680_40"/>
+ <maxpower>26</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5500_5640_80"/>
+ <maxpower>26</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5500_5640_160"/>
+ <maxpower>26</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT160</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+
+ <!-- 5725-5875/80, 25 mW "short range" -->
+ <band>
+ <freqband ref="AC2_5745_5865_20"/>
+ <maxpower>13</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5745_5845_40"/>
+ <maxpower>13</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5745_5805_80"/>
+ <maxpower>13</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+</rd>
+
+<!-- ETSI w/o HT40/VHT in 5GHz -->
+
+<rd id="etsi2">
+ <name>ETSI2</name>
+ <sku>0x32</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5120_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5120_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+</rd>
+
+<!-- ETSI - channel 36 -->
+
+<rd id="etsi3">
+ <name>ETSI3</name>
+ <sku>0x33</sku>
+ <defcc ref="RO"/>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5200_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5280_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5200_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5200_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5280_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5280_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5680"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="apac">
+ <name>APAC</name>
+ <sku>0x50</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5825_5825"/>
+ <maxpower>23</maxpower>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+</rd>
+
+<!-- APAC w/ DFS on Mid-band -->
+
+<rd id="apac2">
+ <name>APAC2</name>
+ <sku>0x51</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5120_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5825_5825"/>
+ <maxpower>23</maxpower>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5120_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5120_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+</rd>
+
+<!-- APAC w/o ISM band -->
+
+<rd id="apac3">
+ <name>APAC3</name>
+ <sku>0x5d</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="korea">
+ <name>KOREA</name>
+ <sku>0x45</sku>
+ <defcc ref="KR"/>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ <band>
+ <freqband ref="F1_2467_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="F1_2467_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5620"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="F1_2467_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5180_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5620"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="taiwan">
+ <name>TAIWAN</name>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5160_5240"/>
+ <maxpower>23</maxpower>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5340"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5480_5720"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5845"/>
+ <maxpower>30</maxpower>
+ </band>
+ </netband>
+
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5160_5240"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5180_5240"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+
+ <band>
+ <freqband ref="F1_5260_5340"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+
+ <band>
+ <freqband ref="F1_5480_5720"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5720"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+
+ <band>
+ <freqband ref="F1_5745_5845"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5845"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+
+ <netband mode="11ac">
+ <band>
+ <freqband ref="AC2_5160_5240_20"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5180_5240_40"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5180_5240_80"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ </band>
+
+ <band>
+ <freqband ref="AC2_5260_5340_20"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5260_5320_40"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5260_5320_80"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+
+ <band>
+ <freqband ref="AC2_5480_5700_20"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5500_5720_40"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5500_5720_80"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5500_5640_160"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT160</flags>
+ <flags>IEEE80211_CHAN_DFS</flags>
+ </band>
+
+ <band>
+ <freqband ref="AC2_5745_5845_20"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_VHT20</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5745_5845_40"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT40</flags>
+ </band>
+ <band>
+ <freqband ref="AC2_5745_5805_80"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_VHT80</flags>
+ </band>
+ </netband>
+</rd>
+
+<!-- Rest Of World -->
+
+<rd id="row">
+ <name>ROW</name>
+ <sku>0x8a</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="none">
+ <name>NONE</name>
+ <sku>0xf0</sku>
+ <netband mode="11b">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ </band>
+ <band>
+ <freqband ref="F1_2467_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_B</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11g">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="F1_2467_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11a">
+ <band>
+ <freqband ref="F1_5120_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5825_5825"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11ng">
+ <band>
+ <freqband ref="F1_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2412_2462"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ </band>
+ <band>
+ <freqband ref="F1_2467_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_2467_2472"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+ <netband mode="11na">
+ <band>
+ <freqband ref="F1_5120_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5120_5240"/>
+ <maxpower>17</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5260_5320"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5500_5700"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5500_5680"/>
+ <maxpower>24</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5745_5805"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="F1_5825_5825"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT20</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ <band>
+ <freqband ref="H4_5825_5825"/>
+ <maxpower>23</maxpower>
+ <flags>IEEE80211_CHAN_HT40</flags>
+ <flags>IEEE80211_CHAN_PASSIVE</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="sr9">
+ <name>SR9</name>
+ <sku>0x0298</sku>
+ <netband mode="11g">
+ <band>
+ <freqband ref="S1_907_922_5"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_907_922_10"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_912_917"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="xr9">
+ <name>XR9</name>
+ <sku>0x299</sku>
+ <netband mode="11g">
+ <band>
+ <freqband ref="S1_907_922_5"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_907_922_10"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_912_917"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="gz901">
+ <name>GZ901</name>
+ <sku>0x29a</sku>
+ <netband mode="11g">
+ <band>
+ <freqband ref="S1_908_923_5"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_913_918_10"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_913_918"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+</rd>
+
+<rd id="xc900m">
+ <name>XC900M</name>
+ <sku>0x29b</sku>
+ <netband mode="11g">
+ <band>
+ <freqband ref="S1_905_925_5"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_910_920_10"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ <band>
+ <freqband ref="S1_915_915"/>
+ <maxpower>30</maxpower>
+ <flags>IEEE80211_CHAN_G</flags>
+ </band>
+ </netband>
+</rd>
+
+</regulatory-domains>
+
+<country-codes>
+<!--
+ ISO 3166 Country/Region codes and regdomain mapping.
+
+ http://ftp.ics.uci.edu/pub/ietf/http/related/iso3166.txt
+ has the list of codes.
+ XXX this table is incomplete
+-->
+<country id="AL">
+ <isocc>8</isocc> <name>Albania</name> <rd ref="none"/>
+</country>
+<country id="DZ">
+ <isocc>12</isocc> <name>Algeria</name> <rd ref="none"/>
+</country>
+<country id="AR">
+ <isocc>32</isocc> <name>Argentina</name> <rd ref="none"/>
+</country>
+<country id="AM">
+ <isocc>51</isocc> <name>Armenia</name> <rd ref="etsi"/>
+</country>
+<country id="AU">
+ <isocc>36</isocc> <name>Australia</name> <rd ref="row"/>
+</country>
+<country id="AT">
+ <isocc>40</isocc> <name>Austria</name> <rd ref="etsi2"/>
+</country>
+<country id="AZ">
+ <isocc>31</isocc> <name>Azerbaijan</name> <rd ref="etsi"/>
+</country>
+<country id="BH">
+ <isocc>48</isocc> <name>Bahrain</name> <rd ref="none"/>
+</country>
+<country id="BD">
+ <isocc>50</isocc> <name>Bangladesh</name> <rd ref="row"/>
+</country>
+<country id="BY">
+ <isocc>112</isocc> <name>Belarus</name> <rd ref="none"/>
+</country>
+<country id="BE">
+ <isocc>56</isocc> <name>Belgium</name> <rd ref="etsi"/>
+</country>
+<country id="BZ">
+ <isocc>84</isocc> <name>Belize</name> <rd ref="none"/>
+</country>
+<country id="BO">
+ <isocc>68</isocc> <name>Bolivia</name> <rd ref="none"/>
+</country>
+<country id="BR">
+ <isocc>76</isocc> <name>Brazil</name> <rd ref="fcc"/>
+</country>
+<country id="BN">
+ <isocc>96</isocc> <name>Brunei</name> <rd ref="apac"/>
+</country>
+<country id="BG">
+ <isocc>100</isocc> <name>Bulgaria</name> <rd ref="etsi"/>
+</country>
+<country id="CA">
+ <isocc>124</isocc> <name>Canada</name> <rd ref="fcc"/>
+</country>
+<country id="CL">
+ <isocc>152</isocc> <name>Chile</name> <rd ref="row"/>
+</country>
+<country id="CN">
+ <isocc>156</isocc> <name>China</name> <rd ref="row"/>
+</country>
+<country id="CO">
+ <isocc>170</isocc> <name>Colombia</name> <rd ref="fcc"/>
+</country>
+<country id="CR">
+ <isocc>188</isocc> <name>Costa Rica</name> <rd ref="none"/>
+</country>
+<country id="HR">
+ <isocc>191</isocc> <name>Croatia</name> <rd ref="etsi"/>
+</country>
+<country id="CY">
+ <isocc>196</isocc> <name>Cyprus</name> <rd ref="etsi"/>
+</country>
+<country id="CZ">
+ <isocc>203</isocc> <name>Czech Republic</name> <rd ref="etsi"/>
+</country>
+<country id="DK">
+ <isocc>208</isocc> <name>Denmark</name> <rd ref="etsi"/>
+</country>
+<country id="DO">
+ <isocc>214</isocc> <name>Dominican Republic</name> <rd ref="none"/>
+</country>
+<country id="EC">
+ <isocc>218</isocc> <name>Ecuador</name> <rd ref="none"/>
+</country>
+<country id="EG">
+ <isocc>818</isocc> <name>Egypt</name> <rd ref="none"/>
+</country>
+<country id="SV">
+ <isocc>222</isocc> <name>El Salvador</name> <rd ref="none"/>
+</country>
+<country id="EE">
+ <isocc>233</isocc> <name>Estonia</name> <rd ref="etsi"/>
+</country>
+<country id="FI">
+ <isocc>246</isocc> <name>Finland</name> <rd ref="etsi"/>
+</country>
+<country id="FR">
+ <isocc>250</isocc> <name>France</name> <rd ref="etsi"/>
+</country>
+<country id="F2">
+ <isocc>255</isocc> <name>France2</name> <rd ref="etsi"/>
+</country>
+<country id="GE">
+ <isocc>268</isocc> <name>Georgia</name> <rd ref="etsi"/>
+</country>
+<country id="DE">
+ <isocc>276</isocc> <name>Germany</name> <rd ref="etsi"/>
+</country>
+<country id="GR">
+ <isocc>300</isocc> <name>Greece</name> <rd ref="etsi"/>
+</country>
+<country id="GT">
+ <isocc>320</isocc> <name>Guatemala</name> <rd ref="none"/>
+</country>
+<country id="HN">
+ <isocc>340</isocc> <name>Honduras</name> <rd ref="none"/>
+</country>
+<country id="HK">
+ <isocc>344</isocc> <name>Hong Kong</name> <rd ref="apac"/>
+</country>
+<country id="HU">
+ <isocc>348</isocc> <name>Hungary</name> <rd ref="etsi"/>
+</country>
+<country id="IS">
+ <isocc>352</isocc> <name>Iceland</name> <rd ref="etsi"/>
+</country>
+<country id="IN">
+ <isocc>356</isocc> <name>India</name> <rd ref="apac"/>
+</country>
+<country id="ID">
+ <isocc>360</isocc> <name>Indonesia</name> <rd ref="none"/>
+</country>
+<country id="IR">
+ <isocc>364</isocc> <name>Iran</name> <rd ref="none"/>
+</country>
+<country id="IE">
+ <isocc>372</isocc> <name>Ireland</name> <rd ref="etsi"/>
+</country>
+<country id="IL">
+ <isocc>376</isocc> <name>Israel</name> <rd ref="none"/>
+</country>
+<country id="IT">
+ <isocc>380</isocc> <name>Italy</name> <rd ref="etsi"/>
+</country>
+<country id="JM">
+ <isocc>388</isocc> <name>Jamaica</name> <rd ref="none"/>
+</country>
+<country id="JP">
+ <isocc>392</isocc> <name>Japan</name> <rd ref="japan"/>
+</country>
+<country id="J1">
+ <isocc>393</isocc> <name>Japan1</name> <rd ref="japan"/>
+</country>
+<country id="J2">
+ <isocc>394</isocc> <name>Japan2</name> <rd ref="japan"/>
+</country>
+<country id="J3">
+ <isocc>395</isocc> <name>Japan3</name> <rd ref="japan"/>
+</country>
+<country id="J4">
+ <isocc>396</isocc> <name>Japan4</name> <rd ref="japan"/>
+</country>
+<country id="J5">
+ <isocc>397</isocc> <name>Japan5</name> <rd ref="japan"/>
+</country>
+<country id="JO">
+ <isocc>400</isocc> <name>Jordan</name> <rd ref="none"/>
+</country>
+<country id="KZ">
+ <isocc>398</isocc> <name>Kazakhstan</name> <rd ref="none"/>
+</country>
+<country id="KP">
+ <isocc>408</isocc> <name>North Korea</name> <rd ref="korea"/>
+</country>
+<country id="KR">
+ <isocc>410</isocc> <name>Korea Republic</name> <rd ref="korea"/>
+</country>
+<country id="K2">
+ <isocc>411</isocc> <name>Korea Republic2</name> <rd ref="none"/>
+</country>
+<country id="KW">
+ <isocc>414</isocc> <name>Kuwait</name> <rd ref="none"/>
+</country>
+<country id="LV">
+ <isocc>428</isocc> <name>Latvia</name> <rd ref="etsi2"/>
+</country>
+<country id="LB">
+ <isocc>422</isocc> <name>Lebanon</name> <rd ref="none"/>
+</country>
+<country id="LI">
+ <isocc>438</isocc> <name>Liechtenstein</name> <rd ref="etsi"/>
+</country>
+<country id="LT">
+ <isocc>440</isocc> <name>Lithuania</name> <rd ref="etsi"/>
+</country>
+<country id="LU">
+ <isocc>442</isocc> <name>Luxemborg</name> <rd ref="etsi"/>
+</country>
+<country id="MO">
+ <isocc>446</isocc> <name>Macau</name> <rd ref="none"/>
+</country>
+<country id="MK">
+ <isocc>807</isocc> <name>Macedonia</name> <rd ref="none"/>
+</country>
+<country id="MY">
+ <isocc>458</isocc> <name>Malaysia</name> <rd ref="apac3"/>
+</country>
+<country id="MT">
+ <isocc>470</isocc> <name>Malta</name> <rd ref="etsi"/>
+</country>
+<country id="MX">
+ <isocc>484</isocc> <name>Mexico</name> <rd ref="fcc"/>
+</country>
+<country id="MC">
+ <isocc>492</isocc> <name>Monaco</name> <rd ref="none"/>
+</country>
+<country id="MA">
+ <isocc>504</isocc> <name>Morocco</name> <rd ref="etsi"/>
+</country>
+<country id="NP">
+ <isocc>524</isocc> <name>Nepal</name> <rd ref="row"/>
+</country>
+<country id="NL">
+ <isocc>528</isocc> <name>Netherlands</name> <rd ref="etsi"/>
+</country>
+<country id="NZ">
+ <isocc>554</isocc> <name>New Zealand</name> <rd ref="apac"/>
+</country>
+<country id="NO">
+ <isocc>578</isocc> <name>Norway</name> <rd ref="etsi"/>
+</country>
+<country id="OM">
+ <isocc>512</isocc> <name>Oman</name> <rd ref="none"/>
+</country>
+<country id="PK">
+ <isocc>586</isocc> <name>Pakistan</name> <rd ref="row"/>
+</country>
+<country id="PA">
+ <isocc>591</isocc> <name>Panama</name> <rd ref="none"/>
+</country>
+<country id="PE">
+ <isocc>604</isocc> <name>Peru</name> <rd ref="none"/>
+</country>
+<country id="PH">
+ <isocc>608</isocc> <name>Phillipines</name> <rd ref="apac2"/>
+</country>
+<country id="PL">
+ <isocc>616</isocc> <name>Poland</name> <rd ref="etsi"/>
+</country>
+<country id="PT">
+ <isocc>620</isocc> <name>Portugal</name> <rd ref="etsi"/>
+</country>
+<country id="PR">
+ <isocc>630</isocc> <name>Puerto Rico</name> <rd ref="fcc"/>
+</country>
+<country id="QA">
+ <isocc>634</isocc> <name>Quatar</name> <rd ref="none"/>
+</country>
+<country id="RO">
+ <isocc>642</isocc> <name>Romania</name> <rd ref="etsi"/>
+</country>
+<country id="RU">
+ <isocc>643</isocc> <name>Russia</name> <rd ref="none"/>
+</country>
+<country id="SA">
+ <isocc>682</isocc> <name>Saudi Arabia</name> <rd ref="none"/>
+</country>
+<country id="SG">
+ <isocc>702</isocc> <name>Singapore</name> <rd ref="apac2"/>
+</country>
+<country id="SK">
+ <isocc>703</isocc> <name>Slovak Republic</name> <rd ref="etsi2"/>
+</country>
+<country id="SI">
+ <isocc>705</isocc> <name>Slovenia</name> <rd ref="etsi"/>
+</country>
+<country id="ZA">
+ <isocc>710</isocc> <name>South Africa</name> <rd ref="none"/>
+</country>
+<country id="ES">
+ <isocc>724</isocc> <name>Spain</name> <rd ref="etsi2"/>
+</country>
+<country id="LK">
+ <isocc>144</isocc> <name>Sri Lanka</name> <rd ref="apac2"/>
+</country>
+<country id="SE">
+ <isocc>752</isocc> <name>Sweden</name> <rd ref="etsi"/>
+</country>
+<country id="CH">
+ <isocc>756</isocc> <name>Switzerland</name> <rd ref="etsi"/>
+</country>
+<country id="SY">
+ <isocc>760</isocc> <name>Syria</name> <rd ref="none"/>
+</country>
+<country id="TW">
+ <isocc>158</isocc> <name>Taiwan</name> <rd ref="taiwan"/>
+</country>
+<country id="TH">
+ <isocc>764</isocc> <name>Thailand</name> <rd ref="none"/>
+</country>
+<country id="TT">
+ <isocc>780</isocc> <name>Tobago</name> <rd ref="none"/>
+</country>
+<country id="TN">
+ <isocc>788</isocc> <name>Tunisia</name> <rd ref="none"/>
+</country>
+<country id="TR">
+ <isocc>792</isocc> <name>Turkey</name> <rd ref="etsi"/>
+</country>
+<country id="UA">
+ <isocc>804</isocc> <name>Ukraine</name> <rd ref="none"/>
+</country>
+<country id="AE">
+ <isocc>784</isocc> <name>United Arab Emirates</name> <rd ref="none"/>
+</country>
+<country id="GB">
+ <isocc>826</isocc> <name>United Kingdom</name> <rd ref="etsi"/>
+</country>
+<country id="US">
+ <isocc>840</isocc> <name>United States</name> <rd ref="fcc"/>
+</country>
+<country id="UY">
+ <isocc>858</isocc> <name>Uruguay</name> <rd ref="none"/>
+</country>
+<country id="UZ">
+ <isocc>860</isocc> <name>Uzbekistan</name> <rd ref="none"/>
+</country>
+<country id="VE">
+ <isocc>862</isocc> <name>Venezuela</name> <rd ref="fcc"/>
+</country>
+<country id="VN">
+ <isocc>704</isocc> <name>Viet Nam</name> <rd ref="apac2"/>
+</country>
+<country id="YE">
+ <isocc>887</isocc> <name>Yemen</name> <rd ref="none"/>
+</country>
+<country id="ZW">
+ <isocc>716</isocc> <name>Zimbabwe</name> <rd ref="none"/>
+</country>
+
+<country id="DEBUG">
+ <isocc>0</isocc> <name>Debug</name> <rd ref="debug"/>
+</country>
+</country-codes>
+
+<!--
+ Band specifications referenced above.
+ NB: keep sorted by starting frequency, legacy before HT
+-->
+<shared-frequency-bands>
+<freqband id="F1_4942_4987_5">
+ <freqstart>4942</freqstart> <freqend>4987</freqend>
+ <chanwidth>5</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+ <flags>IEEE80211_CHAN_QUARTER</flags>
+</freqband>
+<freqband id="F1_4945_4985_10">
+ <freqstart>4945</freqstart> <freqend>4985</freqend>
+ <chanwidth>10</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+ <flags>IEEE80211_CHAN_HALF</flags>
+</freqband>
+<freqband id="F1_4920_4980">
+ <freqstart>4920</freqstart> <freqend>4980</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_4920_4980">
+ <freqstart>4920</freqstart> <freqend>4980</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_4950_4980">
+ <freqstart>4950</freqstart> <freqend>4980</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5040_5080">
+ <freqstart>5040</freqstart> <freqend>5080</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5040_5080">
+ <freqstart>5040</freqstart> <freqend>5080</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5120_5240">
+ <freqstart>5120</freqstart> <freqend>5240</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5120_5240">
+ <freqstart>5120</freqstart> <freqend>5240</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5180_5240">
+ <freqstart>5180</freqstart> <freqend>5240</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC1_5180_5240_20">
+ <freqstart>5180</freqstart> <freqend>5240</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC1_5180_5240_40">
+ <freqstart>5180</freqstart> <freqend>5240</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC1_5180_5240_80">
+ <freqstart>5180</freqstart> <freqend>5240</freqend>
+ <chanwidth>80</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<!-- 5150-5250/80 -->
+<freqband id="F1_5160_5240">
+ <freqstart>5120</freqstart> <freqend>5240</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5160_5240_20">
+ <freqstart>5160</freqstart> <freqend>5240</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5180_5240_40">
+ <freqstart>5180</freqstart> <freqend>5240</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5180_5240_80">
+ <freqstart>5180</freqstart> <freqend>5240</freqend>
+ <chanwidth>80</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5180_5320_160">
+ <freqstart>5180</freqstart> <freqend>5320</freqend>
+ <chanwidth>160</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<!-- 5250-5350/80 -->
+<freqband id="F1_5260_5340">
+ <freqstart>5260</freqstart> <freqend>5340</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5260_5340_20">
+ <freqstart>5260</freqstart> <freqend>5340</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5260_5320_40">
+ <freqstart>5260</freqstart> <freqend>5320</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5260_5320_80">
+ <freqstart>5260</freqstart> <freqend>5320</freqend>
+ <chanwidth>80</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<!-- 5470-5725/160 -->
+<freqband id="F1_5480_5720">
+ <freqstart>5480</freqstart> <freqend>5720</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5480_5700_20">
+ <freqstart>5480</freqstart> <freqend>5700</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5500_5680_40">
+ <freqstart>5500</freqstart> <freqend>5680</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5500_5640_80">
+ <freqstart>5500</freqstart> <freqend>5640</freqend>
+ <chanwidth>80</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5500_5640_160">
+ <freqstart>5500</freqstart> <freqend>5640</freqend>
+ <chanwidth>160</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<!-- 5500-5720/80 -->
+<freqband id="AC2_5500_5720_40">
+ <freqstart>5500</freqstart> <freqend>5720</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5500_5720_80">
+ <freqstart>5500</freqstart> <freqend>5720</freqend>
+ <chanwidth>80</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<!-- 5725-5875/80 short range -->
+<freqband id="F1_5745_5825">
+ <freqstart>5745</freqstart> <freqend>5825</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5745_5845">
+ <freqstart>5745</freqstart> <freqend>5845</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5745_5845">
+ <freqstart>5745</freqstart> <freqend>5845</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5745_5845_20">
+ <freqstart>5745</freqstart> <freqend>5845</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5745_5865_20">
+ <freqstart>5745</freqstart> <freqend>5865</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5745_5805_40">
+ <freqstart>5745</freqstart> <freqend>5805</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5745_5845_40">
+ <freqstart>5745</freqstart> <freqend>5845</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5745_5805_80">
+ <freqstart>5745</freqstart> <freqend>5805</freqend>
+ <chanwidth>80</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC2_5745_5885_160">
+ <freqstart>5745</freqstart> <freqend>5885</freqend>
+ <chanwidth>160</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5180_5240">
+ <freqstart>5180</freqstart> <freqend>5240</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5200_5240">
+ <freqstart>5200</freqstart> <freqend>5240</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5200_5240">
+ <freqstart>5200</freqstart> <freqend>5240</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5260_5320">
+ <freqstart>5260</freqstart> <freqend>5320</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5260_5320">
+ <freqstart>5260</freqstart> <freqend>5320</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5260_5700">
+ <freqstart>5260</freqstart> <freqend>5700</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5280_5320">
+ <freqstart>5280</freqstart> <freqend>5320</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5280_5320">
+ <freqstart>5280</freqstart> <freqend>5320</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5500_5580">
+ <freqstart>5500</freqstart> <freqend>5580</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5500_5720">
+ <freqstart>5500</freqstart> <freqend>5720</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5500_5580">
+ <freqstart>5500</freqstart> <freqend>5580</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5500_5620">
+ <freqstart>5500</freqstart> <freqend>5620</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5500_5620">
+ <freqstart>5500</freqstart> <freqend>5620</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5500_5680">
+ <freqstart>5500</freqstart> <freqend>5680</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5500_5700">
+ <freqstart>5500</freqstart> <freqend>5700</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="A20_5745_5865">
+ <freqstart>5745</freqstart>
+ <freqend>5865</freqend>
+ <chanwidth>20</chanwidth>
+ <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="NA20_5745_5865">
+ <freqstart>5745</freqstart>
+ <freqend>5865</freqend>
+ <chanwidth>20</chanwidth>
+ <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+ <flags>IEEE80211_CHAN_HT20</flags>
+</freqband>
+<freqband id="NA40_5745_5845">
+ <freqstart>5745</freqstart>
+ <freqend>5845</freqend>
+ <chanwidth>40</chanwidth>
+ <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+ <flags>IEEE80211_CHAN_HT40</flags>
+</freqband>
+<freqband id="F1_5660_5700">
+ <freqstart>5660</freqstart> <freqend>5700</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5660_5700">
+ <freqstart>5660</freqstart> <freqend>5700</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5725_5825">
+ <freqstart>5725</freqstart> <freqend>5825</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5745_5805">
+ <freqstart>5745</freqstart> <freqend>5805</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC1_5745_5805_20">
+ <freqstart>5745</freqstart> <freqend>5805</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC1_5745_5805_40">
+ <freqstart>5745</freqstart> <freqend>5805</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="AC1_5745_5805_80">
+ <freqstart>5745</freqstart> <freqend>5805</freqend>
+ <chanwidth>80</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5745_5805">
+ <freqstart>5745</freqstart> <freqend>5805</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5745_5825">
+ <freqstart>5745</freqstart> <freqend>5825</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="F1_5825_5825">
+ <freqstart>5825</freqstart> <freqend>5825</freqend>
+ <chanwidth>20</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+<freqband id="H4_5825_5825">
+ <freqstart>5825</freqstart> <freqend>5825</freqend>
+ <chanwidth>40</chanwidth> <chansep>20</chansep>
+ <flags>IEEE80211_CHAN_A</flags>
+</freqband>
+
+<freqband id="F1_2312_2372">
+ <freqstart>2312</freqstart> <freqend>2372</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="F1_2412_2462">
+ <freqstart>2412</freqstart> <freqend>2462</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="H4_2412_2462">
+ <freqstart>2412</freqstart> <freqend>2462</freqend>
+ <chanwidth>40</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="F1_2412_2472">
+ <freqstart>2412</freqstart> <freqend>2472</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="H4_2412_2472">
+ <freqstart>2412</freqstart> <freqend>2472</freqend>
+ <chanwidth>40</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="F1_2467_2472">
+ <freqstart>2467</freqstart> <freqend>2472</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="H4_2467_2472">
+ <freqstart>2467</freqstart> <freqend>2472</freqend>
+ <chanwidth>40</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="F1_2484_2484">
+ <freqstart>2484</freqstart> <freqend>2484</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+</freqband>
+<freqband id="F1_2512_2732">
+ <freqstart>2512</freqstart> <freqend>2732</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+</freqband>
+
+<freqband id="S1_907_922_5">
+ <freqstart>907</freqstart> <freqend>922</freqend>
+ <chanwidth>5</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+ <flags>IEEE80211_CHAN_QUARTER</flags>
+</freqband>
+<freqband id="S1_907_922_10">
+ <freqstart>907</freqstart> <freqend>922</freqend>
+ <chanwidth>10</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+ <flags>IEEE80211_CHAN_HALF</flags>
+</freqband>
+<freqband id="S1_912_917">
+ <freqstart>912</freqstart> <freqend>917</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+</freqband>
+
+<freqband id="S1_908_923_5">
+ <freqstart>908</freqstart> <freqend>923</freqend>
+ <chanwidth>5</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+ <flags>IEEE80211_CHAN_QUARTER</flags>
+</freqband>
+<freqband id="S1_913_918_10">
+ <freqstart>913</freqstart> <freqend>918</freqend>
+ <chanwidth>10</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+ <flags>IEEE80211_CHAN_HALF</flags>
+</freqband>
+<freqband id="S1_913_918">
+ <freqstart>913</freqstart> <freqend>918</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+</freqband>
+
+<freqband id="S1_905_925_5">
+ <freqstart>905</freqstart> <freqend>925</freqend>
+ <chanwidth>5</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+ <flags>IEEE80211_CHAN_QUARTER</flags>
+</freqband>
+<freqband id="S1_910_920_10">
+ <freqstart>910</freqstart> <freqend>920</freqend>
+ <chanwidth>10</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+ <flags>IEEE80211_CHAN_HALF</flags>
+</freqband>
+<freqband id="S1_915_915">
+ <freqstart>915</freqstart> <freqend>915</freqend>
+ <chanwidth>20</chanwidth> <chansep>5</chansep>
+ <flags>IEEE80211_CHAN_GSM</flags>
+</freqband>
+
+
+</shared-frequency-bands>
+
+</regulatory-data>