1# cfg80211 connect command (SME in the driver/firmware) 2# Copyright (c) 2013, Jouni Malinen <j@w1.fi> 3# 4# This software may be distributed under the terms of the BSD license. 5# See README for more details. 6 7import logging 8logger = logging.getLogger() 9import time 10 11import hwsim_utils 12import hostapd 13from wpasupplicant import WpaSupplicant 14from p2p_utils import * 15from utils import * 16 17def test_connect_cmd_open(dev, apdev): 18 """Open connection using cfg80211 connect command""" 19 params = {"ssid": "sta-connect", 20 "manage_p2p": "1", 21 "allow_cross_connection": "1"} 22 hostapd.add_ap(apdev[0], params) 23 24 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 25 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 26 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 27 bg_scan_period="1") 28 wpas.dump_monitor() 29 wpas.request("DISCONNECT") 30 wpas.wait_disconnected() 31 wpas.dump_monitor() 32 33def test_connect_cmd_wep(dev, apdev): 34 """WEP Open System using cfg80211 connect command""" 35 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 36 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 37 check_wep_capa(wpas) 38 39 params = {"ssid": "sta-connect-wep", "wep_key0": '"hello"'} 40 hapd = hostapd.add_ap(apdev[0], params) 41 42 wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", 43 wep_key0='"hello"') 44 wpas.dump_monitor() 45 hwsim_utils.test_connectivity(wpas, hapd) 46 wpas.request("DISCONNECT") 47 wpas.wait_disconnected() 48 wpas.dump_monitor() 49 50def test_connect_cmd_wep_shared(dev, apdev): 51 """WEP Shared key using cfg80211 connect command""" 52 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 53 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 54 check_wep_capa(wpas) 55 56 params = {"ssid": "sta-connect-wep", "wep_key0": '"hello"', 57 "auth_algs": "2"} 58 hapd = hostapd.add_ap(apdev[0], params) 59 60 id = wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", 61 auth_alg="SHARED", wep_key0='"hello"') 62 wpas.dump_monitor() 63 hwsim_utils.test_connectivity(wpas, hapd) 64 wpas.request("DISCONNECT") 65 wpas.remove_network(id) 66 wpas.connect("sta-connect-wep", key_mgmt="NONE", scan_freq="2412", 67 auth_alg="OPEN SHARED", wep_key0='"hello"') 68 wpas.dump_monitor() 69 hwsim_utils.test_connectivity(wpas, hapd) 70 wpas.request("DISCONNECT") 71 wpas.wait_disconnected() 72 wpas.dump_monitor() 73 74def test_connect_cmd_p2p_management(dev, apdev): 75 """Open connection using cfg80211 connect command and AP using P2P management""" 76 params = {"ssid": "sta-connect", 77 "manage_p2p": "1", 78 "allow_cross_connection": "0"} 79 hostapd.add_ap(apdev[0], params) 80 81 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 82 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 83 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") 84 wpas.dump_monitor() 85 wpas.request("DISCONNECT") 86 wpas.wait_disconnected() 87 wpas.dump_monitor() 88 89def test_connect_cmd_wpa2_psk(dev, apdev): 90 """WPA2-PSK connection using cfg80211 connect command""" 91 params = hostapd.wpa2_params(ssid="sta-connect", passphrase="12345678") 92 hostapd.add_ap(apdev[0], params) 93 94 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 95 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 96 wpas.connect("sta-connect", psk="12345678", scan_freq="2412") 97 wpas.dump_monitor() 98 wpas.request("DISCONNECT") 99 wpas.wait_disconnected() 100 wpas.dump_monitor() 101 102def test_connect_cmd_concurrent_grpform_while_connecting(dev, apdev): 103 """Concurrent P2P group formation while connecting to an AP using cfg80211 connect command""" 104 logger.info("Start connection to an infrastructure AP") 105 hapd = hostapd.add_ap(apdev[0], {"ssid": "test-open"}) 106 107 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 108 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 109 wpas.connect("test-open", key_mgmt="NONE", wait_connect=False) 110 wpas.dump_monitor() 111 112 logger.info("Form a P2P group while connecting to an AP") 113 wpas.request("SET p2p_no_group_iface 0") 114 115 [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_freq=2412, 116 r_dev=wpas, r_freq=2412) 117 check_grpform_results(i_res, r_res) 118 remove_group(dev[0], wpas) 119 wpas.dump_monitor() 120 121 logger.info("Confirm AP connection after P2P group removal") 122 hwsim_utils.test_connectivity(wpas, hapd) 123 124 wpas.request("DISCONNECT") 125 wpas.wait_disconnected() 126 wpas.dump_monitor() 127 128def test_connect_cmd_reject_assoc(dev, apdev): 129 """Connection using cfg80211 connect command getting rejected""" 130 params = {"ssid": "sta-connect", 131 "require_ht": "1"} 132 hostapd.add_ap(apdev[0], params) 133 134 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 135 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 136 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 137 disable_ht="1", wait_connect=False) 138 ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15) 139 if ev is None: 140 raise Exception("Association rejection timed out") 141 if "status_code=27" not in ev: 142 raise Exception("Unexpected rejection status code") 143 144 wpas.request("DISCONNECT") 145 wpas.dump_monitor() 146 147def test_connect_cmd_disconnect_event(dev, apdev): 148 """Connection using cfg80211 connect command getting disconnected by the AP""" 149 params = {"ssid": "sta-connect"} 150 hapd = hostapd.add_ap(apdev[0], params) 151 152 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 153 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 154 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") 155 156 if "OK" not in hapd.request("DEAUTHENTICATE " + wpas.p2p_interface_addr()): 157 raise Exception("DEAUTHENTICATE command failed") 158 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=5) 159 if ev is None: 160 raise Exception("Disconnection event timed out") 161 # This event was actually based on deauthenticate event since we force 162 # connect command to be used with a driver that supports auth+assoc for 163 # testing purposes. Anyway, wait some time to allow the debug log to capture 164 # the following NL80211_CMD_DISCONNECT event. 165 time.sleep(0.1) 166 wpas.dump_monitor() 167 168 # Clean up to avoid causing issue for following test cases 169 wpas.request("REMOVE_NETWORK all") 170 wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=2) 171 wpas.flush_scan_cache() 172 wpas.dump_monitor() 173 wpas.interface_remove("wlan5") 174 del wpas 175 176def test_connect_cmd_roam(dev, apdev): 177 """cfg80211 connect command to trigger roam""" 178 params = {"ssid": "sta-connect"} 179 hostapd.add_ap(apdev[0], params) 180 181 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 182 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 183 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") 184 wpas.dump_monitor() 185 186 hostapd.add_ap(apdev[1], params) 187 wpas.scan_for_bss(apdev[1]['bssid'], freq=2412, force_scan=True) 188 wpas.roam(apdev[1]['bssid']) 189 time.sleep(0.1) 190 wpas.request("DISCONNECT") 191 wpas.wait_disconnected() 192 wpas.dump_monitor() 193 194def test_connect_cmd_wpa_psk_roam(dev, apdev): 195 """WPA2/WPA-PSK connection using cfg80211 connect command to trigger roam""" 196 params = hostapd.wpa2_params(ssid="sta-connect", passphrase="12345678") 197 hostapd.add_ap(apdev[0], params) 198 199 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 200 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 201 wpas.connect("sta-connect", psk="12345678", scan_freq="2412") 202 wpas.dump_monitor() 203 204 params = hostapd.wpa_params(ssid="sta-connect", passphrase="12345678") 205 hostapd.add_ap(apdev[1], params) 206 wpas.scan_for_bss(apdev[1]['bssid'], freq=2412, force_scan=True) 207 wpas.roam(apdev[1]['bssid']) 208 time.sleep(0.1) 209 wpas.request("DISCONNECT") 210 wpas.wait_disconnected() 211 wpas.dump_monitor() 212 213def test_connect_cmd_bssid_hint(dev, apdev): 214 """cfg80211 connect command with bssid_hint""" 215 params = {"ssid": "sta-connect"} 216 hostapd.add_ap(apdev[0], params) 217 hostapd.add_ap(apdev[1], params) 218 219 # This does not really give full coverage with mac80211_hwsim since the 220 # driver does not end up claiming support for driver-based BSS selection. 221 # Anyway, some test coverage can be achieved for setting the parameter and 222 # checking that it does not prevent connection with another BSSID. 223 224 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 225 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 226 227 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 228 bssid_hint=apdev[0]['bssid']) 229 wpas.request("REMOVE_NETWORK all") 230 wpas.wait_disconnected() 231 wpas.dump_monitor() 232 233 wpas.request("BSS_FLUSH 0") 234 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 235 bssid_hint='22:33:44:55:66:77') 236 wpas.request("REMOVE_NETWORK all") 237 wpas.wait_disconnected() 238 wpas.dump_monitor() 239 240 # Additional coverage using ap_scan=2 to prevent scan entry -based selection 241 # within wpa_supplicant from overriding bssid_hint. 242 243 try: 244 if "OK" not in wpas.request("AP_SCAN 2"): 245 raise Exception("Failed to set AP_SCAN 2") 246 wpas.request("BSS_FLUSH 0") 247 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 248 bssid_hint='22:33:44:55:66:77') 249 wpas.request("REMOVE_NETWORK all") 250 wpas.wait_disconnected() 251 wpas.dump_monitor() 252 finally: 253 wpas.request("AP_SCAN 1") 254 wpas.flush_scan_cache() 255