Added support of Multiple same SSIDs including band steering. 24/202524/8 accepted/tizen/unified/20190410.061801 submit/tizen/20190409.131053
authorNiraj Kumar Goit <niraj.g@samsung.com>
Fri, 29 Mar 2019 10:35:49 +0000 (16:05 +0530)
committerNiraj Kumar Goit <niraj.g@samsung.com>
Fri, 5 Apr 2019 07:26:09 +0000 (12:56 +0530)
When there are multiple APs with the same SSID and security,
this patch support below features:
1. If AP does not respond to probe request during connection
procedure, connman tries to connect with the next available BSSID
before sending disconnected event to application.

2. If connection with AP is failed during association due to
ASSOC_REJECT, connman tries to connect with the next available BSSID
before sending disconnected event to application.

Change-Id: Ie80939bd013a12b9c88e91a1fd5a05fbb57c1833
Signed-off-by: Niraj Kumar Goit <niraj.g@samsung.com>
gsupplicant/supplicant.c
include/network.h
plugins/wifi.c
src/network.c
src/service.c

index 67d4d608b2e3698e626514820c0c190b8e32f51e..1c0e64198b41aa51e71a2866c1fb12723d7a3dba 100644 (file)
@@ -50,6 +50,7 @@
 #define WLAN_EID_SUPP_RATES 1
 #define WLAN_EID_EXT_SUPP_RATES 50
 #define COUNTRY_CODE_LENGTH    2
+#define WIFI_BSSID_LEN_MAX 6
 #endif
 
 #define BSS_UNKNOWN_STRENGTH    -90
