]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: Use wpa_supplicant global control interface for P2P
authorJouni Malinen <j@w1.fi>
Sun, 30 Jun 2013 21:13:11 +0000 (00:13 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 30 Jun 2013 21:36:33 +0000 (00:36 +0300)
This allows more consistent interface to be used regardless of which
P2P driver design is used (especially for P2P management operations
over netdev vs. dedicated P2P_DEVICE).

Signed-hostap: Jouni Malinen <j@w1.fi>

tests/hwsim/run-tests.py
tests/hwsim/start.sh
tests/hwsim/test_p2p_discovery.py
tests/hwsim/test_p2p_grpform.py
tests/hwsim/wpasupplicant.py

index 7bdd41496d2fb8ecb76cf9e8d42a412c9d7f7a78..364115a1a9e98a500dc7c1a9c0e73915ac6d639c 100755 (executable)
@@ -49,9 +49,9 @@ def main():
     else:
         test_filter = None
 
-    dev0 = WpaSupplicant('wlan0')
-    dev1 = WpaSupplicant('wlan1')
-    dev2 = WpaSupplicant('wlan2')
+    dev0 = WpaSupplicant('wlan0', '/tmp/wpas-wlan0')
+    dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
+    dev2 = WpaSupplicant('wlan2', '/tmp/wpas-wlan2')
     dev = [ dev0, dev1, dev2 ]
     apdev = [ ]
     apdev.append({"ifname": 'wlan3', "bssid": "02:00:00:00:03:00"})
index c824a47e449ea7ce544876bd68fed80a905dae9e..be5070dd5974f72ef22419c79c39b0b3113121d4 100755 (executable)
@@ -12,9 +12,9 @@ DATE=`date +%s`
 sudo ifconfig hwsim0 up
 sudo $WLANTEST -i hwsim0 -c -d > $DIR/logs/$DATE-hwsim0 &
 sudo tcpdump -ni hwsim0 -s 2500 -w $DIR/logs/$DATE-hwsim0.dump &
-sudo $WPAS -g @abstract:wpas-wlan0 -Dnl80211 -iwlan0 -c $DIR/p2p0.conf -ddKt > $DIR/logs/$DATE-log0 &
-sudo $WPAS -g @abstract:wpas-wlan1 -Dnl80211 -iwlan1 -c $DIR/p2p1.conf -ddKt > $DIR/logs/$DATE-log1 &
-sudo $WPAS -g @abstract:wpas-wlan2 -Dnl80211 -iwlan2 -c $DIR/p2p2.conf -ddKt > $DIR/logs/$DATE-log2 &
+sudo $WPAS -g /tmp/wpas-wlan0 -Gadmin -Dnl80211 -iwlan0 -c $DIR/p2p0.conf -ddKt > $DIR/logs/$DATE-log0 &
+sudo $WPAS -g /tmp/wpas-wlan1 -Gadmin -Dnl80211 -iwlan1 -c $DIR/p2p1.conf -ddKt > $DIR/logs/$DATE-log1 &
+sudo $WPAS -g /tmp/wpas-wlan2 -Gadmin -Dnl80211 -iwlan2 -c $DIR/p2p2.conf -ddKt > $DIR/logs/$DATE-log2 &
 sudo $HAPD -ddKt -g /var/run/hostapd-global -G admin -ddKt > $DIR/logs/$DATE-hostapd &
 sleep 1
 sudo chown $USER $DIR/logs/$DATE-hwsim0.dump
index 0b0c7beb42b3e270b927c569a4b54b982c6ce339..f1029c82cbcffe1f2056afbe006e78e1805c567e 100644 (file)
@@ -23,14 +23,14 @@ def test_discovery(dev):
         raise Exception("Device discovery timed out")
 
     logger.info("Test provision discovery for display")
-    dev[0].request("P2P_PROV_DISC " + addr1 + " display")
-    ev1 = dev[1].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=15)
+    dev[0].global_request("P2P_PROV_DISC " + addr1 + " display")
+    ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=15)
     if ev1 is None:
         raise Exception("Provision discovery timed out (display/dev1)")
     if addr0 not in ev1:
         raise Exception("Dev0 not in provision discovery event")
-    ev0 = dev[0].wait_event(["P2P-PROV-DISC-ENTER-PIN",
-                             "P2P-PROV-DISC-FAILURE"], timeout=15)
+    ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-ENTER-PIN",
+                                    "P2P-PROV-DISC-FAILURE"], timeout=15)
     if ev0 is None:
         raise Exception("Provision discovery timed out (display/dev0)")
     if "P2P-PROV-DISC-FAILURE" in ev0:
@@ -39,14 +39,15 @@ def test_discovery(dev):
         raise Exception("Dev1 not in provision discovery event")
 
     logger.info("Test provision discovery for keypad")
