From 7dda32b516a47e27fcb51fc2f41f567d6505abb7 Mon Sep 17 00:00:00 2001 From: SolidHal Date: Thu, 20 Sep 2018 10:10:47 -0500 Subject: [PATCH] Begin addressing wireless regdb, cleanup scripts. Remove uneeded dwc2 patch --- .../patches-tested/chromeos-dwc2-glue.patch | 150 -- ...verse-do-not-use-bulk-on-EP3-and-EP4.patch | 10 +- .../regdb/wireless-regdb-2018.09.07.tar.gz | Bin 0 -> 27152 bytes .../wireless-regdb-2018.09.07/.gitignore | 2 + .../wireless-regdb-2018.09.07/CONTRIBUTING | 49 + .../regdb/wireless-regdb-2018.09.07/LICENSE | 16 + .../regdb/wireless-regdb-2018.09.07/Makefile | 129 ++ .../regdb/wireless-regdb-2018.09.07/README | 29 + .../regdb/wireless-regdb-2018.09.07/db.txt | 1380 +++++++++++++++++ .../regdb/wireless-regdb-2018.09.07/db2bin.py | 147 ++ .../regdb/wireless-regdb-2018.09.07/db2fw.py | 158 ++ .../wireless-regdb-2018.09.07/dbparse.py | 516 ++++++ .../debian-example/changelog | 5 + .../debian-example/compat | 1 + .../debian-example/control | 15 + .../debian-example/copyright | 21 + .../debian-example/docs | 1 + .../debian-example/rules | 10 + .../wireless-regdb-2018.09.07/gen-pubcert.sh | 18 + .../wireless-regdb-2018.09.07/regulatory.bin | Bin 0 -> 5864 bytes .../regulatory.bin.5 | 49 + .../wireless-regdb-2018.09.07/regulatory.db | Bin 0 -> 4232 bytes .../wireless-regdb-2018.09.07/regulatory.db.5 | 1 + .../regulatory.db.p7s | Bin 0 -> 1182 bytes .../sforshee.key.pub.pem | 9 + .../sforshee.x509.pem | 17 + .../wireless-regdb-2018.09.07/sha1sum.txt | 1 + .../web/Regulatory.py | 166 ++ .../wireless-regdb.spec | 35 + scripts/InstallScripts/InstallPackages.sh | 6 +- scripts/buildDebianFs.sh | 12 +- scripts/buildKernel.sh | 7 +- 32 files changed, 2793 insertions(+), 167 deletions(-) delete mode 100644 resources/BuildResources/patches-tested/chromeos-dwc2-glue.patch create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07.tar.gz create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/.gitignore create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/CONTRIBUTING create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/LICENSE create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/Makefile create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/README create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/db.txt create mode 100755 resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2bin.py create mode 100755 resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2fw.py create mode 100755 resources/BuildResources/regdb/wireless-regdb-2018.09.07/dbparse.py create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/changelog create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/compat create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/control create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/copyright create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/docs create mode 100755 resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/rules create mode 100755 resources/BuildResources/regdb/wireless-regdb-2018.09.07/gen-pubcert.sh create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.bin create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.bin.5 create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db.5 create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db.p7s create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/sforshee.key.pub.pem create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/sforshee.x509.pem create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/sha1sum.txt create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/web/Regulatory.py create mode 100644 resources/BuildResources/regdb/wireless-regdb-2018.09.07/wireless-regdb.spec diff --git a/resources/BuildResources/patches-tested/chromeos-dwc2-glue.patch b/resources/BuildResources/patches-tested/chromeos-dwc2-glue.patch deleted file mode 100644 index b4c4493..0000000 --- a/resources/BuildResources/patches-tested/chromeos-dwc2-glue.patch +++ /dev/null @@ -1,150 +0,0 @@ -diff -rup linux-4.17.2-orig/arch/arm/boot/dts/rk3288.dtsi linux-4.17.2/arch/arm/boot/dts/rk3288.dtsi ---- linux-4.17.2-orig/arch/arm/boot/dts/rk3288.dtsi 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/arch/arm/boot/dts/rk3288.dtsi 2018-04-21 17:56:26.360024274 +0300 -@@ -582,6 +582,9 @@ - dr_mode = "host"; - phys = <&usbphy2>; - phy-names = "usb2-phy"; -+ resets = <&cru SRST_USBHOST1_PHY>; -+ reset-names = "phy-full-reset"; -+ snps,need-phy-full-reset-on-wake; - status = "disabled"; - }; - -diff -rup linux-4.17.2-orig/arch/arm/boot/dts/rk3288-veyron.dtsi linux-4.17.2/arch/arm/boot/dts/rk3288-veyron.dtsi ---- linux-4.17.2-orig/arch/arm/boot/dts/rk3288-veyron.dtsi 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/arch/arm/boot/dts/rk3288-veyron.dtsi 2018-04-21 17:47:25.796011427 +0300 -@@ -429,6 +429,7 @@ - - &usb_host1 { - status = "okay"; -+ snps,need-phy-for-wake; - }; - - &usb_otg { -@@ -437,6 +438,7 @@ - assigned-clocks = <&cru SCLK_USBPHY480M_SRC>; - assigned-clock-parents = <&usbphy0>; - dr_mode = "host"; -+ snps,need-phy-for-wake; - }; - - &vopb { -diff -rup linux-4.17.2-orig/drivers/base/dd.c linux-4.17.2/drivers/base/dd.c ---- linux-4.17.2-orig/drivers/base/dd.c 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/drivers/base/dd.c 2018-04-21 13:01:30.280037034 +0300 -@@ -523,6 +523,9 @@ int driver_probe_device(struct device_dr - - bool driver_allows_async_probing(struct device_driver *drv) - { -+ if (drv->async_probe) -+ return true; -+ - switch (drv->probe_type) { - case PROBE_PREFER_ASYNCHRONOUS: - return true; -diff -rup linux-4.17.2-orig/drivers/usb/common/common.c linux-4.17.2/drivers/usb/common/common.c ---- linux-4.17.2-orig/drivers/usb/common/common.c 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/drivers/usb/common/common.c 2018-04-21 13:36:51.184087441 +0300 -@@ -105,6 +105,30 @@ static const char *const usb_dr_modes[] - [USB_DR_MODE_OTG] = "otg", - }; - -+/** -+ * of_usb_get_dr_mode - Get dual role mode for given device_node -+ * @np: Pointer to the given device_node -+ * -+ * The function gets phy interface string from property 'dr_mode', -+ * and returns the correspondig enum usb_dr_mode -+ */ -+enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np) -+{ -+ const char *dr_mode; -+ int err, i; -+ -+ err = of_property_read_string(np, "dr_mode", &dr_mode); -+ if (err < 0) -+ return USB_DR_MODE_UNKNOWN; -+ -+ for (i = 0; i < ARRAY_SIZE(usb_dr_modes); i++) -+ if (!strcmp(dr_mode, usb_dr_modes[i])) -+ return i; -+ -+ return USB_DR_MODE_UNKNOWN; -+} -+EXPORT_SYMBOL_GPL(of_usb_get_dr_mode); -+ - static enum usb_dr_mode usb_get_dr_mode_from_string(const char *str) - { - int ret; -diff -rup linux-4.17.2-orig/drivers/usb/core/hub.c linux-4.17.2/drivers/usb/core/hub.c ---- linux-4.17.2-orig/drivers/usb/core/hub.c 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/drivers/usb/core/hub.c 2018-04-21 17:58:20.456026986 +0300 -@@ -3063,13 +3063,14 @@ static int usb_disable_remote_wakeup(str - } - - /* Count of wakeup-enabled devices at or below udev */ --static unsigned wakeup_enabled_descendants(struct usb_device *udev) -+unsigned usb_wakeup_enabled_descendants(struct usb_device *udev) - { - struct usb_hub *hub = usb_hub_to_struct_hub(udev); - - return udev->do_remote_wakeup + - (hub ? hub->wakeup_enabled_descendants : 0); - } -+EXPORT_SYMBOL_GPL(usb_wakeup_enabled_descendants); - - /* - * usb_port_suspend - suspend a usb device's upstream port -@@ -3178,7 +3179,7 @@ int usb_port_suspend(struct usb_device * - * Therefore we will turn on the suspend feature if udev or any of its - * descendants is enabled for remote wakeup. - */ -- else if (PMSG_IS_AUTO(msg) || wakeup_enabled_descendants(udev) > 0) -+ else if (PMSG_IS_AUTO(msg) || usb_wakeup_enabled_descendants(udev) > 0) - status = set_port_feature(hub->hdev, port1, - USB_PORT_FEAT_SUSPEND); - else { -@@ -3581,7 +3582,7 @@ static int hub_suspend(struct usb_interf - } - if (udev) - hub->wakeup_enabled_descendants += -- wakeup_enabled_descendants(udev); -+ usb_wakeup_enabled_descendants(udev); - } - - if (hdev->do_remote_wakeup && hub->quirk_check_port_auto_suspend) { -diff -rup linux-4.17.2-orig/include/linux/device.h linux-4.17.2/include/linux/device.h ---- linux-4.17.2-orig/include/linux/device.h 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/include/linux/device.h 2018-04-21 13:06:59.172044851 +0300 -@@ -270,6 +270,7 @@ struct device_driver { - - bool suppress_bind_attrs; /* disables bind/unbind via sysfs */ - enum probe_type probe_type; -+ bool async_probe; - - const struct of_device_id *of_match_table; - const struct acpi_device_id *acpi_match_table; -diff -rup linux-4.17.2-orig/include/linux/of.h linux-4.17.2/include/linux/of.h ---- linux-4.17.2-orig/include/linux/of.h 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/include/linux/of.h 2018-04-21 18:03:18.492034069 +0300 -@@ -543,6 +543,8 @@ const char *of_prop_next_string(struct p - - bool of_console_check(struct device_node *dn, char *name, int index); - -+enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np); -+ - extern int of_cpu_node_to_id(struct device_node *np); - - #else /* CONFIG_OF */ -diff -rup linux-4.17.2-orig/include/linux/usb/hcd.h linux-4.17.2/include/linux/usb/hcd.h ---- linux-4.17.2-orig/include/linux/usb/hcd.h 2018-04-20 09:21:08.000000000 +0300 -+++ linux-4.17.2/include/linux/usb/hcd.h 2018-04-21 18:02:33.620033003 +0300 -@@ -640,6 +640,7 @@ extern wait_queue_head_t usb_kill_urb_qu - #define usb_endpoint_out(ep_dir) (!((ep_dir) & USB_DIR_IN)) - - #ifdef CONFIG_PM -+extern unsigned usb_wakeup_enabled_descendants(struct usb_device *udev); - extern void usb_root_hub_lost_power(struct usb_device *rhdev); - extern int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg); - extern int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg); diff --git a/resources/BuildResources/patches-tested/kernel/reverse-do-not-use-bulk-on-EP3-and-EP4.patch b/resources/BuildResources/patches-tested/kernel/reverse-do-not-use-bulk-on-EP3-and-EP4.patch index 8712b14..551c18c 100644 --- a/resources/BuildResources/patches-tested/kernel/reverse-do-not-use-bulk-on-EP3-and-EP4.patch +++ b/resources/BuildResources/patches-tested/kernel/reverse-do-not-use-bulk-on-EP3-and-EP4.patch @@ -1,10 +1,14 @@ FROM: Solidhal -This patch reverse commit 2b721118b7821107757eb1d37af4b60e877b27e7, as can bee seen here: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2b721118b7821107757eb1d37af4b60e877b27e7 +This patch reverses commit 2b721118b7821107757eb1d37af4b60e877b27e7, as can bee seen here: +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2b721118b7821107757eb1d37af4b60e877b27e7 This commit caused issues on veyron speedy with ath9k and dwc2 drivers. Any ath9k device (ar9271) -would intermittently work, most of the time ending in errors as can bee seen here: https://github.com/SolidHal/PrawnOS/issues/38 -This commit fixes that issue. +would intermittently work, most of the time ending in errors as can bee seen here: +https://github.com/SolidHal/PrawnOS/issues/38 +This commit fixes that issue. +This is only a temporary work around while a permenant fix is found, as this commit seems to only cause issues +with dwc2 diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c --- b/drivers/net/wireless/ath/ath9k/hif_usb.c diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07.tar.gz b/resources/BuildResources/regdb/wireless-regdb-2018.09.07.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b88610d7466cca7c5c214ecebbab7f5f509dda4c GIT binary patch literal 27152 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 LiWUPq6T|-jq<|wQ literal 0 HcmV?d00001 diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/.gitignore b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/.gitignore new file mode 100644 index 0000000..a59d408 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/.gitignore @@ -0,0 +1,2 @@ +key.priv.pem +dbparse.pyc diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/CONTRIBUTING b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/CONTRIBUTING new file mode 100644 index 0000000..f288959 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/CONTRIBUTING @@ -0,0 +1,49 @@ + +This project embraces the Developer Certificate of Origin (DCO) for +contributions. This means you must agree to the following prior to submitting +patches, if you agree with this developer certificate you acknowledge this by +adding a Signed-off-by tag to your patch commit log. Every submitted patch +must have this. + +The source for the DCO: + +http://developercertificate.org/ + +----------------------------------------------------------------------- + +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/LICENSE b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/LICENSE new file mode 100644 index 0000000..652a6dd --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/LICENSE @@ -0,0 +1,16 @@ +Copyright (c) 2008, Luis R. Rodriguez +Copyright (c) 2008, Johannes Berg +Copyright (c) 2008, Michael Green + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/Makefile b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/Makefile new file mode 100644 index 0000000..2f1ed93 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/Makefile @@ -0,0 +1,129 @@ +# Install prefix +PREFIX ?= /usr +CRDA_PATH ?= $(PREFIX)/lib/crda +CRDA_KEY_PATH ?= $(CRDA_PATH)/pubkeys +FIRMWARE_PATH ?= /lib/firmware + +MANDIR ?= $(PREFIX)/share/man/ + +SHA1SUM ?= /usr/bin/sha1sum +LSB_RELEASE ?= /usr/bin/lsb_release +WHOAMI ?= /usr/bin/whoami + +# Distro name: Ubuntu, Debian, Fedora, if not present you get +# "custom-distro", if your distribution does not have the LSB stuff, +# then set this variable when calling make if you don't want "custom-distro" +LSB_ID ?= $(shell if [ -f $(LSB_RELEASE) ]; then \ + $(LSB_RELEASE) -i -s; \ + else \ + echo custom-distro; \ + fi) + +DISTRO_PRIVKEY ?= ~/.wireless-regdb-$(LSB_ID).key.priv.pem +DISTRO_PUBKEY ?= ~/.wireless-regdb-$(LSB_ID).key.priv.pem + +REGDB_AUTHOR ?= $(shell if [ -f $(DISTRO_PRIVKEY) ]; then \ + echo $(LSB_ID) ; \ + elif [ -f $(WHOAMI) ]; then \ + $(WHOAMI); \ + else \ + echo custom-user; \ + fi) + +REGDB_PRIVKEY ?= ~/.wireless-regdb-$(REGDB_AUTHOR).key.priv.pem +REGDB_PUBKEY ?= $(REGDB_AUTHOR).key.pub.pem +REGDB_PUBCERT ?= $(REGDB_AUTHOR).x509.pem + +REGDB_UPSTREAM_PUBKEY ?= sforshee.key.pub.pem + +REGDB_CHANGED = $(shell $(SHA1SUM) -c --status sha1sum.txt >/dev/null 2>&1; \ + if [ $$? -ne 0 ]; then \ + echo maintainer-clean $(REGDB_PUBKEY) $(REGDB_PUBCERT); \ + fi) + +.PHONY: all clean mrproper install maintainer-clean install-distro-key + +all: $(REGDB_CHANGED) regulatory.bin sha1sum.txt regulatory.db.p7s + +clean: + @rm -f *.pyc *.gz + +maintainer-clean: clean + @rm -f regulatory.bin regulatory.db regulatory.db.p7s + +mrproper: clean maintainer-clean + @echo Removed public key, regulatory.bin, regulatory.db* and compressed man pages + @rm -f $(REGDB_PUBKEY) $(REGDB_PUBCERT) .custom + +regulatory.bin: db.txt $(REGDB_PRIVKEY) $(REGDB_PUBKEY) + @echo Generating $@ digitally signed by $(REGDB_AUTHOR)... + ./db2bin.py regulatory.bin db.txt $(REGDB_PRIVKEY) + +regulatory.db: db.txt db2fw.py + @echo "Generating $@" + ./db2fw.py regulatory.db db.txt + +regulatory.db.p7s: regulatory.db $(REGDB_PRIVKEY) $(REGDB_PUBCERT) + @echo "Signing regulatory.db (by $(REGDB_AUTHOR))..." + @openssl smime -sign \ + -signer $(REGDB_PUBCERT) \ + -inkey $(REGDB_PRIVKEY) \ + -in $< -nosmimecap -binary \ + -outform DER -out $@ + +sha1sum.txt: db.txt + sha1sum $< > $@ + +$(REGDB_PUBKEY): $(REGDB_PRIVKEY) + @echo "Generating public key for $(REGDB_AUTHOR)..." + openssl rsa -in $(REGDB_PRIVKEY) -out $(REGDB_PUBKEY) -pubout -outform PEM + +$(REGDB_PUBCERT): $(REGDB_PRIVKEY) + @echo "Generating certificate for $(REGDB_AUTHOR)..." + ./gen-pubcert.sh $(REGDB_PRIVKEY) $(REGDB_PUBCERT) + @echo $(REGDB_PUBKEY) > .custom + + +$(REGDB_PRIVKEY): + @echo "Generating private key for $(REGDB_AUTHOR)..." + openssl genrsa -out $(REGDB_PRIVKEY) 2048 + +ifneq ($(shell test -e $(DISTRO_PRIVKEY) && echo yes),yes) +$(DISTRO_PRIVKEY): + @echo "Generating private key for $(LSB_ID) packager..." + openssl genrsa -out $(DISTRO_PRIVKEY) 2048 +endif + +install-distro-key: maintainer-clean $(DISTRO_PRIVKEY) + +%.gz: % + gzip < $< > $@ + +# Users should just do: +# sudo make install +# +# Developers should do: +# make maintainer-clean +# make +# sudo make install +# +# Distributions packagers should do only once: +# make install-distro-key +# This will create a private key for you and install it into +# ~/.wireless-regdb-$(LSB_ID).key.priv.pem +# To make new releaes just do: +# make maintainer-clean +# make +# sudo make install +install: regulatory.bin.5.gz regulatory.db.5.gz + install -m 755 -d $(DESTDIR)/$(CRDA_PATH) + install -m 755 -d $(DESTDIR)/$(CRDA_KEY_PATH) + install -m 755 -d $(DESTDIR)/$(FIRMWARE_PATH) + if [ -f .custom ]; then \ + install -m 644 -t $(DESTDIR)/$(CRDA_KEY_PATH)/ $(shell cat .custom); \ + fi + install -m 644 -t $(DESTDIR)/$(CRDA_KEY_PATH)/ $(REGDB_UPSTREAM_PUBKEY) + install -m 644 -t $(DESTDIR)/$(CRDA_PATH)/ regulatory.bin + install -m 644 -t $(DESTDIR)/$(FIRMWARE_PATH) regulatory.db regulatory.db.p7s + install -m 755 -d $(DESTDIR)/$(MANDIR)/man5/ + install -m 644 -t $(DESTDIR)/$(MANDIR)/man5/ regulatory.bin.5.gz regulatory.db.5.gz diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/README b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/README new file mode 100644 index 0000000..4028223 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/README @@ -0,0 +1,29 @@ +This repository contains the plain text version of the regulatory +database file I maintain for use with Central Regulatory Database +Agent daemon. Also included is the compiled binary version of this +file signed with my RSA key. This represents a good faith attempt +to capture regulatory information that is correct at the time of its last +modification. This information is provided to you with no warranty +either expressed or implied. + +Also included are the tools used to compile and sign the regulatory.bin +file as well as a MoinMoin macro used for viewing the database. + + TECHNICAL INFORMATION +======================= + +The regulatory information in `db.txt' is stored in a human-readable +format which can be read using the `dbparse.py' python module. This +python module is used by the web viewer (Regulatory.py) which is +implemented as a MoinMoin macro (and used on http://wireless.kernel.org) +to allow viewing the database for verification. + +The dbparse module is also used by db2bin.py and db2fw.py, the `compilers' +that compile the database to its binary formats. + +For more information, please see the CRDA git repository: + + git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/crda.git + +John W. Linville +17 November 2008 diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db.txt b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db.txt new file mode 100644 index 0000000..bc64628 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db.txt @@ -0,0 +1,1380 @@ +wmmrule ETSI: + vo_c: cw_min=3, cw_max=7, aifsn=2, cot=2 + vi_c: cw_min=7, cw_max=15, aifsn=2, cot=4 + be_c: cw_min=15, cw_max=1023, aifsn=3, cot=6 + bk_c: cw_min=15, cw_max=1023, aifsn=7, cot=6 + vo_ap: cw_min=3, cw_max=7, aifsn=1, cot=2 + vi_ap: cw_min=7, cw_max=15, aifsn=1, cot=4 + be_ap: cw_min=15, cw_max=63, aifsn=3, cot=6 + bk_ap: cw_min=15, cw_max=1023, aifsn=7, cot=6 + +# This is the world regulatory domain +country 00: + (2402 - 2472 @ 40), (20) + # Channel 12 - 13. + (2457 - 2482 @ 20), (20), NO-IR, AUTO-BW + # Channel 14. Only JP enables this and for 802.11b only + (2474 - 2494 @ 20), (20), NO-IR, NO-OFDM + # Channel 36 - 48 + (5170 - 5250 @ 80), (20), NO-IR, AUTO-BW + # Channel 52 - 64 + (5250 - 5330 @ 80), (20), NO-IR, DFS, AUTO-BW + # Channel 100 - 144 + (5490 - 5730 @ 160), (20), NO-IR, DFS + # Channel 149 - 165 + (5735 - 5835 @ 80), (20), NO-IR + # IEEE 802.11ad (60GHz), channels 1..3 + (57240 - 63720 @ 2160), (0) + + +country AD: + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, wmmrule=ETSI + (5490 - 5710 @ 80), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country AE: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country AF: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +# Source: +# http://pucanguilla.org/Downloads/January2005-Anguilla%20Table%20of%20Allocations.pdf +country AI: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country AL: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20.00), AUTO-BW + (5250 - 5330 @ 80), (20.00), DFS, AUTO-BW + (5490 - 5710 @ 160), (27.00), DFS + +country AM: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 20), (18) + (5250 - 5330 @ 20), (18), DFS + +country AN: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country AR: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country AS: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country AT: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +# Source: +# https://www.legislation.gov.au/Details/F2016C00432 +# Both DFS-ETSI and DFS-FCC are acceptable per AS/NZS 4268 Appendix B. +# The EIRP for DFS bands can be increased by 3dB if TPC is implemented. +# In order to allow 80MHz operation between 5650-5730MHz the upper boundary +# of this more restrictive band has been shifted up by 5MHz from 5725MHz. +country AU: DFS-ETSI + (2400 - 2483.5 @ 40), (36) + (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (20), NO-OUTDOOR, AUTO-BW, DFS + (5470 - 5600 @ 80), (27), DFS + (5650 - 5730 @ 80), (27), DFS + (5730 - 5850 @ 80), (36) + (57000 - 66000 @ 2160), (43), NO-OUTDOOR + +country AW: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country AZ: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (18), AUTO-BW + (5250 - 5330 @ 80), (18), DFS, AUTO-BW + +country BA: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country BB: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (23), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + +country BD: DFS-JP + (2402 - 2482 @ 40), (20) + (5735 - 5835 @ 80), (30) + +country BE: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country BF: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# Bulgarian rules as defined by the Communications Regulation Commission in the +# following documents: +# +# Rules for carrying out electronic communications through radio equipment using +# radio spectrum, which does not need to be individually assigned (the Rules): +# http://www.crc.bg/files/_bg/Pravila_09_06_2015.pdf +# +# List of radio equipment that uses harmonized within the European Union bands +# and electronic communications terminal equipment (the List): +# http://www.crc.bg/files/_bg/Spisak_2015.pdf +# +# Note: The transmit power limits in the 5250-5350 MHz and 5470-5725 MHz bands +# can be raised by 3 dBm if TPC is enabled. Refer to BDS EN 301 893 for details. +country BG: DFS-ETSI + # Wideband data transmission systems (WDTS) in the 2.4GHz ISM band, ref: + # I.22 of the List, BDS EN 300 328 + (2402 - 2482 @ 40), (20) + # 5 GHz Radio Local Area Networks (RLANs), ref: + # II.H01 of the List, BDS EN 301 893 + (5170 - 5250 @ 80), (23), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + # II.H01 of the List, I.54 from the List, BDS EN 301 893 + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # Short range devices (SRDs) in the 5725-5875 MHz frequency range, ref: + # I.43 of the List, BDS EN 300 440-2, BDS EN 300 440-1 + (5725 - 5875 @ 80), (14) + # 60 GHz Multiple-Gigabit RLAN Systems, ref: + # II.H03 of the List, BDS EN 302 567-2 + (57000 - 66000 @ 2160), (40), NO-OUTDOOR + +country BH: DFS-JP + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 20), (20) + (5250 - 5330 @ 20), (20), DFS + (5735 - 5835 @ 20), (20) + +country BL: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country BM: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country BN: DFS-JP + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5735 - 5835 @ 80), (20) + +country BO: DFS-JP + (2402 - 2482 @ 40), (20) + (5250 - 5330 @ 80), (30), DFS + (5735 - 5835 @ 80), (30) + +country BR: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country BS: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# Source: +# http://www.bicma.gov.bt/paper/publication/nrrpart4.pdf +country BT: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country BY: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country BZ: DFS-JP + (2402 - 2482 @ 40), (30) + (5735 - 5835 @ 80), (30) + +# Source: +# https://www.ic.gc.ca/eic/site/smt-gst.nsf/vwapj/rss-247-i2-e.pdf/$file/rss-247-i2-e.pdf +country CA: DFS-FCC + (2402 - 2472 @ 40), (30) + (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (24), DFS, AUTO-BW + (5470 - 5600 @ 80), (24), DFS + (5650 - 5730 @ 80), (24), DFS + (5735 - 5835 @ 80), (30) + +# Source: +# http://www.art-rca.org +country CF: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 40), (17) + (5250 - 5330 @ 40), (24), DFS + (5490 - 5730 @ 40), (24), DFS + (5735 - 5835 @ 40), (30) + +# Source: +# https://www.ofcomnet.ch/#/fatTable +# Note that the maximum transmitter power can be doubled for 5250-5710MHz if +# transmitter power control is in use: 5250-5330@23db, 5490-5710@30db +country CH: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5150 - 5330 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country CI: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country CL: DFS-JP + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5735 - 5835 @ 80), (20) + +country CN: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (23), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + # 60 GHz band channels 1,4: 28dBm, channels 2,3: 44dBm + # ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf + (57240 - 59400 @ 2160), (28) + (59400 - 63720 @ 2160), (44) + (63720 - 65880 @ 2160), (28) + +country CO: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country CR: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 20), (17) + (5250 - 5330 @ 20), (24), DFS + (5490 - 5730 @ 20), (24), DFS + (5735 - 5835 @ 20), (30) + +# Source: +# http://www.mincom.gob.cu/?q=marcoregulatorio +# - Redes Informáticas +# Resolución 127- 2011 Reglamento de Banda de frecuencias de 2,4 GHz. +country CU: DFS-FCC + (2400 - 2483.5 @ 40), (200 mW) + +country CX: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country CY: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +# Data from http://www.ctu.eu/164/download/VOR/VOR-12-08-2005-34.pdf +# and http://www.ctu.eu/164/download/VOR/VOR-12-05-2007-6-AN.pdf +# Power at 5250 - 5350 MHz and 5470 - 5725 MHz can be doubled if TPC is +# implemented. +country CZ: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +# Allocation for the 2.4 GHz band (Vfg 10 / 2013, Allgemeinzuteilung von +# Frequenzen für die Nutzung in lokalen Netzwerken; Wireless Local Area +# Networks (WLAN-Funkanwendungen). +# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2013_10_WLAN_2,4GHz_pdf.pdf +# +# Allocation for the 5 GHz band (Vfg. 7 / 2010, Allgemeinzuteilung von +# Frequenzen in den Bereichen 5150 MHz - 5350 MHz und 5470 MHz - 5725 MHz für +# Funkanwendungen zur breitbandigen Datenübertragung, WAS/WLAN („Wireless +# Access Systems including Wireless Local Area Networks“). +# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2010_07_WLAN_5GHz_pdf.pdf +# The values for the 5 GHz have been reduced by a factor of 2 (3db) for non TPC +# devices (in other words: devices with TPC can use twice the tx power of this +# table). Note that the docs do not require TPC for 5150--5250; the reduction +# to 100mW thus is not strictly required -- however the conservative 100mW +# limit is used here as the non-interference with radar and satellite +# apps relies on the attenuation by the building walls only in the +# absence of DFS; the neighbour countries have 100mW limit here as well. +# +# The ETSI EN 300 440-1 standard for short range devices in the 5 GHz band has +# been implemented in Germany: +# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2014_69_SRD_pdf.pdf +# +# Allocation for the 60 GHz band (Allgemeinzuteilung von Frequenzen im +# Bereich 57 GHz - 66 GHz für Funkanwendungen für weitbandige +# Datenübertragungssysteme; „Multiple Gigabit WAS/RLAN Systems (MGWS)“). +# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2011_08_MGWS_pdf.pdf + +country DE: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI + # short range devices (ETSI EN 300 440-1) + (5725 - 5875 @ 80), (25 mW) + # 60 GHz band channels 1-4 (ETSI EN 302 567) + (57000 - 66000 @ 2160), (40) + +# Sources: +# 5GHz: https://erhvervsstyrelsen.dk/sites/default/files/007_interface-datanet_5-6_ghz.pdf.pdf +# 60GHz: https://erhvervsstyrelsen.dk/sites/default/files/radiograenseflader-63.pdf +country DK: DFS-ETSI + (2400 - 2483.5 @ 40), (20) + (5150 - 5250 @ 80), (23), AUTO-BW, wmmrule=ETSI + (5250 - 5350 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5725 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4 (ETSI EN 302 567) + (57000 - 66000 @ 2160), (40), NO-OUTDOOR + +# Source: +# http://www.ntrcdom.org/index.php?option=com_content&view=category&layout=blog&id=10&Itemid=55 +country DM: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + +country DO: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + +country DZ: DFS-JP + (2402 - 2482 @ 40), (20) + (5170.000 - 5250.000 @ 80.000), (23.00), AUTO-BW + (5250.000 - 5330.000 @ 80.000), (23.00), DFS, AUTO-BW + (5490.000 - 5670.000 @ 160.000), (23.00), DFS + +country EC: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 20), (17) + (5250 - 5330 @ 20), (24), DFS + (5490 - 5730 @ 20), (24), DFS + (5735 - 5835 @ 20), (30) + +country EE: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country EG: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 40), (20) + (5250 - 5330 @ 40), (20), DFS + +# Source: +# Cuadro nacional de atribución de frecuencias (CNAF) +# http://www.mincotur.gob.es/telecomunicaciones/espectro/paginas/cnaf.aspx +country ES: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI + # Short Range Devices (SRD) (ETSI EN 300 440) + (5725 - 5875 @ 80), (25 mW) + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country ET: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country FI: DFS-ETSI + (2400 - 2483.5 @ 40), (20) + (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5725 @ 160), (27), DFS, wmmrule=ETSI + # short range devices (ETSI EN 300 440-1) + (5725 - 5875 @ 80), (25 mW) + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country FM: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country FR: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # short range devices (ETSI EN 300 440) + (5725 - 5875 @ 80), (25 mW) + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country GB: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country GD: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country GE: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (18), AUTO-BW + (5250 - 5330 @ 80), (18), DFS, AUTO-BW + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country GF: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country GH: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country GL: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country GP: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country GR: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country GT: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + +country GU: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 20), (17) + (5250 - 5330 @ 20), (24), DFS + (5490 - 5730 @ 20), (24), DFS + (5735 - 5835 @ 20), (30) + +country GY: + (2402 - 2482 @ 40), (30) + (5735 - 5835 @ 80), (30) + +country HK: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5710 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country HN: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country HR: DFS-ETSI + (2400 - 2483.5 @ 40), (20) + (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5725 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country HT: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# http://stir.nmhh.hu/?oldal=dokumentumGeneralo&root_rendeletelem_id=3&hatalyos=1 +# http://english.nmhh.hu/cikk/297/Eljarasi_tajekoztato_a_24_GHzes_es_az_5_GHzes_savban_mukodo_berendezesek_engedelyezeserol +# http://nmhh.hu/dokumentum/319/kis_hatotavolsagu_eszkozok_srdk.pdf +country HU: DFS-ETSI + # ref: 2006/771/EK, (EU) 2017/1483, MSZ EN 300 328 + # additionally: 100mW @ 10MHz channels, 50mW @ 5MHz (max. 10mW/MHz) + (2400 - 2483.5 @ 40), (20) + # ref: 2005/513/EK + # note: TPC not needed @ 5150-5250 + (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + # note: max would be +3dB with TPC @ 5250-5725 + (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5725 @ 160), (27), DFS, wmmrule=ETSI + # "Short Range Devices (SRD)" + # ref: 2006/771/EK, (EU) 2017/1483, MSZ EN 300 440, MSZ EN 302 064 + (5725 - 5875 @ 80), (25 mW) + # 60 GHz band channels 1-4, "Fixed outdoor installation not allowed" + # ref: 2006/771/EK, (EU) 2017/1483, MSZ EN 302 567 + (57000 - 66000 @ 2160), (40), NO-OUTDOOR + +country ID: DFS-JP + # ref: http://www.postel.go.id/content/ID/regulasi/standardisasi/kepdir/bwa%205,8%20ghz.pdf + (2402 - 2482 @ 20), (20) + (5735 - 5815 @ 20), (23) + +country IE: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country IL: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (200 mW), NO-OUTDOOR, DFS, AUTO-BW + +country IN: + (2402 - 2482 @ 40), (20) + (5150 - 5350 @ 160), (23) + (5725 - 5875 @ 80), (23) + +country IR: DFS-JP + (2402 - 2482 @ 40), (20) + (5735 - 5835 @ 80), (30) + +country IS: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country IT: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country JM: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country JO: DFS-JP + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (23) + (5735 - 5835 @ 80), (23) + +country JP: DFS-JP + (2402 - 2482 @ 40), (20) + (2474 - 2494 @ 20), (20), NO-OFDM + (4910 - 4990 @ 40), (23) + (5030 - 5090 @ 40), (23) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (23), DFS + # 60 GHz band channels 2-4 at 10mW, + # ref: http://www.arib.or.jp/english/html/overview/doc/1-STD-T74v1_1.pdf + (59000 - 66000 @ 2160), (10 mW) + +country KE: DFS-JP + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (23) + (5490 - 5570 @ 80), (30), DFS + (5735 - 5775 @ 40), (23) + +country KH: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +# Source +# http://ntrc.kn/?page_id=7 +country KN: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (30), DFS + (5735 - 5815 @ 80), (30) + +country KP: DFS-JP + (2402 - 2482 @ 20), (20) + (5170 - 5250 @ 20), (20) + (5250 - 5330 @ 20), (20), DFS + (5490 - 5630 @ 20), (30), DFS + (5735 - 5815 @ 20), (30) + +country KR: DFS-JP + (2402 - 2482 @ 40), (13) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (30), DFS + (5735 - 5835 @ 80), (30) + # 60 GHz band channels 1-4, + # ref: http://www.law.go.kr/%ED%96%89%EC%A0%95%EA%B7%9C%EC%B9%99/%EB%AC%B4%EC%84%A0%EC%84%A4%EB%B9%84%EA%B7%9C%EC%B9%99 + (57000 - 66000 @ 2160), (43) + +country KW: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + +country KY: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# Source: +# http://mic.gov.kz/sites/default/files/pages/pravila_prisvoeniya_polos_chastot_no34.pdf +# http://adilet.zan.kz/rus/docs/P000001379_ +country KZ: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5150 - 5250 @ 80), (20), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW + (5470 - 5725 @ 80), (20), NO-OUTDOOR, DFS + +country LB: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# Source: +# http://www.ntrc.org.lc/operational_structures.htm +country LC: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (30), DFS + (5735 - 5815 @ 80), (30) + +# Source: +# https://www.ofcomnet.ch/#/fatTable +# Note that the maximum transmitter power can be doubled for 5250-5710MHz if +# transmitter power control is in use: 5250-5330@23db, 5490-5710@30db +country LI: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5150 - 5330 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country LK: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 20), (17) + (5250 - 5330 @ 20), (24), DFS + (5490 - 5730 @ 20), (24), DFS + (5735 - 5835 @ 20), (30) + +# Source: +# http://lca.org.ls/images/documents/lesotho_national_frequency_allocation_plan.pdf +country LS: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country LT: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country LU: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country LV: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country MA: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + +country MC: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +# Source: +# http://www.cnfr.md/index.php?pag=sec&id=117&l=en +country MD: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +# Source: +# http://www.cept.org/files/1050/Tools%20and%20Services/EFIS%20-%20ECO%20Frequency%20Information%20System/National%20frequency%20tables/Montenegro%20NAFT%20-%202010.pdf +country ME: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country MF: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country MH: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country MK: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country MN: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country MO: DFS-FCC + (2402 - 2482 @ 40), (23) + (5170 - 5250 @ 80), (23), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5490 - 5730 @ 160), (30), DFS + (5735 - 5835 @ 80), (30) + +country MP: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country MQ: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +# Source: +# http://www.are.mr/pdfs/telec_freq_TNAbf_2010.pdf +country MR: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country MT: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country MU: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# Source: +# http://www.cam.gov.mv/docs/tech_standards/TAM-TS-100-2004-WLAN.pdf +country MV: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), AUTO-BW + (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW + (5725 - 5850 @ 80), (100 mW) + +country MW: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country MX: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country MY: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5650 @ 160), (24), DFS + (5735 - 5835 @ 80), (24) + +country NG: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5250 - 5330 @ 80), (30), DFS + (5735 - 5835 @ 80), (30) + +country NI: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# Regulation on the use of frequency space without a license and +# without notification 2015 +# +# http://wetten.overheid.nl/BWBR0036378/2015-03-05 + +country NL: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # short range devices (ETSI EN 300 440-1) + (5725 - 5875 @ 80), (25 mW) + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +# Data from http://www.lovdata.no/dokument/SF/forskrift/2012-01-19-77 +# Power at 5250 - 5350 MHz, 5470 - 5725 MHz and 5815 – 5850 MHz can +# be doubled if TPC is implemented. +# Up to 2W (or 4W with TPC) is allowed in the 5725 – 5795 MHz band +# which has been merged with 5470 - 5725 MHz to allow wide channels +country NO: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5250 @ 80), (200 mW), AUTO-BW, wmmrule=ETSI + (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW, wmmrule=ETSI + (5470 - 5795 @ 160), (500 mW), DFS, wmmrule=ETSI + (5815 - 5850 @ 35), (2000 mW), DFS + (17100 - 17300 @ 200), (100 mW) + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country NP: DFS-JP + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5735 - 5835 @ 80), (20) + +country NZ: DFS-ETSI + (2402 - 2482 @ 40), (30) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country OM: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +# Source: +# http://www.asep.gob.pa/images/telecomunicaciones/Anexos/PNAF-dic2015.pdf +country PA: DFS-FCC + (2400 - 2483.5 @ 40), (36) + (5150 - 5250 @ 80), (36), AUTO-BW + (5250 - 5350 @ 80), (30), AUTO-BW + (5470 - 5725 @ 160), (30) + (5725 - 5850 @ 80), (36) + (57000 - 64000 @ 2160), (43) + +country PE: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country PF: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country PG: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country PH: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country PK: DFS-JP + (2402 - 2482 @ 40), (20) + (5735 - 5835 @ 80), (30) + +country PL: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country PM: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country PR: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country PT: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country PW: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country PY: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country QA: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW), NO-OUTDOOR + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (200 mW), NO-OUTDOOR, DFS, AUTO-BW + (5470 - 5725 @ 160), (100 mW), NO-OUTDOOR, DFS + (5725 - 5875 @ 80), (100 mW), NO-OUTDOOR, DFS + (57000 - 66000 @ 2160), (40), NO-OUTDOOR + +country RE: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country RO: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + + +# Source: +# http://www.ratel.rs/upload/documents/Plan_namene/Plan_namene-sl_glasnik.pdf +country RS: DFS-ETSI + (2400 - 2483.5 @ 40), (100 mW) + (5150 - 5350 @ 40), (200 mW), NO-OUTDOOR + (5470 - 5725 @ 20), (1000 mW), DFS + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country RU: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5650 - 5730 @ 80), (30), DFS + (5735 - 5835 @ 80), (30) + # 60 GHz band channels 1-4, ref: Changes to NLA 124_Order №129_22042015.pdf + (57000 - 66000 @ 2160), (40) + +country RW: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country SA: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country SE: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +# Source +# https://www.imda.gov.sg/~/media/imda/files/regulation%20licensing%20and%20consultations/ict%20standards/telecommunication%20standards/radio-comms/imdatssrd.pdf?la=en +# page 12-14 +# The EIRP for 5250 – 5350 can be increased by 3dB if TPC is implemented. +country SG: DFS-FCC + (2400 - 2483.5 @ 40), (23) + (5150 - 5250 @ 80), (23), AUTO-BW + (5250 - 5350 @ 80), (20), DFS, AUTO-BW + # 5470 - 5725 is only allowed when TPC is implemented + # (5470 - 5725 @ 160), (30), DFS + (5725 - 5850 @ 80), (30) + +country SI: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country SK: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +# Source: +# Regulation N° 2004-005 ART/DG/DRC/D.Rég +country SN: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country SR: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country SV: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 20), (17) + (5250 - 5330 @ 20), (23), DFS + (5735 - 5835 @ 20), (30) + +country SY: + (2402 - 2482 @ 40), (20) + +# Source: +# http://www.telecommission.tc/Spectrum-plan20110324-101210.html +country TC: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (24), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5730 @ 160), (24), DFS, wmmrule=ETSI + (5735 - 5835 @ 80), (30) + +country TD: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +country TG: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 40), (20) + (5250 - 5330 @ 40), (20), DFS + (5490 - 5710 @ 40), (27), DFS + +country TH: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country TN: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + +# Source: +# By-Law on Short Range Radio Devices (SRD) Oct 2015 +# https://www.btk.gov.tr/File/?path=ROOT%2f1%2fDocuments%2fOrdinance%2fBY%2DLAW%20ON%20SHORT%20RANGE%20DEVICES.pdf +# Article 8 +country TR: DFS-ETSI + (2400 - 2483.5 @ 40), (20) + (5170 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW + (5250 - 5330 @ 80), (20), DFS, NO-OUTDOOR, AUTO-BW + (5470 - 5725 @ 160), (27), DFS + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country TT: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +# Source: +# Table of Frequency Allocations of Republic of China (Taiwan) / Feb 2017: +# https://www.motc.gov.tw/websitedowndoc?file=post/201702221012200.doc& \ +# filedisplay=Table%2Bof%2Bradio%2Bfrequency%2Ballocation.doc +# LP0002 Low-power Radio-frequency Devices Technical Regulations / 23 Aug 2016: +# http://www.ncc.gov.tw/english/show_file.aspx?table_name=news&file_sn=681 +country TW: DFS-FCC + # 2.4g band, LP0002 section 3.10.1 + (2400 - 2483.5 @ 40), (30) + # 5g U-NII band, LP0002 section 4.7 + # 5.15 ~ 5.25 GHz: 30 dBm for master mode, 23 dBm for clients + (5150 - 5250 @ 80), (23), AUTO-BW + (5250 - 5350 @ 80), (23), DFS, AUTO-BW + (5470 - 5725 @ 160), (23), DFS + (5725 - 5850 @ 80), (30) + # 60g band, LP0002 section 3.13.1.1 (3)(C), EIRP=40dBm(43dBm peak) + (57000 - 66000 @ 2160), (40) + +country TZ: + (2402 - 2482 @ 40), (20) + (5735 - 5835 @ 80), (30) + +# Source: +# #914 / 06 Sep 2007: http://www.ucrf.gov.ua/uk/doc/nkrz/1196068874 +# #1174 / 23 Oct 2008: http://www.nkrz.gov.ua/uk/activities/ruling/1225269361 +# (appendix 8) +# Listed 5GHz range is a lowest common denominator for all related +# rules in the referenced laws. Such a range is used because of +# disputable definitions there. +country UA: DFS-ETSI + (2400 - 2483.5 @ 40), (20), NO-OUTDOOR + (5150 - 5250 @ 80), (20), NO-OUTDOOR, AUTO-BW + (5250 - 5350 @ 80), (20), DFS, NO-OUTDOOR, AUTO-BW + (5490 - 5670 @ 160), (20), DFS + (5735 - 5835 @ 80), (20) + # 60 GHz band channels 1-4, ref: Etsi En 302 567 + (57000 - 66000 @ 2160), (40) + +country UG: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country US: DFS-FCC + (2402 - 2472 @ 40), (30) + # 5.15 ~ 5.25 GHz: 30 dBm for master mode, 23 dBm for clients + (5170 - 5250 @ 80), (23), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5490 - 5730 @ 160), (23), DFS + (5735 - 5835 @ 80), (30) + # 60g band + # reference: http://cfr.regstoday.com/47cfr15.aspx#47_CFR_15p255 + # channels 1,2,3, EIRP=40dBm(43dBm peak) + (57240 - 63720 @ 2160), (40) + +country UY: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (23), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + +# Source: +# http://cemc.uz/article/1976/ +country UZ: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + +# Source: +# http://www.ntrc.vc/regulations/Jun_2006_Spectrum_Managment_Regulations.pdf +country VC: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + +# Source: +# Official Gazette (Gaceta Oficial) concerning Unlicensed transmitter use +# (10 June 2013) +# http://www.conatel.gob.ve/ +country VE: DFS-FCC + (2402 - 2482 @ 40), (30) + (5170 - 5250 @ 80), (23), AUTO-BW + (5250 - 5330 @ 80), (23), DFS, AUTO-BW + (5735 - 5835 @ 80), (30) + +country VI: DFS-FCC + (2402 - 2472 @ 40), (30) + (5170 - 5250 @ 80), (24), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country VN: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17) + (5250 - 5330 @ 80), (24), DFS + (5490 - 5730 @ 80), (24), DFS + (5735 - 5835 @ 80), (30) + +# Source: +# http://www.trr.vu/attachments/category/130/GURL_for_Short-range_Radiocommunication_Devices2.pdf +country VU: DFS-FCC + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (17), AUTO-BW + (5250 - 5330 @ 80), (24), DFS, AUTO-BW + (5490 - 5730 @ 160), (24), DFS + (5735 - 5835 @ 80), (30) + +country WF: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country WS: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 40), (20) + (5250 - 5330 @ 40), (20), DFS + (5490 - 5710 @ 40), (27), DFS + +country YE: + (2402 - 2482 @ 40), (20) + +country YT: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI + (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI + (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI + +country ZA: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (30) + +country ZW: DFS-ETSI + (2402 - 2482 @ 40), (20) + (5170 - 5250 @ 80), (20), AUTO-BW + (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5490 - 5710 @ 160), (27), DFS + diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2bin.py b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2bin.py new file mode 100755 index 0000000..28cd7d2 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2bin.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python + +from io import BytesIO, open +import struct +import hashlib +from dbparse import DBParser +import sys + +MAGIC = 0x52474442 +VERSION = 19 + +if len(sys.argv) < 3: + print('Usage: %s output-file input-file [key-file]' % sys.argv[0]) + sys.exit(2) + +def create_rules(countries): + result = {} + for c in countries.values(): + for rule in c.permissions: + result[rule] = 1 + return list(result) + +def create_collections(countries): + result = {} + for c in countries.values(): + result[c.permissions] = 1 + return list(result) + + +def be32(output, val): + output.write(struct.pack('>I', val)) + +class PTR(object): + def __init__(self, output): + self._output = output + self._pos = output.tell() + be32(output, 0xFFFFFFFF) + + def set(self, val=None): + if val is None: + val = self._output.tell() + self._offset = val + pos = self._output.tell() + self._output.seek(self._pos) + be32(self._output, val) + self._output.seek(pos) + + def get(self): + return self._offset + +p = DBParser() +countries = p.parse(open(sys.argv[2], 'r', encoding='utf-8')) + +countrynames = list(countries) +countrynames.sort() + +power = [] +bands = [] +for alpha2 in countrynames: + for perm in countries[alpha2].permissions: + if not perm.freqband in bands: + bands.append(perm.freqband) + if not perm.power in power: + power.append(perm.power) +rules = create_rules(countries) +rules.sort() +collections = create_collections(countries) +collections.sort() + +output = BytesIO() + +# struct regdb_file_header +be32(output, MAGIC) +be32(output, VERSION) +reg_country_ptr = PTR(output) +# add number of countries +be32(output, len(countries)) +siglen = PTR(output) + +power_rules = {} +for pr in power: + power_rules[pr] = output.tell() + pr = [int(v * 100.0) for v in (pr.max_ant_gain, pr.max_eirp)] + # struct regdb_file_power_rule + output.write(struct.pack('>II', *pr)) + +freq_ranges = {} +for fr in bands: + freq_ranges[fr] = output.tell() + fr = [int(f * 1000.0) for f in (fr.start, fr.end, fr.maxbw)] + # struct regdb_file_freq_range + output.write(struct.pack('>III', *fr)) + + +reg_rules = {} +for reg_rule in rules: + freq_range, power_rule = reg_rule.freqband, reg_rule.power + reg_rules[reg_rule] = output.tell() + # struct regdb_file_reg_rule + output.write(struct.pack('>III', freq_ranges[freq_range], power_rules[power_rule], + reg_rule.flags)) + + +reg_rules_collections = {} + +for coll in collections: + reg_rules_collections[coll] = output.tell() + # struct regdb_file_reg_rules_collection + coll = list(coll) + be32(output, len(coll)) + coll.sort() + for regrule in coll: + be32(output, reg_rules[regrule]) + +# update country pointer now! +reg_country_ptr.set() + +for alpha2 in countrynames: + coll = countries[alpha2] + # struct regdb_file_reg_country + output.write(struct.pack('>BBxBI', alpha2[0], alpha2[1], coll.dfs_region, reg_rules_collections[coll.permissions])) + + +if len(sys.argv) > 3: + # Load RSA only now so people can use this script + # without having those libraries installed to verify + # their SQL changes + from M2Crypto import RSA + + # determine signature length + key = RSA.load_key(sys.argv[3]) + hash = hashlib.sha1() + hash.update(output.getvalue()) + sig = key.sign(hash.digest()) + # write it to file + siglen.set(len(sig)) + # sign again + hash = hashlib.sha1() + hash.update(output.getvalue()) + sig = key.sign(hash.digest()) + + output.write(sig) +else: + siglen.set(0) + +outfile = open(sys.argv[1], 'wb') +outfile.write(output.getvalue()) diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2fw.py b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2fw.py new file mode 100755 index 0000000..0c0f030 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2fw.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python + +from io import BytesIO, open +import struct +import hashlib +from dbparse import DBParser +import sys +from math import log + +MAGIC = 0x52474442 +VERSION = 20 + +if len(sys.argv) < 3: + print('Usage: %s output-file input-file' % sys.argv[0]) + sys.exit(2) + +def create_rules(countries): + result = {} + for c in countries.values(): + for rule in c.permissions: + result[rule] = 1 + return list(result) + +def create_collections(countries): + result = {} + for c in countries.values(): + result[(c.permissions, c.dfs_region)] = 1 + return list(result) + +def create_wmms(countries): + result = {} + for c in countries.values(): + for rule in c.permissions: + if rule.wmmrule is not None: + result[rule.wmmrule] = 1 + return list(result) + +def be32(output, val): + output.write(struct.pack('>I', val)) +def be16(output, val): + output.write(struct.pack('>H', val)) + +class PTR(object): + def __init__(self, output): + self._output = output + self._pos = output.tell() + be16(output, 0) + self._written = False + + def set(self, val=None): + if val is None: + val = self._output.tell() + assert val & 3 == 0 + self._offset = val + pos = self._output.tell() + self._output.seek(self._pos) + be16(self._output, val >> 2) + self._output.seek(pos) + self._written = True + + def get(self): + return self._offset + + @property + def written(self): + return self._written + +p = DBParser() +countries = p.parse(open(sys.argv[2], 'r', encoding='utf-8')) +rules = create_rules(countries) +rules.sort() +collections = create_collections(countries) +collections.sort() +wmms = create_wmms(countries) +wmms.sort() + +output = BytesIO() + +# struct regdb_file_header +be32(output, MAGIC) +be32(output, VERSION) + +country_ptrs = {} +countrynames = list(countries) +countrynames.sort() +for alpha2 in countrynames: + coll = countries[alpha2] + output.write(struct.pack('>BB', alpha2[0], alpha2[1])) + country_ptrs[alpha2] = PTR(output) +output.write(b'\x00' * 4) + +wmmdb = {} +for w in wmms: + assert output.tell() & 3 == 0 + wmmdb[w] = output.tell() >> 2 + for r in w._as_tuple(): + ecw = int(log(r[0] + 1, 2)) << 4 | int(log(r[1] + 1, 2)) + ac = (ecw, r[2],r[3]) + output.write(struct.pack('>BBH', *ac)) + +reg_rules = {} +flags = 0 +for reg_rule in rules: + freq_range, power_rule, wmm_rule = reg_rule.freqband, reg_rule.power, reg_rule.wmmrule + reg_rules[reg_rule] = output.tell() + assert power_rule.max_ant_gain == 0 + flags = 0 + # convert to new rule flags + assert reg_rule.flags & ~0x899 == 0 + if reg_rule.flags & 1<<0: + flags |= 1<<0 + if reg_rule.flags & 1<<3: + flags |= 1<<1 + if reg_rule.flags & 1<<4: + flags |= 1<<2 + if reg_rule.flags & 1<<7: + flags |= 1<<3 + if reg_rule.flags & 1<<11: + flags |= 1<<4 + rule_len = 16 + cac_timeout = 0 # TODO + if not (flags & 1<<2): + cac_timeout = 0 + if cac_timeout or wmm_rule: + rule_len += 2 + if wmm_rule is not None: + rule_len += 2 + output.write(struct.pack('>BBHIII', rule_len, flags, int(power_rule.max_eirp * 100), + int(freq_range.start * 1000), int(freq_range.end * 1000), int(freq_range.maxbw * 1000), + )) + if rule_len > 16: + output.write(struct.pack('>H', cac_timeout)) + + if rule_len > 18: + be16(output, wmmdb[wmm_rule]) + + while rule_len % 4: + output.write('\0') + rule_len += 1 + +for coll in collections: + for alpha2 in countrynames: + if (countries[alpha2].permissions, countries[alpha2].dfs_region) == coll: + assert not country_ptrs[alpha2].written + country_ptrs[alpha2].set() + slen = 3 + output.write(struct.pack('>BBBx', slen, len(list(coll[0])), coll[1])) + coll = list(coll[0]) + for regrule in coll: + be16(output, reg_rules[regrule] >> 2) + if len(coll) % 2: + be16(output, 0) + +for alpha2 in countrynames: + assert country_ptrs[alpha2].written + +outfile = open(sys.argv[1], 'wb') +outfile.write(output.getvalue()) diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/dbparse.py b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/dbparse.py new file mode 100755 index 0000000..5fe752b --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/dbparse.py @@ -0,0 +1,516 @@ +#!/usr/bin/env python + +from builtins import bytes +from functools import total_ordering +import sys, math +from math import ceil, log +from collections import defaultdict, OrderedDict +import attr + +# must match enum nl80211_reg_rule_flags + +flag_definitions = { + 'NO-OFDM': 1<<0, + 'NO-CCK': 1<<1, + 'NO-INDOOR': 1<<2, + 'NO-OUTDOOR': 1<<3, + 'DFS': 1<<4, + 'PTP-ONLY': 1<<5, + 'PTMP-ONLY': 1<<6, + 'NO-IR': 1<<7, + # hole at bit 8 + # hole at bit 9. FIXME: Where is NO-HT40 defined? + 'NO-HT40': 1<<10, + 'AUTO-BW': 1<<11, +} + +dfs_regions = { + 'DFS-FCC': 1, + 'DFS-ETSI': 2, + 'DFS-JP': 3, +} + +@total_ordering + +@attr.s(frozen=True, cmp=False) +class WmmRule(object): + vo_c = attr.ib() + vi_c = attr.ib() + be_c = attr.ib() + bk_c = attr.ib() + vo_ap = attr.ib() + vi_ap = attr.ib() + be_ap = attr.ib() + bk_ap = attr.ib() + + def _as_tuple(self): + return (self.vo_c, self.vi_c, self.be_c, self.bk_c, + self.vo_ap, self.vi_ap, self.be_ap, self.bk_ap) + + def __eq__(self, other): + if other is None: + return False + return (self._as_tuple() == other._as_tuple()) + + def __ne__(self, other): + return not (self == other) + + def __lt__(self, other): + if other is None: + return False + return (self._as_tuple() < other._as_tuple()) + + def __hash__(self): + return hash(self._as_tuple()) + +class FreqBand(object): + def __init__(self, start, end, bw, comments=None): + self.start = start + self.end = end + self.maxbw = bw + self.comments = comments or [] + + def _as_tuple(self): + return (self.start, self.end, self.maxbw) + + def __eq__(self, other): + return (self._as_tuple() == other._as_tuple()) + + def __ne__(self, other): + return not (self == other) + + def __lt__(self, other): + return (self._as_tuple() < other._as_tuple()) + + def __hash__(self): + return hash(self._as_tuple()) + + def __str__(self): + return '' % ( + self.start, self.end, self.maxbw) + +@total_ordering +class PowerRestriction(object): + def __init__(self, max_ant_gain, max_eirp, comments = None): + self.max_ant_gain = max_ant_gain + self.max_eirp = max_eirp + self.comments = comments or [] + + def _as_tuple(self): + return (self.max_ant_gain, self.max_eirp) + + def __eq__(self, other): + return (self._as_tuple() == other._as_tuple()) + + def __ne__(self, other): + return not (self == other) + + def __lt__(self, other): + return (self._as_tuple() < other._as_tuple()) + + def __hash__(self): + return hash(self._as_tuple()) + + def __str__(self): + return '' + +class DFSRegionError(Exception): + def __init__(self, dfs_region): + self.dfs_region = dfs_region + +class FlagError(Exception): + def __init__(self, flag): + self.flag = flag + +@total_ordering +class Permission(object): + def __init__(self, freqband, power, flags, wmmrule): + assert isinstance(freqband, FreqBand) + assert isinstance(power, PowerRestriction) + assert isinstance(wmmrule, WmmRule) or wmmrule is None + self.freqband = freqband + self.power = power + self.wmmrule = wmmrule + self.flags = 0 + for flag in flags: + if not flag in flag_definitions: + raise FlagError(flag) + self.flags |= flag_definitions[flag] + self.textflags = flags + + def _as_tuple(self): + return (self.freqband, self.power, self.flags, self.wmmrule) + + def __eq__(self, other): + return (self._as_tuple() == other._as_tuple()) + + def __ne__(self, other): + return not (self == other) + + def __lt__(self, other): + return (self._as_tuple() < other._as_tuple()) + + def __hash__(self): + return hash(self._as_tuple()) + + def __str__(self): + return str(self.freqband) + str(self.power) + str(self.wmmrule) + +class Country(object): + def __init__(self, dfs_region, permissions=None, comments=None): + self._permissions = permissions or [] + self.comments = comments or [] + self.dfs_region = 0 + + if dfs_region: + if not dfs_region in dfs_regions: + raise DFSRegionError(dfs_region) + self.dfs_region = dfs_regions[dfs_region] + + def add(self, perm): + assert isinstance(perm, Permission) + self._permissions.append(perm) + self._permissions.sort() + + def __contains__(self, perm): + assert isinstance(perm, Permission) + return perm in self._permissions + + def __str__(self): + r = ['(%s, %s)' % (str(b), str(p)) for b, p in self._permissions] + return '' % (', '.join(r)) + + def _get_permissions_tuple(self): + return tuple(self._permissions) + permissions = property(_get_permissions_tuple) + +class SyntaxError(Exception): + pass + +class DBParser(object): + def __init__(self, warn=None): + self._warn_callout = warn or sys.stderr.write + + def _syntax_error(self, txt=None): + txt = txt and ' (%s)' % txt or '' + raise SyntaxError("Syntax error in line %d%s" % (self._lineno, txt)) + + def _warn(self, txt): + self._warn_callout("Warning (line %d): %s\n" % (self._lineno, txt)) + + def _parse_band_def(self, bname, banddef, dupwarn=True): + try: + freqs, bw = banddef.split('@') + bw = float(bw) + except ValueError: + bw = 20.0 + + try: + start, end = freqs.split('-') + start = float(start) + end = float(end) + # The kernel will reject these, so might as well reject this + # upon building it. + if start <= 0: + self._syntax_error("Invalid start freq (%d)" % start) + if end <= 0: + self._syntax_error("Invalid end freq (%d)" % end) + if start > end: + self._syntax_error("Inverted freq range (%d - %d)" % (start, end)) + if start == end: + self._syntax_error("Start and end freqs are equal (%d)" % start) + except ValueError: + self._syntax_error("band must have frequency range") + + b = FreqBand(start, end, bw, comments=self._comments) + self._comments = [] + self._banddup[bname] = bname + if b in self._bandrev: + if dupwarn: + self._warn('Duplicate band definition ("%s" and "%s")' % ( + bname, self._bandrev[b])) + self._banddup[bname] = self._bandrev[b] + self._bands[bname] = b + self._bandrev[b] = bname + self._bandline[bname] = self._lineno + + def _parse_band(self, line): + try: + bname, line = line.split(':', 1) + if not bname: + self._syntax_error("'band' keyword must be followed by name") + except ValueError: + self._syntax_error("band name must be followed by colon") + + if bname in flag_definitions: + self._syntax_error("Invalid band name") + + self._parse_band_def(bname, line) + + def _parse_power(self, line): + try: + pname, line = line.split(':', 1) + if not pname: + self._syntax_error("'power' keyword must be followed by name") + except ValueError: + self._syntax_error("power name must be followed by colon") + + if pname in flag_definitions: + self._syntax_error("Invalid power name") + + self._parse_power_def(pname, line) + + def _parse_power_def(self, pname, line, dupwarn=True): + try: + max_eirp = line + if max_eirp == 'N/A': + max_eirp = '0' + max_ant_gain = float(0) + def conv_pwr(pwr): + if pwr.endswith('mW'): + pwr = float(pwr[:-2]) + return 10.0 * math.log10(pwr) + else: + return float(pwr) + max_eirp = conv_pwr(max_eirp) + except ValueError: + self._syntax_error("invalid power data") + + p = PowerRestriction(max_ant_gain, max_eirp, + comments=self._comments) + self._comments = [] + self._powerdup[pname] = pname + if p in self._powerrev: + if dupwarn: + self._warn('Duplicate power definition ("%s" and "%s")' % ( + pname, self._powerrev[p])) + self._powerdup[pname] = self._powerrev[p] + self._power[pname] = p + self._powerrev[p] = pname + self._powerline[pname] = self._lineno + + def _parse_wmmrule(self, line): + regions = line[:-1].strip() + if not regions: + self._syntax_error("'wmmrule' keyword must be followed by region") + + regions = regions.split(',') + + self._current_regions = {} + for region in regions: + if region in self._wmm_rules: + self._warn("region %s was added already to wmm rules" % region) + self._current_regions[region] = 1 + self._comments = [] + + def _validate_input(self, cw_min, cw_max, aifsn, cot): + if cw_min < 1: + self._syntax_error("Invalid cw_min value (%d)" % cw_min) + if cw_max < 1: + self._syntax_error("Invalid cw_max value (%d)" % cw_max) + if cw_min > cw_max: + self._syntax_error("Inverted contention window (%d - %d)" % + (cw_min, cw_max)) + if not (bin(cw_min + 1).count('1') == 1 and cw_min < 2**15): + self._syntax_error("Invalid cw_min value should be power of 2 - 1 (%d)" + % cw_min) + if not (bin(cw_max + 1).count('1') == 1 and cw_max < 2**15): + self._syntax_error("Invalid cw_max value should be power of 2 - 1 (%d)" + % cw_max) + if aifsn < 1: + self._syntax_error("Invalid aifsn value (%d)" % aifsn) + if cot < 0: + self._syntax_error("Invalid cot value (%d)" % cot) + + + def _validate_size(self, var, bytcnt): + return bytcnt < ceil(len(bin(var)[2:]) / 8.0) + + def _parse_wmmrule_item(self, line): + bytcnt = (2.0, 2.0, 1.0, 2.0) + try: + ac, cval = line.split(':') + if not ac: + self._syntax_error("wmm item must have ac prefix") + except ValueError: + self._syntax_error("access category must be followed by colon") + p = tuple([int(v.split('=', 1)[1]) for v in cval.split(',')]) + self._validate_input(*p) + for v, b in zip(p, bytcnt): + if self._validate_size(v, b): + self._syntax_error("unexpected input size expect %d got %d" + % (b, v)) + + for r in self._current_regions: + self._wmm_rules[r][ac] = p + + def _parse_country(self, line): + try: + cname, cvals= line.split(':', 1) + dfs_region = cvals.strip() + if not cname: + self._syntax_error("'country' keyword must be followed by name") + except ValueError: + self._syntax_error("country name must be followed by colon") + + cnames = cname.split(',') + + self._current_countries = {} + for cname in cnames: + if len(cname) != 2: + self._warn("country '%s' not alpha2" % cname) + cname = bytes(cname, 'ascii') + if not cname in self._countries: + self._countries[cname] = Country(dfs_region, comments=self._comments) + self._current_countries[cname] = self._countries[cname] + self._comments = [] + + def _parse_country_item(self, line): + if line[0] == '(': + try: + band, line = line[1:].split('),', 1) + bname = 'UNNAMED %d' % self._lineno + self._parse_band_def(bname, band, dupwarn=False) + except: + self._syntax_error("Badly parenthesised band definition") + else: + try: + bname, line = line.split(',', 1) + if not bname: + self._syntax_error("country definition must have band") + if not line: + self._syntax_error("country definition must have power") + except ValueError: + self._syntax_error("country definition must have band and power") + + if line[0] == '(': + items = line.split('),', 1) + if len(items) == 1: + pname = items[0] + line = '' + if not pname[-1] == ')': + self._syntax_error("Badly parenthesised power definition") + pname = pname[:-1] + flags = [] + else: + pname = items[0] + flags = items[1].split(',') + power = pname[1:] + pname = 'UNNAMED %d' % self._lineno + self._parse_power_def(pname, power, dupwarn=False) + else: + line = line.split(',') + pname = line[0] + flags = line[1:] + w = None + if flags and 'wmmrule' in flags[-1]: + try: + region = flags.pop().split('=', 1)[1] + if region not in self._wmm_rules.keys(): + self._syntax_error("No wmm rule for %s" % region) + except IndexError: + self._syntax_error("flags is empty list or no region was found") + w = WmmRule(*self._wmm_rules[region].values()) + + if not bname in self._bands: + self._syntax_error("band does not exist") + if not pname in self._power: + self._syntax_error("power does not exist") + self._bands_used[bname] = True + self._power_used[pname] = True + # de-duplicate so binary database is more compact + bname = self._banddup[bname] + pname = self._powerdup[pname] + b = self._bands[bname] + p = self._power[pname] + try: + perm = Permission(b, p, flags, w) + except FlagError as e: + self._syntax_error("Invalid flag '%s'" % e.flag) + for cname, c in self._current_countries.items(): + if perm in c: + self._warn('Rule "%s, %s" added to "%s" twice' % ( + bname, pname, cname)) + else: + c.add(perm) + + def parse(self, f): + self._current_countries = None + self._current_regions = None + self._bands = {} + self._power = {} + self._countries = {} + self._bands_used = {} + self._power_used = {} + self._bandrev = {} + self._powerrev = {} + self._banddup = {} + self._powerdup = {} + self._bandline = {} + self._powerline = {} + self._wmm_rules = defaultdict(lambda: OrderedDict()) + + self._comments = [] + + self._lineno = 0 + for line in f: + self._lineno += 1 + line = line.strip() + if line[0:1] == '#': + self._comments.append(line[1:].strip()) + line = line.replace(' ', '').replace('\t', '') + if not line: + self._current_regions = None + self._comments = [] + line = line.split('#')[0] + if not line: + continue + if line[0:4] == 'band': + self._parse_band(line[4:]) + self._current_countries = None + self._current_regions = None + self._comments = [] + elif line[0:5] == 'power': + self._parse_power(line[5:]) + self._current_countries = None + self._current_regions = None + self._comments = [] + elif line[0:7] == 'country': + self._parse_country(line[7:]) + self._comments = [] + self._current_regions = None + elif self._current_countries is not None: + self._current_regions = None + self._parse_country_item(line) + self._comments = [] + elif line[0:7] == 'wmmrule': + self._parse_wmmrule(line[7:]) + self._current_countries = None + self._comments = [] + elif self._current_regions is not None: + self._parse_wmmrule_item(line) + self._current_countries = None + self._comments = [] + else: + self._syntax_error("Expected band, power or country definition") + + countries = self._countries + bands = {} + for k, v in self._bands.items(): + if k in self._bands_used: + bands[self._banddup[k]] = v + continue + # we de-duplicated, but don't warn again about the dupes + if self._banddup[k] == k: + self._lineno = self._bandline[k] + self._warn('Unused band definition "%s"' % k) + power = {} + for k, v in self._power.items(): + if k in self._power_used: + power[self._powerdup[k]] = v + continue + # we de-duplicated, but don't warn again about the dupes + if self._powerdup[k] == k: + self._lineno = self._powerline[k] + self._warn('Unused power definition "%s"' % k) + return countries diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/changelog b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/changelog new file mode 100644 index 0000000..7bbce5c --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/changelog @@ -0,0 +1,5 @@ +wireless-regdb (2009.01.15-1) unstable; urgency=low + + * Initial release + + -- Luis R. Rodriguez Thu, 22 Jan 2009 16:00:00 +0100 diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/compat b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/compat new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/compat @@ -0,0 +1 @@ +5 diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/control b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/control new file mode 100644 index 0000000..e6e7161 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/control @@ -0,0 +1,15 @@ +Source: wireless-regdb +Section: admin +Priority: optional +Maintainer: Luis R. Rodriguez +Build-Depends: cdbs, debhelper (>= 5), python +Standards-Version: 3.7.3 + +Package: wireless-regdb +Architecture: all +Depends: +Suggests: crda +Description: The Linux wireless regulatory database + This package contains the wireless regulatory database used by all + cfg80211 based Linux wireless drivers. The wireless database being + used is maintained by Seth Forshee. diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/copyright b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/copyright new file mode 100644 index 0000000..c01f1a0 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/copyright @@ -0,0 +1,21 @@ +This package was debianized by Luis Rodriguez on +Thu, 22 Jan 2009 16:00:00 +0100. + +The wireless-regdb packages was downloaded from + +Copyright (c) 2008, Luis R. Rodriguez +Copyright (c) 2008, Johannes Berg +Copyright (c) 2008, Michael Green + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/docs b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/docs new file mode 100644 index 0000000..e845566 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/docs @@ -0,0 +1 @@ +README diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/rules b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/rules new file mode 100755 index 0000000..34a08a5 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/debian-example/rules @@ -0,0 +1,10 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk + +PREFIX = /usr +CRDA_LIB ?= $(PREFIX)/lib/crda + +install/wireless-regdb:: + install -o 0 -g 0 -m 755 -d debian/$(cdbs_curpkg)/$(CRDA_LIB) + install -o 0 -g 0 -m 644 regulatory.bin debian/$(cdbs_curpkg)/$(CRDA_LIB)/regulatory.bin diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/gen-pubcert.sh b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/gen-pubcert.sh new file mode 100755 index 0000000..1a4d579 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/gen-pubcert.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +if [[ $# -ne 2 ]]; then + echo "Usage: $0 priv-key out-file" + exit 1 +fi + +openssl req -new -key "$1" -days 36500 -utf8 -nodes -batch \ + -x509 -outform PEM -out "$2" \ + -config <(cat <<-EOF + [ req ] + distinguished_name = req_distinguished_name + string_mask = utf8only + prompt = no + [ req_distinguished_name ] + commonName = sforshee + EOF + ) diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.bin b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.bin new file mode 100644 index 0000000000000000000000000000000000000000..e0c1c172f47b0af62e53f9b33be42f7b7a0a2697 GIT binary patch literal 5864 zcmZ`+e{5S<6~6wN=fr;YM6`Bm1SzDWRQ)4DffW|f#CBpQu^l&d5~qvSR-~IN0t77+ zY1e^=f(UJaFl7)>5Yb4d01=8x1c6n>f~=Y#MOIfNi-j(Tb_7V*q7|v26!D#N?|peq z$CK>y-S3_s-#Pa_x9N&S!$OGn2oV~A{fQ6`7pLuM)uOZ& zhO}l#T4O`n(6Y21s)MKUmb4GlOKaSfw(^v;o@b+^nRu!oSze-_e(j^XWSv) zb?jKtwcOq$YX4P``6(yzvw!V8`y4Gcxo%b$*hlk}N7tgdRFi5EuKT_ayRPr$JgFD! z@743tkks?}deQwf#txl5AC=k&lg7TtIP<-a$3@@SeG)6p_8v*6Raa|9Jn_0m!lXgX zf%`pmi2HTH>fXt^ZtO2^_DFfqO9nbg2lY$6_lyoP=Ce@qr&_sRmf4?cp-1v>|Hr&Y z)YY?|L~%$Yf5h5cqtW6$^UU5YSv}_7J89{soHP@v+r5T7Ha$Emnva?lYr`B_Cp6~< z7a3Cy@)2W;4)^-1qvAic!WC$8(V3P&)46NSeD11Wu7$e2xC6`+#!RTLaP;F&s(Wc+ z+<(TjhllZ~4M%M_E3sIBRe2aIA7|4h@1TA4&M{X0jCC#IRIDhZ%dPSA zLO2JoRh4KL)I8&Dn4XSZQ-M0Fwr)MOf8!QErvr zQES8dfR&Gfu*$<&`x9@+QLOQ>4`HfR1FK`NY+_gaCKk7VN!vI+gjHR}D)v6C@;hh- zIzM5php^VL1WftyI0+MvhjCV7#|-R*4G-Ed#p3MPhqU2wOyWz$Iw?-^&cqh1YfXb! z*f9@GIq@*o{3-~A#RjnQv2Xz#@v0W%My%-}Ue{U!p2H`E9&f{{JT5>nKwqf47hm+j zV_{rq#&#dV#NUA(CU0P@MGZrVRUYR_a8r_Zx?yRJ#|a%eR(SDlGz#Ia6~a4<{|h44 zm=nTBaUQjYd*vO+UKBihteCWl0dK|Vd|US@PUo}jaUE!54gJVBidEz;kW*a{gs3uVH@xd(gw@LVM={OW@t$ z>%hahz(4?Xz&;OWd4u&weLC#80-rDm`9=$*83Hy{-A ztXKu7bJ#fRH%j+m+vD6irU~Jgf5j^1Ij4Hmb#vhJ;Mc@v-{5>%thLVo;^Xj}yr1JU zpm%)%{V6}aZ{g>v+>ZW@03-8`X=7i55L3Ue1r9vq!3l*<|tXSskw#TThra# zNpwZk-wrZ-mSNR=eTN7@U`{6M82ZzH^ z>NQjoZc%)z%omRFdNv%V{lI8g)ek3Sop6eHb1B@(@&2&V5oR61l`!it^Wi?q1ACDD z1|!WBU$qh8I)TXu{*p%i+DMzM8%fB#krb_iW06k9bN)boq?_YMB01h)iE#d)5#jzS z*P`4bSIrQZ4|=keD^Sx4}2ON8PB{Vl5R7VbAN-;&|DZ&iJ_ zc5y%Ju`t=75sOkDe>BE<%)K#rZsk~lTXUImXm6( zNuH~JB*}9M8cBIiR+4`;p}PWV(~G zucZ{%4z=TsH%Qgi8IJwc<3=UXMZc&_Gb7sr|I zjGSveqwYzDbyN*x_yz65V))wyKl`%=uRezNku zCIpiA22JU_F1Q1*ZFpgQOFG@v8^hy^w2lI^TDT| zc;WbwC#FB~ypNQSUVQk{L}&41j*UUrJJGWzZ!G-w_=(Fkk-ZE}whrSk+5)#al0A Szx?8FQcwQ;$hL>>X8#9y9V0*h literal 0 HcmV?d00001 diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.bin.5 b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.bin.5 new file mode 100644 index 0000000..b1862cd --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.bin.5 @@ -0,0 +1,49 @@ +.TH regulatory.bin 5 "21 December 2017" "regulatory.bin" "Linux" +.SH NAME +regulatory.bin, regulatory.db \- The Linux wireless regulatory database + +.ad l +.in +8 +.ti -8 + +.SS +.SH Description +.B regulatory.bin +and +.B regulatory.db +are the files used by the Linux wireless subsystem to keep its regulatory +database information. +.PP +.B regulatory.bin +is read by +.B crda +upon the Linux kernel's request for regulatory information for a specific +ISO / IEC 3166 alpha2 country code. +.PP +.B regulatory.db +is a newer, extensible database format which (since Linux 4.15) is read +by the kernel directly as a firmware file. + +The regulatory database is kept in a small binary format for size and code +efficiency. The +.B regulatory.bin +file can be parsed and read in human format by using the +.B regdbdump +command. The regulatory database files should be updated upon regulatory +changes or corrections. + +.SH Upkeeping +The regulatory database is maintained by the community as such +you are encouraged to send any corrections or updates to the +linux-wireless and wireless-regdb mailing lists: +.B linux-wireless@vger.kernel.org +and +.B wireless-regdb@lists.infradead.org + +.SH SEE ALSO +.BR regdbdump (8) +.BR crda (8) +.BR iw (8) + +.BR http://wireless.kernel.org/en/developers/Regulatory/ + diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db new file mode 100644 index 0000000000000000000000000000000000000000..b0d89c928272baf03a45ae5116a17972281e88c9 GIT binary patch literal 4232 zcmZuye~2Ad6~6bLdApl5O=gp4qokIVW`%&2rD&~+cHhkVx$n)q**EXUz8A0sE4H+T zSamH$OVIeMR%!kSG^C|A7%@_@LG-1S=muHXU{W?>LKh6~Ll+Wjs*5ffbFtXdYVTX|#LD&V>ZeX9gFtumajFyC@u-g4oJRX4U-sA2hrw3@iz z#b3{uuygQ9y9g)kG90lh(6?)F#dhHzb{*FZIBvI~ZqFIg?!v0wgAeBm@UDCn-ko>g zv3wnWJ$Sod!|?*vE|lO@!G{kPP`_A#_Y|>qu>rp?S+H8l!+}x(epxEQN~sL}QVpLT z{u&r-!egZte7e*%?kZQ|r)3xVyqF1L3^G+3Gt|6VevCHug&*FXqIhgCTaK8=rICvh; z9Q2(oY`P_5i(7$tw+4T5>oDbdaK-HzyXy`tc{%8Lc*Y)TdnJ70EWD~Q?$uz`b8xQ# z2RzjEIxz2{@7Wxb8|bA`ht-A;A8WMWw~Y?;{TwX$I1|4FHNS#S^yuTvHI!zZAn+=$5HgVm7*=En!(aJ%-RWfADhbLNHSa0=Uv2DXryI|~T zV-IZ?e$sA1zk_}|KD^Q`z~OEaR(d)3O%Hp?%%~W-TOyXiC~9nq z(PgpsB_Sr)-Y3Kh)22#cG4|g?T#Rid@oi_4c)OXzr1yhmF?nX1^#$?cIE??n6T+P^ zMJ5}>38NqONBj_zpEwTnbo`yDH~Hls27J_$gcnTl-tAMYza@pKznQmQ6}7z>r+SEM z3kQYsqh-cBk?$Uz65gI=A@4twO<^4IY171VXd>7(n(;gli17d#Pf*N z4s`GgVtd&;bPuylk9uH^(s{Ed4n}=b4q^3KVTzIO3-^y6_s!=rI+nsXmv}tR*XI_+ z3CH5-!8Fr2rcZOGa}V=F&t`Hjo5Ivra6Z~sm`8Uarp0F*$9!JHoNNm7y!gCgoD^n` zx#gjFooos-$G|@6F40-gTn+S=z<5s*7&Q|(&d0eL@i^jaOrPc$*AM5BjcE`kh1nnTE!#YxvEhJ4n4@ynUa? z?>^lb#)pG%0ehu*h{+e?&cv(q?LhBCjJ*amsXxu(esvAXVI0eedK>atgL@n9MZP1A zQ1ifYqK^(?{cf-a#B>JRbYB!_5242p$Mo1!5+`OEX&{H@MmW3|35>IjWBRVq`E~8* zm`^<>Fn+reIP--7pS(ZdXP!)8x>w8(QVeFb7JnU=cDgF>uOZv417_x5V__Cx4nx`C}6U#qYLoNgVTYY5R5O( zXpDLkk1$+=!}$e>^2etrcNj-Ky7Dx|9ln}4UjC@<|Q7@}?$S~e6*VJCMfwhA8 zZjA5ccoJ`Deh^3-B=iL+ZB3%U9*E)I^kf zR!aG2^>K9xntBjCuc2puVLBkU`zc@&Wm> zdPJS4z8QDqg(%jMzf)gQ1Fe5qK83L-F}g+PJ{!d|AjFC+$z$q1br$)GuzC$f@Of1} zEPt*ZRs(etu!JDJG29=Bb#YT{a53q+9)p_#(0d!qUKfQDfPIzh_QfImnVtGwQ#M9n&-=9b&zKe z_@J5i0p{An83j7~CHrC>T+D^B$3}tNohC>*!q=$N-0TcOX9_e~q)GcO{t1yt-HY41i}euU5zxuj#xk zJ!4uAV3d0f))L0y9g(-EslGaicbM+gK+@g#h`NgLAr9_RfS;3ZszW@-U~X4~HP;Q+ m*s>U4O}b0;q`Wo0gI{AVoyT=KoIl-#>m0`%%)PF2@%ewioE72# literal 0 HcmV?d00001 diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db.5 b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db.5 new file mode 100644 index 0000000..6c8aae3 --- /dev/null +++ b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db.5 @@ -0,0 +1 @@ +.so man5/regulatory.bin.5.gz diff --git a/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db.p7s b/resources/BuildResources/regdb/wireless-regdb-2018.09.07/regulatory.db.p7s new file mode 100644 index 0000000000000000000000000000000000000000..61dd4ec7573582a0eeb4711add085dcadbb43c47 GIT binary patch literal 1182 zcmXqLVwuIpsnzDu_MMlJooPW6OSeH2OFI)IqanWmFB@k$Y57IP8L6oT z3gWzm=7t6aW`>p~2F9jQ68uJnhUNyAhDJ~U?An?bm5_}Gx`?@nk)HwR0xqT|Mn;CM z4v*((v{*8Kvb>(A<7gqerfz9-p=#ZPnvA>o_BXFbTFkG>3OdBBrCXQwMQ*cDfkO0^ z=|;AN-PY0^;v(6JN5Z?OiOKv`xysG?GefZD_o+ahi>{Kl1YEjq{wrJgH$hi|TVv`b z-B%qmc3cco{17bvktzSB+w95l8WZ@}nElF7E({O*cINW^TCJPX#jdY+skgqbs$Y7# z;kbd>rQmmO*2q0K{AjjlPV%wT=z7)CjD@c**D=J*io2m8VN}kpDU>E>R{VTAi=+9* zjYZmD7HTTgOsnM9zHsB-i5&aMzmLAF2oe;PuKM;UW9IYUZelHuk1u@o;F8AX=M0{IyM6Wwa{mIf7OHQT7tSL%AoG*M>*R=9_*YmGe6b-ztep`IAGVBw- z!1vkYwQ2f*qmwdu%Ti1qxCzl8GMutX;+>(KaknSwU#Nh zc=g}&Q_k>OCH%D!(HApbsVILsU}Hb?y9H@0#VSP%n;5qNQ^_V^qBc;#nzqnVFjAsl zkZB+RPtu&shRAuqKn5YhYRC^v)fNVp2IhtqM#e^_Q3m=5Sr$Vj7KJ}<1qr{ccZgW= zGBEyg^Ez&;r{DPVl)&_R^)_L1WL9S(M;$P6votX>)K^tLTI*6cX@+3#y!}`9R;4tn z*1i8KTa&8#y1#Yvqz8rj=A0_Z<$F^5THOD^i7AuMNM7BhZ8!ICK)b+^@YEH0>puM{ z?pwEeWq(X@m!^9D`fXYJrPrk;G@f)l`>X4)*UVz3vU{%e*Ed(z8_Yg<(o%P+=Xc3f zzuvvy*})a_{+Nv!XLjN}F5~AM?N^wk+DzZy=Qo(c@ax9}`` +BuildRoot : /var/tmp/%{name}-buildroot +Requires: python +BuildArch: noarch + +%define crda_lib /usr/lib/crda + +%description +This package contains the wireless regulatory database used by all +cfg80211 based Linux wireless drivers. The wireless database being +used is maintained by Seth Forshee. +http://wireless.kernel.org/en/developers/Regulatory/ + +%prep +%setup -n %name-2009-01-15 +%build +%install +install -m 755 -d %buildroot/%crda_lib +install -m 644 regulatory.bin %buildroot/%{crda_lib}/regulatory.bin +%files +%crda_lib/regulatory.bin +%doc README LICENSE + +%changelog +* Fri Jan 23 2009 - mcgrof@gmail.com +- Started wireless-regdb package + diff --git a/scripts/InstallScripts/InstallPackages.sh b/scripts/InstallScripts/InstallPackages.sh index 3cbb662..d89571a 100755 --- a/scripts/InstallScripts/InstallPackages.sh +++ b/scripts/InstallScripts/InstallPackages.sh @@ -13,8 +13,8 @@ done locale-gen #Install shared packages -apt install -y xorg acpi-support lightdm tasksel dpkg librsvg2-common xorg xserver-xorg-input-libinput alsa-utils anacron avahi-daemon eject iw libnss-mdns xdg-utils xserver-xorg-input-synaptics mousepad vlc dconf-tools -apt install -y wicd-daemon wicd wicd-curses wicd-gtk +apt install -y xorg acpi-support lightdm tasksel dpkg librsvg2-common xorg xserver-xorg-input-libinput alsa-utils anacron avahi-daemon eject iw libnss-mdns xdg-utils xserver-xorg-input-synaptics mousepad vlc dconf-tools sudo +apt install -y network-manager-gnome network-manager-openvpn [ "$DE" = "xfce" ] && apt install -y xfce4 dbus-user-session system-config-printer tango-icon-theme xfce4-power-manager xfce4-terminal xfce4-goodies numix-gtk-theme plank [ "$DE" = "lxqt" ] && apt install -y lxqt @@ -48,7 +48,7 @@ adduser $username usermod -a -G sudo,netdev $username -#install plank launchers +#install plank launchers #TODO: Disabled as doing it this way causes xconf or xfce4-session to not start?? #[ "$DE" = "xfce" ] && mkdir -p /home/$username/.config/plank/dock1/launchers/ #[ "$DE" = "xfce" ] && cp $DIR/xfce-config/plank/plank-launchers/* /home/$username/.config/plank/dock1/launchers/ diff --git a/scripts/buildDebianFs.sh b/scripts/buildDebianFs.sh index 392b772..94060f3 100755 --- a/scripts/buildDebianFs.sh +++ b/scripts/buildDebianFs.sh @@ -63,9 +63,7 @@ create_image() { create_image PrawnOS-Alpha-c201-libre-2GB.img $outdev 50M 40 $outmnt # install Debian on it -# export LC_ALL="en_US.UTF-8" #Change this as necessary if not US -# export LANGUAGE="en_US.UTF-8" -# export LANG="en_US.UTF-8" +export LC_ALL="en_US.UTF-8" #Change this as necessary if not US export DEBIAN_FRONTEND=noninteractive qemu-debootstrap --arch armhf stretch --include locales,init --keyring=$build_resources/debian-archive-keyring.gpg $outmnt http://deb.debian.org/debian chroot $outmnt passwd -d root @@ -87,14 +85,14 @@ cp /etc/locale.gen $outmnt/etc/ #Install the base packages chroot $outmnt apt update -chroot $outmnt apt install -y initscripts udev kmod net-tools inetutils-ping traceroute iproute2 isc-dhcp-client wpasupplicant iw alsa-utils cgpt vim-tiny less psmisc netcat-openbsd ca-certificates bzip2 xz-utils ifupdown nano apt-utils python python-urwid +chroot $outmnt apt install -y initscripts udev kmod net-tools inetutils-ping traceroute iproute2 isc-dhcp-client wpasupplicant iw alsa-utils cgpt vim-tiny less psmisc netcat-openbsd ca-certificates bzip2 xz-utils ifupdown nano apt-utils #Cleanup to reduce install size chroot $outmnt apt-get autoremove --purge chroot $outmnt apt-get clean -#Download the packages to be installed by Install.sh: TODO: potentially dpkg-reconfigure locales? -chroot $outmnt apt-get install -y -d xorg acpi-support lightdm tasksel dpkg librsvg2-common xorg xserver-xorg-input-libinput alsa-utils anacron avahi-daemon eject iw libnss-mdns xdg-utils lxqt wicd-daemon wicd wicd-curses wicd-gtk xserver-xorg-input-synaptics crda xfce4 dbus-user-session system-config-printer tango-icon-theme xfce4-power-manager xfce4-terminal xfce4-goodies mousepad vlc libutempter0 xterm numix-gtk-theme dconf-tools plank +#Download the packages to be installed by Install.sh: +chroot $outmnt apt-get install -y -d xorg acpi-support lightdm tasksel dpkg librsvg2-common xorg xserver-xorg-input-libinput alsa-utils anacron avahi-daemon eject iw libnss-mdns xdg-utils lxqt xserver-xorg-input-synaptics crda xfce4 dbus-user-session system-config-printer tango-icon-theme xfce4-power-manager xfce4-terminal xfce4-goodies mousepad vlc libutempter0 xterm numix-gtk-theme dconf-tools plank network-manager-gnome network-manager-openvpn #Cleanup hosts rm -rf $outmnt/etc/hosts #This is what https://wiki.debian.org/EmDebian/CrossDebootstrap suggests @@ -107,6 +105,8 @@ make -C build/linux-$KVER ARCH=arm INSTALL_MOD_PATH=$outmnt modules_install rm -f $outmnt/lib/modules/3.14.0/{build,source} install -D -m 644 build/open-ath9k-htc-firmware/target_firmware/htc_9271.fw $outmnt/lib/firmware/ath9k_htc/htc_9271-1.4.0.fw +#Install the regulatory.db files +install -m 644 $build_resources/regdb/wireless-regdb-2018.09.07/regulatory.db* $outmnt/lib/firmware/ umount -l $outmnt > /dev/null 2>&1 rmdir $outmnt > /dev/null 2>&1 diff --git a/scripts/buildKernel.sh b/scripts/buildKernel.sh index e3ec7c9..55e99ef 100755 --- a/scripts/buildKernel.sh +++ b/scripts/buildKernel.sh @@ -12,22 +12,19 @@ RESOURCES=$ROOT_DIR/resources/BuildResources [ ! -d build ] && mkdir build cd build -# build Linux-libre, with ath9k_htc, dwc2 from Chrome OS and without many useless drivers +# build Linux-libre, with ath9k_htc [ ! -f linux-libre-$KVER-gnu.tar.lz ] && wget https://www.linux-libre.fsfla.org/pub/linux-libre/releases/$KVER-gnu/linux-libre-$KVER-gnu.tar.lz [ ! -d linux-$KVER ] && tar --lzip -xvf linux-libre-$KVER-gnu.tar.lz && FRESH=true cd linux-$KVER make clean make mrproper #Apply the usb and mmc patches if unapplied -# [ "$FRESH" = true ] && for i in $RESOURCES/patches-tested/*.patch; do patch -p1 < $i; done [ "$FRESH" = true ] && for i in $RESOURCES/patches-tested/DTS/*.patch; do patch -p1 < $i; done [ "$FRESH" = true ] && for i in $RESOURCES/patches-tested/kernel/*.patch; do patch -p1 < $i; done #Apply all of the rockMyy patches that make sense [ "$TEST_PATCHES" = true ] && for i in $RESOURCES/patches-untested/kernel/*.patch; do patch -p1 < $i; done [ "$TEST_PATCHES" = true ] && for i in $RESOURCES/patches-untested/DTS/*.patch; do patch -p1 < $i; done -# reset the minor version number, so out-of-tree drivers continue to work after -# a kernel upgrade **TODO - is this needed? -# sed s/'SUBLEVEL = .*'/'SUBLEVEL = 0'/ -i Makefile + cp $RESOURCES/config .config make -j `grep ^processor /proc/cpuinfo | wc -l` CROSS_COMPILE=arm-none-eabi- ARCH=arm zImage modules dtbs [ ! -h kernel.its ] && ln -s $RESOURCES/kernel.its .