Hello community,

here is the log from the commit of package wireless-regdb for openSUSE:Factory 
checked in at 2018-06-05 12:49:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/wireless-regdb (Old)
 and      /work/SRC/openSUSE:Factory/.wireless-regdb.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "wireless-regdb"

Tue Jun  5 12:49:14 2018 rev:35 rq:613331 version:2018.05.09

Changes:
--------
--- /work/SRC/openSUSE:Factory/wireless-regdb/wireless-regdb.changes    
2018-01-16 09:24:45.599133241 +0100
+++ /work/SRC/openSUSE:Factory/.wireless-regdb.new/wireless-regdb.changes       
2018-06-05 12:49:15.193678811 +0200
@@ -1,0 +2,7 @@
+Thu May 31 14:02:29 UTC 2018 - mplus...@suse.com
+
+- Update to version 2018.05.09 (boo#1095397):
+  * Updated regulatory database for France and Panama
+  * Fixes in python3 scripts
+
+-------------------------------------------------------------------

Old:
----
  wireless-regdb-2017.12.23.tar.xz

New:
----
  wireless-regdb-2018.05.09.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ wireless-regdb.spec ++++++
--- /var/tmp/diff_new_pack.1xodMB/_old  2018-06-05 12:49:15.645662250 +0200
+++ /var/tmp/diff_new_pack.1xodMB/_new  2018-06-05 12:49:15.649662103 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           wireless-regdb
-Version:        2017.12.23
+Version:        2018.05.09
 Release:        0
 Summary:        802.11 regulatory domain database
 License:        ISC
@@ -39,14 +39,15 @@
 %make_install
 
 %files
-%doc LICENSE README
+%license LICENSE
+%doc README
 /lib/firmware/regulatory.db
 /lib/firmware/regulatory.db.p7s
 %dir %{_libexecdir}/crda
 %{_libexecdir}/crda/regulatory.bin
 %dir %{_libexecdir}/crda/pubkeys
 %{_libexecdir}/crda/pubkeys/*pem
-%{_mandir}/man5/regulatory.db.5%{ext_man}
-%{_mandir}/man5/regulatory.bin.5%{ext_man}
+%{_mandir}/man5/regulatory.db.5%{?ext_man}
+%{_mandir}/man5/regulatory.bin.5%{?ext_man}
 
 %changelog

++++++ wireless-regdb-2017.12.23.tar.xz -> wireless-regdb-2018.05.09.tar.xz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wireless-regdb-2017.12.23/db.txt 
new/wireless-regdb-2018.05.09/db.txt
--- old/wireless-regdb-2017.12.23/db.txt        2017-12-24 04:39:42.000000000 
+0100
+++ new/wireless-regdb-2018.05.09/db.txt        2018-05-09 15:12:21.000000000 
+0200
@@ -1,3 +1,13 @@
+wmmrule ETSI:
+       vo_c: cw_min=3, cw_max=7, aifsn=2, cot=2
+       vi_c: cw_min=7, cw_max=15, aifsn=2, cot=4
+       be_c: cw_min=15, cw_max=1023, aifsn=3, cot=6
+       bk_c: cw_min=15, cw_max=1023, aifsn=7, cot=6
+       vo_ap: cw_min=3, cw_max=7, aifsn=1, cot=2
+       vi_ap: cw_min=7, cw_max=15, aifsn=1, cot=4
+       be_ap: cw_min=15, cw_max=63, aifsn=3, cot=6
+       bk_ap: cw_min=15, cw_max=1023, aifsn=7, cot=6
+
 # This is the world regulatory domain
 country 00:
        (2402 - 2472 @ 40), (20)
@@ -19,9 +29,9 @@
 
 country AD:
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20)
-       (5250 - 5330 @ 80), (20), DFS
-       (5490 - 5710 @ 80), (27), DFS
+       (5170 - 5250 @ 80), (20), wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, wmmrule=ETSI
+       (5490 - 5710 @ 80), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -42,9 +52,9 @@
 # 
http://pucanguilla.org/Downloads/January2005-Anguilla%20Table%20of%20Allocations.pdf
 country AI: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country AL: DFS-ETSI
        (2402 - 2482 @ 40), (20)
@@ -79,9 +89,9 @@
 
 country AT: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -113,9 +123,9 @@
 
 country BA: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -131,9 +141,9 @@
 
 country BE: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -163,10 +173,10 @@
        (2402 - 2482 @ 40), (20)
        # 5 GHz Radio Local Area Networks (RLANs), ref:
        # II.H01 of the List, BDS EN 301 893
-       (5170 - 5250 @ 80), (23), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
+       (5170 - 5250 @ 80), (23), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
        # II.H01 of the List, I.54 from the List, BDS EN 301 893
-       (5490 - 5710 @ 160), (27), DFS
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # Short range devices (SRDs) in the 5725-5875 MHz frequency range, ref:
        # I.43 of the List, BDS EN 300 440-2, BDS EN 300 440-1
        (5725 - 5875 @ 80), (14)
@@ -257,9 +267,9 @@
 
 country CH: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -316,9 +326,9 @@
 
 country CY: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -328,9 +338,9 @@
 # implemented.
 country CZ: DFS-ETSI
        (2400 - 2483.5 @ 40), (100 mW)
-       (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW
-       (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW
-       (5470 - 5725 @ 160), (500 mW), DFS
+       (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI
+       (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI
+       (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -363,9 +373,9 @@
 
 country DE: DFS-ETSI
        (2400 - 2483.5 @ 40), (100 mW)
-       (5150 - 5250 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW
-       (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW
-       (5470 - 5725 @ 160), (500 mW), DFS
+       (5150 - 5250 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI
+       (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI
+       (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI
        # short range devices (ETSI EN 300 440-1)
        (5725 - 5875 @ 80), (25 mW)
        # 60 GHz band channels 1-4 (ETSI EN 302 567)
@@ -376,9 +386,9 @@
 # 60GHz: 
https://erhvervsstyrelsen.dk/sites/default/files/radiograenseflader-63.pdf
 country DK: DFS-ETSI
        (2400 - 2483.5 @ 40), (20)
-       (5150 - 5250 @ 80), (23), AUTO-BW
-       (5250 - 5350 @ 80), (20), DFS, AUTO-BW
-       (5470 - 5725 @ 160), (27), DFS
+       (5150 - 5250 @ 80), (23), AUTO-BW, wmmrule=ETSI
+       (5250 - 5350 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5470 - 5725 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4 (ETSI EN 302 567)
        (57000 - 66000 @ 2160), (40), NO-OUTDOOR
 
@@ -411,9 +421,9 @@
 
 country EE: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -431,9 +441,9 @@
 
 country ES: DFS-ETSI
        (2400 - 2483.5 @ 40), (100 mW)
-       (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW
-       (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW
-       (5470 - 5725 @ 160), (500 mW), DFS
+       (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI
+       (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI
+       (5470 - 5725 @ 160), (500 mW), DFS, wmmrule=ETSI
        # Short Range Devices (SRD) (ETSI EN 300 440)
        (5725 - 5875 @ 80), (25 mW)
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
@@ -447,9 +457,9 @@
 
 country FI: DFS-ETSI
        (2400 - 2483.5 @ 40), (20)
-       (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW
-       (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW
-       (5470 - 5725 @ 160), (27), DFS
+       (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI
+       (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI
+       (5470 - 5725 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -462,17 +472,17 @@
 
 country FR: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
 country GB: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -492,9 +502,9 @@
 
 country GF: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country GH: DFS-FCC
        (2402 - 2482 @ 40), (20)
@@ -505,21 +515,21 @@
 
 country GL: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country GP: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country GR: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -556,9 +566,9 @@
 
 country HR: DFS-ETSI
        (2400 - 2483.5 @ 40), (20)
-       (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW
-       (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW
-       (5470 - 5725 @ 160), (27), DFS
+       (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI
+       (5250 - 5350 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI
+       (5470 - 5725 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -571,9 +581,9 @@
 
 country HU: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -584,9 +594,9 @@
 
 country IE: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -606,17 +616,17 @@
 
 country IS: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
 country IT: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -721,9 +731,9 @@
 
 country LI: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country LK: DFS-FCC
        (2402 - 2482 @ 40), (20)
@@ -742,25 +752,25 @@
 
 country LT: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
 country LU: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
 country LV: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -771,9 +781,9 @@
 
 country MC: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 # Source:
 # http://www.cnfr.md/index.php?pag=sec&id=117&l=en
@@ -787,15 +797,15 @@
 # 
http://www.cept.org/files/1050/Tools%20and%20Services/EFIS%20-%20ECO%20Frequency%20Information%20System/National%20frequency%20tables/Montenegro%20NAFT%20-%202010.pdf
 country ME: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country MF: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country MH: DFS-FCC
        (2402 - 2472 @ 40), (30)
@@ -806,9 +816,9 @@
 
 country MK: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -835,9 +845,9 @@
 
 country MQ: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 # Source:
 # http://www.are.mr/pdfs/telec_freq_TNAbf_2010.pdf
@@ -849,9 +859,9 @@
 
 country MT: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -909,9 +919,9 @@
 
 country NL: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), NO-OUTDOOR, AUTO-BW
-       (5250 - 5330 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), NO-OUTDOOR, AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # short range devices (ETSI EN 300 440-1)
        (5725 - 5875 @ 80), (25 mW)
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
@@ -924,9 +934,9 @@
 # which has been merged with 5470 - 5725 MHz to allow wide channels
 country NO: DFS-ETSI
        (2400 - 2483.5 @ 40), (100 mW)
-       (5150 - 5250 @ 80), (200 mW), AUTO-BW
-       (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW
-       (5470 - 5795 @ 160), (500 mW), DFS
+       (5150 - 5250 @ 80), (200 mW), AUTO-BW, wmmrule=ETSI
+       (5250 - 5350 @ 80), (100 mW), DFS, AUTO-BW, wmmrule=ETSI
+       (5470 - 5795 @ 160), (500 mW), DFS, wmmrule=ETSI
        (5815 - 5850 @ 35), (2000 mW), DFS
        (17100 - 17300 @ 200), (100 mW)
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
@@ -966,9 +976,9 @@
 
 country PF: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country PG: DFS-FCC
        (2402 - 2482 @ 40), (20)
@@ -990,17 +1000,17 @@
 
 country PL: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
 country PM: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country PR: DFS-FCC
        (2402 - 2472 @ 40), (30)
@@ -1011,9 +1021,9 @@
 
 country PT: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -1031,21 +1041,25 @@
        (5490 - 5730 @ 160), (24), DFS
        (5735 - 5835 @ 80), (30)
 
-country QA: DFS-JP
-       (2402 - 2482 @ 40), (20)
-       (5735 - 5835 @ 80), (30)
+country QA: DFS-ETSI
+       (2400 - 2483.5 @ 40), (100 mW), NO-OUTDOOR
+       (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR, AUTO-BW
+       (5250 - 5350 @ 80), (200 mW), NO-OUTDOOR, DFS, AUTO-BW
+       (5470 - 5725 @ 160), (100 mW), NO-OUTDOOR, DFS
+       (5725 - 5875 @ 80), (100 mW), NO-OUTDOOR, DFS
+       (57000 - 66000 @ 2160), (40), NO-OUTDOOR
 
 country RE: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country RO: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -1083,9 +1097,9 @@
 
 country SE: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -1103,17 +1117,17 @@
 
 country SI: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
 country SK: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
        # 60 GHz band channels 1-4, ref: Etsi En 302 567
        (57000 - 66000 @ 2160), (40)
 
@@ -1145,9 +1159,9 @@
 # http://www.telecommission.tc/Spectrum-plan20110324-101210.html
 country TC: DFS-FCC
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (24), AUTO-BW
-       (5250 - 5330 @ 80), (24), DFS, AUTO-BW
-       (5490 - 5730 @ 160), (24), DFS
+       (5170 - 5250 @ 80), (24), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (24), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5730 @ 160), (24), DFS, wmmrule=ETSI
        (5735 - 5835 @ 80), (30)
 
 country TD: DFS-ETSI
@@ -1306,9 +1320,9 @@
 
 country WF: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country WS: DFS-ETSI
        (2402 - 2482 @ 40), (20)
@@ -1321,9 +1335,9 @@
 
 country YT: DFS-ETSI
        (2402 - 2482 @ 40), (20)
-       (5170 - 5250 @ 80), (20), AUTO-BW
-       (5250 - 5330 @ 80), (20), DFS, AUTO-BW
-       (5490 - 5710 @ 160), (27), DFS
+       (5170 - 5250 @ 80), (20), AUTO-BW, wmmrule=ETSI
+       (5250 - 5330 @ 80), (20), DFS, AUTO-BW, wmmrule=ETSI
+       (5490 - 5710 @ 160), (27), DFS, wmmrule=ETSI
 
 country ZA: DFS-ETSI
        (2402 - 2482 @ 40), (20)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wireless-regdb-2017.12.23/db2bin.py 
new/wireless-regdb-2018.05.09/db2bin.py
--- old/wireless-regdb-2017.12.23/db2bin.py     2017-12-24 04:39:42.000000000 
+0100
+++ new/wireless-regdb-2018.05.09/db2bin.py     2018-05-09 15:12:21.000000000 
+0200
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
-from cStringIO import StringIO
+from io import BytesIO, open
 import struct
 import hashlib
 from dbparse import DBParser
@@ -10,21 +10,21 @@
 VERSION = 19
 
 if len(sys.argv) < 3:
-    print 'Usage: %s output-file input-file [key-file]' % sys.argv[0]
+    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 c in countries.values():
         for rule in c.permissions:
             result[rule] = 1
-    return result.keys()
+    return list(result)
 
 def create_collections(countries):
     result = {}
-    for c in countries.itervalues():
+    for c in countries.values():
         result[c.permissions] = 1
-    return result.keys()
+    return list(result)
 
 
 def be32(output, val):
@@ -49,21 +49,25 @@
         return self._offset
 
 p = DBParser()
-countries = p.parse(file(sys.argv[2]))
+countries = p.parse(open(sys.argv[2], 'r', encoding='utf-8'))
+
+countrynames = list(countries)
+countrynames.sort()
+
 power = []
 bands = []
-for c in countries.itervalues():
-    for perm in c.permissions:
+for alpha2 in countrynames:
+    for perm in countries[alpha2].permissions:
         if not perm.freqband in bands:
             bands.append(perm.freqband)
         if not perm.power in power:
             power.append(perm.power)
 rules = create_rules(countries)
-rules.sort(cmp=lambda x, y: cmp(x.freqband, y.freqband))
+rules.sort()
 collections = create_collections(countries)
-collections.sort(cmp=lambda x, y: cmp(x[0].freqband, y[0].freqband))
+collections.sort()
 
-output = StringIO()
+output = BytesIO()
 
 # struct regdb_file_header
 be32(output, MAGIC)
@@ -104,19 +108,17 @@
     # struct regdb_file_reg_rules_collection
     coll = list(coll)
     be32(output, len(coll))
-    coll.sort(cmp=lambda x, y: cmp(x.freqband, y.freqband))
+    coll.sort()
     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]))
+    output.write(struct.pack('>BBxBI', alpha2[0], alpha2[1], coll.dfs_region, 
reg_rules_collections[coll.permissions]))
 
 
 if len(sys.argv) > 3:
@@ -141,5 +143,5 @@
 else:
     siglen.set(0)
 
-outfile = open(sys.argv[1], 'w')
+outfile = open(sys.argv[1], 'wb')
 outfile.write(output.getvalue())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wireless-regdb-2017.12.23/db2fw.py 
new/wireless-regdb-2018.05.09/db2fw.py
--- old/wireless-regdb-2017.12.23/db2fw.py      2017-12-24 04:39:42.000000000 
+0100
+++ new/wireless-regdb-2018.05.09/db2fw.py      2018-05-09 15:12:21.000000000 
+0200
@@ -1,31 +1,39 @@
 #!/usr/bin/env python
 
-from cStringIO import StringIO
+from io import BytesIO, open
 import struct
 import hashlib
 from dbparse import DBParser
 import sys
+from math import log
 
 MAGIC = 0x52474442
 VERSION = 20
 
 if len(sys.argv) < 3:
-    print 'Usage: %s output-file input-file' % sys.argv[0]
+    print('Usage: %s output-file input-file' % sys.argv[0])
     sys.exit(2)
 
 def create_rules(countries):
     result = {}
-    for c in countries.itervalues():
+    for c in countries.values():
         for rule in c.permissions:
             result[rule] = 1
-    return result.keys()
+    return list(result)
 
 def create_collections(countries):
     result = {}
-    for c in countries.itervalues():
+    for c in countries.values():
         result[(c.permissions, c.dfs_region)] = 1
-    return result.keys()
+    return list(result)
 
+def create_wmms(countries):
+    result = {}
+    for c in countries.itervalues():
+        for rule in c.permissions:
+            if rule.wmmrule is not None:
+                result[rule.wmmrule] = 1
+    return list(result)
 
 def be32(output, val):
     output.write(struct.pack('>I', val))
@@ -58,31 +66,42 @@
         return self._written
 
 p = DBParser()
-countries = p.parse(file(sys.argv[2]))
+countries = p.parse(open(sys.argv[2], 'r', encoding='utf-8'))
 rules = create_rules(countries)
-rules.sort(cmp=lambda x, y: cmp(x.freqband, y.freqband))
+rules.sort()
 collections = create_collections(countries)
-collections.sort(cmp=lambda x, y: cmp(x[0][0].freqband, y[0][0].freqband))
+collections.sort()
+wmms = create_wmms(countries)
+wmms.sort()
 
-output = StringIO()
+output = BytesIO()
 
 # struct regdb_file_header
 be32(output, MAGIC)
 be32(output, VERSION)
 
 country_ptrs = {}
-countrynames = countries.keys()
+countrynames = list(countries)
 countrynames.sort()
 for alpha2 in countrynames:
     coll = countries[alpha2]
-    output.write(struct.pack('>cc', str(alpha2[0]), str(alpha2[1])))
+    output.write(struct.pack('>BB', alpha2[0], alpha2[1]))
     country_ptrs[alpha2] = PTR(output)
-output.write('\x00' * 4)
+output.write(b'\x00' * 4)
+
+wmmdb = {}
+for w in wmms:
+    assert output.tell() & 3 == 0
+    wmmdb[w] = output.tell() >> 2
+    for r in w._as_tuple():
+        ecw = int(log(r[0] + 1, 2)) << 4 | int(log(r[1] + 1, 2))
+        ac = (ecw, r[2],r[3])
+        output.write(struct.pack('>BBH', *ac))
 
 reg_rules = {}
 flags = 0
 for reg_rule in rules:
-    freq_range, power_rule = reg_rule.freqband, reg_rule.power
+    freq_range, power_rule, wmm_rule = reg_rule.freqband, reg_rule.power, 
reg_rule.wmmrule
     reg_rules[reg_rule] = output.tell()
     assert power_rule.max_ant_gain == 0
     flags = 0
@@ -102,13 +121,19 @@
     cac_timeout = 0 # TODO
     if not (flags & 1<<2):
         cac_timeout = 0
-    if cac_timeout:
+    if cac_timeout or wmm_rule:
+        rule_len += 2
+    if wmm_rule is not None:
         rule_len += 2
-    output.write(struct.pack('>BBHIII', rule_len, flags, power_rule.max_eirp * 
100,
-                             freq_range.start * 1000, freq_range.end * 1000, 
freq_range.maxbw * 1000,
+    output.write(struct.pack('>BBHIII', rule_len, flags, 
int(power_rule.max_eirp * 100),
+                             int(freq_range.start * 1000), int(freq_range.end 
* 1000), int(freq_range.maxbw * 1000),
                              ))
-    if cac_timeout:
+    if rule_len > 16:
         output.write(struct.pack('>H', cac_timeout))
+
+    if rule_len > 18:
+        be16(output, wmmdb[wmm_rule])
+
     while rule_len % 4:
         output.write('\0')
         rule_len += 1
@@ -129,5 +154,5 @@
 for alpha2 in countrynames:
     assert country_ptrs[alpha2].written
 
-outfile = open(sys.argv[1], 'w')
+outfile = open(sys.argv[1], 'wb')
 outfile.write(output.getvalue())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wireless-regdb-2017.12.23/dbparse.py 
new/wireless-regdb-2018.05.09/dbparse.py
--- old/wireless-regdb-2017.12.23/dbparse.py    2017-12-24 04:39:42.000000000 
+0100
+++ new/wireless-regdb-2018.05.09/dbparse.py    2018-05-09 15:12:21.000000000 
+0200
@@ -1,6 +1,11 @@
 #!/usr/bin/env python
 
+from builtins import bytes
+from functools import total_ordering
 import sys, math
+from math import ceil, log
+from collections import defaultdict, OrderedDict
+import attr
 
 # must match <linux/nl80211.h> enum nl80211_reg_rule_flags
 
@@ -25,6 +30,23 @@
     'DFS-JP':          3,
 }
 
+@total_ordering
+
+@attr.s(frozen=True)
+class WmmRule(object):
+    vo_c = attr.ib()
+    vi_c = attr.ib()
+    be_c = attr.ib()
+    bk_c = attr.ib()
+    vo_ap = attr.ib()
+    vi_ap = attr.ib()
+    be_ap = attr.ib()
+    bk_ap = attr.ib()
+
+    def _as_tuple(self):
+        return (self.vo_c, self.vi_c, self.be_c, self.bk_c,
+                self.vo_ap, self.vi_ap, self.be_ap, self.bk_ap)
+
 class FreqBand(object):
     def __init__(self, start, end, bw, comments=None):
         self.start = start
@@ -32,41 +54,49 @@
         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 _as_tuple(self):
+        return (self.start, self.end, self.maxbw)
+
+    def __eq__(self, other):
+        return (self._as_tuple() == other._as_tuple())
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    def __lt__(self, other):
+        return (self._as_tuple() < other._as_tuple())
 
     def __hash__(self):
-        s = self
-        return hash((s.start, s.end, s.maxbw))
+        return hash(self._as_tuple())
 
     def __str__(self):
         return '<FreqBand %.3f - %.3f @ %.3f>' % (
                   self.start, self.end, self.maxbw)
 
+@total_ordering
 class PowerRestriction(object):
     def __init__(self, max_ant_gain, max_eirp, comments = None):
         self.max_ant_gain = max_ant_gain
         self.max_eirp = max_eirp
         self.comments = comments or []
 
-    def __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 _as_tuple(self):
+        return (self.max_ant_gain, self.max_eirp)
 
-    def __str__(self):
-        return '<PowerRestriction ...>'
+    def __eq__(self, other):
+        return (self._as_tuple() == other._as_tuple())
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    def __lt__(self, other):
+        return (self._as_tuple() < other._as_tuple())
 
     def __hash__(self):
-        s = self
-        return hash((s.max_ant_gain, s.max_eirp))
+        return hash(self._as_tuple())
+
+    def __str__(self):
+        return '<PowerRestriction ...>'
 
 class DFSRegionError(Exception):
     def __init__(self, dfs_region):
@@ -76,12 +106,15 @@
     def __init__(self, flag):
         self.flag = flag
 
+@total_ordering
 class Permission(object):
-    def __init__(self, freqband, power, flags):
+    def __init__(self, freqband, power, flags, wmmrule):
         assert isinstance(freqband, FreqBand)
         assert isinstance(power, PowerRestriction)
+        assert isinstance(wmmrule, WmmRule) or wmmrule is None
         self.freqband = freqband
         self.power = power
+        self.wmmrule = wmmrule
         self.flags = 0
         for flag in flags:
             if not flag in flag_definitions:
@@ -90,26 +123,33 @@
         self.textflags = flags
 
     def _as_tuple(self):
-        return (self.freqband, self.power, self.flags)
+        return (self.freqband, self.power, self.flags, self.wmmrule)
 
-    def __cmp__(self, other):
-        if not isinstance(other, Permission):
-            return False
-        return cmp(self._as_tuple(), other._as_tuple())
+    def __eq__(self, other):
+        return (self._as_tuple() == other._as_tuple())
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    def __lt__(self, other):
+        return (self._as_tuple() < other._as_tuple())
 
     def __hash__(self):
         return hash(self._as_tuple())
 
+    def __str__(self):
+        return str(self.freqband) + str(self.power) + str(self.wmmrule)
+
 class Country(object):
     def __init__(self, dfs_region, permissions=None, comments=None):
         self._permissions = permissions or []
         self.comments = comments or []
-       self.dfs_region = 0
+        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]
+        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)
@@ -233,6 +273,61 @@
         self._powerrev[p] = pname
         self._powerline[pname] = self._lineno
 
+    def _parse_wmmrule(self, line):
+        regions = line[:-1].strip()
+        if not regions:
+            self._syntax_error("'wmmrule' keyword must be followed by region")
+
+        regions = regions.split(',')
+
+        self._current_regions = {}
+        for region in regions:
+            if region in self._wmm_rules:
+                self._warn("region %s was added already to wmm rules" % region)
+            self._current_regions[region] = 1
+        self._comments = []
+
+    def _validate_input(self, cw_min, cw_max, aifsn, cot):
+        if  cw_min < 1:
+            self._syntax_error("Invalid cw_min value (%d)" % cw_min)
+        if cw_max < 1:
+            self._syntax_error("Invalid cw_max value (%d)" % cw_max)
+        if cw_min > cw_max:
+            self._syntax_error("Inverted contention window (%d - %d)" %
+                    (cw_min, cw_max))
+        if not (bin(cw_min + 1).count('1') == 1 and cw_min < 2**15):
+            self._syntax_error("Invalid cw_min value should be power of 2 - 1 
(%d)"
+                    % cw_min)
+        if not (bin(cw_max + 1).count('1') == 1 and cw_max < 2**15):
+            self._syntax_error("Invalid cw_max value should be power of 2 - 1 
(%d)"
+                    % cw_max)
+        if aifsn < 1:
+            self._syntax_error("Invalid aifsn value (%d)" % aifsn)
+        if cot < 0:
+            self._syntax_error("Invalid cot value (%d)" % cot)
+
+
+    def _validate_size(self, var, bytcnt):
+        return bytcnt < ceil(len(bin(var)[2:]) / 8.0)
+
+    def _parse_wmmrule_item(self, line):
+        bytcnt = (2.0, 2.0, 1.0, 2.0)
+        try:
+            ac, cval = line.split(':')
+            if not ac:
+                self._syntax_error("wmm item must have ac prefix")
+        except ValueError:
+                self._syntax_error("access category must be followed by colon")
+        p = tuple([int(v.split('=', 1)[1]) for v in cval.split(',')])
+        self._validate_input(*p)
+        for v, b in zip(p, bytcnt):
+            if self._validate_size(v, b):
+                self._syntax_error("unexpected input size expect %d got %d"
+                        % (b, v))
+
+            for r in self._current_regions:
+                self._wmm_rules[r][ac] = p
+
     def _parse_country(self, line):
         try:
             cname, cvals= line.split(':', 1)
@@ -248,6 +343,7 @@
         for cname in cnames:
             if len(cname) != 2:
                 self._warn("country '%s' not alpha2" % cname)
+            cname = bytes(cname, 'ascii')
             if not cname in self._countries:
                 self._countries[cname] = Country(dfs_region, 
comments=self._comments)
             self._current_countries[cname] = self._countries[cname]
@@ -290,6 +386,15 @@
             line = line.split(',')
             pname = line[0]
             flags = line[1:]
+        w = None
+        if flags and 'wmmrule' in flags[-1]:
+            try:
+                region = flags.pop().split('=', 1)[1]
+                if region not in self._wmm_rules.keys():
+                    self._syntax_error("No wmm rule for %s" % region)
+            except IndexError:
+                self._syntax_error("flags is empty list or no region was 
found")
+            w = WmmRule(*self._wmm_rules[region].values())
 
         if not bname in self._bands:
             self._syntax_error("band does not exist")
@@ -303,10 +408,10 @@
         b = self._bands[bname]
         p = self._power[pname]
         try:
-            perm = Permission(b, p, flags)
-        except FlagError, e:
+            perm = Permission(b, p, flags, w)
+        except FlagError as e:
             self._syntax_error("Invalid flag '%s'" % e.flag)
-        for cname, c in self._current_countries.iteritems():
+        for cname, c in self._current_countries.items():
             if perm in c:
                 self._warn('Rule "%s, %s" added to "%s" twice' % (
                               bname, pname, cname))
@@ -315,6 +420,7 @@
 
     def parse(self, f):
         self._current_countries = None
+        self._current_regions = None
         self._bands = {}
         self._power = {}
         self._countries = {}
@@ -326,6 +432,7 @@
         self._powerdup = {}
         self._bandline = {}
         self._powerline = {}
+        self._wmm_rules = defaultdict(lambda: OrderedDict())
 
         self._comments = []
 
@@ -337,6 +444,7 @@
                 self._comments.append(line[1:].strip())
             line = line.replace(' ', '').replace('\t', '')
             if not line:
+                self._current_regions = None
                 self._comments = []
             line = line.split('#')[0]
             if not line:
@@ -344,23 +452,35 @@
             if line[0:4] == 'band':
                 self._parse_band(line[4:])
                 self._current_countries = None
+                self._current_regions = None
                 self._comments = []
             elif line[0:5] == 'power':
                 self._parse_power(line[5:])
                 self._current_countries = None
+                self._current_regions = None
                 self._comments = []
             elif line[0:7] == 'country':
                 self._parse_country(line[7:])
                 self._comments = []
+                self._current_regions = None
             elif self._current_countries is not None:
+                self._current_regions = None
                 self._parse_country_item(line)
                 self._comments = []
+            elif line[0:7] == 'wmmrule':
+                self._parse_wmmrule(line[7:])
+                self._current_countries = None
+                self._comments = []
+            elif self._current_regions is not None:
+                self._parse_wmmrule_item(line)
+                self._current_countries = None
+                self._comments = []
             else:
                 self._syntax_error("Expected band, power or country 
definition")
 
         countries = self._countries
         bands = {}
-        for k, v in self._bands.iteritems():
+        for k, v in self._bands.items():
             if k in self._bands_used:
                 bands[self._banddup[k]] = v
                 continue
@@ -369,7 +489,7 @@
                 self._lineno = self._bandline[k]
                 self._warn('Unused band definition "%s"' % k)
         power = {}
-        for k, v in self._power.iteritems():
+        for k, v in self._power.items():
             if k in self._power_used:
                 power[self._powerdup[k]] = v
                 continue
Binary files old/wireless-regdb-2017.12.23/regulatory.bin and 
new/wireless-regdb-2018.05.09/regulatory.bin differ
Binary files old/wireless-regdb-2017.12.23/regulatory.db and 
new/wireless-regdb-2018.05.09/regulatory.db differ
Binary files old/wireless-regdb-2017.12.23/regulatory.db.p7s and 
new/wireless-regdb-2018.05.09/regulatory.db.p7s differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/wireless-regdb-2017.12.23/sha1sum.txt 
new/wireless-regdb-2018.05.09/sha1sum.txt
--- old/wireless-regdb-2017.12.23/sha1sum.txt   2017-12-24 04:39:42.000000000 
+0100
+++ new/wireless-regdb-2018.05.09/sha1sum.txt   2018-05-09 15:12:21.000000000 
+0200
@@ -1 +1 @@
-189f968d043b3acddd761684ad56db26d17c5145  db.txt
+6f2a26095237c64654fad1ca6c18db9de4c28842  db.txt


Reply via email to