-    dev[0].request("P2P_PROV_DISC " + addr1 + " keypad")
-    ev1 = dev[1].wait_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=15)
+    dev[0].global_request("P2P_PROV_DISC " + addr1 + " keypad")
+    ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=15)
     if ev1 is None:
         raise Exception("Provision discovery timed out (keypad/dev1)")
     if addr0 not in ev1:
         raise Exception("Dev0 not in provision discovery event")
-    ev0 = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN", "P2P-PROV-DISC-FAILURE"],
-                            timeout=15)
+    ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN",
+                                    "P2P-PROV-DISC-FAILURE"],
+                                   timeout=15)
     if ev0 is None:
         raise Exception("Provision discovery timed out (keypad/dev0)")
     if "P2P-PROV-DISC-FAILURE" in ev0:
@@ -55,14 +56,15 @@ def test_discovery(dev):
         raise Exception("Dev1 not in provision discovery event")
 
     logger.info("Test provision discovery for push button")
-    dev[0].request("P2P_PROV_DISC " + addr1 + " pbc")
-    ev1 = dev[1].wait_event(["P2P-PROV-DISC-PBC-REQ"], timeout=15)
+    dev[0].global_request("P2P_PROV_DISC " + addr1 + " pbc")
+    ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-PBC-REQ"], timeout=15)
     if ev1 is None:
         raise Exception("Provision discovery timed out (pbc/dev1)")
     if addr0 not in ev1:
         raise Exception("Dev0 not in provision discovery event")
-    ev0 = dev[0].wait_event(["P2P-PROV-DISC-PBC-RESP", "P2P-PROV-DISC-FAILURE"],
-                            timeout=15)
+    ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-PBC-RESP",
+                                    "P2P-PROV-DISC-FAILURE"],
+                                   timeout=15)
     if ev0 is None:
         raise Exception("Provision discovery timed out (pbc/dev0)")
     if "P2P-PROV-DISC-FAILURE" in ev0:
