Merge "[WifiBaseTest] Add support for Wifi Enterprise in hostapd"
diff --git a/acts/framework/acts/controllers/ap_lib/hostapd_ap_preset.py b/acts/framework/acts/controllers/ap_lib/hostapd_ap_preset.py
index 6088903..9120725 100644
--- a/acts/framework/acts/controllers/ap_lib/hostapd_ap_preset.py
+++ b/acts/framework/acts/controllers/ap_lib/hostapd_ap_preset.py
@@ -54,8 +54,8 @@
 
     # The Onhub uses wlan0, wlan1 as the WAN interfaces, while the Gale uses
     # wlan-2400mhz, wlan-5000mhz.
-    if iface_wlan_2g not in hotapd_constants.INTERFACE_2G_LIST or \
-       iface_wlan_5g not in hotapd_constants.INTERFACE_5G_LIST:
+    if iface_wlan_2g not in hostapd_constants.INTERFACE_2G_LIST or \
+       iface_wlan_5g not in hostapd_constants.INTERFACE_5G_LIST:
         raise ValueError('Incorrect interface name was passed.')
 
     force_wmm = None
diff --git a/acts/framework/acts/controllers/ap_lib/hostapd_config.py b/acts/framework/acts/controllers/ap_lib/hostapd_config.py
index bfc0ca3..2d39875 100644
--- a/acts/framework/acts/controllers/ap_lib/hostapd_config.py
+++ b/acts/framework/acts/controllers/ap_lib/hostapd_config.py
@@ -455,7 +455,7 @@
         self._scenario_name = scenario_name
         self._min_streams = min_streams
 
-        self._bss_lookup = {}
+        self._bss_lookup = collections.OrderedDict()
         for bss in bss_settings:
             if bss.name in self._bss_lookup:
                 raise ValueError('Cannot have multiple bss settings with the'
diff --git a/acts/framework/acts/controllers/ap_lib/hostapd_constants.py b/acts/framework/acts/controllers/ap_lib/hostapd_constants.py
index 3d3f233..a5e3b2d 100755
--- a/acts/framework/acts/controllers/ap_lib/hostapd_constants.py
+++ b/acts/framework/acts/controllers/ap_lib/hostapd_constants.py
@@ -22,6 +22,7 @@
 WPA1 = 1
 WPA2 = 2
 MIXED = 3
+ENT = 4 # get the correct constant
 MAX_WPA_PSK_LENGTH = 64
 MIN_WPA_PSK_LENGTH = 8
 WPA_STRICT_REKEY = 1
@@ -32,6 +33,9 @@
 WPA_STRING = 'wpa'
 WPA2_STRING = 'wpa2'
 WPA_MIXED_STRING = 'wpa/wpa2'
+ENT_STRING = 'ent'
+ENT_KEY_MGMT = 'WPA-EAP'
+IEEE8021X = 1
 WLAN0_STRING = 'wlan0'
 WLAN1_STRING = 'wlan1'
 WLAN2_STRING = 'wlan2'
diff --git a/acts/framework/acts/controllers/ap_lib/hostapd_security.py b/acts/framework/acts/controllers/ap_lib/hostapd_security.py
index 6e0ecce..47d41fe 100644
--- a/acts/framework/acts/controllers/ap_lib/hostapd_security.py
+++ b/acts/framework/acts/controllers/ap_lib/hostapd_security.py
@@ -30,7 +30,10 @@
                  wpa2_cipher=hostapd_constants.WPA2_DEFAULT_CIPER,
                  wpa_group_rekey=hostapd_constants.WPA_GROUP_KEY_ROTATION_TIME,
                  wpa_strict_rekey=hostapd_constants.WPA_STRICT_REKEY_DEFAULT,
-                 wep_default_key=hostapd_constants.WEP_DEFAULT_KEY):
+                 wep_default_key=hostapd_constants.WEP_DEFAULT_KEY,
+                 radius_server_ip=None,
+                 radius_server_port=None,
+                 radius_server_secret=None):
         """Gather all of the security settings for WPA-PSK.  This could be
            expanded later.
 
@@ -53,12 +56,18 @@
                               Options: True, False
                               Default: True
             wep_default_key: The wep key number to use when transmitting.
+            radius_server_ip: Radius server IP for Enterprise auth.
+            radius_server_port: Radius server port for Enterprise auth.
+            radius_server_secret: Radius server secret for Enterprise auth.
         """
         self.wpa_cipher = wpa_cipher
         self.wpa2_cipher = wpa2_cipher
         self.wpa_group_rekey = wpa_group_rekey
         self.wpa_strict_rekey = wpa_strict_rekey
         self.wep_default_key = wep_default_key
