Begin addressing wireless regdb, cleanup scripts. Remove uneeded dwc2 patch
This commit is contained in:
parent
8237de3fdf
commit
7dda32b516
@ -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);
|
|
@ -1,10 +1,14 @@
|
|||||||
FROM: Solidhal <hal@halemmerich.com>
|
FROM: Solidhal <hal@halemmerich.com>
|
||||||
|
|
||||||
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)
|
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
|
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 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
|
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
|
--- b/drivers/net/wireless/ath/ath9k/hif_usb.c
|
||||||
|
BIN
resources/BuildResources/regdb/wireless-regdb-2018.09.07.tar.gz
Normal file
BIN
resources/BuildResources/regdb/wireless-regdb-2018.09.07.tar.gz
Normal file
Binary file not shown.
2
resources/BuildResources/regdb/wireless-regdb-2018.09.07/.gitignore
vendored
Normal file
2
resources/BuildResources/regdb/wireless-regdb-2018.09.07/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
key.priv.pem
|
||||||
|
dbparse.pyc
|
@ -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.
|
@ -0,0 +1,16 @@
|
|||||||
|
Copyright (c) 2008, Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
Copyright (c) 2008, Johannes Berg <johannes@sipsolutions.net>
|
||||||
|
Copyright (c) 2008, Michael Green <Michael.Green@Atheros.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
@ -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
|
@ -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
|
1380
resources/BuildResources/regdb/wireless-regdb-2018.09.07/db.txt
Normal file
1380
resources/BuildResources/regdb/wireless-regdb-2018.09.07/db.txt
Normal file
File diff suppressed because it is too large
Load Diff
147
resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2bin.py
Executable file
147
resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2bin.py
Executable file
@ -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())
|
158
resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2fw.py
Executable file
158
resources/BuildResources/regdb/wireless-regdb-2018.09.07/db2fw.py
Executable file
@ -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())
|
516
resources/BuildResources/regdb/wireless-regdb-2018.09.07/dbparse.py
Executable file
516
resources/BuildResources/regdb/wireless-regdb-2018.09.07/dbparse.py
Executable file
@ -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 <linux/nl80211.h> 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 '<FreqBand %.3f - %.3f @ %.3f>' % (
|
||||||
|
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 '<PowerRestriction ...>'
|
||||||
|
|
||||||
|
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 '<Country (%s)>' % (', '.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
|
@ -0,0 +1,5 @@
|
|||||||
|
wireless-regdb (2009.01.15-1) unstable; urgency=low
|
||||||
|
|
||||||
|
* Initial release
|
||||||
|
|
||||||
|
-- Luis R. Rodriguez <mcgrof@gmail.com> Thu, 22 Jan 2009 16:00:00 +0100
|
@ -0,0 +1 @@
|
|||||||
|
5
|
@ -0,0 +1,15 @@
|
|||||||
|
Source: wireless-regdb
|
||||||
|
Section: admin
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
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.
|
@ -0,0 +1,21 @@
|
|||||||
|
This package was debianized by Luis Rodriguez <mcgrof@gmail.com> on
|
||||||
|
Thu, 22 Jan 2009 16:00:00 +0100.
|
||||||
|
|
||||||
|
The wireless-regdb packages was downloaded from <http://wireless.kernel.org/download/wireless-regdb/>
|
||||||
|
|
||||||
|
Copyright (c) 2008, Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
Copyright (c) 2008, Johannes Berg <johannes@sipsolutions.net>
|
||||||
|
Copyright (c) 2008, Michael Green <Michael.Green@Atheros.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
README
|
@ -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
|
18
resources/BuildResources/regdb/wireless-regdb-2018.09.07/gen-pubcert.sh
Executable file
18
resources/BuildResources/regdb/wireless-regdb-2018.09.07/gen-pubcert.sh
Executable file
@ -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
|
||||||
|
)
|
Binary file not shown.
@ -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/
|
||||||
|
|
Binary file not shown.
@ -0,0 +1 @@
|
|||||||
|
.so man5/regulatory.bin.5.gz
|
Binary file not shown.
@ -0,0 +1,9 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtUDjnCiEOQPyOddmLEE4
|
||||||
|
Fax+pYNxJX6QfGjdbz/Z11k4n3xqUsIDKi1+ZvQesxJwIFvUlzI9cYs7GwgXFGth
|
||||||
|
xFeLlhYc/STVCwn5aBGE+8pRDNFFGdoQRIrZ/nap/WAtGAsolbIt6oiYuNFWIfBT
|
||||||
|
H/ECb+lGm5NfKJAPrDb6aCNxV1b2zNPffSrZG3NF67onhe96f6XLgMcwNtJT7uys
|
||||||
|
Hucx8TainGPGZVt/JXVooerTfgBcml7YIBgydwcpEmYeNnPnlwRBN7Gxciv0oSkg
|
||||||
|
fJZ5CyvQ2N7IbD+T+8XueFIRFRt69uJomef7RhaE48eh5uDSRtXhxF+gZvTaxP+V
|
||||||
|
HQIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
@ -0,0 +1,17 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICpDCCAYwCCQCyjd9HrvnOpzANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAhz
|
||||||
|
Zm9yc2hlZTAgFw0xNzEwMDYxOTQwMzVaGA8yMTE3MDkxMjE5NDAzNVowEzERMA8G
|
||||||
|
A1UEAwwIc2ZvcnNoZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1
|
||||||
|
QOOcKIQ5A/I512YsQTgVrH6lg3ElfpB8aN1vP9nXWTiffGpSwgMqLX5m9B6zEnAg
|
||||||
|
W9SXMj1xizsbCBcUa2HEV4uWFhz9JNULCfloEYT7ylEM0UUZ2hBEitn+dqn9YC0Y
|
||||||
|
CyiVsi3qiJi40VYh8FMf8QJv6Uabk18okA+sNvpoI3FXVvbM0999Ktkbc0XruieF
|
||||||
|
73p/pcuAxzA20lPu7Kwe5zHxNqKcY8ZlW38ldWih6tN+AFyaXtggGDJ3BykSZh42
|
||||||
|
c+eXBEE3sbFyK/ShKSB8lnkLK9DY3shsP5P7xe54UhEVG3r24miZ5/tGFoTjx6Hm
|
||||||
|
4NJG1eHEX6Bm9NrE/5UdAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIcD2vKCwt2v
|
||||||
|
fEQvhtNfTJNIuf4HF7sh9yUjTqoiDBa5c66dRnx12cNJV0e/M7eX7PVAdcBGIvCg
|
||||||
|
XZx5E6H/uKMve44GP8i25Goo8jRcIz8ywOatD6zPVXRHc9MBhbcLIlYkfZ8JqQ6G
|
||||||
|
njdbnG0C2YzIUGriWfMWBuqyQrVY/rrRgVca77I4iFj2qsQui1on5KXopMpnXKxy
|
||||||
|
Z8NvE8MtNXnXiuf11CEwStX2o9l5VvIPEPd90FGTL0f4fUsKhFUSCn1OOx8rL/wo
|
||||||
|
s2k04YCAu+KvudYw8R1UhyOZn1EDTEV9AmVzq/3PlMwNOmD9PBQvFjOpIR/LULGP
|
||||||
|
A+6gZqkWeRQ=
|
||||||
|
-----END CERTIFICATE-----
|
@ -0,0 +1 @@
|
|||||||
|
027c038d4bb051c1e0b17ec007ab9a283a21a06b db.txt
|
@ -0,0 +1,166 @@
|
|||||||
|
# -*- coding: iso-8859-1 -*-
|
||||||
|
"""
|
||||||
|
Regulatory Database
|
||||||
|
|
||||||
|
@copyright: 2008 Johannes Berg
|
||||||
|
@license: ISC, see LICENSE for details.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import codecs, math
|
||||||
|
from dbparse import DBParser, flag_definitions
|
||||||
|
|
||||||
|
Dependencies = ["time"]
|
||||||
|
|
||||||
|
def _country(macro, countries, code):
|
||||||
|
result = []
|
||||||
|
|
||||||
|
f = macro.formatter
|
||||||
|
|
||||||
|
result.extend([
|
||||||
|
f.heading(1, 1),
|
||||||
|
f.text('Regulatory definition for %s' % _get_iso_code(code)),
|
||||||
|
f.heading(0, 1),
|
||||||
|
])
|
||||||
|
|
||||||
|
try:
|
||||||
|
country = countries[code]
|
||||||
|
except:
|
||||||
|
result.append(f.text('No information available'))
|
||||||
|
return ''.join(result)
|
||||||
|
|
||||||
|
|
||||||
|
if country.comments:
|
||||||
|
result.extend([
|
||||||
|
f.preformatted(1),
|
||||||
|
f.text('\n'.join(country.comments)),
|
||||||
|
f.preformatted(0),
|
||||||
|
])
|
||||||
|
|
||||||
|
result.append(f.table(1))
|
||||||
|
result.extend([
|
||||||
|
f.table_row(1),
|
||||||
|
f.table_cell(1), f.strong(1),
|
||||||
|
f.text('Band [MHz]'),
|
||||||
|
f.strong(0), f.table_cell(0),
|
||||||
|
f.table_cell(1), f.strong(1),
|
||||||
|
f.text('Max BW [MHz]'),
|
||||||
|
f.strong(0), f.table_cell(0),
|
||||||
|
f.table_cell(1), f.strong(1),
|
||||||
|
f.text('Flags'),
|
||||||
|
f.strong(0), f.table_cell(0),
|
||||||
|
f.table_cell(1), f.strong(1),
|
||||||
|
f.text('Max antenna gain [dBi]'),
|
||||||
|
f.strong(0), f.table_cell(0),
|
||||||
|
f.table_cell(1), f.strong(1),
|
||||||
|
f.text('Max EIRP [dBm'),
|
||||||
|
f.hardspace,
|
||||||
|
f.text('(mW)]'),
|
||||||
|
f.strong(0), f.table_cell(0),
|
||||||
|
f.table_row(0),
|
||||||
|
])
|
||||||
|
|
||||||
|
for perm in country.permissions:
|
||||||
|
def str_or_na(val, dBm=False):
|
||||||
|
if val and not dBm:
|
||||||
|
return '%.2f' % val
|
||||||
|
elif val:
|
||||||
|
return '%.2f (%.2f)' % (val, math.pow(10, val/10.0))
|
||||||
|
return 'N/A'
|
||||||
|
result.extend([
|
||||||
|
f.table_row(1),
|
||||||
|
f.table_cell(1),
|
||||||
|
f.text('%.3f - %.3f' % (perm.freqband.start, perm.freqband.end)),
|
||||||
|
f.table_cell(0),
|
||||||
|
f.table_cell(1),
|
||||||
|
f.text('%.3f' % (perm.freqband.maxbw,)),
|
||||||
|
f.table_cell(0),
|
||||||
|
f.table_cell(1),
|
||||||
|
f.text(', '.join(perm.textflags)),
|
||||||
|
f.table_cell(0),
|
||||||
|
f.table_cell(1),
|
||||||
|
f.text(str_or_na(perm.power.max_ant_gain)),
|
||||||
|
f.table_cell(0),
|
||||||
|
f.table_cell(1),
|
||||||
|
f.text(str_or_na(perm.power.max_eirp, dBm=True)),
|
||||||
|
f.table_cell(0),
|
||||||
|
f.table_row(0),
|
||||||
|
])
|
||||||
|
|
||||||
|
result.append(f.table(0))
|
||||||
|
|
||||||
|
result.append(f.linebreak(0))
|
||||||
|
result.append(f.linebreak(0))
|
||||||
|
result.append(macro.request.page.link_to(macro.request, 'return to country list'))
|
||||||
|
return ''.join(result)
|
||||||
|
|
||||||
|
_iso_list = {}
|
||||||
|
|
||||||
|
def _get_iso_code(code):
|
||||||
|
if not _iso_list:
|
||||||
|
for line in codecs.open('/usr/share/iso-codes/iso_3166.tab', encoding='utf-8'):
|
||||||
|
line = line.strip()
|
||||||
|
c, name = line.split('\t')
|
||||||
|
_iso_list[c] = name
|
||||||
|
return _iso_list.get(code, 'Unknown (%s)' % code)
|
||||||
|
|
||||||
|
def macro_Regulatory(macro):
|
||||||
|
_ = macro.request.getText
|
||||||
|
request = macro.request
|
||||||
|
f = macro.formatter
|
||||||
|
|
||||||
|
country = request.form.get('alpha2', [None])[0]
|
||||||
|
|
||||||
|
dbpath = '/tmp/db.txt'
|
||||||
|
if hasattr(request.cfg, 'regdb_path'):
|
||||||
|
dbpath = request.cfg.regdb_path
|
||||||
|
|
||||||
|
result = []
|
||||||
|
|
||||||
|
if request.form.get('raw', [None])[0]:
|
||||||
|
result.append(f.code_area(1, 'db-raw', show=1, start=1, step=1))
|
||||||
|
for line in open(dbpath):
|
||||||
|
result.extend([
|
||||||
|
f.code_line(1),
|
||||||
|
f.text(line.rstrip()),
|
||||||
|
f.code_line(0),
|
||||||
|
])
|
||||||
|
result.append(f.code_area(0, 'db-raw'))
|
||||||
|
result.append(macro.request.page.link_to(macro.request, 'return to country list'))
|
||||||
|
return ''.join(result)
|
||||||
|
|
||||||
|
warnings = []
|
||||||
|
countries = DBParser(warn=lambda x: warnings.append(x)).parse(open(dbpath))
|
||||||
|
|
||||||
|
if country:
|
||||||
|
return _country(macro, countries, country)
|
||||||
|
|
||||||
|
countries = countries.keys()
|
||||||
|
countries = [(_get_iso_code(code), code) for code in countries]
|
||||||
|
countries.sort()
|
||||||
|
|
||||||
|
result.extend([
|
||||||
|
f.heading(1, 1),
|
||||||
|
f.text('Countries'),
|
||||||
|
f.heading(0, 1),
|
||||||
|
])
|
||||||
|
|
||||||
|
result.append(f.bullet_list(1))
|
||||||
|
for name, code in countries:
|
||||||
|
result.extend([
|
||||||
|
f.listitem(1),
|
||||||
|
request.page.link_to(request, name, querystr={'alpha2': code}),
|
||||||
|
f.listitem(0),
|
||||||
|
])
|
||||||
|
result.append(f.bullet_list(0))
|
||||||
|
|
||||||
|
if warnings:
|
||||||
|
result.append(f.heading(1, 2))
|
||||||
|
result.append(f.text("Warnings"))
|
||||||
|
result.append(f.heading(0, 2))
|
||||||
|
result.append(f.preformatted(1))
|
||||||
|
result.extend(warnings)
|
||||||
|
result.append(f.preformatted(0))
|
||||||
|
|
||||||
|
result.append(request.page.link_to(request, 'view raw database', querystr={'raw': 1}))
|
||||||
|
|
||||||
|
return ''.join(result)
|
@ -0,0 +1,35 @@
|
|||||||
|
Summary: Linux wireless regulatory database
|
||||||
|
Name: wireless-regdb
|
||||||
|
Version: 2009.01.15
|
||||||
|
Release: 1
|
||||||
|
License: ISC
|
||||||
|
Group: System Enviroment/Base
|
||||||
|
Source: http://wireless.kernel.org/download/wireless-regdb/wireless-regdb-2009-01-15.tar.bz2
|
||||||
|
URL: http://wireless.kernel.org/en/developers/Regulatory/
|
||||||
|
Packager: Luis R. Rodriguez <mcgrof@gmail.com>
|
||||||
|
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
|
||||||
|
|
@ -13,8 +13,8 @@ done
|
|||||||
|
|
||||||
locale-gen
|
locale-gen
|
||||||
#Install shared packages
|
#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 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 wicd-daemon wicd wicd-curses wicd-gtk
|
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" = "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
|
[ "$DE" = "lxqt" ] && apt install -y lxqt
|
||||||
@ -48,7 +48,7 @@ adduser $username
|
|||||||
usermod -a -G sudo,netdev $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" ] && mkdir -p /home/$username/.config/plank/dock1/launchers/
|
||||||
#[ "$DE" = "xfce" ] && cp $DIR/xfce-config/plank/plank-launchers/* /home/$username/.config/plank/dock1/launchers/
|
#[ "$DE" = "xfce" ] && cp $DIR/xfce-config/plank/plank-launchers/* /home/$username/.config/plank/dock1/launchers/
|
||||||
|
|
||||||
|
@ -63,9 +63,7 @@ create_image() {
|
|||||||
create_image PrawnOS-Alpha-c201-libre-2GB.img $outdev 50M 40 $outmnt
|
create_image PrawnOS-Alpha-c201-libre-2GB.img $outdev 50M 40 $outmnt
|
||||||
|
|
||||||
# install Debian on it
|
# install Debian on it
|
||||||
# export LC_ALL="en_US.UTF-8" #Change this as necessary if not US
|
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 DEBIAN_FRONTEND=noninteractive
|
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
|
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
|
chroot $outmnt passwd -d root
|
||||||
@ -87,14 +85,14 @@ cp /etc/locale.gen $outmnt/etc/
|
|||||||
|
|
||||||
#Install the base packages
|
#Install the base packages
|
||||||
chroot $outmnt apt update
|
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
|
#Cleanup to reduce install size
|
||||||
chroot $outmnt apt-get autoremove --purge
|
chroot $outmnt apt-get autoremove --purge
|
||||||
chroot $outmnt apt-get clean
|
chroot $outmnt apt-get clean
|
||||||
|
|
||||||
#Download the packages to be installed by Install.sh: TODO: potentially dpkg-reconfigure locales?
|
#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 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
|
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
|
#Cleanup hosts
|
||||||
rm -rf $outmnt/etc/hosts #This is what https://wiki.debian.org/EmDebian/CrossDebootstrap suggests
|
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}
|
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 -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
|
umount -l $outmnt > /dev/null 2>&1
|
||||||
rmdir $outmnt > /dev/null 2>&1
|
rmdir $outmnt > /dev/null 2>&1
|
||||||
|
@ -12,22 +12,19 @@ RESOURCES=$ROOT_DIR/resources/BuildResources
|
|||||||
|
|
||||||
[ ! -d build ] && mkdir build
|
[ ! -d build ] && mkdir build
|
||||||
cd 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
|
[ ! -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
|
[ ! -d linux-$KVER ] && tar --lzip -xvf linux-libre-$KVER-gnu.tar.lz && FRESH=true
|
||||||
cd linux-$KVER
|
cd linux-$KVER
|
||||||
make clean
|
make clean
|
||||||
make mrproper
|
make mrproper
|
||||||
#Apply the usb and mmc patches if unapplied
|
#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/DTS/*.patch; do patch -p1 < $i; done
|
||||||
[ "$FRESH" = true ] && for i in $RESOURCES/patches-tested/kernel/*.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
|
#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/kernel/*.patch; do patch -p1 < $i; done
|
||||||
[ "$TEST_PATCHES" = true ] && for i in $RESOURCES/patches-untested/DTS/*.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
|
cp $RESOURCES/config .config
|
||||||
make -j `grep ^processor /proc/cpuinfo | wc -l` CROSS_COMPILE=arm-none-eabi- ARCH=arm zImage modules dtbs
|
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 .
|
[ ! -h kernel.its ] && ln -s $RESOURCES/kernel.its .
|
||||||
|
Loading…
Reference in New Issue
Block a user