index c861eb68a1097841fb04c45fc57c9e6c4b3fa5c8..6bba55bd0584038dfb23e4e1d05cb90972a55779 100644 (file)
@@ -40,7 +40,7 @@ def go_neg_pin(i_dev, r_dev, i_intent=None, r_intent=None, i_method='enter', r_m
     t = threading.Thread(target=go_neg_init, args=(i_dev, r_dev, pin, i_method, i_intent, res))
     t.start()
     logger.debug("Wait for GO Negotiation Request on r_dev")
-    ev = r_dev.wait_event(["P2P-GO-NEG-REQUEST"], timeout=15)
+    ev = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
     if ev is None:
         raise Exception("GO Negotiation timed out")
     r_dev.dump_monitor()
@@ -92,7 +92,7 @@ def go_neg_pbc(i_dev, r_dev, i_intent=None, r_intent=None):
     t = threading.Thread(target=go_neg_init_pbc, args=(i_dev, r_dev, i_intent, res))
     t.start()
     logger.debug("Wait for GO Negotiation Request on r_dev")
-    ev = r_dev.wait_event(["P2P-GO-NEG-REQUEST"], timeout=15)
+    ev = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
     if ev is None:
         raise Exception("GO Negotiation timed out")
     r_dev.dump_monitor()
index ce1367f18736e39d5ef9a75d6225aee87f02a65b..3e8036e393f375fd05104e6c14ad818f79fa9640 100644 (file)
@@ -16,17 +16,30 @@ logger = logging.getLogger(__name__)
 wpas_ctrl = '/var/run/wpa_supplicant'
 
 class WpaSupplicant:
-    def __init__(self, ifname):
+    def __init__(self, ifname, global_iface=None):
         self.ifname = ifname
         self.group_ifname = None
         self.ctrl = wpaspy.Ctrl(os.path.join(wpas_ctrl, ifname))
         self.mon = wpaspy.Ctrl(os.path.join(wpas_ctrl, ifname))
         self.mon.attach()
 
+        self.global_iface = global_iface
+        if global_iface:
+            self.global_ctrl = wpaspy.Ctrl(global_iface)
+            self.global_mon = wpaspy.Ctrl(global_iface)
+            self.global_mon.attach()
+
     def request(self, cmd):
         logger.debug(self.ifname + ": CTRL: " + cmd)
         return self.ctrl.request(cmd)
 
+    def global_request(self, cmd):
+        if self.global_iface is None:
+            self.request(cmd)
+        else:
+            logger.debug(self.ifname + ": CTRL: " + cmd)
+            return self.global_ctrl.request(cmd)
+
     def group_request(self, cmd):
         if self.group_ifname and self.group_ifname != self.ifname:
             logger.debug(self.group_ifname + ": CTRL: " + cmd)
@@ -142,15 +155,15 @@ class WpaSupplicant:
         return self.get_group_status_field("address")
 
     def p2p_listen(self):
-        return self.request("P2P_LISTEN")
+        return self.global_request("P2P_LISTEN")
 
     def p2p_find(self, social=False):
         if social:
-            return self.request("P2P_FIND type=social")
-        return self.request("P2P_FIND")
+            return self.global_request("P2P_FIND type=social")
+        return self.global_request("P2P_FIND")
 
     def p2p_stop_find(self):
-        return self.request("P2P_STOP_FIND")
+        return self.global_request("P2P_STOP_FIND")
 
     def wps_read_pin(self):
         #TODO: make this random
@@ -158,7 +171,7 @@ class WpaSupplicant:
         return self.pin
 
     def peer_known(self, peer, full=True):
-        res = self.request("P2P_PEER " + peer)
+        res = self.global_request("P2P_PEER " + peer)
         if peer.lower() not in res.lower():
             return False
         if not full:
@@ -221,12 +234,12 @@ class WpaSupplicant:
         cmd = "P2P_CONNECT " + peer + " " + pin + " " + method + " auth"
         if go_intent:
             cmd = cmd + ' go_intent=' + str(go_intent)
-        if "OK" in self.request(cmd):
+        if "OK" in self.global_request(cmd):
             return None
         raise Exception("P2P_CONNECT (auth) failed")
 
     def p2p_go_neg_auth_result(self, timeout=1, expect_failure=False):
-        ev = self.wait_event(["P2P-GROUP-STARTED","P2P-GO-NEG-FAILURE"], timeout);
+        ev = self.wait_global_event(["P2P-GROUP-STARTED","P2P-GO-NEG-FAILURE"], timeout);
         if ev is None:
             if expect_failure:
                 return None
@@ -244,11 +257,11 @@ class WpaSupplicant:
             cmd = "P2P_CONNECT " + peer + " " + method
         if go_intent:
             cmd = cmd + ' go_intent=' + str(go_intent)
-        if "OK" in self.request(cmd):
+        if "OK" in self.global_request(cmd):
             if timeout == 0:
                 self.dump_monitor()
                 return None
-            ev = self.wait_event(["P2P-GROUP-STARTED","P2P-GO-NEG-FAILURE"], timeout)
+            ev = self.wait_global_event(["P2P-GROUP-STARTED","P2P-GO-NEG-FAILURE"], timeout)
             if ev is None:
                 if expect_failure:
                     return None
@@ -270,6 +283,22 @@ class WpaSupplicant:
                         return ev
         return None
 
+    def wait_global_event(self, events, timeout):
+        if self.global_iface is None:
+            self.wait_event(events, timeout)
+        else:
+            count = 0
+            while count < timeout * 10:
+                count = count + 1
+                time.sleep(0.1)
+                while self.global_mon.pending():
+                    ev = self.global_mon.recv()
+                    logger.debug(self.ifname + ": " + ev)
+                    for event in events:
+                        if event in ev:
+                            return ev
+        return None
+
     def dump_monitor(self):
         while self.mon.pending():
             ev = self.mon.recv()
@@ -278,7 +307,7 @@ class WpaSupplicant:
     def remove_group(self, ifname=None):
         if ifname is None:
             ifname = self.group_ifname if self.group_ifname else self.iname
-        if "OK" not in self.request("P2P_GROUP_REMOVE " + ifname):
+        if "OK" not in self.global_request("P2P_GROUP_REMOVE " + ifname):
             raise Exception("Group could not be removed")
         self.group_ifname = None
 
@@ -293,8 +322,8 @@ class WpaSupplicant:
             cmd = cmd + " persistent=" + str(persistent)
         if freq:
             cmd = cmd + " freq=" + freq
-        if "OK" in self.request(cmd):
-            ev = self.wait_event(["P2P-GROUP-STARTED"], timeout=5)
+        if "OK" in self.global_request(cmd):
+            ev = self.wait_global_event(["P2P-GROUP-STARTED"], timeout=5)
             if ev is None:
                 raise Exception("GO start up timed out")
             self.dump_monitor()
@@ -313,11 +342,11 @@ class WpaSupplicant:
             raise Exception("GO " + go_addr + " not found")
         self.dump_monitor()
         cmd = "P2P_CONNECT " + go_addr + " " + pin + " join"
-        if "OK" in self.request(cmd):
+        if "OK" in self.global_request(cmd):
             if timeout == 0:
                 self.dump_monitor()
                 return None
-            ev = self.wait_event(["P2P-GROUP-STARTED"], timeout)
+            ev = self.wait_global_event(["P2P-GROUP-STARTED"], timeout)
             if ev is None:
                 raise Exception("Joining the group timed out")
             self.dump_monitor()