+        self.radius_server_ip = radius_server_ip
+        self.radius_server_port = radius_server_port
+        self.radius_server_secret = radius_server_secret
         if security_mode == hostapd_constants.WPA_STRING:
             security_mode = hostapd_constants.WPA1
         elif security_mode == hostapd_constants.WPA2_STRING:
@@ -67,6 +76,8 @@
             security_mode = hostapd_constants.MIXED
         elif security_mode == hostapd_constants.WEP_STRING:
             security_mode = hostapd_constants.WEP
+        elif security_mode == hostapd_constants.ENT_STRING:
+            security_mode = hostapd_constants.ENT
         else:
             security_mode = None
         self.security_mode = security_mode
@@ -96,6 +107,13 @@
             if self.security_mode == hostapd_constants.WEP:
                 settings['wep_default_key'] = self.wep_default_key
                 settings['wep_key' + str(self.wep_default_key)] = self.password
+            elif self.security_mode  == hostapd_constants.ENT:
+                settings['auth_server_addr'] = self.radius_server_ip
+                settings['auth_server_port'] = self.radius_server_port
+                settings['auth_server_shared_secret'] = self.radius_server_secret
+                settings['wpa_key_mgmt'] = hostapd_constants.ENT_KEY_MGMT
+                settings['ieee8021x'] = hostapd_constants.IEEE8021X
+                settings['wpa'] = hostapd_constants.WPA2
             else:
                 settings['wpa'] = self.security_mode
                 if len(self.password) == hostapd_constants.MAX_WPA_PSK_LENGTH:
diff --git a/acts/framework/acts/test_utils/wifi/WifiBaseTest.py b/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
index 526673e..4101571e 100755
--- a/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
+++ b/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
@@ -259,6 +259,8 @@
             self.wpa_networks[ap_instance][band]["bssid"] = bssid
         if network["security"] == hostapd_constants.WEP_STRING:
             self.wep_networks[ap_instance][band]["bssid"] = bssid
+        if network["security"] == hostapd_constants.ENT_STRING:
+            self.ent_networks[ap_instance][band]["bssid"] = bssid
         if network["security"] == 'none':
             self.open_network[ap_instance][band]["bssid"] = bssid
 
@@ -303,6 +305,9 @@
             mirror_ap=True,
             wpa_network=False,
             wep_network=False,
+            ent_network=False,
+            radius_conf_2g=None,
+            radius_conf_5g=None,
             ap_count=1):
         asserts.assert_true(
             len(self.user_params["AccessPoint"]) == 2,
@@ -327,6 +332,8 @@
             self.user_params["wpa_networks"] = []
         if wep_network:
             self.user_params["wep_networks"] = []
+        if ent_network:
+            self.user_params["ent_networks"] = []
 
         for count in range(config_count):
 
@@ -388,6 +395,21 @@
                     network_list_2g.append(networks_dict["2g"])
                     network_list_5g.append(networks_dict["5g"])
 
+                if ent_network:
+                    networks_dict = self.get_open_network(
+                                        mirror_ap,
+                                        self.user_params["ent_networks"],
+                                        hidden=hidden,
+                                        same_ssid=same_ssid)
+                    networks_dict["2g"]["security"] = hostapd_constants.ENT_STRING
+                    networks_dict["2g"].update(radius_conf_2g)
+                    networks_dict["5g"]["security"] = hostapd_constants.ENT_STRING
+                    networks_dict["5g"].update(radius_conf_5g)
+                    self.ent_networks = self.user_params["ent_networks"]
+
+                    network_list_2g.append(networks_dict["2g"])
+                    network_list_5g.append(networks_dict["5g"])
+
             orig_network_list_5g = copy.copy(network_list_5g)
             orig_network_list_2g = copy.copy(network_list_2g)
 
@@ -437,6 +459,17 @@
                         security=hostapd_security.Security(
                             security_mode=network["security"],
                             password=network["wepKeys"][0])))
+            elif network["security"] == hostapd_constants.ENT_STRING:
+                bss_settings.append(
+                    hostapd_bss_settings.BssSettings(
+                        name=network["SSID"],
+                        ssid=network["SSID"],
+                        hidden=network["hiddenSSID"],
+                        security=hostapd_security.Security(
+                            security_mode=network["security"],
+                            radius_server_ip=network["radius_server_ip"],
+                            radius_server_port=network["radius_server_port"],
+                            radius_server_secret=network["radius_server_secret"])))
             else:
                 bss_settings.append(
                     hostapd_bss_settings.BssSettings(