Begin addressing wireless regdb, cleanup scripts. Remove uneeded dwc2 patch

This commit is contained in:
SolidHal 2018-09-20 10:10:47 -05:00
parent 8237de3fdf
commit 7dda32b516
32 changed files with 2793 additions and 167 deletions

View File

@ -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);

View File

@ -1,10 +1,14 @@
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)
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

View File

@ -0,0 +1,2 @@
key.priv.pem
dbparse.pyc

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

View 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())

View 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())

View 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

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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

View 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
)

View File

@ -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/

View File

@ -0,0 +1 @@
.so man5/regulatory.bin.5.gz

View File

@ -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-----

View File

@ -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-----

View File

@ -0,0 +1 @@
027c038d4bb051c1e0b17ec007ab9a283a21a06b db.txt

View File

@ -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)

View File

@ -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

View File

@ -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/

View File

@ -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

View File

@ -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 .