taxonomy: no more v1/v2 signatures.

Resolve all remaining v1/v2 signatures:
+ Update to v4 signature: Epson Printer, Vizio Smart TV, HP Printer,
  Xbox.
+ Remove remaining v2 signatures which don't work. We'll re-gather
  these signatures by obtaining the devices.
  Chromebook 14" HP (Tegra), Amazon Kindle Fire 7" (2014 edition)
+ Remove the support for decimating a v4 signature back to v2 and v1.

Also:
+ Add alternate DHCP signature for an HP Printer.
+ Add alternate OUIs for Amazon, LG, Microsoft, Samsung.
+ Remove Nintendo OUIs, we're not using them.
+ Remove a duplicate Nexus 5X signature. The same signature was in the
  database twice.
+ Add alternate signatures: HP Printer, iPad 4th gen,
  Panasonic TV, Roku Streaming Stick, Samsung Galaxy Note 5,
  Samsung Galaxy S5, Nexus 7 (2013), iPhone 6s.
+ Add LG Pad 400, Canon Printer (with OS signature).

Change-Id: I10f15fe9b7e756b43da710d97773ec82a742570a
diff --git a/taxonomy/dhcp.py b/taxonomy/dhcp.py
index faa9a39..e75a337 100644
--- a/taxonomy/dhcp.py
+++ b/taxonomy/dhcp.py
@@ -36,15 +36,18 @@
 
     '6,3,1,15,66,67,13,44,2,42,12': ['brotherprinter'],
 
+    '1,3,6,15,44,47': ['canonprinter'],
+
     '1,121,33,3,6,12,15,26,28,51,54,58,59,119,252': ['chromeos'],
     '1,121,33,3,6,12,15,26,28,51,54,58,59,119': ['chromeos'],
 
-    '1,3,6': ['dashbutton'],
+    '1,3,6': ['dashbutton', 'canonprinter'],
 
     '1,3,6,28': ['ecobee'],
 
     '1,3,6,12,15,17,28,40,41,42': ['epsonprinter'],
 
+    '6,3,1,15,66,67,13,44': ['hpprinter'],
     '6,3,1,15,66,67,13,44,12': ['hpprinter'],
     '6,3,1,15,66,67,13,44,12,81': ['hpprinter'],
     '6,3,1,15,66,67,13,44,119,12,81,252': ['hpprinter'],
diff --git a/taxonomy/ethernet.py b/taxonomy/ethernet.py
index ca10bee..ea6ab77 100644
--- a/taxonomy/ethernet.py
+++ b/taxonomy/ethernet.py
@@ -27,6 +27,7 @@
     '0c:47:c9': ['amazon'],
     '10:ae:60': ['amazon'],
     '28:ef:01': ['amazon'],
+    '44:65:0d': ['amazon'],
     '74:75:48': ['amazon'],
     '74:c2:46': ['amazon'],
     '84:d6:d0': ['amazon'],
@@ -82,6 +83,7 @@
     'd8:b3:77': ['htc'],
     'e8:99:c4': ['htc'],
 
+    '00:34:da': ['lg'],
     '0c:48:85': ['lg'],
     '10:68:3f': ['lg'],
     '2c:54:cf': ['lg'],
@@ -105,14 +107,23 @@
     'f8:95:c7': ['lg'],
     'f8:a9:d0': ['lg'],
 
+    '00:0d:3a': ['microsoft'],
+    '00:12:5a': ['microsoft'],
+    '00:17:fa': ['microsoft'],
     '00:1d:d8': ['microsoft'],
+    '00:22:48': ['microsoft'],
+    '00:25:ae': ['microsoft'],
+    '00:50:f2': ['microsoft'],
     '28:18:78': ['microsoft'],
+    '30:59:b7': ['microsoft'],
+    '4c:0b:be': ['microsoft'],
     '50:1a:c5': ['microsoft'],
     '58:82:a8': ['microsoft'],
     '60:45:bd': ['microsoft'],
     '7c:1e:52': ['microsoft'],
     '7c:ed:8d': ['microsoft'],
     'b4:ae:2b': ['microsoft'],
+    'c0:33:5e': ['microsoft'],
 
     '14:1a:a3': ['motorola'],
     '14:30:c6': ['motorola'],
@@ -156,9 +167,6 @@
 
     '18:b4:30': ['nest'],
 
-    '00:27:09': ['nintendo'],
-    '34:af:2c': ['nintendo'],
-
     'c0:ee:fb': ['oneplus'],
 
     '00:15:99': ['samsung'],
@@ -166,6 +174,8 @@
     '08:d4:2b': ['samsung'],
     '08:ec:a9': ['samsung'],
     '14:32:d1': ['samsung'],
+    '18:22:7e': ['samsung'],
+    '20:6e:9c': ['samsung'],
     '24:4b:81': ['samsung'],
     '28:ba:b5': ['samsung'],
     '2c:ae:2b': ['samsung'],
@@ -175,8 +185,10 @@
     '38:aa:3c': ['samsung'],
     '38:d4:0b': ['samsung'],
     '3c:8b:fe': ['samsung'],
+    '3c:a1:0d': ['samsung'],
     '40:0e:85': ['samsung'],
     '48:5a:3f': ['samsung', 'wisol'],
+    '4c:bc:a5': ['samsung'],
     '50:cc:f8': ['samsung'],
     '54:88:0e': ['samsung'],
     '5c:0a:5b': ['samsung'],
diff --git a/taxonomy/tests/wifi_test.py b/taxonomy/tests/wifi_test.py
index 5ccb745..13eb234 100755
--- a/taxonomy/tests/wifi_test.py
+++ b/taxonomy/tests/wifi_test.py
@@ -30,7 +30,7 @@
     dhcp.DHCP_SIGNATURE_FILE = 'testdata/dhcp.signatures'
 
   def testLookup(self):
