Project import
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..7f622b1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,103 @@
+#
+#    Copyright (c) 2011 Nest Labs, Inc.
+#    All rights reserved.
+#
+#    This document is the property of Nest. It is considered
+#    confidential and proprietary information.
+#
+#    This document may not be reproduced or transmitted in any form,
+#    in whole or in part, without the express written permission of
+#    Nest.
+#
+#    Description:
+#      This file is for the wireless regulatory database, a database
+#      of the supported wireless channel and power settings for a
+#      given region.
+#
+
+BuildConfigSpecialized	:= No
+BuildProductSpecialized	:= No
+
+include pre.mak
+
+PackageName		:= wireless-regdb
+
+PackageExtension	:= tar.bz2
+PackageSeparator	:= -
+
+PackagePatchArgs	:= -p1
+
+PackageArchive		:= $(PackageName).$(PackageExtension)
+PackageSourceDir	:= $(PackageName)$(PackageSeparator)$(PackageVersion)
+
+PackageBuildMakefile	= $(call GenerateBuildPaths,Makefile)
+
+LicenseSourceFile	:= LICENSE
+LicenseSourcePath	:= $(addprefix $(PackageSourceDir)/,$(LicenseSourceFile))
+
+CleanPaths		+= $(PackageLicenseFile)
+
+all: $(PackageDefaultGoal)
+
+# Generate the package license contents.
+
+$(LicenseSourcePath): source
+
+$(PackageLicenseFile): $(LicenseSourcePath)
+	$(copy-result)
+
+# Extract the source from the archive and apply patches, if any.
+
+$(PackageSourceDir): $(PackageArchive) $(PackagePatchPaths)
+	$(expand-and-patch-package)
+
+# Prepare the sources.
+
+.PHONY: source
+source: | $(PackageSourceDir)
+
+# Patch the sources, if necessary.
+
+.PHONY: patch
+patch: source
+
+# Generate the package build makefile.
+
+$(PackageBuildMakefile): | $(PackageSourceDir) $(BuildDirectory)
+	$(call create-links,$(CURDIR)/$(PackageSourceDir),$(BuildDirectory))
+
+# Configure the source for building.
+
+.PHONY: configure
+configure: source $(PackageBuildMakefile)
+
+# Build the source.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: build
+build: configure | $(BuildDirectory)
+	$(Verbose)unset MAKEFLAGS && \
+	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) \
+	CC="$(CC)" CXX="$(CXX)" AR=$(AR) NM=$(NM) RANLIB=$(RANLIB) STRIP=$(STRIP) \
+	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
+	all
+
+# Stage the build to a temporary installation area.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: stage
+stage: build | $(ResultDirectory)
+	$(Verbose)unset MAKEFLAGS && \
+	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) \
+	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
+	DESTDIR=$(ResultDirectory) \
+	install
+
+clean:
+	$(Verbose)$(RM) $(RMFLAGS) -r $(PackageSourceDir)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(BuildDirectory)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(ResultDirectory)
+
+include post.mak
diff --git a/wireless-regdb-2011.04.28/LICENSE b/wireless-regdb-2011.04.28/LICENSE
new file mode 100644
index 0000000..652a6dd
--- /dev/null
+++ b/wireless-regdb-2011.04.28/LICENSE
@@ -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.
+
diff --git a/wireless-regdb-2011.04.28/Makefile b/wireless-regdb-2011.04.28/Makefile
new file mode 100644
index 0000000..3d5040d
--- /dev/null
+++ b/wireless-regdb-2011.04.28/Makefile
@@ -0,0 +1,113 @@
+# 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)/
diff --git a/wireless-regdb-2011.04.28/README b/wireless-regdb-2011.04.28/README
new file mode 100644
index 0000000..065b672
--- /dev/null
+++ b/wireless-regdb-2011.04.28/README
@@ -0,0 +1,29 @@
+This repository contains the plain text version of the regulatory
+database file I maintain for use with Central Regulatory Database
+Agent daemon.  Also included is the compiled binary version of this
+file signed with my RSA key.  This represents a good faith attempt
+to capture regulatory information that is correct at the time of its last
+modification.  This information is provided to you with no warranty
+either expressed or implied.
+
+Also included are the tools used to compile and sign the regulatory.bin
+file as well as a MoinMoin macro used for viewing the database.
+
+ TECHNICAL INFORMATION
+=======================
+
+The regulatory information in `db.txt' is stored in a human-readable
+format which can be read using the `dbparse.py' python module. This
+python module is used by the web viewer (Regulatory.py) which is
+implemented as a MoinMoin macro (and used on http://wireless.kernel.org)
+to allow viewing the database for verification.
+
+The dbparse module is also used by db2bin.py, 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
diff --git a/wireless-regdb-2011.04.28/db.txt b/wireless-regdb-2011.04.28/db.txt
new file mode 100644
index 0000000..f0b46d8
--- /dev/null
+++ b/wireless-regdb-2011.04.28/db.txt
@@ -0,0 +1,697 @@
+# This is the world regulatory domain
+country 00:
+	(2402 - 2472 @ 40), (3, 20)
+        # Channel 12 - 13. No HT40 channel fits here
+        (2457 - 2482 @ 20), (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 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:
+	(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 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:
+	(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 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:
+	(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 BG:
+	(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
+
+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:
+	(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 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)
+
+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:
+	(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
+
+# 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:
+	(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
+
+# 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:
+	# 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
+
+country DK:
+	(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 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:
+	(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 EG:
+	(2402 - 2482 @ 40), (N/A, 20)
+	(5170 - 5250 @ 20), (N/A, 20)
+	(5250 - 5330 @ 20), (N/A, 20), DFS
+
+country ES:
+	(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 FI:
+	(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 FR:
+	(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 GE:
+	(2402 - 2482 @ 40), (N/A, 20)
+	(5170 - 5250 @ 40), (N/A, 18)
+	(5250 - 5330 @ 40), (N/A, 18), DFS
+
+country GB:
+	(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 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:
+	(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 GL:
+	(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:
+	(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 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:
+	(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 ID:
+	(2402 - 2482 @ 40), (N/A, 20)
+
+country IE:
+	(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 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:
+	(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 IR:
+	(2402 - 2482 @ 40), (N/A, 20)
+	(5735 - 5835 @ 40), (N/A, 30)
+
+country IT:
+	(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 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 - 2472 @ 40), (N/A, 20)
+	(2457 - 2482 @ 20), (N/A, 20)
+	(2474 - 2494 @ 20), (N/A, 20), NO-OFDM
+	(4910 - 4930 @ 10), (N/A, 23)
+	(4910 - 4990 @ 40), (N/A, 23)
+	(4930 - 4950 @ 10), (N/A, 23)
+	(5030 - 5045 @ 10), (N/A, 23)
+	(5030 - 5090 @ 40), (N/A, 23)
+	(5050 - 5060 @ 10), (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:
+	(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:
+	(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 LU:
+	(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 LV:
+	(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 MC:
+	(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:
+	(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 MT:
+	(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 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:
+	(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
+
+country NO:
+	(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 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:
+	(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 PT:
+	(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 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:
+	(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 RU:
+	(2402 - 2482 @ 40), (N/A, 20)
+	(5735 - 5835 @ 20), (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:
+	(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 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:
+	(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 SK:
+	(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 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:
+	(2402 - 2482 @ 40), (N/A, 20)
+	(5170 - 5250 @ 20), (N/A, 20)
+	(5250 - 5330 @ 20), (N/A, 20), DFS
+
+country UA:
+	(2402 - 2482 @ 40), (N/A, 20)
+
+country US:
+	(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)
+
+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)
+
diff --git a/wireless-regdb-2011.04.28/db2bin.py b/wireless-regdb-2011.04.28/db2bin.py
new file mode 100755
index 0000000..4df20a8
--- /dev/null
+++ b/wireless-regdb-2011.04.28/db2bin.py
@@ -0,0 +1,145 @@
+#!/usr/bin/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('>ccxxI', str(alpha2[0]), str(alpha2[1]), 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())
diff --git a/wireless-regdb-2011.04.28/dbparse.py b/wireless-regdb-2011.04.28/dbparse.py
new file mode 100755
index 0000000..2c0d738
--- /dev/null
+++ b/wireless-regdb-2011.04.28/dbparse.py
@@ -0,0 +1,370 @@
+#!/usr/bin/env python
+
+import sys, math
+
+# 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,
+    'PASSIVE-SCAN':	1<<7,
+    'NO-IBSS':		1<<8,
+    # hole at bit 9. FIXME: Where is NO-HT40 defined?
+    'NO-HT40':		1<<10,
+}
+
+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 '<FreqBand %.3f - %.3f @ %.3f>' % (
+                  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 '<PowerRestriction ...>'
+
+    def __hash__(self):
+        s = self
+        return hash((s.max_ant_gain, s.max_eirp))
+
+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, permissions=None, comments=None):
+        self._permissions = permissions or []
+        self.comments = comments or []
+
+    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)
+            if end - start < bw:
+                self._syntax_error("Invalid bandwidth: %d width channel "
+			"cannot possibly fit between %d - %d" % (bw, start, end))
+        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, line = line.split(':', 1)
+            if not cname:
+                self._syntax_error("'country' keyword must be followed by name")
+            if line:
+                self._syntax_error("extra data at end of country line")
+        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(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
diff --git a/wireless-regdb-2011.04.28/dbparse.pyc b/wireless-regdb-2011.04.28/dbparse.pyc
new file mode 100644
index 0000000..8520adc
--- /dev/null
+++ b/wireless-regdb-2011.04.28/dbparse.pyc
Binary files differ
diff --git a/wireless-regdb-2011.04.28/debian-example/changelog b/wireless-regdb-2011.04.28/debian-example/changelog
new file mode 100644
index 0000000..7bbce5c
--- /dev/null
+++ b/wireless-regdb-2011.04.28/debian-example/changelog
@@ -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
diff --git a/wireless-regdb-2011.04.28/debian-example/compat b/wireless-regdb-2011.04.28/debian-example/compat
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/wireless-regdb-2011.04.28/debian-example/compat
@@ -0,0 +1 @@
+5
diff --git a/wireless-regdb-2011.04.28/debian-example/control b/wireless-regdb-2011.04.28/debian-example/control
new file mode 100644
index 0000000..a5b518b
--- /dev/null
+++ b/wireless-regdb-2011.04.28/debian-example/control
@@ -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 John Linville, the Linux wireless kernel maintainer.
diff --git a/wireless-regdb-2011.04.28/debian-example/copyright b/wireless-regdb-2011.04.28/debian-example/copyright
new file mode 100644
index 0000000..c01f1a0
--- /dev/null
+++ b/wireless-regdb-2011.04.28/debian-example/copyright
@@ -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.
+
diff --git a/wireless-regdb-2011.04.28/debian-example/docs b/wireless-regdb-2011.04.28/debian-example/docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/wireless-regdb-2011.04.28/debian-example/docs
@@ -0,0 +1 @@
+README
diff --git a/wireless-regdb-2011.04.28/debian-example/rules b/wireless-regdb-2011.04.28/debian-example/rules
new file mode 100755
index 0000000..34a08a5
--- /dev/null
+++ b/wireless-regdb-2011.04.28/debian-example/rules
@@ -0,0 +1,10 @@
+#!/usr/bin/make -f
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+
+PREFIX = /usr
+CRDA_LIB ?= $(PREFIX)/lib/crda
+
+install/wireless-regdb::
+	install -o 0 -g 0 -m 755 -d debian/$(cdbs_curpkg)/$(CRDA_LIB)
+	install -o 0 -g 0 -m 644 regulatory.bin debian/$(cdbs_curpkg)/$(CRDA_LIB)/regulatory.bin
diff --git a/wireless-regdb-2011.04.28/linville.key.pub.pem b/wireless-regdb-2011.04.28/linville.key.pub.pem
new file mode 100644
index 0000000..3a2e8d0
--- /dev/null
+++ b/wireless-regdb-2011.04.28/linville.key.pub.pem
@@ -0,0 +1,9 @@
+-----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-----
diff --git a/wireless-regdb-2011.04.28/regulatory.bin b/wireless-regdb-2011.04.28/regulatory.bin
new file mode 100644
index 0000000..15b9230
--- /dev/null
+++ b/wireless-regdb-2011.04.28/regulatory.bin
Binary files differ
diff --git a/wireless-regdb-2011.04.28/regulatory.bin.5 b/wireless-regdb-2011.04.28/regulatory.bin.5
new file mode 100644
index 0000000..430c65c
--- /dev/null
+++ b/wireless-regdb-2011.04.28/regulatory.bin.5
@@ -0,0 +1,37 @@
+.TH regulatory.bin 5 "23 January 2009" "regulatory.bin" "Linux"
+.SH NAME
+regulatory.bin \- The Linux wireless regulatory database
+
+.ad l
+.in +8
+.ti -8
+
+.SS
+.SH Description
+.B regulatory.bin
+is the file used by the Linux wireless subsystem to keep its regulatory
+database information. It is read by
+.B crda
+upon the Linux kernel's request for regulatory information for a specific
+ISO / IEC 3166 alpha2 country code. 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
+.B regulatory.bin
+file 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 mailing list:
+.B linux-wireless@vger.kernel.org
+
+.SH SEE ALSO
+.BR regdbdump (8)
+.BR crda (8)
+.BR iw (8)
+
+.BR http://wireless.kernel.org/en/developers/Regulatory/
+
diff --git a/wireless-regdb-2011.04.28/sha1sum.txt b/wireless-regdb-2011.04.28/sha1sum.txt
new file mode 100644
index 0000000..01a75ea
--- /dev/null
+++ b/wireless-regdb-2011.04.28/sha1sum.txt
@@ -0,0 +1 @@
+a22131f5718777a60076b83b9dac03c7d2245cec  db.txt
diff --git a/wireless-regdb-2011.04.28/web/Regulatory.py b/wireless-regdb-2011.04.28/web/Regulatory.py
new file mode 100644
index 0000000..f675921
--- /dev/null
+++ b/wireless-regdb-2011.04.28/web/Regulatory.py
@@ -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)
diff --git a/wireless-regdb-2011.04.28/wireless-regdb.spec b/wireless-regdb-2011.04.28/wireless-regdb.spec
new file mode 100644
index 0000000..b76d391
--- /dev/null
+++ b/wireless-regdb-2011.04.28/wireless-regdb.spec
@@ -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 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
+
diff --git a/wireless-regdb.patches/wireless-regdb-50.description b/wireless-regdb.patches/wireless-regdb-50.description
new file mode 100644
index 0000000..d8b7d58
--- /dev/null
+++ b/wireless-regdb.patches/wireless-regdb-50.description
@@ -0,0 +1 @@
+Use /usr/bin/python instead of /usr/bin/env python to prevent build errors with nest-python setup in your environment.
diff --git a/wireless-regdb.patches/wireless-regdb-50.patch b/wireless-regdb.patches/wireless-regdb-50.patch
new file mode 100644
index 0000000..a69dca4
--- /dev/null
+++ b/wireless-regdb.patches/wireless-regdb-50.patch
@@ -0,0 +1,9 @@
+diff -Naur a/db2bin.py b/db2bin.py
+--- a/db2bin.py	2011-04-28 12:17:40.000000000 -0700
++++ b/db2bin.py	2015-07-09 11:40:45.681967994 -0700
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/python
+ 
+ from cStringIO import StringIO
+ import struct
diff --git a/wireless-regdb.tar.bz2 b/wireless-regdb.tar.bz2
new file mode 100644
index 0000000..d808207
--- /dev/null
+++ b/wireless-regdb.tar.bz2
Binary files differ
diff --git a/wireless-regdb.url b/wireless-regdb.url
new file mode 100644
index 0000000..9872796
--- /dev/null
+++ b/wireless-regdb.url
@@ -0,0 +1 @@
+http://linuxwireless.org/download/wireless-regdb/wireless-regdb-2011.04.28.tar.bz2
diff --git a/wireless-regdb.version b/wireless-regdb.version
new file mode 100644
index 0000000..2f21b2d
--- /dev/null
+++ b/wireless-regdb.version
@@ -0,0 +1 @@
+2011.04.28