pax_global_header00006660000000000000000000000064121067655320014521gustar00rootroot0000000000000052 comment=bb99560ff69c44c30e47416501639e37014689c3 wireless-regdb/000075500000000000000000000000001210676553200140015ustar00rootroot00000000000000wireless-regdb/.gitignore000064400000000000000000000000311210676553200157630ustar00rootroot00000000000000key.priv.pem dbparse.pyc wireless-regdb/LICENSE000064400000000000000000000015601210676553200150100ustar00rootroot00000000000000Copyright (c) 2008, Luis R. Rodriguez Copyright (c) 2008, Johannes Berg Copyright (c) 2008, Michael Green Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. wireless-regdb/Makefile000064400000000000000000000062201210676553200154410ustar00rootroot00000000000000# Install prefix PREFIX ?= /usr CRDA_PATH ?= $(PREFIX)/lib/crda CRDA_KEY_PATH ?= $(CRDA_PATH)/pubkeys 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_UPSTREAM_PUBKEY ?= linville.key.pub.pem REGDB_CHANGED = $(shell $(SHA1SUM) -c --status sha1sum.txt >/dev/null 2>&1; \ if [ $$? -ne 0 ]; then \ echo maintainer-clean $(REGDB_PUBKEY); \ fi) .PHONY: all clean mrproper install maintainer-clean install-distro-key all: $(REGDB_CHANGED) regulatory.bin sha1sum.txt clean: @rm -f *.pyc *.gz maintainer-clean: clean @rm -f regulatory.bin mrproper: clean maintainer-clean @echo Removed public key, regulatory.bin and compresed man pages @rm -f $(REGDB_PUBKEY) .custom regulatory.bin: db.txt $(REGDB_PRIVKEY) $(REGDB_PUBKEY) @echo Generating $@ digitally signed by $(REGDB_AUTHOR)... ./db2bin.py regulatory.bin db.txt $(REGDB_PRIVKEY) 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 @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 install -m 755 -d $(DESTDIR)/$(CRDA_PATH) install -m 755 -d $(DESTDIR)/$(CRDA_KEY_PATH) if [ -f .custom ]; then \ install -m 644 -t $(DESTDIR)/$(CRDA_KEY_PATH)/ $(shell cat .custom); \ fi @# In linville we trust install -m 644 -t $(DESTDIR)/$(CRDA_KEY_PATH)/ $(REGDB_UPSTREAM_PUBKEY) install -m 644 -t $(DESTDIR)/$(CRDA_PATH)/ regulatory.bin install -m 755 -d $(DESTDIR)/$(MANDIR)/man5/ install -m 644 -t $(DESTDIR)/$(MANDIR)/man5/ regulatory.bin.5.gz uninstall: rm -rf $(DESTDIR)/$(CRDA_PATH)/ wireless-regdb/README000064400000000000000000000022761210676553200146700ustar00rootroot00000000000000This 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, the `compiler', which compiles and signs the binary database. 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 wireless-regdb/db.txt000064400000000000000000000531731210676553200151400ustar00rootroot00000000000000# This is the world regulatory domain country 00: (2402 - 2472 @ 40), (3, 20) # Channel 12 - 13. (2457 - 2482 @ 40), (3, 20), PASSIVE-SCAN, NO-IBSS # Channel 14. Only JP enables this and for 802.11b only (2474 - 2494 @ 20), (3, 20), PASSIVE-SCAN, NO-IBSS, NO-OFDM # Channel 36 - 48 (5170 - 5250 @ 40), (3, 20), PASSIVE-SCAN, NO-IBSS # NB: 5260 MHz - 5700 MHz requies DFS # Channel 149 - 165 (5735 - 5835 @ 40), (3, 20), PASSIVE-SCAN, NO-IBSS country AD: # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country AE: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country AL: (2402 - 2482 @ 20), (N/A, 20) country AM: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (N/A, 18) (5250 - 5330 @ 20), (N/A, 18), DFS country AN: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country AR: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country AT: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country AU: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 23) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country AW: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country AZ: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 18) (5250 - 5330 @ 40), (N/A, 18), DFS country BA: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country BB: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 23) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country BD: (2402 - 2482 @ 40), (N/A, 20) country BE: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country BG: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 23) (5250 - 5290 @ 40), (N/A, 23), DFS (5490 - 5710 @ 40), (N/A, 30), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country BH: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (N/A, 20) (5250 - 5330 @ 20), (N/A, 20), DFS (5735 - 5835 @ 20), (N/A, 20) country BL: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 18) (5250 - 5330 @ 40), (N/A, 18), DFS country BN: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5735 - 5835 @ 40), (N/A, 30) country BO: (2402 - 2482 @ 40), (N/A, 30) (5735 - 5835 @ 40), (N/A, 30) country BR: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country BY: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country BZ: (2402 - 2482 @ 40), (N/A, 30) (5735 - 5835 @ 40), (N/A, 30) country CA: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country CH: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country CL: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5735 - 5835 @ 40), (N/A, 20) country CN: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) # 60 gHz band channels 1,4: 28dBm, channels 2,3: 44dBm # ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf (57240 - 59400 @ 2160), (N/A, 28) (59400 - 63720 @ 2160), (N/A, 44) (63720 - 65880 @ 2160), (N/A, 28) country CO: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country CR: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (3, 17) (5250 - 5330 @ 20), (3, 23), DFS (5735 - 5835 @ 20), (3, 30) country CS: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country CY: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR # Data from http://www.ctu.eu/164/download/VOR/VOR-12-08-2005-34.pdf # and http://www.ctu.eu/164/download/VOR/VOR-12-05-2007-6-AN.pdf # Power at 5250 - 5350 MHz and 5470 - 5725 MHz can be doubled if TPC is # implemented. country CZ: DFS-ETSI (2400 - 2483.5 @ 40), (N/A, 100 mW) (5150 - 5250 @ 40), (N/A, 200 mW), NO-OUTDOOR (5250 - 5350 @ 40), (N/A, 100 mW), NO-OUTDOOR, DFS (5470 - 5725 @ 40), (N/A, 500 mW), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR # Data from "Frequenznutzungsplan" (as published in April 2008), downloaded from # http://www.bundesnetzagentur.de/cae/servlet/contentblob/38448/publicationFile/2659/Frequenznutzungsplan2008_Id17448pdf.pdf # For the 5GHz range also see # http://www.bundesnetzagentur.de/cae/servlet/contentblob/38216/publicationFile/6579/WLAN5GHzVfg7_2010_28042010pdf.pdf # The values have been reduced by a factor of 2 (3db) for non TPC devices # (in other words: devices with TPC can use twice the tx power of this table). # Note that the docs do not require TPC for 5150--5250; the reduction to # 100mW thus is not strictly required -- however the conservative 100mW # limit is used here as the non-interference with radar and satellite # apps relies on the attenuation by the building walls only in the # absence of DFS; the neighbour countries have 100mW limit here as well. country DE: DFS-ETSI # entries 279004 and 280006 (2400 - 2483.5 @ 40), (N/A, 100 mW) # entry 303005 (5150 - 5250 @ 40), (N/A, 100 mW), NO-OUTDOOR # entries 304002 and 305002 (5250 - 5350 @ 40), (N/A, 100 mW), NO-OUTDOOR, DFS # entries 308002, 309001 and 310003 (5470 - 5725 @ 40), (N/A, 500 mW), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country DK: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country DO: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country DZ: (2402 - 2482 @ 40), (N/A, 20) country EC: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (3, 17) (5250 - 5330 @ 20), (3, 23), DFS (5735 - 5835 @ 20), (3, 30) country EE: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country EG: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (N/A, 20) (5250 - 5330 @ 20), (N/A, 20), DFS country ES: DFS-ETSI (2400 - 2483.5 @ 40), (N/A, 100 mW) (5150 - 5250 @ 40), (N/A, 100 mW), NO-OUTDOOR (5250 - 5350 @ 40), (N/A, 100 mW), NO-OUTDOOR, DFS (5470 - 5725 @ 40), (N/A, 500 mW), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country FI: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country FR: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country GE: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 18) (5250 - 5330 @ 40), (N/A, 18), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country GB: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country GD: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country GR: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country GL: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (N/A, 20) (5250 - 5330 @ 20), (N/A, 20), DFS (5490 - 5710 @ 20), (N/A, 27), DFS country GT: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country GU: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 20), (3, 17) (5250 - 5330 @ 20), (3, 23), DFS (5735 - 5835 @ 20), (3, 30) country HN: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country HK: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country HR: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country HT: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country HU: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country ID: (2402 - 2482 @ 40), (N/A, 20) country IE: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country IL: (2402 - 2482 @ 40), (N/A, 20) (5150 - 5250 @ 40), (N/A, 200 mW), NO-OUTDOOR (5250 - 5350 @ 40), (N/A, 200 mW), NO-OUTDOOR, DFS country IN: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5735 - 5835 @ 40), (N/A, 20) country IS: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country IR: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country IT: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country JM: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country JP: (2402 - 2482 @ 40), (N/A, 20) (2474 - 2494 @ 20), (N/A, 20), NO-OFDM (4910 - 4990 @ 40), (N/A, 23) (5030 - 5090 @ 40), (N/A, 23) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 23), DFS country JO: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 18) country KE: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country KH: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country KP: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5330 @ 40), (3, 20) (5160 - 5250 @ 40), (3, 20), DFS (5490 - 5630 @ 40), (3, 30), DFS (5735 - 5815 @ 40), (3, 30) country KR: (2402 - 2482 @ 20), (N/A, 20) (5170 - 5250 @ 20), (3, 20) (5250 - 5330 @ 20), (3, 20), DFS (5490 - 5630 @ 20), (3, 30), DFS (5735 - 5815 @ 20), (3, 30) country KW: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS country KZ: (2402 - 2482 @ 40), (N/A, 20) country LB: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country LI: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS country LK: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (3, 17) (5250 - 5330 @ 20), (3, 20), DFS (5490 - 5710 @ 20), (3, 20), DFS (5735 - 5835 @ 20), (3, 30) country LT: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country LU: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country LV: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country MC: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 18) (5250 - 5330 @ 40), (N/A, 18), DFS country MA: (2402 - 2482 @ 40), (N/A, 20) country MO: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 23) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country MK: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country MT: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country MY: (2402 - 2482 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 30), DFS (5735 - 5835 @ 40), (N/A, 30) country MX: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country NL: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20), NO-OUTDOOR (5250 - 5330 @ 40), (N/A, 20), NO-OUTDOOR, DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country NO: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country NP: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country NZ: (2402 - 2482 @ 40), (N/A, 30) (5170 - 5250 @ 20), (3, 23) (5250 - 5330 @ 20), (3, 23), DFS (5735 - 5835 @ 20), (3, 30) country OM: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country PA: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country PE: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country PG: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country PH: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country PK: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country PL: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country PT: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country PR: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 23), DFS (5735 - 5835 @ 40), (3, 30) country QA: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country RO: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR # Source: # http://www.ratel.rs/upload/documents/Plan_namene/Plan_namene-sl_glasnik.pdf country RS: (2400 - 2483.5 @ 40), (N/A, 100 mW) (5150 - 5350 @ 40), (N/A, 200 mW), NO-OUTDOOR (5470 - 5725 @ 20), (3, 1000 mW), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country RU: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 20), (N/A, 30) country RW: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5835 @ 40), (N/A, 30) country SA: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (3, 23) (5250 - 5330 @ 20), (3, 23), DFS (5735 - 5835 @ 20), (3, 30) country SE: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country SG: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5735 - 5835 @ 40), (N/A, 20) country SI: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country SK: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS (5490 - 5710 @ 40), (N/A, 27), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country SV: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (3, 17) (5250 - 5330 @ 20), (3, 23), DFS (5735 - 5835 @ 20), (3, 30) country SY: (2402 - 2482 @ 40), (N/A, 20) country TW: (2402 - 2472 @ 40), (3, 27) (5270 - 5330 @ 40), (3, 17), DFS (5735 - 5815 @ 40), (3, 30) country TH: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country TT: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country TN: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (N/A, 20) (5250 - 5330 @ 20), (N/A, 20), DFS country TR: DFS-ETSI (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 20), (N/A, 20) (5250 - 5330 @ 20), (N/A, 20), DFS # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR # Source: # #914 / 06 Sep 2007: http://www.ucrf.gov.ua/uk/doc/nkrz/1196068874 # #1174 / 23 Oct 2008: http://www.nkrz.gov.ua/uk/activities/ruling/1225269361 # (appendix 8) # Listed 5GHz range is a lowest common denominator for all related # rules in the referenced laws. Such a range is used because of # disputable definitions there. country UA: (2400 - 2483.5 @ 40), (N/A, 20), NO-OUTDOOR (5150 - 5350 @ 40), (N/A, 20), NO-OUTDOOR # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR country US: DFS-FCC (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5600 @ 40), (3, 20), DFS (5650 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) # 60g band # reference: http://cfr.regstoday.com/47cfr15.aspx#47_CFR_15p255 # channels 1,2,3, EIRP=40dBm(43dBm peak) (57240 - 63720 @ 2160), (N/A, 40) country UY: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country UZ: (2402 - 2472 @ 40), (3, 27) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country VE: (2402 - 2482 @ 40), (N/A, 20) (5735 - 5815 @ 40), (N/A, 23) country VN: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (N/A, 20) (5250 - 5330 @ 40), (N/A, 20), DFS country YE: (2402 - 2482 @ 40), (N/A, 20) country ZA: (2402 - 2482 @ 40), (N/A, 20) (5170 - 5250 @ 40), (3, 17) (5250 - 5330 @ 40), (3, 20), DFS (5490 - 5710 @ 40), (3, 20), DFS (5735 - 5835 @ 40), (3, 30) country ZW: (2402 - 2482 @ 40), (N/A, 20) wireless-regdb/db2bin.py000075500000000000000000000073421210676553200155240ustar00rootroot00000000000000#!/usr/bin/env python from cStringIO import StringIO 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.itervalues(): for rule in c.permissions: result[rule] = 1 return result.keys() def create_collections(countries): result = {} for c in countries.itervalues(): result[c.permissions] = 1 return result.keys() 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(file(sys.argv[2])) power = [] bands = [] for c in countries.itervalues(): for perm in c.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(cmp=lambda x, y: cmp(x.freqband, y.freqband)) collections = create_collections(countries) collections.sort(cmp=lambda x, y: cmp(x[0].freqband, y[0].freqband)) output = StringIO() # 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(cmp=lambda x, y: cmp(x.freqband, y.freqband)) for regrule in coll: be32(output, reg_rules[regrule]) # update country pointer now! reg_country_ptr.set() countrynames = countries.keys() countrynames.sort() for alpha2 in countrynames: coll = countries[alpha2] # struct regdb_file_reg_country output.write(struct.pack('>ccxBI', str(alpha2[0]), str(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], 'w') outfile.write(output.getvalue()) wireless-regdb/dbparse.py000075500000000000000000000307411210676553200160030ustar00rootroot00000000000000#!/usr/bin/env python import sys, math # must match enum nl80211_reg_rule_flags flag_definitions = { 'NO-OFDM': 1<<0, 'NO-CCK': 1<<1, 'NO-INDOOR': 1<<2, 'NO-OUTDOOR': 1<<3, 'DFS': 1<<4, 'PTP-ONLY': 1<<5, 'PTMP-ONLY': 1<<6, 'PASSIVE-SCAN': 1<<7, 'NO-IBSS': 1<<8, # hole at bit 9. FIXME: Where is NO-HT40 defined? 'NO-HT40': 1<<10, } dfs_regions = { 'DFS-FCC': 1, 'DFS-ETSI': 2, 'DFS-JP': 3, } 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 __cmp__(self, other): s = self o = other if not isinstance(o, FreqBand): return False return cmp((s.start, s.end, s.maxbw), (o.start, o.end, o.maxbw)) def __hash__(self): s = self return hash((s.start, s.end, s.maxbw)) def __str__(self): return '' % ( self.start, self.end, self.maxbw) 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 __cmp__(self, other): s = self o = other if not isinstance(o, PowerRestriction): return False return cmp((s.max_ant_gain, s.max_eirp), (o.max_ant_gain, o.max_eirp)) def __str__(self): return '' def __hash__(self): s = self return hash((s.max_ant_gain, s.max_eirp)) class DFSRegionError(Exception): def __init__(self, dfs_region): self.dfs_region = dfs_region class FlagError(Exception): def __init__(self, flag): self.flag = flag class Permission(object): def __init__(self, freqband, power, flags): assert isinstance(freqband, FreqBand) assert isinstance(power, PowerRestriction) self.freqband = freqband self.power = power 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) def __cmp__(self, other): if not isinstance(other, Permission): return False return cmp(self._as_tuple(), other._as_tuple()) def __hash__(self): return hash(self._as_tuple()) class Country(object): def __init__(self, dfs_region, permissions=None, comments=None): self._permissions = permissions or [] self.comments = comments or [] self.dfs_region = 0 if dfs_region: if not dfs_region in dfs_regions: raise DFSRegionError(dfs_region) self.dfs_region = dfs_regions[dfs_region] def add(self, perm): assert isinstance(perm, Permission) self._permissions.append(perm) self._permissions.sort() def __contains__(self, perm): assert isinstance(perm, Permission) return perm in self._permissions def __str__(self): r = ['(%s, %s)' % (str(b), str(p)) for b, p in self._permissions] return '' % (', '.join(r)) def _get_permissions_tuple(self): return tuple(self._permissions) permissions = property(_get_permissions_tuple) class SyntaxError(Exception): pass class DBParser(object): def __init__(self, warn=None): self._warn_callout = warn or sys.stderr.write def _syntax_error(self, txt=None): txt = txt and ' (%s)' % txt or '' raise SyntaxError("Syntax error in line %d%s" % (self._lineno, txt)) def _warn(self, txt): self._warn_callout("Warning (line %d): %s\n" % (self._lineno, txt)) def _parse_band_def(self, bname, banddef, dupwarn=True): try: freqs, bw = banddef.split('@') bw = float(bw) except ValueError: bw = 20.0 try: start, end = freqs.split('-') start = float(start) end = float(end) # The kernel will reject these, so might as well reject this # upon building it. if start <= 0: self._syntax_error("Invalid start freq (%d)" % start) if end <= 0: self._syntax_error("Invalid end freq (%d)" % end) if start > end: self._syntax_error("Inverted freq range (%d - %d)" % (start, end)) if start == end: self._syntax_error("Start and end freqs are equal (%d)" % start) except ValueError: self._syntax_error("band must have frequency range") b = FreqBand(start, end, bw, comments=self._comments) self._comments = [] self._banddup[bname] = bname if b in self._bandrev: if dupwarn: self._warn('Duplicate band definition ("%s" and "%s")' % ( bname, self._bandrev[b])) self._banddup[bname] = self._bandrev[b] self._bands[bname] = b self._bandrev[b] = bname self._bandline[bname] = self._lineno def _parse_band(self, line): try: bname, line = line.split(':', 1) if not bname: self._syntax_error("'band' keyword must be followed by name") except ValueError: self._syntax_error("band name must be followed by colon") if bname in flag_definitions: self._syntax_error("Invalid band name") self._parse_band_def(bname, line) def _parse_power(self, line): try: pname, line = line.split(':', 1) if not pname: self._syntax_error("'power' keyword must be followed by name") except ValueError: self._syntax_error("power name must be followed by colon") if pname in flag_definitions: self._syntax_error("Invalid power name") self._parse_power_def(pname, line) def _parse_power_def(self, pname, line, dupwarn=True): try: (max_ant_gain, max_eirp) = line.split(',') if max_ant_gain == 'N/A': max_ant_gain = '0' if max_eirp == 'N/A': max_eirp = '0' max_ant_gain = float(max_ant_gain) 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_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) 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:] 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) except FlagError, e: self._syntax_error("Invalid flag '%s'" % e.flag) for cname, c in self._current_countries.iteritems(): 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._bands = {} self._power = {} self._countries = {} self._bands_used = {} self._power_used = {} self._bandrev = {} self._powerrev = {} self._banddup = {} self._powerdup = {} self._bandline = {} self._powerline = {} 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._comments = [] line = line.split('#')[0] if not line: continue if line[0:4] == 'band': self._parse_band(line[4:]) self._current_countries = None self._comments = [] elif line[0:5] == 'power': self._parse_power(line[5:]) self._current_countries = None self._comments = [] elif line[0:7] == 'country': self._parse_country(line[7:]) self._comments = [] elif self._current_countries is not None: self._parse_country_item(line) self._comments = [] else: self._syntax_error("Expected band, power or country definition") countries = self._countries bands = {} for k, v in self._bands.iteritems(): 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.iteritems(): 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 wireless-regdb/debian-example/000075500000000000000000000000001210676553200166545ustar00rootroot00000000000000wireless-regdb/debian-example/changelog000064400000000000000000000002241210676553200205240ustar00rootroot00000000000000wireless-regdb (2009.01.15-1) unstable; urgency=low * Initial release -- Luis R. Rodriguez Thu, 22 Jan 2009 16:00:00 +0100 wireless-regdb/debian-example/compat000064400000000000000000000000021210676553200200520ustar00rootroot000000000000005 wireless-regdb/debian-example/control000064400000000000000000000007741210676553200202670ustar00rootroot00000000000000Source: wireless-regdb Section: admin Priority: optional Maintainer: Luis R. Rodriguez Build-Depends: cdbs, debhelper (>= 5), python Standards-Version: 3.7.3 Package: wireless-regdb Architecture: all Depends: Suggests: crda Description: The Linux wireless regulatory database This package contains the wireless regulatory database used by all cfg80211 based Linux wireless drivers. The wireless database being used is maintained by John Linville, the Linux wireless kernel maintainer. wireless-regdb/debian-example/copyright000064400000000000000000000020751210676553200206130ustar00rootroot00000000000000This package was debianized by Luis Rodriguez on Thu, 22 Jan 2009 16:00:00 +0100. The wireless-regdb packages was downloaded from Copyright (c) 2008, Luis R. Rodriguez Copyright (c) 2008, Johannes Berg Copyright (c) 2008, Michael Green Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. wireless-regdb/debian-example/docs000064400000000000000000000000071210676553200175240ustar00rootroot00000000000000README wireless-regdb/debian-example/rules000075500000000000000000000004421210676553200177340ustar00rootroot00000000000000#!/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 wireless-regdb/linville.key.pub.pem000064400000000000000000000007031210676553200176760ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1leZcYjTXc4qLq1oN2Ak 8vLP85P5cFTrCpqdSI5W4VOwdaJB4TtaxU2fATcH/A2EsE3h1rOfzI0+fBV9DcOO qyID+zdILBMb8xK5Zv+78OkBGls/WzvDDVhdmn1TRHvRvmJy7cX1mCT56cnHrZM/ ZBaFwVfiD9TcqqisyF1sqE5+cMHTWRbxc1+rtojr0eGYrNfK20awlD5KVj6Ejzot r9EDWAsL1bH/kGfMdnputcyMapLQpRVruO/jEdjSmhAE/sj1tmHcAXBT6j5al4Oa LiBaWnP++rune7rjimwfzp0549/rupQUM7nAZRDLyzXj3J/KEci6dXtjonBUFqDY 4QIDAQAB -----END PUBLIC KEY----- wireless-regdb/regulatory.bin000064400000000000000000000067001210676553200166730ustar00rootroot00000000000000RGDBz  ,, ,,, 0$%P@NPP@PQTP@SPW @ii? PP@WXY@NPPN PQTPN WXYN $%,@N0Qp@Sw0W[HN $%@@%&0N JL$0@LpM@SPW N WXX@%}%P@N0P@PQp@Sw0W[H@ii_@ _@J@ J@? $%PN SPU0N WXXN N@P@NPQTP@SPU0@SPUs@V6PW @iiJ@ PiQTP@(\(l4p\44\@,L,|d|d\<T\L<T\L,\,L<\4\<Ld0TDt \DDXX\\4,\DdDd,D44D\|$$$|<4XlHl<Ll<4Xl`@T\H`Pd<``P<`P<`l plxxhxtlxhxx0x,x(xlx|x8lxP<xtxh0x0Txx8xh$x00xD<xtxlxhxx8 xP<xx8xhlxxl00ADAEALAMANARxATAUAWAZ|BABBBDBEBG(BHdBL|BNBOBRxBYBZCA,CHCLCNCODCRCSCYCZDEDKDODDZECEEEGESFIFRGBGD,GEGLGRGTDGUXHKxHNxHRHTHUIDIEILINIRISITJMxJOJPKEKHKPv֫3LQ=U 9ZdqX>\*H(0,\@g ,~,Rwm ]o0'A@'VsAYH~XD>g]Ot:(A uXJϖ 4ZAM';(BlP% 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 John Linville, the Linux wireless kernel maintainer 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