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 hapd.wait_sta() 123 hwsim_utils.test_connectivity(wpas, hapd) 124 125 wpas.request("DISCONNECT") 126 wpas.wait_disconnected() 127 wpas.dump_monitor() 128 129def test_connect_cmd_reject_assoc(dev, apdev): 130 """Connection using cfg80211 connect command getting rejected""" 131 params = {"ssid": "sta-connect"} 132 hapd = 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 with fail_test(hapd, 1, "hostapd_get_aid"): 137 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 138 wait_connect=False) 139 ev = wpas.wait_event(["CTRL-EVENT-ASSOC-REJECT"], timeout=15) 140 if ev is None: 141 raise Exception("Association rejection timed out") 142 if "status_code=17" not in ev: 143 raise Exception("Unexpected rejection status code") 144 145 wpas.request("DISCONNECT") 146 wpas.dump_monitor() 147 148def test_connect_cmd_disconnect_event(dev, apdev): 149 """Connection using cfg80211 connect command getting disconnected by the AP""" 150 params = {"ssid": "sta-connect"} 151 hapd = hostapd.add_ap(apdev[0], params) 152 153 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 154 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 155 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") 156 157 if "OK" not in hapd.request("DEAUTHENTICATE " + wpas.p2p_interface_addr()): 158 raise Exception("DEAUTHENTICATE command failed") 159 ev = wpas.wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=5) 160 if ev is None: 161 raise Exception("Disconnection event timed out") 162 # This event was actually based on deauthenticate event since we force 163 # connect command to be used with a driver that supports auth+assoc for 164 # testing purposes. Anyway, wait some time to allow the debug log to capture 165 # the following NL80211_CMD_DISCONNECT event. 166 time.sleep(0.1) 167 wpas.dump_monitor() 168 169 # Clean up to avoid causing issue for following test cases 170 wpas.request("REMOVE_NETWORK all") 171 wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=2) 172 wpas.flush_scan_cache() 173 wpas.dump_monitor() 174 wpas.interface_remove("wlan5") 175 del wpas 176 177def test_connect_cmd_roam(dev, apdev): 178 """cfg80211 connect command to trigger roam""" 179 params = {"ssid": "sta-connect"} 180 hostapd.add_ap(apdev[0], params) 181 182 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 183 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 184 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412") 185 wpas.dump_monitor() 186 187 hostapd.add_ap(apdev[1], params) 188 wpas.scan_for_bss(apdev[1]['bssid'], freq=2412, force_scan=True) 189 wpas.roam(apdev[1]['bssid']) 190 time.sleep(0.1) 191 wpas.request("DISCONNECT") 192 wpas.wait_disconnected() 193 wpas.dump_monitor() 194 195def test_connect_cmd_wpa_psk_roam(dev, apdev): 196 """WPA2/WPA-PSK connection using cfg80211 connect command to trigger roam""" 197 params = hostapd.wpa2_params(ssid="sta-connect", passphrase="12345678") 198 hostapd.add_ap(apdev[0], params) 199 200 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 201 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 202 wpas.connect("sta-connect", psk="12345678", scan_freq="2412") 203 wpas.dump_monitor() 204 205 params = hostapd.wpa_params(ssid="sta-connect", passphrase="12345678") 206 hostapd.add_ap(apdev[1], params) 207 wpas.scan_for_bss(apdev[1]['bssid'], freq=2412, force_scan=True) 208 wpas.roam(apdev[1]['bssid']) 209 time.sleep(0.1) 210 wpas.request("DISCONNECT") 211 wpas.wait_disconnected() 212 wpas.dump_monitor() 213 214def test_connect_cmd_bssid_hint(dev, apdev): 215 """cfg80211 connect command with bssid_hint""" 216 params = {"ssid": "sta-connect"} 217 hostapd.add_ap(apdev[0], params) 218 hostapd.add_ap(apdev[1], params) 219 220 # This does not really give full coverage with mac80211_hwsim since the 221 # driver does not end up claiming support for driver-based BSS selection. 222 # Anyway, some test coverage can be achieved for setting the parameter and 223 # checking that it does not prevent connection with another BSSID. 224 225 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') 226 wpas.interface_add("wlan5", drv_params="force_connect_cmd=1") 227 228 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 229 bssid_hint=apdev[0]['bssid']) 230 wpas.request("REMOVE_NETWORK all") 231 wpas.wait_disconnected() 232 wpas.dump_monitor() 233 234 wpas.request("BSS_FLUSH 0") 235 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 236 bssid_hint='22:33:44:55:66:77') 237 wpas.request("REMOVE_NETWORK all") 238 wpas.wait_disconnected() 239 wpas.dump_monitor() 240 241 # Additional coverage using ap_scan=2 to prevent scan entry -based selection 242 # within wpa_supplicant from overriding bssid_hint. 243 244 try: 245 if "OK" not in wpas.request("AP_SCAN 2"): 246 raise Exception("Failed to set AP_SCAN 2") 247 wpas.request("BSS_FLUSH 0") 248 wpas.connect("sta-connect", key_mgmt="NONE", scan_freq="2412", 249 bssid_hint='22:33:44:55:66:77') 250 wpas.request("REMOVE_NETWORK all") 251 wpas.wait_disconnected() 252 wpas.dump_monitor() 253 finally: 254 wpas.request("AP_SCAN 1") 255 wpas.flush_scan_cache() 256