-    signature = ('wifi|probe:0,1,50,45,htcap:186e|assoc:0,1,50,48,'
+    signature = ('wifi4|probe:0,1,50,45,htcap:186e|assoc:0,1,50,48,'
                  '221(0050f2,2),45,127,htcap:086c,htmcs:000000ff')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual(3, len(taxonomy))
@@ -114,76 +114,76 @@
     self.assertIn('Unknown', taxonomy[1])
 
   def testUnknown(self):
-    signature = 'wifi|probe:0,1,2,vhtcap:0033|assoc:3,4,vhtcap:0033'
+    signature = 'wifi4|probe:0,1,2,vhtcap:0033|assoc:3,4,vhtcap:0033'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertIn('802.11ac', taxonomy[2])
     self.assertNotIn('802.11n', taxonomy[2])
     self.assertNotIn('802.11a/b/g', taxonomy[2])
-    signature = 'wifi|probe:0,1,2,htcap:0033|assoc:3,4,htcap:0033'
+    signature = 'wifi4|probe:0,1,2,htcap:0033|assoc:3,4,htcap:0033'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertNotIn('802.11ac', taxonomy[2])
     self.assertIn('802.11n', taxonomy[2])
     self.assertNotIn('802.11a/b/g', taxonomy[2])
-    signature = 'wifi|probe:0,1,2|assoc:3,4'
+    signature = 'wifi4|probe:0,1,2|assoc:3,4'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertNotIn('802.11ac', taxonomy[2])
     self.assertNotIn('802.11n', taxonomy[2])
     self.assertIn('802.11a/b/g', taxonomy[2])
 
   def test802_11n_NssWidth(self):
-    signature = 'wifi|probe:0|assoc:1,htcap:012c,htagg:03,htmcs:000000ff'
+    signature = 'wifi4|probe:0|assoc:1,htcap:012c,htagg:03,htmcs:000000ff'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11n n:1,w:20', taxonomy[2])
-    signature = 'wifi|probe:0|assoc:1,htcap:0102,htagg:03,htmcs:0000ffff'
+    signature = 'wifi4|probe:0|assoc:1,htcap:0102,htagg:03,htmcs:0000ffff'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11n n:2,w:40', taxonomy[2])
-    signature = 'wifi|probe:0|assoc:1,htcap:0200,htagg:03,htmcs:00ffffff'
+    signature = 'wifi4|probe:0|assoc:1,htcap:0200,htagg:03,htmcs:00ffffff'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11n n:3,w:20', taxonomy[2])
-    signature = 'wifi|probe:0|assoc:1,htcap:0302,htagg:03,htmcs:ffffffff'
+    signature = 'wifi4|probe:0|assoc:1,htcap:0302,htagg:03,htmcs:ffffffff'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11n n:4,w:40', taxonomy[2])
-    signature = 'wifi|probe:0|assoc:1'
+    signature = 'wifi4|probe:0|assoc:1'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11a/b/g n:1,w:20', taxonomy[2])
 
   def test802_11ac_Width(self):
-    signature = ('wifi|probe:0|assoc:1,htcap:0302,htmcs:000000ff,'
+    signature = ('wifi4|probe:0|assoc:1,htcap:0302,htmcs:000000ff,'
                  'vhtcap:00000000,vhtrxmcs:0000ffaa,vhttxmcs:0000ffaa')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11ac n:4,w:80', taxonomy[2])
-    signature = ('wifi|probe:0|assoc:1,htcap:0200,htmcs:000000ff,'
+    signature = ('wifi4|probe:0|assoc:1,htcap:0200,htmcs:000000ff,'
                  'vhtcap:00000004,vhtrxmcs:0000ffea,vhttxmcs:0000ffea')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11ac n:3,w:160', taxonomy[2])
-    signature = ('wifi|probe:0|assoc:1,htcap:0200,htmcs:000000ff,'
+    signature = ('wifi4|probe:0|assoc:1,htcap:0200,htmcs:000000ff,'
                  'vhtcap:00000004,vhtrxmcs:0000fffa,vhttxmcs:0000fffa')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11ac n:2,w:160', taxonomy[2])
-    signature = ('wifi|probe:0|assoc:1,htcap:0200,htmcs:000000ff,'
+    signature = ('wifi4|probe:0|assoc:1,htcap:0200,htmcs:000000ff,'
                  'vhtcap:00000004,vhtrxmcs:0000fffe,vhttxmcs:0000fffe')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11ac n:1,w:160', taxonomy[2])
-    signature = 'wifi|probe:0|assoc:1,vhtcap:00000008'
+    signature = 'wifi4|probe:0|assoc:1,vhtcap:00000008'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11ac n:?,w:80+80', taxonomy[2])
-    signature = 'wifi|probe:0|assoc:1,vhtcap:0000000c'
+    signature = 'wifi4|probe:0|assoc:1,vhtcap:0000000c'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11ac n:?,w:??', taxonomy[2])
 
   def testPerformanceInfoBroken(self):
-    signature = ('wifi|probe:0,htmcs:000000ff|assoc:0,htmcs:000000ff')
+    signature = ('wifi4|probe:0,htmcs:000000ff|assoc:0,htmcs:000000ff')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11a/b/g n:1,w:20', taxonomy[2])
-    signature = ('wifi|probe:0,htcap:wrong,htmcs:ffffffff|'
+    signature = ('wifi4|probe:0,htcap:wrong,htmcs:ffffffff|'
                  'assoc:0,htcap:wrong,htmcs:ffffffff')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11n n:4,w:??', taxonomy[2])
-    signature = ('wifi|probe:0,htcap:012c,htmcs:wrong|'
+    signature = ('wifi4|probe:0,htcap:012c,htmcs:wrong|'
                  'assoc:0,htcap:012c,htmcs:wrong')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11n n:?,w:20', taxonomy[2])
-    signature = ('wifi|probe:0,htcap:wrong,htmcs:wrong|'
+    signature = ('wifi4|probe:0,htcap:wrong,htmcs:wrong|'
                  'assoc:0,htcap:wrong,htmcs:wrong')
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertEqual('802.11n n:?,w:??', taxonomy[2])
@@ -191,13 +191,13 @@
   def testRealClientsPerformance(self):
     """Test the performance information for a few real clients."""
     # Nest Thermostat
-    sig = ('wifi|probe:0,1,50,45,htcap:0130,htagg:18,htmcs:000000ff|assoc:'
+    sig = ('wifi4|probe:0,1,50,45,htcap:0130,htagg:18,htmcs:000000ff|assoc:'
            '0,1,50,48,45,221(0050f2,2),htcap:013c,htagg:18,htmcs:000000ff')
     taxonomy = wifi.identify_wifi_device(sig, '18:b4:30:00:00:01')
     self.assertEqual('802.11n n:1,w:20', taxonomy[2])
     # Samsung Galaxy S4
     sig = (
-        'wifi|probe:0,1,45,127,191,221(001018,2),221(00904c,51),221(00904c,'
+        'wifi4|probe:0,1,45,127,191,221(001018,2),221(00904c,51),221(00904c,'
         '4),221(0050f2,8),htcap:006f,htagg:17,htmcs:000000ff,vhtcap:0f805832,'
         'vhtrxmcs:0000fffe,vhttxmcs:0000fffe|assoc:0,1,33,36,48,45,127,191,'
         '221(001018,2),221(00904c,4),221(0050f2,2),htcap:006f,htagg:17,htmcs:'
@@ -206,7 +206,7 @@
     self.assertEqual('802.11ac n:1,w:80', taxonomy[2])
     # MacBook Pro 802.11ac
     sig = (
-        'wifi|probe:0,1,45,127,191,221(00904c,51),htcap:09ef,htagg:17,'
+        'wifi4|probe:0,1,45,127,191,221(00904c,51),htcap:09ef,htagg:17,'
         'htmcs:0000ffff,vhtcap:0f8259b2,vhtrxmcs:0000ffea,vhttxmcs:0000ffea|'
         'assoc:0,1,33,36,48,45,127,191,221(00904c,51),221(0050f2,2),htcap:09ef,'
         'htagg:17,htmcs:0000ffff,vhtcap:0f8259b2,vhtrxmcs:0000ffea,'
@@ -225,7 +225,7 @@
     look at the Association for determining client
     performance characteristics.
     """
-    signature = ('wifi|probe:0,1,50,45,221(0050f2,8),191,221(0050f2,4),'
+    signature = ('wifi4|probe:0,1,50,45,221(0050f2,8),191,221(0050f2,4),'
                  '221(506f9a,9),htcap:012c,htagg:03,htmcs:000000ff,'
                  'vhtcap:31811120,vhtrxmcs:01b2fffc,vhttxmcs:01b2fffc,'
                  'wps:Nexus_4|assoc:0,1,50,48,45,221(0050f2,2),'
@@ -234,76 +234,13 @@
     self.assertEqual('802.11n n:1,w:20', taxonomy[2])
 
   def testCorruptFiles(self):
-    signature = 'wifi|probe:0|assoc:1,htcap:this_is_not_a_number'
+    signature = 'wifi4|probe:0|assoc:1,htcap:this_is_not_a_number'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertIn('802.11n', taxonomy[2])
-    signature = 'wifi|probe:0|assoc:1,vhtcap:this_is_not_a_number'
+    signature = 'wifi4|probe:0|assoc:1,vhtcap:this_is_not_a_number'
     taxonomy = wifi.identify_wifi_device(signature, '00:00:01:00:00:01')
     self.assertIn('802.11ac', taxonomy[2])
 
-  def testV1Signature(self):
-    sig = ('wifi|probe:0,1,50,45,221(0050f2,8),221(0050f2,4),221(506f9a,9),'
-           'htcap:012c,htagg:03,htmcs:000000ff,wps:Nexus_4|assoc:0,1,50,48,45,'
-           '221(0050f2,2),htcap:012c,htagg:03,htmcs:000000ff')
-    expected = (
-        'wifi|probe:0,1,50,45,221(0050f2,8),221(0050f2,4),221(506f9a,9),'
-        'htcap:012c,wps:Nexus_4|assoc:0,1,50,48,45,221(0050f2,2),htcap:012c')
-    v1 = wifi.make_v1_signature(sig)
-    self.assertEqual(v1, expected)
-    sig = ('wifi|probe:0,1,45,127,191,221(001018,2),221(00904c,51),'
-           '221(00904c,4),221(0050f2,8),htcap:006f,htagg:17,htmcs:000000ff,'
-           'vhtcap:0f805832,vhtrxmcs:0000fffe,vhttxmcs:0000fffe|assoc:0,1,33,'
-           '36,48,45,127,191,221(001018,2),221(00904c,4),221(0050f2,2),'
-           'htcap:006f,htagg:17,htmcs:000000ff,vhtcap:0f805832,'
-           'vhtrxmcs:0000fffe,vhttxmcs:0000fffe')
-    expected = ('wifi|probe:0,1,45,127,191,221(001018,2),221(00904c,51),'
-                '221(00904c,4),221(0050f2,8),htcap:006f,vhtcap:0f805832|assoc:'
-                '0,1,33,36,48,45,127,191,221(001018,2),221(00904c,4),'
-                '221(0050f2,2),htcap:006f,vhtcap:0f805832')
-    v1 = wifi.make_v1_signature(sig)
-    self.assertEqual(v1, expected)
-
-  def testV2Signature(self):
-    sig = 'wifi4|probe:0,1,50|assoc:0,1,50,htcap:012c,txpow:3210'
-    exp = 'wifi|probe:0,1,50|assoc:0,1,50,htcap:012c'
-    v2 = wifi.make_v2_signature(sig)
-    self.assertEqual(v2, exp)
-    sig = 'wifi4|probe:0,1,50|assoc:0,1,50,extcap:0123456789abcdef'
-    exp = 'wifi|probe:0,1,50|assoc:0,1,50,extcap:67452301'
-    v2 = wifi.make_v2_signature(sig)
-    self.assertEqual(v2, exp)
-    # iPhone 6s signature
-    sig = ('wifi4|probe:0,1,50,3,45,127,107,221(0050f2,8),221(001018,2),'
-           'htcap:002d,htagg:17,htmcs:0000ffff,'
-           'extcap:0400088400000040|assoc:0,1,50,33,36,48,45,127,221(001018,2),'
-           '221(0050f2,2),htcap:002d,htagg:17,htmcs:0000ffff,'
-           'txpow:1202,extcap:0000000000000040|os:ios')
-    exp = ('wifi|probe:0,1,50,3,45,127,107,221(0050f2,8),221(001018,2),'
-           'htcap:002d,htagg:17,htmcs:0000ffff,'
-           'extcap:84080004|assoc:0,1,50,33,36,48,45,127,221(001018,2),'
-           '221(0050f2,2),htcap:002d,htagg:17,htmcs:0000ffff,'
-           'extcap:00000000|os:ios')
-    v2 = wifi.make_v2_signature(sig)
-    self.assertEqual(v2, exp)
-
-  def testV2SignatureSmallExtcap(self):
-    sig = 'wifi4|probe:0,1,50|assoc:0,1,50,extcap:01234567'
-    exp = 'wifi|probe:0,1,50|assoc:0,1,50,extcap:67452301'
-    v2 = wifi.make_v2_signature(sig)
-    self.assertEqual(v2, exp)
-    sig = 'wifi4|probe:0,1,50|assoc:0,1,50,extcap:012345'
-    exp = 'wifi|probe:0,1,50|assoc:0,1,50,extcap:452301'
-    v2 = wifi.make_v2_signature(sig)
-    self.assertEqual(v2, exp)
-    sig = 'wifi4|probe:0,1,50|assoc:0,1,50,extcap:0123'
-    exp = 'wifi|probe:0,1,50|assoc:0,1,50,extcap:2301'
-    v2 = wifi.make_v2_signature(sig)
-    self.assertEqual(v2, exp)
-    sig = 'wifi4|probe:0,1,50|assoc:0,1,50,extcap:01'
-    exp = 'wifi|probe:0,1,50|assoc:0,1,50,extcap:01'
-    v2 = wifi.make_v2_signature(sig)
-    self.assertEqual(v2, exp)
-
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/taxonomy/wifi.py b/taxonomy/wifi.py
index 109095c..69aab98 100644
--- a/taxonomy/wifi.py
+++ b/taxonomy/wifi.py
@@ -42,8 +42,6 @@
 
     'wifi4|probe:0,1,50,3,45,221(0050f2,8),htcap:1130,htagg:18,htmcs:000000ff|assoc:0,1,50,48,45,221(0050f2,2),htcap:1130,htagg:18,htmcs:000000ff|oui:amazon':
         ('TI_WL1271', 'Amazon Kindle Fire 7" (2011 edition)', '2.4GHz'),
-    'wifi|probe:0,1,50,221(0050f2,4),221(506f9a,9),wps:KFASWI|assoc:0,1,50,45,127,221(0050f2,2),48,htcap:1172,htagg:03,htmcs:000000ff':
-        ('', 'Amazon Kindle Fire 7" (2014 edition)', '2.4GHz'),
     'wifi4|probe:0,1,50,221(0050f2,4),221(506f9a,9),wps:KFFOWI|assoc:0,1,50,45,48,127,221(0050f2,2),htcap:1172,htagg:03,htmcs:000000ff,extcap:01':
         ('', 'Amazon Kindle Fire 7" (2015 edition)', '2.4GHz'),
 
@@ -96,6 +94,9 @@
     'wifi4|probe:0,1,50,45,3,221(001018,2),221(00904c,51),htcap:112c,htagg:19,htmcs:000000ff|assoc:0,1,48,50,45,221(001018,2),221(00904c,51),221(0050f2,2),htcap:112c,htagg:19,htmcs:000000ff|os:brotherprinter':
         ('', 'Brother Printer', '2.4GHz'),
 
+    'wifi4|probe:0,1,3,45,50,htcap:007e,htagg:00,htmcs:000000ff|assoc:0,1,45,48,50,221(0050f2,2),htcap:000c,htagg:1b,htmcs:000000ff|os:canonprinter':
+        ('', 'Canon Printer', '2.4GHz'),
+
     'wifi4|probe:0,1,45,191,htcap:11e2,htagg:17,htmcs:0000ffff,vhtcap:038071a0,vhtrxmcs:0000fffa,vhttxmcs:0000fffa|assoc:0,1,48,45,127,191,221(0050f2,2),htcap:11e6,htagg:17,htmcs:0000ffff,vhtcap:038001a0,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,extcap:0000000000000040|os:chromeos':
         ('Intel_7260', 'Chromebook Pixel 2', '5GHz'),
     'wifi4|probe:0,1,45,191,htcap:11e2,htagg:17,htmcs:0000ffff,vhtcap:038071a0,vhtrxmcs:0000fffa,vhttxmcs:0000fffa|assoc:0,1,48,45,127,191,221(0050f2,2),htcap:11ee,htagg:17,htmcs:0000ffff,vhtcap:038001a0,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,extcap:0000000000000040|os:chromeos':
@@ -112,9 +113,6 @@
     'wifi4|probe:0,1,50,3,45,htcap:11ef,htagg:1b,htmcs:0000ffff|assoc:0,1,50,48,45,221(0050f2,2),htcap:11ef,htagg:1b,htmcs:0000ffff|os:chromeos':
         ('AR5822', 'Chromebook 14" HP', '2.4GHz'),
 
-    'wifi|probe:0,1,3,45,50,htcap:01ff|assoc:0,1,50,127,221(0050f2,1),221(0050f2,2),45,htcap:01ff|os:chromeos':
-        ('Marvell_88W8897', 'Chromebook 14" HP (Tegra)', '2.4GHz'),
-
     'wifi4|probe:0,1,45,50,htcap:016e,htagg:03,htmcs:0000ffff|assoc:0,1,48,127,221(0050f2,2),45,htcap:016e,htagg:03,htmcs:0000ffff,extcap:00':
         ('AR9382', 'Chromebook 11" Samsung', '5GHz'),
     'wifi4|probe:0,1,3,45,50,htcap:016e,htagg:03,htmcs:0000ffff|assoc:0,1,48,50,127,221(0050f2,2),45,htcap:016e,htagg:03,htmcs:0000ffff,extcap:00':
@@ -139,14 +137,14 @@
     'wifi4|probe:0,1,50,45,htcap:002c,htagg:01,htmcs:000000ff|assoc:0,1,50,45,48,221(0050f2,2),htcap:002c,htagg:01,htmcs:000000ff|oui:ecobee':
         ('', 'ecobee thermostat', '2.4GHz'),
 
-    'wifi|probe:0,1,3,45,50,htcap:0162,htagg:00,htmcs:000000ff|assoc:0,1,45,48,127,50,221(0050f2,2),htcap:016e,htagg:1b,htmcs:000000ff|os:epsonprinter':
+    'wifi4|probe:0,1,3,45,50,htcap:0162,htagg:00,htmcs:000000ff|assoc:0,1,45,48,127,50,221(0050f2,2),htcap:016e,htagg:1b,htmcs:000000ff,extcap:00|os:epsonprinter':
         ('', 'Epson Printer', '2.4GHz'),
     'wifi4|probe:0,1,50,45,221(001018,2),221(00904c,51),htcap:182c,htagg:1b,htmcs:000000ff|assoc:0,1,48,50,45,221(001018,2),221(00904c,51),221(0050f2,2),htcap:182c,htagg:1b,htmcs:000000ff|os:epsonprinter':
         ('', 'Epson Printer', '2.4GHz'),
     'wifi4|probe:0,1,50,221(001018,2)|assoc:0,1,48,50,221(001018,2)|os:epsonprinter':
         ('', 'Epson Printer', '2.4GHz'),
 
-    'wifi|probe:0,1,50,45,3,221(001018,2),221(00904c,51),htcap:100c,htagg:19,htmcs:000000ff|assoc:0,1,48,50,45,221(001018,2),221(00904c,51),221(0050f2,2),htcap:100c,htagg:19,htmcs:000000ff|os:hpprinter':
+    'wifi4|probe:0,1,50,45,3,221(001018,2),221(00904c,51),htcap:100c,htagg:19,htmcs:000000ff|assoc:0,1,48,50,45,221(001018,2),221(00904c,51),221(0050f2,2),htcap:100c,htagg:19,htmcs:000000ff|os:hpprinter':
         ('', 'HP Printer', '2.4GHz'),
     'wifi4|probe:0,1,50,45,221(001018,2),221(00904c,51),htcap:102c,htagg:1b,htmcs:000000ff|assoc:0,1,48,50,45,221(001018,2),221(00904c,51),221(0050f2,2),htcap:102c,htagg:1b,htmcs:000000ff|os:hpprinter':
         ('', 'HP Printer', '2.4GHz'),
@@ -156,10 +154,12 @@
         ('', 'HP Printer', '2.4GHz'),
     'wifi4|probe:0,1,50,3,45,221(001018,2),221(00904c,51),htcap:0020,htagg:1a,htmcs:000000ff|assoc:0,1,48,50,45,221(001018,2),221(0050f2,2),221(506f9a,9),htcap:0020,htagg:1a,htmcs:000000ff|os:hpprinter':
         ('', 'HP Printer', '2.4GHz'),
-    'wifi|probe:0,1,3,45,50,htcap:0060,htagg:03,htmcs:000000ff|assoc:0,1,48,50,127,221(0050f2,2),45,htcap:006c,htagg:03,htmcs:000000ff|os:hpprinter':
+    'wifi4|probe:0,1,3,45,50,htcap:0060,htagg:03,htmcs:000000ff|assoc:0,1,48,50,127,221(0050f2,2),45,htcap:006c,htagg:03,htmcs:000000ff,extcap:00|os:hpprinter':
         ('', 'HP Printer', '2.4GHz'),
     'wifi4|probe:0,1,3,45,50,127,htcap:010c,htagg:1b,htmcs:0000ffff,extcap:00|assoc:0,1,45,48,127,50,221(0050f2,2),htcap:016c,htagg:1b,htmcs:000000ff,extcap:00|os:hpprinter':
         ('', 'HP Printer', '2.4GHz'),
+    'wifi4|probe:0,1,50,221(001018,2)|assoc:0,1,48,50,221(001018,2)|os:hpprinter':
+        ('', 'HP Printer', '2.4GHz'),
 
     'wifi4|probe:0,1,45,127,191,221(001018,2),221(00904c,51),htcap:006f,htagg:17,htmcs:000000ff,vhtcap:03800032,vhtrxmcs:0000fffe,vhttxmcs:0000fffe,extcap:0000000000000040|assoc:0,1,33,36,48,45,127,191,221(001018,2),221(0050f2,2),htcap:006f,htagg:17,htmcs:000000ff,vhtcap:03800032,vhtrxmcs:0000fffe,vhttxmcs:0000fffe,txpow:e008,extcap:0000000000000040|oui:htc':
         ('BCM4335', 'HTC One', '5GHz'),
@@ -223,6 +223,8 @@
         ('BCM4334', 'iPad (4th gen or Air)', '5GHz'),
     'wifi4|probe:0,1,45,127,107,221(001018,2),221(00904c,51),221(0050f2,8),htcap:01fe,htagg:1b,htmcs:0000ffff,extcap:00000804|assoc:0,1,33,36,48,45,70,221(001018,2),221(00904c,51),221(0050f2,2),htcap:01fe,htagg:1b,htmcs:0000ffff,txpow:e708|os:ios':
         ('BCM4334', 'iPad (4th gen or Air)', '5GHz'),
+    'wifi4|probe:0,1,45,127,107,221(001018,2),221(00904c,51),221(0050f2,8),htcap:01fe,htagg:1b,htmcs:0000ffff,extcap:00000004|assoc:0,1,33,36,48,45,70,221(001018,2),221(00904c,51),221(0050f2,2),htcap:01fe,htagg:1b,htmcs:0000ffff,txpow:e708|os:ios':
+        ('BCM4334', 'iPad (4th gen or Air)', '5GHz'),
     'wifi4|probe:0,1,50,3,45,127,107,221(001018,2),221(00904c,51),221(0050f2,8),htcap:01bc,htagg:1b,htmcs:0000ffff,extcap:00000804|assoc:0,1,33,36,48,50,45,221(001018,2),221(00904c,51),221(0050f2,2),htcap:01bc,htagg:1b,htmcs:0000ffff,txpow:1805|os:ios':
         ('BCM4334', 'iPad (4th gen or Air)', '2.4GHz'),
     'wifi4|probe:0,1,50,3,45,127,107,221(001018,2),221(00904c,51),221(0050f2,8),htcap:01bc,htagg:1b,htmcs:0000ffff,extcap:00000804|assoc:0,1,33,36,48,50,45,70,221(001018,2),221(00904c,51),221(0050f2,2),htcap:01bc,htagg:1b,htmcs:0000ffff,txpow:1805|os:ios':
@@ -352,6 +354,8 @@
         ('BCM4350', 'iPhone 6s/6s+', '2.4GHz'),
     'wifi4|probe:0,1,50,3,45,127,107,221(0050f2,8),221(001018,2),htcap:002d,htagg:17,htmcs:000000ff,extcap:0400088400000040|assoc:0,1,50,33,36,48,70,45,127,221(001018,2),221(0050f2,2),htcap:002d,htagg:17,htmcs:000000ff,txpow:1202,extcap:0000000000000040|os:ios':
         ('BCM4350', 'iPhone 6s/6s+', '2.4GHz'),
+    'wifi4|probe:0,1,50,3,45,127,107,221(00904c,51),221(0050f2,8),221(001018,2),htcap:002d,htagg:17,htmcs:0000ffff,extcap:0400088400000040|assoc:0,1,50,33,36,48,70,45,127,221(001018,2),221(0050f2,2),htcap:002d,htagg:17,htmcs:0000ffff,txpow:1202,extcap:0000000000000040|os:ios':
+        ('BCM4350', 'iPhone 6s/6s+', '2.4GHz'),
 
     'wifi4|probe:0,1,3,50|assoc:0,1,48,50|os:ipodtouch1':
         ('Marvell_W8686B22', 'iPod Touch 1st/2nd gen', '2.4GHz'),
@@ -398,6 +402,9 @@
     'wifi4|probe:0,1,50,3,45,221(0050f2,8),221(0050f2,4),221(506f9a,9),htcap:012c,htagg:03,htmcs:000000ff,wps:LGMS323|assoc:0,1,50,48,45,221(0050f2,2),221(004096,3),htcap:012c,htagg:03,htmcs:000000ff':
         ('QCA_WCN3360', 'LG Optimus L70', '2.4GHz'),
 
+    'wifi4|probe:0,1,3,45,221(0050f2,8),221(0050f2,4),221(506f9a,9),htcap:016e,htagg:03,htmcs:000000ff,wps:LG_V400|assoc:0,1,33,36,48,70,45,221(0050f2,2),127,htcap:016e,htagg:03,htmcs:000000ff,txpow:170d,extcap:00000a0200000000':
+        ('', 'LG Pad v400', '5GHz'),
+
     'wifi4|probe:0,1,50,3,45,127,221(001018,2),221(00904c,51),htcap:11ac,htagg:16,htmcs:0000ffff,extcap:0000000000000040|assoc:0,1,33,36,48,50,45,127,221(001018,2),221(0050f2,2),htcap:11ac,htagg:16,htmcs:0000ffff,txpow:140a,extcap:0000000000000040|os:lgtv':
         ('', 'LG Smart TV', '2.4GHz'),
 
@@ -535,8 +542,6 @@
         ('QCA6174', 'Nexus 5X', '2.4GHz'),
     'wifi4|probe:0,1,50,127,45,191,htcap:01ef,htagg:03,htmcs:0000ffff,vhtcap:338061b2,vhtrxmcs:030cfffa,vhttxmcs:030cfffa,extcap:00000a020100004080|assoc:0,1,50,48,45,221(0050f2,2),127,htcap:01ad,htagg:03,htmcs:0000ffff,extcap:000000000000000080|oui:lg':
         ('QCA6174', 'Nexus 5X', '2.4GHz'),
-    'wifi4|probe:0,1,127,45,191,htcap:01ef,htagg:03,htmcs:0000ffff,vhtcap:338061b2,vhtrxmcs:030cfffa,vhttxmcs:030cfffa,extcap:00000a020100004080|assoc:0,1,33,36,48,70,45,221(0050f2,2),191,127,htcap:01ef,htagg:03,htmcs:0000ffff,vhtcap:339071b2,vhtrxmcs:030cfffa,vhttxmcs:030cfffa,txpow:1e08,extcap:000000000000004080|oui:lg':
-        ('QCA6174', 'Nexus 5X', '2.4GHz'),
     'wifi4|probe:0,1,50,127,45,191,htcap:01ef,htagg:03,htmcs:0000ffff,vhtcap:338061b2,vhtrxmcs:030cfffa,vhttxmcs:030cfffa,extcap:00000a020100004080|assoc:0,1,50,33,48,70,45,221(0050f2,2),127,htcap:01ad,htagg:03,htmcs:0000ffff,txpow:1e08,extcap:000000000000000080|oui:lg':
         ('QCA6174', 'Nexus 5X', '2.4GHz'),
     'wifi4|probe:0,1,50,127,extcap:00000a020100004080|assoc:0,1,50,33,48,70,45,221(0050f2,2),127,htcap:01ad,htagg:03,htmcs:0000ffff,txpow:1e08,extcap:000000000000000080|oui:lg':
@@ -605,6 +610,8 @@
         ('QCA_WCN3660', 'Nexus 7 (2013)', '2.4GHz'),
     'wifi4|probe:0,1,50,45,htcap:016e,htagg:03,htmcs:000000ff|assoc:0,1,50,48,45,221(0050f2,2),127,htcap:012c,htagg:03,htmcs:000000ff,extcap:00000a02|oui:asus':
         ('QCA_WCN3660', 'Nexus 7 (2013)', '2.4GHz'),
+    'wifi4|probe:0,1,50,45,221(0050f2,8),221(0050f2,4),221(506f9a,9),htcap:012c,htagg:03,htmcs:000000ff,wps:Nexus_7|assoc:0,1,50,48,45,221(0050f2,2),htcap:012c,htagg:03,htmcs:000000ff':
+        ('QCA_WCN3660', 'Nexus 7 (2013)', '2.4GHz'),
 
     'wifi4|probe:0,1,45,127,191,221(0050f2,4),221(506f9a,9),221(001018,2),htcap:006f,htagg:17,htmcs:0000ffff,vhtcap:0f815832,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,extcap:000008800140,wps:Nexus_9|assoc:0,1,33,36,48,45,127,191,221(001018,2),221(0050f2,2),htcap:006f,htagg:17,htmcs:0000ffff,vhtcap:0f815832,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,txpow:e009,extcap:000008800140':
         ('BCM4354', 'Nexus 9', '5GHz'),
@@ -642,6 +649,8 @@
 
     'wifi4|probe:0,1,50,48|assoc:0,1,33,36,50,221(0050f2,2),45,221(00037f,1),221(00037f,4),48,htcap:1004,htagg:1b,htmcs:0000ffff,txpow:0f0f|os:panasonictv':
         ('', 'Panasonic TV', '2.4GHz'),
+    'wifi4|probe:0,1,50,45,221(0050f2,4),htcap:01ad,htagg:02,htmcs:0000ffff,wps:WPS_SUPPLICANT_STATION|assoc:0,1,50,45,48,221(0050f2,2),htcap:01ad,htagg:02,htmcs:0000ffff|os:panasonictv':
+        ('', 'Panasonic TV', '2.4GHz'),
 
     'wifi4|probe:0,1,50|assoc:0,1,50,48,221(005043,1)|os:playstation':
         ('', 'Playstation 3 or 4', '2.4GHz'),
@@ -685,10 +694,12 @@
         ('BCM4336', 'Roku 2', '2.4GHz'),
 
     # Roku 3 model 4230, 4200, 4200X and Roku 2 model 4210 and Roku Streaming Stick model 3500
+    'wifi4|probe:0,1,45,127,221(001018,2),221(00904c,51),htcap:09bc,htagg:16,htmcs:0000ffff,extcap:0000000000000040|assoc:0,1,33,36,48,45,127,221(001018,2),221(0050f2,2),htcap:09bc,htagg:16,htmcs:0000ffff,txpow:100a,extcap:0000000000000040|os:roku':
+        ('BCM43236', 'Roku 3/SS', '5GHz'),
     'wifi4|probe:0,1,50,3,45,127,221(001018,2),221(00904c,51),htcap:19bc,htagg:16,htmcs:0000ffff,extcap:0000000000000040|assoc:0,1,33,36,48,50,45,127,221(001018,2),221(0050f2,2),htcap:19bc,htagg:16,htmcs:0000ffff,txpow:140a,extcap:0000000000000040|os:roku':
-        ('BCM43236', 'Roku 3', '2.4GHz'),
+        ('BCM43236', 'Roku 3/SS', '2.4GHz'),
     'wifi4|probe:0,1,50,3,45,127,221(001018,2),221(00904c,51),htcap:193c,htagg:16,htmcs:0000ffff,extcap:0000000000000040|assoc:0,1,33,36,48,50,45,127,221(001018,2),221(0050f2,2),htcap:193c,htagg:16,htmcs:0000ffff,txpow:140a,extcap:0000000000000040|os:roku':
-        ('BCM43236', 'Roku 3', '2.4GHz'),
+        ('BCM43236', 'Roku 3/SS', '2.4GHz'),
 
     # Roku 4 model 4400
     'wifi4|probe:0,1,45,127,191,221(001018,2),htcap:01ad,htagg:17,htmcs:0000ffff,vhtcap:0f8159b2,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,extcap:0000000000000040|assoc:0,1,33,36,48,45,127,191,199,221(001018,2),221(0050f2,2),htcap:01ad,htagg:17,htmcs:0000ffff,vhtcap:0f8159b2,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,txpow:1109,extcap:0000000000000040|os:roku':
@@ -757,6 +768,8 @@
         ('BCM4359', 'Samsung Galaxy Note 5', '5GHz'),
     'wifi4|probe:0,1,45,127,107,191,221(506f9a,16),221(00904c,4),221(0050f2,8),221(001018,2),htcap:01ef,htagg:17,htmcs:0000ffff,vhtcap:0f9118b2,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,extcap:00080f8401400040|assoc:0,1,33,36,48,70,45,127,191,199,221(00904c,4),221(001018,2),221(0050f2,2),htcap:01ef,htagg:17,htmcs:0000ffff,vhtcap:0f9118b2,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,txpow:1202,extcap:0000000000000040|oui:samsung':
         ('BCM4359', 'Samsung Galaxy Note 5', '5GHz'),
+    'wifi4|probe:0,1,45,127,107,191,221(506f9a,16),221(00904c,4),221(0050f2,8),221(001018,2),htcap:01ef,htagg:17,htmcs:0000ffff,vhtcap:0f9118b2,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,extcap:00080f840140|assoc:0,1,33,36,48,70,45,191,199,221(00904c,4),221(001018,2),221(0050f2,2),htcap:01ef,htagg:17,htmcs:0000ffff,vhtcap:0f9118b2,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,txpow:1202|oui:samsung':
+        ('BCM4359', 'Samsung Galaxy Note 5', '5GHz'),
     'wifi4|probe:0,1,50,3,45,127,107,221(506f9a,16),221(00904c,4),221(0050f2,8),221(001018,2),htcap:01ad,htagg:17,htmcs:0000ffff,extcap:00080f8401400040|assoc:0,1,50,33,36,48,45,221(001018,2),221(0050f2,2),htcap:01ad,htagg:17,htmcs:0000ffff,txpow:1202|oui:samsung':
         ('BCM4359', 'Samsung Galaxy Note 5', '2.4GHz'),
 
@@ -810,6 +823,8 @@
         ('BCM4354', 'Samsung Galaxy S5', '2.4GHz'),
     'wifi4|probe:0,1,50,3,45,127,107,221(506f9a,16),221(00904c,4),221(0050f2,8),221(001018,2),htcap:002d,htagg:17,htmcs:0000ffff,extcap:0000088001400040|assoc:0,1,50,33,36,48,45,127,107,221(001018,2),221(0050f2,2),htcap:002d,htagg:17,htmcs:0000ffff,txpow:1209,extcap:000008800140|oui:samsung':
         ('BCM4354', 'Samsung Galaxy S5', '2.4GHz'),
+    'wifi4|probe:0,1,50,3,45,127,107,221(506f9a,16),221(00904c,4),221(0050f2,8),221(001018,2),htcap:002d,htagg:17,htmcs:0000ffff,extcap:000008800140|assoc:0,1,50,33,36,48,70,45,127,107,221(001018,2),221(0050f2,2),htcap:002d,htagg:17,htmcs:0000ffff,txpow:1209,extcap:000008800140|oui:samsung':
+        ('BCM4354', 'Samsung Galaxy S5', '2.4GHz'),
 
     'wifi4|probe:0,1,45,127,191,221(00904c,4),221(0050f2,8),221(001018,2),htcap:006f,htagg:17,htmcs:0000ffff,vhtcap:0f815832,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,extcap:0000088001400040|assoc:0,1,33,36,48,45,127,191,221(00904c,4),221(001018,2),221(0050f2,2),htcap:006f,htagg:17,htmcs:0000ffff,vhtcap:0f815832,vhtrxmcs:0000fffa,vhttxmcs:0000fffa,txpow:e002,extcap:0000088001400040|oui:samsung':
         ('BCM4358', 'Samsung Galaxy S6', '5GHz'),
@@ -900,7 +915,7 @@
         ('', 'Vizio Smart TV', '2.4GHz'),
     'wifi4|probe:0,1,50,45,127,221(0050f2,4),htcap:106e,htagg:12,htmcs:000000ff,extcap:00,wps:Ralink_Wireless_Linux_Client|assoc:0,1,50,45,127,221(000c43,6),221(0050f2,2),48,htcap:000c,htagg:12,htmcs:000000ff,extcap:01000000|os:visiotv':
         ('', 'Vizio Smart TV', '2.4GHz'),
-    'wifi|probe:0,1,50,48|assoc:0,1,50,221(0050f2,2),45,51,127,48,htcap:012c,htagg:1b,htmcs:000000ff|os:visiotv':
+    'wifi4|probe:0,1,50,48|assoc:0,1,50,221(0050f2,2),45,51,127,48,htcap:012c,htagg:1b,htmcs:000000ff,extcap:01|os:visiotv':
         ('', 'Vizio Smart TV', '2.4GHz'),
 
     'wifi4|probe:0,1,50,221(001018,2)|assoc:0,1,48,50,221(001018,2)|os:wii':
@@ -919,7 +934,7 @@
         ('', 'Xbox', '5GHz'),
     'wifi4|probe:0,1,3|assoc:0,1,48,33,36,221(0050f2,2),txpow:1405|oui:microsoft':
         ('', 'Xbox', '5GHz'),
-    'wifi|probe:0,1,3,45,50,htcap:016e,htagg:03,htmcs:0000ffff|assoc:0,1,33,48,50,127,221(0050f2,2),45,htcap:012c,htagg:03,htmcs:0000ffff,extcap:00000000|oui:microsoft':
+    'wifi4|probe:0,1,3,45,50,htcap:016e,htagg:03,htmcs:0000ffff|assoc:0,1,33,48,50,127,221(0050f2,2),45,htcap:012c,htagg:03,htmcs:0000ffff,txpow:1208,extcap:0000000000000140|oui:microsoft':
         ('', 'Xbox', '5GHz'),
     'wifi4|probe:0,1,50|assoc:0,1,3,33,36,50,221(0050f2,2),45,221(00037f,1),221(00037f,4),48,htcap:104c,htagg:00,htmcs:000000ff,txpow:0f0f|oui:microsoft':
         ('', 'Xbox', '2.4GHz'),
@@ -927,6 +942,8 @@
         ('', 'Xbox', '2.4GHz'),
     'wifi4|probe:0,1,45,50,htcap:058f,htagg:03,htmcs:0000ffff|assoc:0,1,33,36,48,221(0050f2,2),45,htcap:058f,htagg:03,htmcs:0000ffff,txpow:1208|oui:microsoft':
         ('', 'Xbox', '2.4GHz'),
+    'wifi4|probe:0,1,3,50|assoc:0,1,33,48,50,127,127,221(0050f2,2),45,htcap:012c,htagg:03,htmcs:0000ffff,txpow:1208,extcap:0000000000000140|oui:microsoft':
+        ('', 'Xbox', '2.4GHz'),
 
     'wifi4|probe:0,1,3,45,50,htcap:058f,htagg:03,htmcs:0000ffff|assoc:0,1,48,50,221(0050f2,2),45,htcap:058d,htagg:03,htmcs:0000ffff|oui:microsoft':
         ('Marvell_88W8897', 'Xbox One', '2.4GHz'),
@@ -942,82 +959,6 @@
 }
 
 
-def make_v2_signature(sig):
-  """Degrade a v3 / v4 signature to match the equivalent v2 signature.
-
-  v3/v4 signatures include additional information from the Wifi MLME
-  frames, based on experience of working with v1 and v2. Return a string
-  which matches what the v2 signature would have been, by removing
-  the additional information.
-
-  This allows us to retain the base of v2 signatures.
-
-  Args:
-    sig: the text signature.
-
-  Returns:
-    a v2 signature.
-  """
-  new_sig = []
-  for s in sig.split('|'):
-    fields = s.split(',')
-    new_fields = []
-    for x in fields:
-      if x.startswith('extcap:'):
-        val = x[7:]
-        # v2 sig includes only the first 4 bytes, swapped.
-        swapped = ''
-        if len(val) >= 8:
-          swapped = swapped + val[6:8]
-        if len(val) >= 6:
-          swapped = swapped + val[4:6]
-        if len(val) >= 4:
-          swapped = swapped + val[2:4]
-        if len(val) >= 2:
-          swapped = swapped + val[0:2]
-        x = 'extcap:' + swapped
-      if x.startswith('cap') or x.startswith('txpow'):
-        # new fields in v3, omit from v2 sig
-        continue
-      new_fields.append(x)
-    new_sig.append(','.join(new_fields))
-  new_sig[0] = 'wifi'
-  return '|'.join(new_sig)
-
-
-def v2only(field):
-  """Return true if field only occurs in a v2 signature."""
-  labels = set(['htagg', 'htmcs', 'vhtrxmcs', 'vhttxmcs', 'intwrk', 'extcap'])
-  for l in labels:
-    if l in field:
-      return True
-  return False
-
-
-def make_v1_signature(sig):
-  """Degrade a v2 signature to match the equivalent v1 signature.
-
-  v2 signatures include additional information from the Wifi MLME
-  frames, based on experience of working with v1. Return a string
-  which matches what the v1 signature would have been, by removing
-  the additional information.
-
-  This allows us to retain the base of v1 signatures.
-
-  Args:
-    sig: the text signature.
-
-  Returns:
-    a v1 signature.
-  """
-  new_sig = []
-  for s in sig.split('|'):
-    fields = s.split(',')
-    new_fields = [x for x in fields if not v2only(x)]
-    new_sig.append(','.join(new_fields))
-  return '|'.join(new_sig)
-
-
 def performance_characteristics(signature):
   """Parse 802.11n/ac capabilities bitmasks from sig.
 
@@ -1133,10 +1074,8 @@
     return (SHA256, 'Unknown', PerformanceInfo)
   """
 
-  v4_sig = signature.strip()
-  v2_sig = make_v2_signature(v4_sig)
-  v1_sig = make_v1_signature(v2_sig)
-  perf = performance_info(*performance_characteristics(v4_sig))
+  sig = signature.strip()
+  perf = performance_info(*performance_characteristics(sig))
   name = dhcp.LookupHostname(mac)
   opersys = dhcp.LookupOperatingSystem(mac)
   oui = ethernet.LookupOUI(mac)
@@ -1148,11 +1087,10 @@
   for o in oui:
     suffixes.append('|oui:' + o)
   suffixes.append('')
-  for sig in [v4_sig, v2_sig, v1_sig]:
-    for suffix in suffixes:
-      result = database.get(sig + suffix, None)
-      if result is not None:
-        return (result[0], result[1], perf)
+  for suffix in suffixes:
+    result = database.get(sig + suffix, None)
+    if result is not None:
+      return (result[0], result[1], perf)
 
   # We have no idea what the client is.
   slug = 'SHA:' + hashlib.sha256(signature).hexdigest()
@@ -1165,13 +1103,5 @@
     # Remove os, oui, etc qualifiers if present.
     a = k.split('|')
     if len(a) > 3:
-      v4_sig = '|'.join(a[0:3])
-      print 'SHA:' + hashlib.sha256(v4_sig).hexdigest() + ' ' + v[1] + ' (unqualified)'
-
-      v2_sig = make_v2_signature(v4_sig)
-      if v2_sig != v4_sig:
-        print 'SHA:' + hashlib.sha256(v2_sig).hexdigest() + ' ' + v[1] + ' (unqualified, v2)'
-
-      v1_sig = make_v1_signature(v2_sig)
-      if v1_sig != v2_sig:
-        print 'SHA:' + hashlib.sha256(v1_sig).hexdigest() + ' ' + v[1] + ' (unqualified, v1)'
+      sig = '|'.join(a[0:3])
+      print 'SHA:' + hashlib.sha256(sig).hexdigest() + ' ' + v[1] + ' (unqualified)'