@@ -364,7 +365,7 @@ struct interface_scan_data {
 
 #if defined TIZEN_EXT
 struct g_connman_bssids {
-       char bssid[18];
+       unsigned char bssid[WIFI_BSSID_LEN_MAX];
        uint16_t strength;
        uint16_t frequency;
 };
@@ -1723,18 +1724,13 @@ static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
 {
        struct g_supplicant_bss *bss = value;
        struct g_connman_bssids *bssids = NULL;
-       char buff[18];
        GSList **list = (GSList **)user_data;
 
        bssids = (struct g_connman_bssids *)g_try_malloc0(sizeof(struct g_connman_bssids));
 
        if (bssids) {
-               g_snprintf(buff, 18, "%02x:%02x:%02x:%02x:%02x:%02x",
-                               bss->bssid[0], bss->bssid[1], bss->bssid[2], bss->bssid[3],
-                               bss->bssid[4], bss->bssid[5]);
+               memcpy(bssids->bssid, bss->bssid, WIFI_BSSID_LEN_MAX);
 
-               memcpy(bssids->bssid, buff, 18);
-               bssids->bssid[17] = '\0';
                bssids->strength = bss->signal;
                bssids->strength += 120;
 
@@ -2816,7 +2812,11 @@ static void interface_bss_removed(DBusMessageIter *iter, void *user_data)
                g_hash_table_remove(interface->network_table, network->group);
        } else {
                if (is_current_network_bss && network->best_bss)
+#if defined TIZEN_EXT
+                       callback_network_changed(network, "CheckMultiBssidConnect");
+#else
                        callback_network_changed(network, "");
+#endif
        }
 }
 
index 6d067c55d846e17c0459456f803970dd2203e1ef..c4c73051a011a760b92cbab591059022c56c7f7e 100755 (executable)
 extern "C" {
 #endif
 
+#if defined TIZEN_EXT
+#define WIFI_ENCYPTION_MODE_LEN_MAX 6
+#define WIFI_BSSID_LEN_MAX 6
+#define MAC_ADDRESS_LENGTH 18
+#endif
+
 /**
  * SECTION:network
  * @title: Network premitives
@@ -64,7 +70,7 @@ enum connman_network_error {
 
 #if defined TIZEN_EXT
 struct connman_bssids {
-       char bssid[18];
+       unsigned char bssid[WIFI_BSSID_LEN_MAX];
        uint16_t strength;
        uint16_t frequency;
 };
@@ -206,6 +212,8 @@ ieee80211_modes_e connman_network_get_phy_mode(struct connman_network *network);
 int connman_network_set_connection_mode(struct connman_network *network,
                                connection_mode_e mode);
 connection_mode_e connman_network_get_connection_mode(struct connman_network *network);
+int connman_network_set_last_bssid(struct connman_network *network, const char *bssid);
+char *connman_network_get_last_bssid(struct connman_network *network);
 #endif
 
 int connman_network_set_name(struct connman_network *network,
index cd543be97baae4487e00d298dc2841daa37e621c..dfcff59c3de37436d2c19d55bb54dfd5ade2dc3a 100644 (file)
@@ -3261,7 +3261,32 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
        ssid->pin_wps = connman_network_get_string(network, "WiFi.PinWPS");
 
 #if defined TIZEN_EXT
-       ssid->bssid = connman_network_get_bssid(network);
+       GSList *bssid_list = (GSList *)connman_network_get_bssid_list(network);
+       if (bssid_list && g_slist_length(bssid_list) > 1) {
+               GSList *list;
+               char buff[MAC_ADDRESS_LENGTH];
+               for (list = bssid_list; list; list = list->next) {
+                       struct connman_bssids * bssids = (struct connman_bssids *)list->data;
+
+                       g_snprintf(buff, MAC_ADDRESS_LENGTH, "%02x:%02x:%02x:%02x:%02x:%02x",
+                                       bssids->bssid[0], bssids->bssid[1], bssids->bssid[2],
+                                       bssids->bssid[3], bssids->bssid[4], bssids->bssid[5]);
+                       buff[MAC_ADDRESS_LENGTH - 1] = '\0';
+
+                       char *last_bssid = connman_network_get_last_bssid(network);
+
+                       if (strcmp(last_bssid, buff) == 0) {
+                               DBG("last_bssid match, try next bssid");
+                               continue;
+                       } else {
+                               connman_network_set_last_bssid(network, buff);
+
+                               ssid->bssid = &(bssids->bssid[0]);
+                               break;
+                       }
+               }
+       } else
+               ssid->bssid = connman_network_get_bssid(network);
 
        ssid->eap_keymgmt = network_eap_keymgmt(
                        connman_network_get_string(network, "WiFi.KeymgmtType"));
@@ -3740,7 +3765,11 @@ static bool handle_assoc_status_code(GSupplicantInterface *interface,
                                      struct wifi_data *wifi)
 {
        if (wifi->state == G_SUPPLICANT_STATE_ASSOCIATING &&
+#if defined TIZEN_EXT
+                       wifi->assoc_code > 0 &&
+#else
                        wifi->assoc_code == ASSOC_STATUS_NO_CLIENT &&
+#endif
                        wifi->load_shaping_retries < LOAD_SHAPING_MAX_RETRIES) {
                wifi->load_shaping_retries ++;
                return TRUE;
@@ -3962,8 +3991,15 @@ static void interface_state(GSupplicantInterface *interface)
                if (is_idle(wifi))
                        break;
 
+#if defined TIZEN_EXT
+               if (handle_assoc_status_code(interface, wifi)) {
+                       network_connect(network);
+                       break;
+               }
+#else
                if (handle_assoc_status_code(interface, wifi))
                        break;
+#endif
 
                /* If previous state was 4way-handshake, then
                 * it's either: psk was incorrect and thus we retry
@@ -4593,6 +4629,10 @@ static void network_changed(GSupplicantNetwork *network, const char *property)
        bssid_list = (GSList *)g_supplicant_network_get_bssid_list(network);
        connman_network_set_bssid_list(connman_network, bssid_list);
        connman_network_set_phy_mode(connman_network, phy_mode);
+
+       if (g_str_equal(property, "CheckMultiBssidConnect") &&
+                       connman_network_get_associating(connman_network))
+               network_connect(connman_network);
 #endif
 }
 
index b710368358ce064a5a2dc0baa542268de95d8113..9933b723a6c429afb03a62ba322ae050591a1d71 100755 (executable)
  */
 #define RS_REFRESH_TIMEOUT     3
 
-#if defined TIZEN_EXT
-#define WIFI_ENCYPTION_MODE_LEN_MAX 6
-#define WIFI_BSSID_LEN_MAX 6
-#endif
-
 /*
  * As per RFC 4861, a host should transmit up to MAX_RTR_SOLICITATIONS(3)
  * Router Solicitation messages, each separated by at least
@@ -107,6 +102,7 @@ struct connman_network {
 #if defined TIZEN_EXT
                char encryption_mode[WIFI_ENCYPTION_MODE_LEN_MAX];
                unsigned char bssid[WIFI_BSSID_LEN_MAX];
+               char last_bssid[MAC_ADDRESS_LENGTH];
                unsigned int maxrate;
                int maxspeed;
                bool isHS20AP;
@@ -1584,6 +1580,11 @@ int connman_network_set_connected(struct connman_network *network,
                network, network->connected, connected, network->connecting,
                network->associating);
 
+#if defined TIZEN_EXT
+       /* reset last connect request bssid */
+       connman_network_set_last_bssid(network, NULL);
+#endif
+
        if ((network->connecting || network->associating) &&
                                                        !connected) {
                connman_network_set_error(network,
@@ -1975,6 +1976,23 @@ unsigned char *connman_network_get_bssid(struct connman_network *network)
        return (unsigned char *)network->wifi.bssid;
 }
 
+int connman_network_set_last_bssid(struct connman_network *network,
+                               const char *bssid)
+{
+       if (bssid == NULL) {
+               memset(network->wifi.last_bssid, '\0', sizeof(network->wifi.last_bssid));
+               return -EINVAL;
+       }
+       strncpy(network->wifi.last_bssid, bssid, MAC_ADDRESS_LENGTH - 1);
+
+       return 0;
+}
+
+char *connman_network_get_last_bssid(struct connman_network *network)
+{
+       return (char *)network->wifi.last_bssid;
+}
+
 int connman_network_set_maxspeed(struct connman_network *network,
                                 int maxspeed)
 {
index 777db8f50400f672d56c852fbe5a88d359f720af..2fd1e50e99a3c72b63a20b1fa189aaf2302dcff9 100644 (file)
@@ -3342,29 +3342,31 @@ static void append_wifi_ext_info(DBusMessageIter *dict,
 
 static void append_bssid_info(DBusMessageIter *iter, void *user_data)
 {
-        GSList *bssid_list = NULL;
+       GSList *bssid_list = NULL;
        struct connman_network *network = user_data;
-        struct connman_bssids *bssids;
-        char bssid_buf[18] = {0,};
-        char *bssid_str = bssid_buf;
+       struct connman_bssids *bssids;
+       char bssid_buf[MAC_ADDRESS_LENGTH] = {0,};
+       char *bssid_str = bssid_buf;
 
-        bssid_list = (GSList *)connman_network_get_bssid_list(network);
-        if(bssid_list) {
-                GSList *list;
-                for (list = bssid_list; list; list = list->next) {
-                        bssids = (struct connman_bssids *)list->data;
-                        memcpy(bssid_str, bssids->bssid, 18);
+       bssid_list = (GSList *)connman_network_get_bssid_list(network);
+       if(bssid_list) {
+               GSList *list;
+               for (list = bssid_list; list; list = list->next) {
+                       bssids = (struct connman_bssids *)list->data;
+                       g_snprintf(bssid_buf, MAC_ADDRESS_LENGTH, "%02x:%02x:%02x:%02x:%02x:%02x",
+                                       bssids->bssid[0], bssids->bssid[1], bssids->bssid[2],
+                                       bssids->bssid[3], bssids->bssid[4], bssids->bssid[5]);
 
                        connman_dbus_dict_append_basic(iter, "BSSID",
-                                        DBUS_TYPE_STRING, &bssid_str);
+                                       DBUS_TYPE_STRING, &bssid_str);
 
-                        connman_dbus_dict_append_basic(iter, "Strength",
-                                        DBUS_TYPE_UINT16, &bssids->strength);
+                       connman_dbus_dict_append_basic(iter, "Strength",
+                                       DBUS_TYPE_UINT16, &bssids->strength);
 
-                        connman_dbus_dict_append_basic(iter, "Frequency",
-                                        DBUS_TYPE_UINT16, &bssids->frequency);
-                }
-        }
+                       connman_dbus_dict_append_basic(iter, "Frequency",
+                                       DBUS_TYPE_UINT16, &bssids->frequency);
+               }
+       }
 }
 #endif