Add regulatory test for channel move

Inject an 802.11h Spectrum Management Channel Switch Action Frame
into an actively running 802.11 connection and ensure that the
client vacates the channel.

CQ-DEPEND=CL:*39532
BUG=chrome-os-partner:19953
TEST=This is a test; Passes with Lumpy.  Fails with daisy ToT, and
passes with daisy with kernel changes to support 802.11h.

Change-Id: I25a5d35e5a7f0c429ea52eb38ab9a8fce6c27211
Reviewed-on: https://gerrit.chromium.org/gerrit/58431
Reviewed-by: Christopher Wiley <[email protected]>
Tested-by: Paul Stewart <[email protected]>
Commit-Queue: Paul Stewart <[email protected]>
diff --git a/server/site_linux_system.py b/server/site_linux_system.py
index 7b3b2f4..d4c8dff 100644
--- a/server/site_linux_system.py
+++ b/server/site_linux_system.py
@@ -23,6 +23,7 @@
     CAPABILITY_MULTI_AP = 'multi_ap'
     CAPABILITY_MULTI_AP_SAME_BAND = 'multi_ap_same_band'
     CAPABILITY_IBSS = 'ibss_supported'
+    CAPABILITY_SEND_MANAGEMENT_FRAME = 'send_management_frame'
 
 
     @property
@@ -250,7 +251,7 @@
         return phys[0]
 
 
-    def _get_wlanif(self, frequency, phytype, mode = None):
+    def _get_wlanif(self, frequency, phytype, mode = None, same_phy_as = None):
         """Get a WiFi device that supports the given frequency, mode, and type.
 
         This function is used by inherited classes, so we use the single '_'
@@ -263,10 +264,18 @@
         @param frequency int WiFi frequency to support.
         @param phytype string type of phy (e.g. 'monitor').
         @param mode string 'a' 'b' or 'g'.
+        @param same_phy_as string create the interface on the same phy as this.
         @return string WiFi device.
 
         """
-        if mode in ('b', 'g') and self.phydev2 is not None:
+        if same_phy_as:
+            for phy, wlanif_i, phytype_i in self.wlanifs_in_use:
+                if wlanif_i == same_phy_as:
+                     break
+            else:
+                raise error.TestFail('Unable to find phy for interface %s' %
+                                     same_phy_as)
+        elif mode in ('b', 'g') and self.phydev2 is not None:
             phy = self.phydev2
         elif mode == 'a' and self.phydev5 is not None:
             phy = self.phydev5