Merge "conman: Determine client connection status using key_mgmt."
diff --git a/conman/connection_manager.py b/conman/connection_manager.py
index e6299f0..e7ab9af 100755
--- a/conman/connection_manager.py
+++ b/conman/connection_manager.py
@@ -95,7 +95,9 @@
def client_up(self):
wpa_status = self.wifi.wpa_status()
return (wpa_status.get('wpa_state') == 'COMPLETED'
- and wpa_status.get('ssid') == self.ssid)
+ # NONE indicates we're on a provisioning network; anything else
+ # suggests we're already on the WLAN.
+ and wpa_status.get('key_mgmt') != 'NONE')
def start_access_point(self):
"""Start an access point."""
diff --git a/conman/connection_manager_test.py b/conman/connection_manager_test.py
index 1616174..eba9f47 100755
--- a/conman/connection_manager_test.py
+++ b/conman/connection_manager_test.py
@@ -183,6 +183,7 @@
def start_client(self):
client_was_up = self.client_up
was_attached = self.wifi.attached()
+ self.wifi._secure_testonly = True
# Do this before calling the super method so that the attach call at the end
# succeeds.
if not client_was_up and not was_attached:
@@ -196,6 +197,7 @@
if was_attached:
self.wifi._wpa_control.ssid_testonly = self.ssid
+ self.wifi._wpa_control.secure_testonly = True
self.wifi.add_connected_event()
# Normally, wpa_supplicant would bring up the client interface, which
@@ -303,6 +305,7 @@
for wifi in self.wifi_interfaces_already_up:
# pylint: disable=protected-access
self.interface_by_name(wifi)._initial_ssid_testonly = 'my ssid'
+ self.interface_by_name(wifi)._secure_testonly = True
@property
def IP_LINK(self):
@@ -325,10 +328,12 @@
def connect(connection_check_result):
# pylint: disable=protected-access
if wifi.attached():
- wifi._wpa_control._ssid_testonly = bss_info.ssid
+ wifi._wpa_control.ssid_testonly = bss_info.ssid
+ wifi._wpa_control.secure_testonly = False
wifi.add_connected_event()
else:
wifi._initial_ssid_testonly = bss_info.ssid
+ wifi._secure_testonly = False
wifi.start_wpa_supplicant_testonly(self._wpa_control_interface)
wifi.set_connection_check_result(connection_check_result)
self.ifplugd_action(wifi.name, True)
diff --git a/conman/interface.py b/conman/interface.py
index 7e37306..1b77b18 100755
--- a/conman/interface.py
+++ b/conman/interface.py
@@ -474,6 +474,7 @@
self._client_mode = False
self._ssid = None
self._status = None
+ self._security = None
self._events = []
@@ -500,6 +501,7 @@
client_mode = self._qcsapi('get_mode', 'wifi0') == 'Station'
ssid = self._qcsapi('get_ssid', 'wifi0')
status = self._qcsapi('get_status', 'wifi0')
+ security = self._qcsapi('ssid_get_authentication_mode', 'wifi0', ssid)
except subprocess.CalledProcessError:
# If QCSAPI failed, skip update.
return
@@ -529,6 +531,7 @@
self._client_mode = client_mode
self._ssid = ssid
self._status = status
+ self._security = security
def recv(self):
return self._events.pop(0)
@@ -544,7 +547,8 @@
if not self._client_mode or not self._ssid:
return ''
- return 'wpa_state=COMPLETED\nssid=%s' % self._ssid
+ return ('wpa_state=COMPLETED\nssid=%s\nkey_mgmt=%s' %
+ (self._ssid, self._security or 'NONE'))
class FrenzyWifi(Wifi):
diff --git a/conman/interface_test.py b/conman/interface_test.py
index 4c7d52b..5b9d431 100755
--- a/conman/interface_test.py
+++ b/conman/interface_test.py
@@ -78,6 +78,7 @@
self.attached = False
self.connected = False
self.ssid_testonly = None
+ self.secure_testonly = False
self.request_status_fails = False
def pending(self):
@@ -96,6 +97,7 @@
def detach(self):
self.attached = False
self.ssid_testonly = None
+ self.secure_testonly = False
self.connected = False
self.check_socket_exists('wpactrl_detach failed')
@@ -103,8 +105,12 @@
if request_type == 'STATUS':
if self.request_status_fails:
raise wpactrl.error('test error')
- return ('foo\nwpa_state=COMPLETED\nssid=%s\nbar' % self.ssid_testonly
- if self.connected else 'foo')
+ if self.connected:
+ return ('foo\nwpa_state=COMPLETED\nssid=%s\nkey_mgmt=%s\nbar' %
+ (self.ssid_testonly,
+ 'WPA2-PSK' if self.secure_testonly else 'NONE'))
+ else:
+ return 'wpa_state=SCANNING\naddress=12:34:56:78:90:ab'
else:
raise ValueError('Invalid request_type %s' % request_type)
@@ -142,6 +148,7 @@
def __init__(self, *args, **kwargs):
super(Wifi, self).__init__(*args, **kwargs)
self._initial_ssid_testonly = None
+ self._secure_testonly = False
def attach_wpa_control(self, path):
if self._initial_ssid_testonly and self._wpa_control:
@@ -153,6 +160,7 @@
if self._initial_ssid_testonly:
result.connected = True
result.ssid_testonly = self._initial_ssid_testonly
+ result.secure_testonly = self._secure_testonly
return result
def add_connected_event(self):
@@ -161,16 +169,19 @@
def add_disconnected_event(self):
self._initial_ssid_testonly = None
+ self._secure_testonly = False
if self.attached():
self._wpa_control.add_disconnected_event()
def add_terminating_event(self):
self._initial_ssid_testonly = None
+ self._secure_testonly = False
if self.attached():
self._wpa_control.add_terminating_event()
def detach_wpa_control(self):
self._initial_ssid_testonly = None
+ self._secure_testonly = False
super(Wifi, self).detach_wpa_control()
def start_wpa_supplicant_testonly(self, path):
@@ -191,6 +202,7 @@
def __init__(self, *args, **kwargs):
super(FrenzyWPACtrl, self).__init__(*args, **kwargs)
self.ssid_testonly = None
+ self.secure_testonly = False
self.request_status_fails = False
def _qcsapi(self, *command):
@@ -199,15 +211,21 @@
def add_connected_event(self):
self.fake_qcsapi['get_mode'] = 'Station'
self.fake_qcsapi['get_ssid'] = self.ssid_testonly
+ security = 'PSKAuthentication' if self.secure_testonly else 'NONE'
+ self.fake_qcsapi['ssid_get_authentication_mode'] = security
def add_disconnected_event(self):
self.ssid_testonly = None
+ self.secure_testonly = False
self.fake_qcsapi['get_ssid'] = None
+ self.fake_qcsapi['ssid_get_authentication_mode'] = 'NONE'
def add_terminating_event(self):
self.ssid_testonly = None
+ self.secure_testonly = False
self.fake_qcsapi['get_ssid'] = None
self.fake_qcsapi['get_mode'] = 'AP'
+ self.fake_qcsapi['ssid_get_authentication_mode'] = 'NONE'
def detach(self):
self.add_terminating_event()
@@ -226,12 +244,14 @@
def __init__(self, *args, **kwargs):
super(FrenzyWifi, self).__init__(*args, **kwargs)
self._initial_ssid_testonly = None
+ self._secure_testonly = False
self.fake_qcsapi = {}
def attach_wpa_control(self, *args, **kwargs):
super(FrenzyWifi, self).attach_wpa_control(*args, **kwargs)
if self._wpa_control:
self._wpa_control.ssid_testonly = self._initial_ssid_testonly
+ self._wpa_control.secure_testonly = self._secure_testonly
if self._initial_ssid_testonly:
self._wpa_control.add_connected_event()
@@ -241,6 +261,7 @@
if self._initial_ssid_testonly:
result.fake_qcsapi['get_mode'] = 'Station'
result.ssid_testonly = self._initial_ssid_testonly
+ result.secure_testonly = self._secure_testonly
result.add_connected_event()
return result
@@ -250,16 +271,19 @@
def add_disconnected_event(self):
self._initial_ssid_testonly = None
+ self._secure_testonly = False
if self.attached():
self._wpa_control.add_disconnected_event()
def add_terminating_event(self):
self._initial_ssid_testonly = None
+ self._secure_testonly = False
if self.attached():
self._wpa_control.add_terminating_event()
def detach_wpa_control(self):
self._initial_ssid_testonly = None
+ self._secure_testonly = False
super(FrenzyWifi, self).detach_wpa_control()
def start_wpa_supplicant_testonly(self, unused_path):