Merge tag 'upstream/1.41' into tizen 15/289915/1
authorAnjali Nijhara <a.nijhara@samsung.com>
Wed, 15 Mar 2023 09:24:24 +0000 (14:54 +0530)
committerAnjali Nijhara <a.nijhara@samsung.com>
Wed, 15 Mar 2023 09:24:24 +0000 (14:54 +0530)
Change-Id: I7e90773484901c50e61d243f97d916f5588da9c5

41 files changed:
1  2 
AUTHORS
README
acinclude.m4
client/agent.c
client/commands.c
configure.ac
doc/technology-api.txt
doc/vpn-connection-api.txt
gdhcp/client.c
gsupplicant/gsupplicant.h
gsupplicant/supplicant.c
include/technology.h
packaging/connman.spec
plugins/bluetooth.c
plugins/ethernet.c
plugins/gadget.c
plugins/iwd.c
plugins/neard.c
plugins/vpn.c
plugins/wifi.c
src/agent.c
src/config.c
src/dbus.c
src/dnsproxy.c
src/inet.c
src/ipconfig.c
src/main.c
src/main.conf
src/manager.c
src/rtnl.c
src/service.c
src/technology.c
src/wispr.c
tools/iptables-test.c
vpn/plugins/l2tp.c
vpn/plugins/openconnect.c
vpn/plugins/openvpn.c
vpn/plugins/pptp.c
vpn/vpn-provider.c
vpn/vpn-provider.h
vpn/vpn-rtnl.c

diff --cc AUTHORS
index 438d45f,3ed0985..3ed0985
mode 100755,100644..100755
+++ b/AUTHORS
diff --cc README
index b8154e6,e3268c8..e3268c8
mode 100755,100644..100755
--- 1/README
--- 2/README
+++ b/README
diff --cc acinclude.m4
index 9e8e0dc,262465d..262465d
mode 100755,100644..100755
diff --cc client/agent.c
index 1cad3e0,94ace7c..94ace7c
mode 100755,100644..100755
index 7861dfd,53cc14c..0ea3733
mode 100755,100644..100755
@@@ -3459,12 -2799,8 +3491,12 @@@ static const struct 
        { "disable",      "<technology>|offline", NULL,    cmd_disable,
          "Disables given technology or offline mode",
          lookup_technology_offline },
 +#if defined TIZEN_EXT_WIFI_MESH
 +      { "mesh",      "", mesh_options, cmd_mesh, "Mesh specific commands",
 +              lookup_mesh },
 +#endif
        { "tether", "<technology> on|off\n"
-                   "            wifi [on|off] <ssid> <passphrase> ",
+                   "            wifi [on|off] <ssid> <passphrase> [<freq>] ",
                                          NULL,            cmd_tether,
          "Enable, disable tethering, set SSID and passphrase for wifi",
          lookup_tether },
diff --cc configure.ac
Simple merge
diff --cc gdhcp/client.c
index 18f11a6,3016dfc..905cecf
mode 100755,100644..100755
index 22b0b3e,eab6293..8b6e6f8
mode 100755,100644..100755
@@@ -181,20 -130,14 +181,26 @@@ typedef enum 
        G_SUPPLICANT_PEER_GROUP_FAILED,
  } GSupplicantPeerState;
  
 +#if defined TIZEN_EXT
 +typedef enum {
 +      G_SUPPLICANT_INS_PREFERRED_FREQ_UNKNOWN,
 +      G_SUPPLICANT_INS_PREFERRED_FREQ_24GHZ,
 +      G_SUPPLICANT_INS_PREFERRED_FREQ_5GHZ,
 +} GSupplicantINSPreferredFreq;
 +#endif
 +
+ typedef enum {
+       G_SUPPLICANT_MFP_NONE,
+       G_SUPPLICANT_MFP_OPTIONAL,
+       G_SUPPLICANT_MFP_REQUIRED,
+ } GSupplicantMfpOptions;
  struct _GSupplicantSSID {
 +#if defined TIZEN_EXT
 +      void *ssid;
 +#else
        const void *ssid;
 +#endif
        unsigned int ssid_len;
        unsigned int scan_ssid;
        GSupplicantMode mode;
        dbus_bool_t use_wps;
        const char *pin_wps;
        const char *bgscan;
-       uint16_t ieee80211w;
 +#if defined TIZEN_EXT
 +      unsigned char *bssid;
 +      unsigned int bssid_for_connect_len;
 +      unsigned char bssid_for_connect[6];
 +      GSupplicantEapKeymgmt eap_keymgmt;
 +      const char *phase1;
 +      const char *pac_file;
        unsigned int keymgmt;
 +      const char *connector;
 +      const char *c_sign_key;
 +      const char *net_access_key;
 +#endif
+       GSupplicantMfpOptions ieee80211w;
  };
  
  typedef struct _GSupplicantSSID GSupplicantSSID;
index 915ffb9,470d99e..c395c7f
mode 100755,100644..100755
@@@ -1888,575 -1429,47 +1888,576 @@@ bool g_supplicant_peer_has_requested_co
        return peer->connection_requested;
  }
  
 -unsigned int g_supplicant_network_get_keymgmt(GSupplicantNetwork *network)
 +#if defined TIZEN_EXT
 +/*
 + * Description: Network client requires additional wifi specific info
 + */
 +const unsigned char *g_supplicant_network_get_bssid(GSupplicantNetwork *network)
  {
 -      if (!network)
 -              return 0;
 +      if (network == NULL || network->best_bss == NULL)
 +              return NULL;
  
 -      return network->keymgmt;
 +      return (const unsigned char *)network->best_bss->bssid;
  }
  
 -static void merge_network(GSupplicantNetwork *network)
 +dbus_bool_t g_supplicant_network_get_transition_mode(GSupplicantNetwork *network)
  {
 -      GString *str;
 -      const char *ssid, *mode, *key_mgmt;
 -      unsigned int i, ssid_len;
 -      char *group;
 +      if (network == NULL)
 +              return FALSE;
  
 -      ssid = g_hash_table_lookup(network->config_table, "ssid");
 -      mode = g_hash_table_lookup(network->config_table, "mode");
 -      key_mgmt = g_hash_table_lookup(network->config_table, "key_mgmt");
 +      return network->owe_transition_mode;
 +}
  
 -      SUPPLICANT_DBG("ssid %s mode %s", ssid, mode);
 +const unsigned char *g_supplicant_network_get_transition_mode_bssid(GSupplicantNetwork *network)
 +{
 +      if (network == NULL)
 +              return NULL;
  
 -      if (ssid)
 -              ssid_len = strlen(ssid);
 -      else
 -              ssid_len = 0;
 +      return (const unsigned char *)network->transition_mode_bssid;
 +}
  
 -      str = g_string_sized_new((ssid_len * 2) + 24);
 -      if (!str)
 -              return;
 +const void *g_supplicant_network_get_transition_mode_ssid(GSupplicantNetwork *network,
 +                                              unsigned int *transition_mode_ssid_len)
 +{
 +      if (!network) {
 +              *transition_mode_ssid_len = 0;
 +              return NULL;
 +      }
  
 -      for (i = 0; i < ssid_len; i++)
 -              g_string_append_printf(str, "%02x", ssid[i]);
 +      *transition_mode_ssid_len = network->transition_mode_ssid_len;
 +      return network->transition_mode_ssid;
 +}
  
 -      if (g_strcmp0(mode, "0") == 0)
 -              g_string_append_printf(str, "_managed");
 -      else if (g_strcmp0(mode, "1") == 0)
 -              g_string_append_printf(str, "_adhoc");
 +unsigned int g_supplicant_network_get_maxrate(GSupplicantNetwork *network)
 +{
 +      if (network == NULL || network->best_bss == NULL)
 +              return 0;
  
 -      if ((g_strcmp0(key_mgmt, "WPA-PSK") == 0) ||
 -          (g_strcmp0(key_mgmt, "SAE") == 0))
 -              g_string_append_printf(str, "_psk");
 +      return network->best_bss->maxrate;
 +}
 +
 +const char *g_supplicant_network_get_enc_mode(GSupplicantNetwork *network)
 +{
 +      if (network == NULL || network->best_bss == NULL)
 +              return NULL;
 +
 +      if (network->best_bss->security == G_SUPPLICANT_SECURITY_PSK ||
 +                      network->best_bss->security == G_SUPPLICANT_SECURITY_SAE ||
 +                      network->best_bss->security == G_SUPPLICANT_SECURITY_OWE ||
 +                      network->best_bss->security == G_SUPPLICANT_SECURITY_DPP ||
 +                      network->best_bss->security == G_SUPPLICANT_SECURITY_PSK_SHA256 ||
 +                      network->best_bss->security == G_SUPPLICANT_SECURITY_IEEE8021X) {
 +              unsigned int pairwise;
 +
 +              pairwise = network->best_bss->rsn_pairwise |
 +                              network->best_bss->wpa_pairwise;
 +
 +              if ((pairwise & G_SUPPLICANT_PAIRWISE_CCMP) &&
 +                  (pairwise & G_SUPPLICANT_PAIRWISE_TKIP))
 +                      return "mixed";
 +              else if (pairwise & G_SUPPLICANT_PAIRWISE_CCMP)
 +                      return "aes";
 +              else if (pairwise & G_SUPPLICANT_PAIRWISE_TKIP)
 +                      return "tkip";
 +
 +      } else if (network->best_bss->security == G_SUPPLICANT_SECURITY_WEP)
 +              return "wep";
 +      else if (network->best_bss->security == G_SUPPLICANT_SECURITY_NONE)
 +              return "none";
 +
 +      return NULL;
 +}
 +
 +bool g_supplicant_network_get_rsn_mode(GSupplicantNetwork *network)
 +{
 +      if (network == NULL || network->best_bss == NULL)
 +              return 0;
 +
 +      if (network->best_bss->security == G_SUPPLICANT_SECURITY_OWE ||
 +                      network->best_bss->security == G_SUPPLICANT_SECURITY_DPP)
 +              return false;
 +
 +      if (network->best_bss->rsn_selected) {
 +              const char *mode = g_supplicant_network_get_enc_mode(network);
 +              if (g_strcmp0(mode, "aes") == 0 ||
 +                              g_strcmp0(mode, "mixed") == 0)
 +                      return true;
 +              else
 +                      return false;
 +      } else
 +              return false;
 +}
 +
 +void *g_supplicant_network_get_wifi_vsie(GSupplicantNetwork *network)
 +{
 +      GSList *vsie_list = NULL;
 +
 +      if (!network)
 +              return NULL;
 +
 +      if (g_slist_length(network->vsie_list) > 0) {
 +              GSList *list = NULL;
 +              unsigned char *vsie = NULL;
 +              for (list = network->vsie_list; list; list = list->next) {
 +                      unsigned char *ie = (unsigned char *)list->data;
 +                      if (ie == NULL)
 +                              continue;
 +                      vsie = (unsigned char *)g_try_malloc0(ie[1]+2); // tag number size(1), tag length size(1)
 +
 +                      if (vsie) {
 +                              memcpy(vsie, ie, ie[1]+2);
 +                              vsie_list = g_slist_append(vsie_list, vsie);
 +                      } else
 +                              SUPPLICANT_DBG("Failed to allocate memory");
 +              }
 +      }
 +
 +      return vsie_list;
 +}
 +
 +static bool compare_bssid(unsigned char *bssid_a, unsigned char *bssid_b)
 +{
 +      if (!memcmp(bssid_a, bssid_b, WIFI_BSSID_LEN_MAX))
 +              return true;
 +
 +      return false;
 +}
 +
 +static gchar *convert_bssid_to_str(unsigned char *bssid)
 +{
 +      GString *bssid_str;
 +      unsigned int i;
 +
 +      bssid_str = g_string_sized_new(18);
 +      if (!bssid_str)
 +              return NULL;
 +
 +      for (i = 0; i < WIFI_BSSID_LEN_MAX; i++) {
 +              g_string_append_printf(bssid_str, "%02x", bssid[i]);
 +              if (i < WIFI_BSSID_LEN_MAX - 1)
 +                      g_string_append(bssid_str, ":");
 +      }
 +
 +      return g_string_free(bssid_str, FALSE);
 +}
 +
 +#if defined TIZEN_EXT_INS
 +static void count_assoc_reject(gpointer data, gpointer user_data)
 +{
 +      time_t assoc_reject_time = GPOINTER_TO_INT(data);
 +      struct assoc_count_data *assoc_count = user_data;
 +
 +      if (assoc_reject_time > assoc_count->ref_time)
 +              assoc_count->assoc_count++;
 +}
 +
 +static uint16_t get_assoc_reject_cnt(GHashTable *assoc_reject_table, unsigned char *bssid)
 +{
 +      gchar *bssid_str;
 +      struct assoc_reject_data *assoc_data;
 +      struct assoc_count_data assoc_count;
 +      time_t curr_time;
 +      struct tm* timeinfo;
 +
 +      if (g_hash_table_size(assoc_reject_table) < 1)
 +              return 0;
 +
 +      if (!bssid)
 +              return 0;
 +
 +      if (!memcmp(bssid, invalid_bssid, WIFI_BSSID_LEN_MAX))
 +              return 0;
 +
 +      bssid_str = convert_bssid_to_str(bssid);
 +      if (!bssid_str)
 +              return 0;
 +
 +      assoc_data = g_hash_table_lookup(assoc_reject_table, bssid_str);
 +      if (!assoc_data) {
 +              g_free(bssid_str);
 +              return 0;
 +      }
 +
 +      if (g_slist_length(assoc_data->reject_time_list) < 1) {
 +              g_free(bssid_str);
 +              return 0;
 +      }
 +
 +      /* Only events that occur within one hour are appened. */
 +      curr_time = time(NULL);
 +      timeinfo = localtime(&curr_time);
 +      timeinfo->tm_hour -= 1;
 +
 +      assoc_count.ref_time = mktime(timeinfo);
 +      assoc_count.assoc_count = 0;
 +
 +      g_slist_foreach(assoc_data->reject_time_list, count_assoc_reject, &assoc_count);
 +
 +      g_free(bssid_str);
 +      return assoc_count.assoc_count;
 +}
 +
 +static int calculate_score_last_connected_bssid(bool is_last_connected)
 +{
 +      int score = 0;
 +
 +      if (ins_settings.last_connected_bssid) {
 +              if (is_last_connected)
 +                      score += ins_settings.last_connected_bssid_score;
 +      }
 +
 +      return score;
 +}
 +
 +static int calculate_score_assoc_reject(uint16_t assoc_reject_cnt)
 +{
 +      int score = 0;
 +
 +      if (ins_settings.assoc_reject)
 +              score -= (assoc_reject_cnt * ins_settings.assoc_reject_score);
 +
 +      return score;
 +}
 +
 +static int calculate_score_frequency(dbus_int16_t strength, dbus_uint16_t frequency)
 +{
 +      int score = 0;
 +
 +      switch (ins_settings.preferred_freq_bssid) {
 +      case G_SUPPLICANT_INS_PREFERRED_FREQ_24GHZ:
 +              if ((frequency >= FREQ_RANGE_24GHZ_CHANNEL_1 &&
 +                      frequency <= FREQ_RANGE_24GHZ_CHANNEL_14) &&
 +                      (strength > ins_settings.signal_level3_24ghz))
 +                      score += ins_settings.preferred_freq_bssid_score;
 +
 +              break;
 +      case G_SUPPLICANT_INS_PREFERRED_FREQ_5GHZ:
 +              if ((frequency >= FREQ_RANGE_5GHZ_CHANNEL_32 &&
 +                      frequency <= FREQ_RANGE_5GHZ_CHANNEL_165) &&
 +                      (strength > ins_settings.signal_level3_5ghz))
 +                      score += ins_settings.preferred_freq_bssid_score;
 +
 +              break;
 +      default:
 +              break;
 +      }
 +
 +      return score;
 +}
 +
 +static int calculate_score_strength(dbus_int16_t strength)
 +{
 +      int score = 0;
 +
 +      if (ins_settings.signal_bssid)
 +              score += (((strength > -60) ? -60 : strength) + 85);
 +
 +      return score;
 +}
 +
 +static int calculate_score_est_throughput(dbus_uint32_t est_throughput)
 +{
 +      int score = 0;
 +
 +      if (est_throughput >= 10000)
 +              score = est_throughput / 10000;
 +
 +      if (score > 40)
 +              score = 40;
 +
 +      return score;
 +}
 +
 +static int calculate_score(bool is_last_connected, uint16_t assoc_reject_cnt,
 +              dbus_uint16_t frequency, dbus_int16_t strength,
 +              dbus_int16_t snr, dbus_uint32_t est_throughput)
 +{
 +      int score = 0;
 +
 +      score += calculate_score_last_connected_bssid(is_last_connected);
 +      score += calculate_score_assoc_reject(assoc_reject_cnt);
 +      score += calculate_score_frequency(strength, frequency);
 +      score += calculate_score_strength(strength);
 +      score += (int)snr;
 +      score += calculate_score_est_throughput(est_throughput);
 +
 +      return score;
 +}
 +#endif
 +
 +static void update_bssid_list(gpointer key, gpointer value, gpointer user_data)
 +{
 +      struct g_supplicant_bss *bss = value;
 +      struct g_connman_bssids *bssids = NULL;
 +      struct update_bssid_data *bssid_data = (struct update_bssid_data *)user_data;
 +
 +      bssids = (struct g_connman_bssids *)g_try_malloc0(sizeof(struct g_connman_bssids));
 +
 +      if (bssids) {
 +              memcpy(bssids->bssid, bss->bssid, WIFI_BSSID_LEN_MAX);
 +
 +              bssids->strength = bss->signal;
 +              bssids->strength += 120;
 +
 +              if (bssids->strength > 100)
 +                      bssids->strength = 100;
 +
 +              bssids->frequency = bss->frequency;
 +              bssids->score_snr = (int)bss->snr;
 +
 +#if defined TIZEN_EXT_INS
 +              bssids->assoc_reject_cnt = get_assoc_reject_cnt(bssid_data->assoc_reject_table, bssids->bssid);
 +              bssids->is_last_connected = compare_bssid(bssids->bssid, bssid_data->last_connected_bssid);
 +
 +              bssids->score_last_connected_bssid = calculate_score_last_connected_bssid(bssids->is_last_connected);
 +              bssids->score_assoc_reject = calculate_score_assoc_reject(bssids->assoc_reject_cnt);
 +              bssids->score_frequency = calculate_score_frequency(bss->signal, bssids->frequency);
 +              bssids->score_strength = calculate_score_strength(bss->signal);
 +              bssids->score_est_throughput = calculate_score_est_throughput(bss->est_throughput);
 +
 +              bssids->ins_score = calculate_score(bssids->is_last_connected,
 +                      bssids->assoc_reject_cnt, bssids->frequency, bss->signal,
 +                      bss->snr, bss->est_throughput);
 +#else
 +              bssids->ins_score = bss->signal;
 +#endif
 +              bssid_data->bssid_list = g_slist_append(bssid_data->bssid_list, bssids);
 +      } else
 +              SUPPLICANT_DBG("Failed to allocate memory");
 +}
 +
 +static gint cmp_bss(gconstpointer a, gconstpointer b)
 +{
 +      struct g_connman_bssids *entry_a = (struct g_connman_bssids *)a;
 +      struct g_connman_bssids *entry_b = (struct g_connman_bssids *)b;
 +
 +      if (entry_a->ins_score > entry_b->ins_score)
 +              return -1;
 +
 +      if (entry_a->ins_score < entry_b->ins_score)
 +              return 1;
 +
 +      if (entry_a->ins_score == entry_b->ins_score) {
 +              if (entry_a->strength >= entry_b->strength)
 +                      return -1;
 +              else
 +                      return 1;
 +      }
 +
 +      return 0;
 +}
 +
 +#if defined TIZEN_EXT_INS
 +static void print_bssid_sort(gpointer data, gpointer user_data)
 +{
 +      struct g_connman_bssids *bssids = data;
 +
 +      GSupplicantNetwork *network = (GSupplicantNetwork *) user_data;
 +
 +      if (!bssids || !network)
 +              return;
 +
 +      SUPPLICANT_DBG("ssid [%-20s] bssid[" MACSTR "] total[%2d] freq[%2d] "
 +                      "last_conn[%2d] assoc_reject[%2d] strength[%2d] rssi[%2d]",
 +                      network->ssid, MAC2STR(bssids->bssid), bssids->ins_score,
 +                      bssids->score_frequency, bssids->score_last_connected_bssid,
 +                      bssids->score_assoc_reject, bssids->score_strength, bssids->strength - 120);
 +}
 +#endif
 +
 +void *g_supplicant_network_get_bssid_list(GSupplicantNetwork *network)
 +{
 +      struct update_bssid_data bssid_data;
 +
 +      if (g_hash_table_size(network->bss_table) < 1)
 +              return NULL;
 +
 +      bssid_data.network = network;
 +      memset(&bssid_data, 0, sizeof(bssid_data));
 +      memcpy(bssid_data.last_connected_bssid, network->last_connected_bssid, WIFI_BSSID_LEN_MAX);
 +      bssid_data.assoc_reject_table = network->assoc_reject_table;
 +
 +      g_hash_table_foreach(network->bss_table, update_bssid_list, &bssid_data);
 +      bssid_data.bssid_list = g_slist_sort(bssid_data.bssid_list, cmp_bss);
 +#if defined TIZEN_EXT_INS
 +      g_slist_foreach(bssid_data.bssid_list, print_bssid_sort, (gpointer)network);
 +#endif
 +
 +      return bssid_data.bssid_list;
 +}
 +
 +void g_supplicant_network_set_last_connected_bssid(GSupplicantNetwork *network, const unsigned char *bssid)
 +{
 +      if (!bssid)
 +              return;
 +
 +      if (!memcmp(bssid, invalid_bssid, WIFI_BSSID_LEN_MAX))
 +              return;
 +
 +      memcpy(network->last_connected_bssid, bssid, WIFI_BSSID_LEN_MAX);
 +
 +      SUPPLICANT_DBG("last connected bssid [" MACSTR "]", MAC2STR(bssid));
 +}
 +
 +const unsigned char *g_supplicant_network_get_last_connected_bssid(GSupplicantNetwork *network)
 +{
 +      if (network == NULL)
 +              return NULL;
 +
 +      return (const unsigned char *)network->last_connected_bssid;
 +}
 +
 +void g_supplicant_network_update_assoc_reject(GSupplicantInterface *interface,
 +              GSupplicantNetwork *network)
 +{
 +      struct assoc_reject_data *assoc_data;
 +      gchar *bssid_str;
 +      time_t curr_time;
 +
 +      if (!network)
 +              return;
 +
 +      bssid_str = convert_bssid_to_str(interface->add_network_bssid);
 +      if (!bssid_str)
 +              return;
 +
 +      assoc_data = g_hash_table_lookup(network->assoc_reject_table, bssid_str);
 +      if (!assoc_data) {
 +              assoc_data = g_try_new0(struct assoc_reject_data, 1);
 +              if (!assoc_data) {
 +                      g_free(bssid_str);
 +                      return;
 +              }
 +
 +              assoc_data->bssid = g_strdup(bssid_str);
 +              g_hash_table_insert(network->assoc_reject_table, assoc_data->bssid, assoc_data);
 +      }
 +
 +      curr_time = time(NULL);
 +      assoc_data->reject_time_list = g_slist_append(assoc_data->reject_time_list, GINT_TO_POINTER(curr_time));
 +
 +      SUPPLICANT_DBG("bssid [%s] time [%u]", bssid_str, curr_time);
 +
 +      g_free(bssid_str);
 +
 +      callback_network_changed(network, "UpdateAssocReject");
 +}
 +
 +GHashTable *g_supplicant_network_get_assoc_reject_table(GSupplicantNetwork *network)
 +{
 +      if (!network)
 +              return NULL;
 +
 +      return network->assoc_reject_table;
 +}
 +
 +GSupplicantNetwork *g_supplicant_interface_get_network(GSupplicantInterface *interface,
 +              const char *group)
 +{
 +      if (!interface)
 +              return NULL;
 +
 +      return g_hash_table_lookup(interface->network_table, group);
 +}
 +
 +static void copy_assoc_reject(gpointer key, gpointer value, gpointer user_data)
 +{
 +      struct assoc_reject_data *cloned_assoc_data;
 +      struct assoc_reject_data *assoc_data = value;
 +      GHashTable *cloned_assoc_reject_table = user_data;
 +
 +      if (assoc_data && cloned_assoc_reject_table) {
 +              cloned_assoc_data = g_try_new0(struct assoc_reject_data, 1);
 +              if (!cloned_assoc_data)
 +                      return;
 +
 +              cloned_assoc_data->bssid = g_strdup(assoc_data->bssid);
 +              cloned_assoc_data->reject_time_list = g_slist_copy(assoc_data->reject_time_list);
 +              g_hash_table_insert(cloned_assoc_reject_table,
 +                                      cloned_assoc_data->bssid, cloned_assoc_data);
 +      }
 +}
 +
 +GHashTable *g_supplicant_network_clone_assoc_reject_table(GSupplicantNetwork *network)
 +{
 +      GHashTable *cloned_assoc_reject_table;
 +
 +      if (!network)
 +              return NULL;
 +
 +      GHashTable *assoc_reject_table = g_supplicant_network_get_assoc_reject_table(network);
 +      if (!assoc_reject_table)
 +              return NULL;
 +
 +      cloned_assoc_reject_table = g_hash_table_new_full(g_str_hash, g_str_equal,
 +                                                              NULL, remove_assoc_data);
 +      g_hash_table_foreach(assoc_reject_table, copy_assoc_reject, cloned_assoc_reject_table);
 +
 +      return cloned_assoc_reject_table;
 +}
 +
 +#endif
 +
 +static void merge_network(GSupplicantNetwork *network)
 +{
 +      GString *str;
 +      const char *ssid, *mode, *key_mgmt;
 +#if defined TIZEN_EXT
 +      const char *isHS20AP;
 +      const char *eap, *identity, *phase2;
 +#endif
 +      unsigned int i, ssid_len;
 +      char *group;
 +
 +      ssid = g_hash_table_lookup(network->config_table, "ssid");
 +      mode = g_hash_table_lookup(network->config_table, "mode");
 +      key_mgmt = g_hash_table_lookup(network->config_table, "key_mgmt");
 +#if defined TIZEN_EXT
 +      isHS20AP = g_hash_table_lookup(network->config_table, "isHS20AP");
 +      eap = g_hash_table_lookup(network->config_table, "eap");
 +      identity = g_hash_table_lookup(network->config_table, "identity");
 +      phase2 = g_hash_table_lookup(network->config_table, "phase2");
 +#endif
 +
 +      SUPPLICANT_DBG("ssid %s mode %s", ssid, mode);
 +
 +      if (ssid)
 +              ssid_len = strlen(ssid);
 +      else
 +              ssid_len = 0;
 +
 +      str = g_string_sized_new((ssid_len * 2) + 24);
 +      if (!str)
 +              return;
 +
 +      for (i = 0; i < ssid_len; i++)
 +#if defined TIZEN_EXT
 +      {
 +              if (ssid[i] != '"')
 +#endif
 +              g_string_append_printf(str, "%02x", ssid[i]);
 +#if defined TIZEN_EXT
 +      }
 +#endif
 +
 +      if (g_strcmp0(mode, "0") == 0)
 +              g_string_append_printf(str, "_managed");
 +      else if (g_strcmp0(mode, "1") == 0)
 +              g_string_append_printf(str, "_adhoc");
 +#if defined TIZEN_EXT_WIFI_MESH
 +      else if (g_strcmp0(mode, "5") == 0)
 +              g_string_append_printf(str, "_mesh");
 +#endif
 +
-       if (g_strcmp0(key_mgmt, "WPA-PSK") == 0)
++      if ((g_strcmp0(key_mgmt, "WPA-PSK") == 0) ||
++          (g_strcmp0(key_mgmt, "SAE") == 0))
 +              g_string_append_printf(str, "_psk");
 +#if defined TIZEN_EXT
 +      else if (g_strcmp0(key_mgmt, "WPA-EAP") == 0)
 +              g_string_append_printf(str, "_ieee8021x");
 +      else
 +              g_string_append_printf(str, "_none");
 +#endif
  
        group = g_string_free(str, FALSE);
  
@@@ -7280,86 -4903,16 +7282,88 @@@ static void add_network_security_proto(
        g_free(proto);
  }
  
- static void add_network_ieee80211w(DBusMessageIter *dict, GSupplicantSSID *ssid)
- {
-       if (ssid->security != G_SUPPLICANT_SECURITY_SAE
-                       && ssid->security != G_SUPPLICANT_SECURITY_OWE
-                       && ssid->security != G_SUPPLICANT_SECURITY_PSK_SHA256
-                       && ssid->security != G_SUPPLICANT_SECURITY_DPP)
-               return;
-       supplicant_dbus_dict_append_basic(dict, "ieee80211w", DBUS_TYPE_UINT32,
-                                         &ssid->ieee80211w);
- }
 +#if defined TIZEN_EXT
 +static void add_network_security_connector(DBusMessageIter *dict, GSupplicantSSID *ssid)
 +{
 +      if (ssid->connector && strlen(ssid->connector) > 0) {
 +              const char *key = "dpp_connector";
 +
 +              supplicant_dbus_dict_append_basic(dict,
 +                              key, DBUS_TYPE_STRING,
 +                              &ssid->connector);
 +      }
 +}
 +
 +static size_t convert_hexstr_to_bin(const char *hex_str, unsigned char **bin)
 +{
 +      unsigned char *bin_res = NULL;
 +      unsigned int i, j, hex;
 +      size_t hex_str_len;
 +
 +      if (!hex_str || strlen(hex_str) == 0)
 +              return 0;
 +
 +      hex_str_len = strlen(hex_str);
 +      bin_res = g_try_malloc0(hex_str_len / 2);
 +      if (!bin_res)
 +              return 0;
 +
 +      j = 0;
 +      for (i = 0; i < hex_str_len; i+=2) {
 +              sscanf(hex_str + i, "%02x", &hex);
 +              bin_res[j++] = hex;
 +      }
 +
 +      *bin = bin_res;
 +      return hex_str_len / 2;
 +}
 +
 +static void add_network_security_c_sign_key(DBusMessageIter *dict, GSupplicantSSID *ssid)
 +{
 +      if (ssid->c_sign_key && strlen(ssid->c_sign_key) > 0) {
 +              const char *key = "dpp_csign";
 +              unsigned char *bin_csign = NULL;
 +              size_t bin_csign_len = convert_hexstr_to_bin(ssid->c_sign_key, &bin_csign);
 +              if  (bin_csign_len != 0)
 +                      supplicant_dbus_dict_append_fixed_array(dict,
 +                                      key, DBUS_TYPE_BYTE,
 +                                      &bin_csign, bin_csign_len);
 +              g_free(bin_csign);
 +      }
 +}
 +
 +static void add_network_security_net_access_key(DBusMessageIter *dict, GSupplicantSSID *ssid)
 +{
 +      if (ssid->net_access_key && strlen(ssid->net_access_key) > 0) {
 +              const char *key = "dpp_netaccesskey";
 +              unsigned char *bin_netaccesskey = NULL;
 +              size_t bin_netaccesskey_len = convert_hexstr_to_bin(ssid->net_access_key, &bin_netaccesskey);
 +              if  (bin_netaccesskey_len != 0)
 +                      supplicant_dbus_dict_append_fixed_array(dict,
 +                                      key, DBUS_TYPE_BYTE,
 +                                      &bin_netaccesskey, bin_netaccesskey_len);
 +              g_free(bin_netaccesskey);
 +      }
 +}
 +
 +#endif
 +
+ static void add_network_ieee80211w(DBusMessageIter *dict, GSupplicantSSID *ssid,
+                                  GSupplicantMfpOptions ieee80211w)
+ {
++#if defined TIZEN_EXT
++      if (ssid->security != G_SUPPLICANT_SECURITY_OWE
++                      && ssid->security != G_SUPPLICANT_SECURITY_PSK_SHA256
++                      && ssid->security != G_SUPPLICANT_SECURITY_DPP)
++              return;
++#endif
+       supplicant_dbus_dict_append_basic(dict, "ieee80211w", DBUS_TYPE_UINT32,
+                                         &ieee80211w);
+ }
  static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid)
  {
+       GSupplicantMfpOptions ieee80211w;
        char *key_mgmt;
  
        switch (ssid->security) {
                add_network_security_ciphers(dict, ssid);
                break;
        case G_SUPPLICANT_SECURITY_PSK:
 -              if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_SAE) {
 +#if defined TIZEN_EXT
 +              if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_FT_PSK)
 +                      key_mgmt = "FT-PSK WPA-PSK";
 +              else
 +                      key_mgmt = "WPA-PSK";
 +#else
 +              key_mgmt = "WPA-PSK";
 +#endif
 +              add_network_security_psk(dict, ssid);
 +              add_network_security_ciphers(dict, ssid);
 +              add_network_security_proto(dict, ssid);
 +              break;
 +      case G_SUPPLICANT_SECURITY_IEEE8021X:
 +              key_mgmt = "WPA-EAP";
 +              add_network_security_eap(dict, ssid);
 +              add_network_security_ciphers(dict, ssid);
 +              add_network_security_proto(dict, ssid);
 +              break;
 +#if defined TIZEN_EXT
 +      case G_SUPPLICANT_SECURITY_PSK_SHA256:
 +              if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK)
 +                      key_mgmt = "WPA-PSK-SHA256 WPA-PSK";
 +              else
 +                      key_mgmt = "WPA-PSK-SHA256";
 +              add_network_security_psk(dict, ssid);
 +              add_network_security_ciphers(dict, ssid);
 +              add_network_security_proto(dict, ssid);
 +              break;
 +      case G_SUPPLICANT_SECURITY_FT_PSK:
 +              key_mgmt = "FT-PSK";
 +              add_network_security_psk(dict, ssid);
 +              add_network_security_ciphers(dict, ssid);
 +              add_network_security_proto(dict, ssid);
 +              break;
 +      case G_SUPPLICANT_SECURITY_FT_IEEE8021X:
 +              key_mgmt = "FT-EAP";
 +              add_network_security_eap(dict, ssid);
 +              add_network_security_ciphers(dict, ssid);
 +              add_network_security_proto(dict, ssid);
 +              break;
 +      case G_SUPPLICANT_SECURITY_SAE:
 +              if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_FT_SAE) {
 +                      if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_SAE)
 +                              key_mgmt = "FT-SAE SAE";
 +                      else
 +                              key_mgmt = "FT-SAE";
-               } else if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK)
++              } else {
+                       if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK) {
 -                              /*
 -                               * WPA3-Personal transition mode: supports both
 -                               * WPA2-Personal (PSK) and WPA3-Personal (SAE)
 -                               */
 -                              key_mgmt = "SAE WPA-PSK";
 -                              ieee80211w = G_SUPPLICANT_MFP_OPTIONAL;
 +                      key_mgmt = "SAE WPA-PSK";
-               else
-                       key_mgmt = "SAE";
++                      ieee80211w = G_SUPPLICANT_MFP_OPTIONAL;
+                       } else {
+                               key_mgmt = "SAE";
+                               ieee80211w = G_SUPPLICANT_MFP_REQUIRED;
+                       }
+                       add_network_ieee80211w(dict, ssid, ieee80211w);
 -              } else {
 -                      key_mgmt = "WPA-PSK";
+               }
                add_network_security_psk(dict, ssid);
 -              add_network_security_ciphers(dict, ssid);
 -              add_network_security_proto(dict, ssid);
                break;
 -      case G_SUPPLICANT_SECURITY_IEEE8021X:
 -              key_mgmt = "WPA-EAP";
 -              add_network_security_eap(dict, ssid);
 +      case G_SUPPLICANT_SECURITY_OWE:
 +              key_mgmt = "OWE";
                add_network_security_ciphers(dict, ssid);
                add_network_security_proto(dict, ssid);
                break;
index ba2c24c,0000000..a07fab6
mode 100644,000000..100644
--- /dev/null
@@@ -1,352 -1,0 +1,352 @@@
- Version:        1.40
 +%bcond_with     connman_openconnect
 +%bcond_without  connman_wireguard
 +%bcond_without  connman_openvpn
 +%bcond_without  connman_ipsec
 +%bcond_without  connman_vpnd
 +
 +Name:           connman
++Version:        1.41
 +Release:        2
 +License:        GPL-2.0+
 +Summary:        Connection Manager
 +Url:            http://connman.net
 +Group:          Network & Connectivity/Connection Management
 +Source0:        %{name}-%{version}.tar.gz
 +BuildRequires:  systemd-devel
 +BuildRequires:  pkgconfig(dlog)
 +BuildRequires:  pkgconfig(dbus-1)
 +BuildRequires:  pkgconfig(glib-2.0)
 +BuildRequires:  pkgconfig(gio-2.0)
 +BuildRequires:  pkgconfig(libiptc)
 +BuildRequires:  pkgconfig(xtables)
 +BuildRequires:  pkgconfig(libsmack)
 +BuildRequires:  pkgconfig(libnl-3.0)
 +BuildRequires:  pkgconfig(libnl-genl-3.0)
 +BuildRequires:  pkgconfig(libsystemd)
 +%if %{with connman_openconnect}
 +BuildRequires:  openconnect
 +%endif
 +%if %{with connman_openvpn}
 +BuildRequires:  openvpn
 +%endif
 +%if %{with connman_ipsec}
 +BuildRequires:  strongswan
 +%endif
 +BuildRequires:  readline-devel
 +#%systemd_requires
 +Requires:       iptables
 +Requires:         systemd
 +Requires(post):   systemd
 +Requires(preun):  systemd
 +Requires(postun): systemd
 +Requires:         security-config
 +Provides:       %{name}-profile_common = %{version}-%{release}
 +Provides:       %{name}-profile_mobile = %{version}-%{release}
 +Provides:       %{name}-profile_wearable = %{version}-%{release}
 +Provides:       %{name}-profile_robot = %{version}-%{release}
 +
 +%description
 +Connection Manager provides a daemon for managing Internet connections
 +within embedded devices running the Linux operating system.
 +
 +%if %{with connman_openconnect}
 +%package plugin-openconnect
 +Summary:        Openconnect Support for Connman
 +Requires:       %{name} = %{version}
 +Requires:       openconnect
 +
 +%description plugin-openconnect
 +Openconnect Support for Connman.
 +%endif
 +
 +%if %{with connman_openvpn}
 +%package plugin-openvpn
 +Summary:        Openvpn Support for Connman
 +Requires:       %{name} = %{version}
 +Requires:       openvpn
 +
 +%description plugin-openvpn
 +OpenVPN support for Connman.
 +%endif
 +
 +%if %{with connman_ipsec}
 +%package plugin-ipsec
 +Summary:        IPsec Support for Connman
 +Requires:       %{name} = %{version}
 +Requires:       strongswan
 +
 +%description plugin-ipsec
 +OpenVPN support for Connman.
 +%endif
 +
 +%if %{with connman_vpnd}
 +%package connman-vpnd
 +Summary:        VPN Support for Connman
 +#BuildRequires:  %{name} = %{version}
 +Requires:       %{name} = %{version}
 +
 +%description connman-vpnd
 +Provides VPN support for Connman
 +%endif
 +
 +%if %{with connman_wireguard}
 +%package plugin-wireguard
 +Summary:        Wireguard Support for Connman
 +BuildRequires:  pkgconfig(libmnl)
 +Requires:       %{name} = %{version}
 +
 +%description plugin-wireguard
 +Wireguard Support for Connman.
 +%endif
 +
 +%package test
 +Summary:        Test Scripts for Connection Manager
 +Group:          Development/Tools
 +Requires:       %{name} = %{version}
 +Requires:       dbus-python
 +Requires:       pygobject
 +Requires:       python-xml
 +
 +%description test
 +Scripts for testing Connman and its functionality
 +
 +%package devel
 +Summary:        Development files for connman
 +Group:          Development/Tools
 +Requires:       %{name} = %{version}
 +
 +%description devel
 +Header files and development files for connman.
 +
 +%package extension-tv
 +Summary:        Connman service script for TV profile
 +Requires:       %{name} = %{version}-%{release}
 +Provides:       %{name}-profile_tv = %{version}-%{release}
 +Conflicts:      %{name}-extension-ivi
 +Conflicts:      %{name}-extension-disable-eth
 +%description extension-tv
 +Supplies Tizen TV profile systemd service scripts instead of the default one.
 +This overwrites service script of %{name}.
 +
 +%package extension-ivi
 +Summary:        Connman configuration for IVI profile
 +Requires:       %{name} = %{version}-%{release}
 +Provides:       %{name}-profile_ivi = %{version}-%{release}
 +Conflicts:      %{name}-extension-tv
 +Conflicts:      %{name}-extension-disable-eth
 +%description extension-ivi
 +Supplies Tizen IVI profile configuration instead of the default one.
 +This overwrites conf file of %{name}.
 +
 +%package extension-disable-eth
 +Summary:        Connman configuration for testing which requires the ethernet to be disabled
 +Requires:       %{name} = %{version}-%{release}
 +Conflicts:      %{name}-extension-tv
 +Conflicts:      %{name}-extension-ivi
 +%description extension-disable-eth
 +Connman without ethernet support
 +This overwrites conf file of %{name}.
 +
 +%package profile_robot
 +Summary:              connman extension for robot profile
 +Requires:             %{name} = %{version}-%{release}
 +%description profile_robot
 +connman extension for Tizen robot profile
 +
 +%prep
 +%setup -q
 +
 +
 +%build
 +%if %{with connman_vpnd}
 +VPN_CFLAGS+=" -DTIZEN_EXT -lsmack -Werror"
 +%endif
 +
 +chmod +x bootstrap
 +./bootstrap
 +%configure \
 +          --sysconfdir=/etc \
 +          --enable-client \
 +          --enable-tizen-ext \
 +          --disable-tizen-ext-ins \
 +            --enable-tizen-ext-eap-on-ethernet \
 +          --enable-pacrunner \
 +            --enable-wifi=builtin \
 +%if %{with connman_openconnect}
 +            --enable-openconnect \
 +%endif
 +%if %{with connman_openvpn}
 +            --enable-openvpn \
 +%endif
 +%if %{with connman_ipsec}
 +            --enable-ipsec \
 +%endif
 +%if %{without connman_wireguard}
 +            --disable-wireguard \
 +%endif
 +%if 0%{?enable_connman_features}
 +            %connman_features \
 +%endif
 +            --disable-ofono \
 +            --enable-telephony=builtin \
 +            --enable-test \
 +          --enable-loopback \
 +          --enable-ethernet \
 +          --with-systemdunitdir=%{_unitdir} \
 +          --enable-pie \
 +          --disable-wispr \
 +          --disable-backtrace \
 +          --disable-tools
 +
 +make %{?_smp_mflags}
 +
 +%install
 +%make_install
 +
 +#Systemd service file
 +mkdir -p %{buildroot}%{_unitdir}
 +
 +cp src/connman_tv.service %{buildroot}%{_unitdir}/connman.service.tv
 +cp src/connman.service %{buildroot}%{_unitdir}/connman.service
 +cp vpn/connman-vpn.service %{buildroot}%{_unitdir}/connman-vpn.service
 +
 +mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants
 +ln -s ../connman.service %{buildroot}%{_unitdir}/multi-user.target.wants/connman.service
 +
 +#Systemd socket file for DNS proxy
 +cp src/connman.socket %{buildroot}%{_unitdir}/connman.socket
 +mkdir -p %{buildroot}%{_unitdir}/sockets.target.wants
 +ln -s ../connman.socket %{buildroot}%{_unitdir}/sockets.target.wants/connman.socket
 +
 +mkdir -p %{buildroot}/%{_localstatedir}/lib/connman
 +cp resources/var/lib/connman/settings %{buildroot}/%{_localstatedir}/lib/connman/settings
 +mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services
 +cp resources/usr/share/dbus-1/system-services/net.connman.service %{buildroot}%{_datadir}/dbus-1/system-services/net.connman.service
 +mkdir -p %{buildroot}/etc/connman
 +
 +cp src/main_ivi.conf %{buildroot}/etc/connman/main.conf.ivi
 +cp src/main_tv.conf %{buildroot}/etc/connman/main.conf.tv
 +cp src/main_disable_eth.conf %{buildroot}/etc/connman/main.conf.disable.eth
 +cp src/main_robot.conf %{buildroot}/etc/connman/main.conf.robot
 +cp src/main.conf %{buildroot}/etc/connman/main.conf
 +
 +rm %{buildroot}%{_sysconfdir}/dbus-1/system.d/*.conf
 +mkdir -p %{buildroot}%{_sysconfdir}/dbus-1/system.d/
 +cp src/connman.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/
 +cp src/connman-robot.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/
 +
 +%if %{with connman_vpnd}
 +cp vpn/vpn-dbus.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/connman-vpn-dbus.conf
 +%endif
 +
 +%post
 +#chsmack -a 'System' /%{_localstatedir}/lib/connman
 +#chsmack -a 'System' /%{_localstatedir}/lib/connman/settings
 +
 +%preun
 +
 +%postun
 +systemctl daemon-reload
 +
 +%docs_package
 +
 +%files
 +%manifest connman.manifest
 +%attr(500,network_fw,network_fw) %{_bindir}/connmand
 +%attr(500,network_fw,network_fw) %{_bindir}/connmanctl
 +%attr(600,network_fw,network_fw) /%{_localstatedir}/lib/connman/settings
 +%attr(644,root,root) %{_datadir}/dbus-1/system-services/net.connman.service
 +%attr(644,root,root) %{_sysconfdir}/dbus-1/system.d/*
 +%exclude %{_sysconfdir}/dbus-1/system.d/connman-robot.conf
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf
 +%attr(644,root,root) %{_sysconfdir}/dbus-1/system.d/*.conf
 +%attr(644,root,root) %{_unitdir}/connman.service
 +%attr(644,root,root) %{_unitdir}/multi-user.target.wants/connman.service
 +%attr(644,root,root) %{_unitdir}/connman.socket
 +%attr(644,root,root) %{_unitdir}/sockets.target.wants/connman.socket
 +%license COPYING
 +
 +%files test
 +%manifest connman.manifest
 +%{_libdir}/%{name}/test/*
 +
 +%files devel
 +%manifest connman.manifest
 +%{_includedir}/*
 +%{_libdir}/pkgconfig/*.pc
 +
 +%if %{with connman_openconnect}
 +%files plugin-openconnect
 +%manifest %{name}.manifest
 +%{_libdir}/connman/plugins-vpn/openconnect.so
 +%{_libdir}/connman/scripts/openconnect-script
 +%license COPYING
 +%endif
 +
 +%if %{with connman_openvpn}
 +%files plugin-openvpn
 +%manifest %{name}.manifest
 +%{_libdir}/%{name}/plugins-vpn/openvpn.so
 +%{_libdir}/%{name}/scripts/openvpn-script
 +%license COPYING
 +%endif
 +
 +%if %{with connman_ipsec}
 +%files plugin-ipsec
 +%manifest %{name}.manifest
 +%{_libdir}/%{name}/plugins-vpn/ipsec.so
 +%{_libdir}/%{name}/scripts/ipsec-script
 +%license COPYING
 +%endif
 +
 +%if %{with connman_vpnd}
 +%files connman-vpnd
 +%manifest %{name}.manifest
 +%{_bindir}/connman-vpnd
 +%dir %{_libdir}/%{name}
 +%dir %{_libdir}/%{name}/scripts
 +%dir %{_libdir}/%{name}/plugins-vpn
 +%attr(644,root,root) %config %{_sysconfdir}/dbus-1/system.d/connman-vpn-dbus.conf
 +%{_datadir}/dbus-1/system-services/net.connman.vpn.service
 +%license COPYING
 +%attr(644,root,root) %{_unitdir}/connman-vpn.service
 +%endif
 +
 +%if %{with connman_wireguard}
 +%files plugin-wireguard
 +%manifest %{name}.manifest
 +%{_libdir}/%{name}/plugins-vpn/wireguard.so
 +%license COPYING
 +%endif
 +
 +%post extension-tv
 +mv -f %{_unitdir}/connman.service.tv %{_unitdir}/connman.service
 +mv -f %{_sysconfdir}/connman/main.conf.tv %{_sysconfdir}/connman/main.conf
 +
 +%files extension-tv
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf.tv
 +%license COPYING
 +%attr(644,root,root) %{_unitdir}/connman.service.tv
 +
 +%post extension-ivi
 +mv -f %{_sysconfdir}/connman/main.conf.ivi %{_sysconfdir}/connman/main.conf
 +
 +%files extension-ivi
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf.ivi
 +%license COPYING
 +
 +%post extension-disable-eth
 +mv -f %{_sysconfdir}/connman/main.conf.disable.eth %{_sysconfdir}/connman/main.conf
 +
 +%files extension-disable-eth
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf.disable.eth
 +%license COPYING
 +
 +%post profile_robot
 +mv %{_sysconfdir}/dbus-1/system.d/connman-robot.conf %{_sysconfdir}/dbus-1/system.d/connman.conf
 +mv -f %{_sysconfdir}/connman/main.conf.robot %{_sysconfdir}/connman/main.conf
 +
 +%files profile_robot
 +%manifest %{name}.manifest
 +%attr(644,root,root) %{_sysconfdir}/dbus-1/system.d/connman-robot.conf
 +%attr(644,network_fw,network_fw) %{_sysconfdir}/connman/main.conf.robot
index a8383e7,57cc8a2..0b59a65
mode 100755,100644..100755
Simple merge
index 1b44bbb,2d58df3..2d58df3
mode 100755,100644..100755
diff --cc plugins/iwd.c
Simple merge
diff --cc plugins/neard.c
index 45effd4,caaea85..caaea85
mode 100755,100644..100755
diff --cc plugins/vpn.c
index d708d1f,42396d2..42396d2
mode 100755,100644..100755
diff --cc plugins/wifi.c
index 5ffbd4e,e947b16..3634552
mode 100755,100644..100755
@@@ -198,24 -162,14 +198,28 @@@ struct wifi_data 
        bool p2p_connecting;
        bool p2p_device;
        int servicing;
 +#if defined TIZEN_EXT
 +      int assoc_retry_count;
 +      struct connman_network *scan_pending_network;
 +      bool allow_full_scan;
 +      unsigned int automaxspeed_timeout;
 +      GSupplicantScanParams *hidden_scan_params;
 +      unsigned int mac_policy;
 +      unsigned int preassoc_mac_policy;
 +      unsigned int mac_lifetime;
 +#endif
        int disconnect_code;
        int assoc_code;
 +#if defined TIZEN_EXT_WIFI_MESH
 +      bool mesh_interface;
 +      struct wifi_mesh_info *mesh_info;
 +#endif
  };
  
+ struct wifi_network {
+       unsigned int keymgmt;
+ };
  struct disconnect_data {
        struct wifi_data *wifi;
        struct connman_network *network;
@@@ -242,128 -183,8 +246,127 @@@ static bool wfd_service_registered = fa
  
  static void start_autoscan(struct connman_device *device);
  static int tech_set_tethering(struct connman_technology *technology,
-                               const char *identifier, const char *passphrase,
                                const char *bridge, bool enabled);
  
 +#if defined TIZEN_EXT
 +#define NETCONFIG_SERVICE "net.netconfig"
 +#define NETCONFIG_WIFI_PATH "/net/netconfig/wifi"
 +#define NETCONFIG_WIFI_INTERFACE NETCONFIG_SERVICE ".wifi"
 +
 +struct enc_method_call_data {
 +      DBusConnection *connection;
 +      struct connman_network *network;
 +};
 +
 +static struct enc_method_call_data encrypt_request_data;
 +
 +static GSupplicantSecurity network_security(const char *security);
 +
 +static void encryption_request_reply(DBusPendingCall *call,
 +                                              void *user_data)
 +{
 +      DBusMessage *reply;
 +      DBusError error;
 +      DBusMessageIter args;
 +      char *out_data;
 +      struct connman_service *service;
 +      gchar* encrypted_value = NULL;
 +      struct connman_network *network = encrypt_request_data.network;
 +
 +      DBG("");
 +
 +      reply = dbus_pending_call_steal_reply(call);
 +
 +      dbus_error_init(&error);
 +      if (dbus_set_error_from_message(&error, reply)) {
 +              DBG("send_encryption_request() %s %s", error.name, error.message);
 +              dbus_error_free(&error);
 +              goto done;
 +      }
 +
 +      if (dbus_message_iter_init(reply, &args) == FALSE)
 +              goto done;
 +
 +      dbus_message_iter_get_basic(&args, &out_data);
 +
 +      encrypted_value = g_strdup((const gchar *)out_data);
 +      service = connman_service_lookup_from_network(network);
 +
 +      if (!service) {
 +              DBG("encryption result: no service");
 +              goto done;
 +      }
 +
 +      if (connman_service_get_favorite(service)) {
 +              __connman_service_set_passphrase(service, encrypted_value);
 +              __connman_service_save(service);
 +      } else
 +              connman_network_set_string(network, "WiFi.Passphrase",
 +                                                      encrypted_value);
 +
 +      DBG("encryption result: succeeded");
 +
 +done:
 +      dbus_message_unref(reply);
 +      dbus_pending_call_unref(call);
 +      dbus_connection_unref(encrypt_request_data.connection);
 +      g_free(encrypted_value);
 +
 +      encrypt_request_data.connection = NULL;
 +      encrypt_request_data.network = NULL;
 +}
 +
 +static int send_encryption_request(const char *passphrase,
 +                              struct connman_network *network)
 +{
 +      DBusConnection *connection = NULL;
 +      DBusMessage *msg = NULL;
 +      DBusPendingCall *call;
 +
 +      if (!passphrase) {
 +              DBG("Invalid parameter");
 +              return -EINVAL;
 +      }
 +
 +      connection = connman_dbus_get_connection();
 +      if (!connection) {
 +              DBG("dbus connection does not exist");
 +              return -EINVAL;
 +      }
 +
 +      msg = dbus_message_new_method_call(NETCONFIG_SERVICE, NETCONFIG_WIFI_PATH,
 +                      NETCONFIG_WIFI_INTERFACE, "EncryptPassphrase");
 +      if (!msg) {
 +              dbus_connection_unref(connection);
 +              return -EINVAL;
 +      }
 +
 +      dbus_message_append_args(msg, DBUS_TYPE_STRING, &passphrase,
 +                                                      DBUS_TYPE_INVALID);
 +
 +      if (!dbus_connection_send_with_reply(connection, msg,
 +                              &call, DBUS_TIMEOUT_USE_DEFAULT)) {
 +              dbus_message_unref(msg);
 +              dbus_connection_unref(connection);
 +              return -EIO;
 +      }
 +
 +      if (!call) {
 +              dbus_message_unref(msg);
 +              dbus_connection_unref(connection);
 +              return -EIO;
 +      }
 +
 +      encrypt_request_data.connection = connection;
 +      encrypt_request_data.network = network;
 +
 +      dbus_pending_call_set_notify(call, encryption_request_reply, NULL, NULL);
 +      dbus_message_unref(msg);
 +
 +      return 0;
 +}
 +#endif
 +
  static int p2p_tech_probe(struct connman_technology *technology)
  {
        p2p_technology = technology;
@@@ -3818,53 -2160,20 +3821,54 @@@ static GSupplicantSecurity network_secu
        return G_SUPPLICANT_SECURITY_UNKNOWN;
  }
  
 +#if defined TIZEN_EXT
 +static GSupplicantEapKeymgmt network_eap_keymgmt(const char *security)
 +{
 +      if (security == NULL)
 +              return G_SUPPLICANT_EAP_KEYMGMT_NONE;
 +
 +      if (g_str_equal(security, "FT") == TRUE)
 +              return G_SUPPLICANT_EAP_KEYMGMT_FT;
 +      else if (g_str_equal(security, "CCKM") == TRUE)
 +              return G_SUPPLICANT_EAP_KEYMGMT_CCKM;
 +
 +      return G_SUPPLICANT_EAP_KEYMGMT_NONE;
 +}
 +#endif
 +
  static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
  {
+       struct wifi_network *network_data = connman_network_get_data(network);
        const char *security;
 +#if defined TIZEN_EXT
 +      const void *ssid_data;
 +#endif
  
        memset(ssid, 0, sizeof(*ssid));
        ssid->mode = G_SUPPLICANT_MODE_INFRA;
 +#if defined TIZEN_EXT
 +      ssid_data = connman_network_get_blob(network, "WiFi.SSID",
 +                                              &ssid->ssid_len);
 +      ssid->ssid = g_try_malloc0(ssid->ssid_len);
 +
 +      if (!ssid->ssid)
 +              ssid->ssid_len = 0;
 +      else
 +              memcpy(ssid->ssid, ssid_data, ssid->ssid_len);
 +#else
        ssid->ssid = connman_network_get_blob(network, "WiFi.SSID",
                                                &ssid->ssid_len);
 +#endif
        ssid->scan_ssid = 1;
        security = connman_network_get_string(network, "WiFi.Security");
 +#if defined TIZEN_EXT
 +      if (connman_network_get_psk_sha256(network))
 +              security = "psk_sha256";
 +#endif
        ssid->security = network_security(security);
- #if defined TIZEN_EXT
-       ssid->ieee80211w = 1;
- #endif
++
+       ssid->keymgmt = network_data->keymgmt;
+       ssid->ieee80211w = G_SUPPLICANT_MFP_OPTIONAL;
        ssid->passphrase = connman_network_get_string(network,
                                                "WiFi.Passphrase");
  
@@@ -5627,20 -2941,9 +5637,21 @@@ static void network_removed(GSupplicant
        if (!connman_network)
                return;
  
 +#if defined TIZEN_EXT
 +      if (connman_network == wifi->scan_pending_network)
 +              wifi->scan_pending_network = NULL;
 +
 +      if (connman_network == wifi->pending_network)
 +              wifi->pending_network = NULL;
 +
 +      if(connman_network_get_connecting(connman_network) == true){
 +              connman_network_set_connected(connman_network, false);
 +      }
 +#endif
 +
        wifi->networks = g_slist_remove(wifi->networks, connman_network);
  
+       g_free(connman_network_get_data(connman_network));
        connman_device_remove_network(wifi->device, connman_network);
        connman_network_unref(connman_network);
  }
@@@ -6340,15 -3344,20 +6354,24 @@@ static GSupplicantSSID *ssid_ap_init(co
        if (!ap)
                return NULL;
  
+       ret = connman_technology_get_wifi_tethering(technology,
+                                               &ssid, &passphrase,
+                                               &freq);
+       if (ret == false)
+               return NULL;
        ap->mode = G_SUPPLICANT_MODE_MASTER;
 +#if defined TIZEN_EXT
 +      ap->ssid = (void *) ssid;
 +#else
        ap->ssid = ssid;
 +#endif
        ap->ssid_len = strlen(ssid);
        ap->scan_ssid = 0;
-       ap->freq = 2412;
+       if (freq)
+               ap->freq = freq;
+       else
+               ap->freq = 2412;
  
        if (!passphrase || strlen(passphrase) == 0) {
                ap->security = G_SUPPLICANT_SECURITY_NONE;
diff --cc src/agent.c
index d6113af,d4f9add..d4f9add
mode 100755,100644..100755
diff --cc src/config.c
Simple merge
diff --cc src/dbus.c
index c454a58,74b3157..74b3157
mode 100755,100644..100755
diff --cc src/dnsproxy.c
index 0cdd42c,cf1d36c..a84693e
mode 100755,100644..100755
@@@ -1843,11 -1791,7 +1843,8 @@@ static char *uncompress(int16_t field_c
                ulen = strlen(name) + 1;
                if ((uptr + ulen) > uncomp_end)
                        goto out;
- #if defined TIZEN_EXT
++
                memcpy(uptr, name, ulen);
- #else
-               strncpy(uptr, name, ulen);
- #endif
  
                debug("pos %d ulen %d left %d name %s", pos, ulen,
                        (int)(uncomp_end - (uptr + ulen)), uptr);
@@@ -2317,22 -2279,8 +2339,21 @@@ static gboolean udp_server_event(GIOCha
  
        len = recv(sk, buf, sizeof(buf), 0);
  
-       if (len >= 12)
-               forward_dns_reply(buf, len, IPPROTO_UDP, data);
+       forward_dns_reply(buf, len, IPPROTO_UDP, data);
  
 +#if defined TIZEN_EXT
 +      GSList *list;
 +
 +      for (list = server_list_sec; list; list = list->next) {
 +              struct server_data *new_data = list->data;
 +
 +              if (new_data == data) {
 +                      destroy_server_sec(data);
 +                      return TRUE;
 +              }
 +      }
 +#endif
 +
        return TRUE;
  }
  
diff --cc src/inet.c
Simple merge
diff --cc src/ipconfig.c
index 4a0e4ad,34b1724..9765ca1
mode 100755,100644..100755
diff --cc src/main.c
index 13e26d4,e209cf2..eaead32
mode 100755,100644..100755
@@@ -1608,14 -1029,9 +1646,16 @@@ int main(int argc, char *argv[]
        g_strfreev(connman_settings.blacklisted_interfaces);
        g_strfreev(connman_settings.tethering_technologies);
        g_free(connman_settings.vendor_class_id);
+       g_free(connman_settings.online_check_ipv4_url);
+       g_free(connman_settings.online_check_ipv6_url);
  
 +#if defined TIZEN_EXT
 +      g_free(connman_ins_settings.ins_preferred_freq_bssid);
 +      g_free(connman_ins_settings.ins_preferred_freq);
 +      if (connman_ins_settings.ins_security_priority)
 +              g_strfreev(connman_ins_settings.ins_security_priority);
 +#endif
 +
        g_free(option_debug);
        g_free(option_wifi);
  
diff --cc src/main.conf
index e734ecf,ddd5799..f997c65
mode 100755,100644..100755
diff --cc src/manager.c
index 0000f78,892d3a4..68627af
mode 100755,100644..100755
diff --cc src/rtnl.c
Simple merge
diff --cc src/service.c
index 79edb2d,1d2b78a..a27dcca
mode 100755,100644..100755
@@@ -3043,13 -1595,28 +3044,32 @@@ bool __connman_service_index_is_default
        return __connman_service_get_index(service) == index;
  }
  
+ static void start_wispr_when_connected(struct connman_service *service)
+ {
+       if (!connman_setting_get_bool("EnableOnlineCheck")) {
+               connman_info("Online check disabled. "
+                       "Default service remains in READY state.");
+               return;
+       }
+       if (__connman_service_is_connected_state(service,
+                       CONNMAN_IPCONFIG_TYPE_IPV4))
+               __connman_service_wispr_start(service,
+                                       CONNMAN_IPCONFIG_TYPE_IPV4);
+       if (__connman_service_is_connected_state(service,
+                       CONNMAN_IPCONFIG_TYPE_IPV6))
+               __connman_service_wispr_start(service,
+                                       CONNMAN_IPCONFIG_TYPE_IPV6);
+ }
  static void default_changed(void)
  {
 +#if defined TIZEN_EXT
 +      struct connman_service *service = connman_service_get_default_connection();
 +#else
        struct connman_service *service = connman_service_get_default();
 +#endif
  
        if (service == current_default)
                return;
@@@ -6135,21 -3734,10 +6147,15 @@@ static DBusMessage *set_property(DBusCo
                if (gw && strlen(gw))
                        __connman_service_nameserver_add_routes(service, gw);
  
 +#if defined TIZEN_EXT
 +              DBG("%s ip_type: %d nameserver add all", name, ip_type);
 +              nameserver_add_all(service, ip_type);
 +#else
                nameserver_add_all(service, CONNMAN_IPCONFIG_TYPE_ALL);
 +#endif
                dns_configuration_changed(service);
  
-               if (__connman_service_is_connected_state(service,
-                                               CONNMAN_IPCONFIG_TYPE_IPV4))
-                       __connman_service_wispr_start(service, CONNMAN_IPCONFIG_TYPE_IPV4);
-               if (__connman_service_is_connected_state(service,
-                                               CONNMAN_IPCONFIG_TYPE_IPV6))
-                       __connman_service_wispr_start(service, CONNMAN_IPCONFIG_TYPE_IPV6);
+               start_wispr_when_connected(service);
  
                service_save(service);
        } else if (g_str_equal(name, "Timeservers.Configuration")) {
@@@ -6672,9 -4215,7 +6678,10 @@@ static bool auto_connect_service(GList 
        bool ignore[MAX_CONNMAN_SERVICE_TYPES] = { };
        bool autoconnecting = false;
        GList *list;
 +#if defined TIZEN_EXT
 +      GSList *wifi_ignore = NULL;
 +#endif
+       int index;
  
        DBG("preferred %d sessions %d reason %s", preferred, active_count,
                reason2string(reason));
@@@ -9464,12 -6148,8 +9487,13 @@@ static int service_indicate_state(struc
                break;
  
        case CONNMAN_SERVICE_STATE_FAILURE:
-               if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER) {
 +#if defined TIZEN_EXT
 +              if (service->type == CONNMAN_SERVICE_TYPE_WIFI)
 +                      service->order = 5;
 +              __connman_service_auto_connect(CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 +#endif
+               if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER ||
+                       service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_NATIVE) {
                        connman_agent_report_error(service, service->path,
                                                error2string(service->error),
                                                report_error_cb,
@@@ -223,18 -193,12 +224,24 @@@ static void technology_save(struct conn
                g_free(enc);
        }
  
 +#ifdef TIZEN_EXT
 +      if (technology->type == CONNMAN_SERVICE_TYPE_WIFI) {
 +              g_key_file_set_uint64(keyfile, identifier, "MacPolicy",
 +                                      technology->mac_policy);
 +
 +              g_key_file_set_uint64(keyfile, identifier, "PreassocMacPolicy",
 +                                      technology->preassoc_mac_policy);
 +
 +              g_key_file_set_uint64(keyfile, identifier, "RandomMacLifetime",
 +                                      technology->random_mac_lifetime);
 +      }
 +#endif /* TIZEN_EXT */
+       if (technology->tethering_freq == 0)
+               technology->tethering_freq = 2412;
+       g_key_file_set_integer(keyfile, identifier,
+                               "Tethering.Freq",
+                               technology->tethering_freq);
  
  done:
        g_free(identifier);
@@@ -513,33 -457,10 +526,36 @@@ static void technology_load(struct conn
                                identifier, "Tethering.Passphrase", NULL);
        if (enc)
                technology->tethering_passphrase = g_strcompress(enc);
 +#ifdef TIZEN_EXT
 +      if (technology->type == CONNMAN_SERVICE_TYPE_WIFI) {
 +              unsigned int val = 0;
 +
 +              val = g_key_file_get_uint64(keyfile,
 +                              identifier, "MacPolicy", NULL);
 +              if (val <= 2)
 +                      technology->mac_policy = val;
 +              else
 +                      technology->mac_policy = 0;
 +
 +              val = g_key_file_get_uint64(keyfile,
 +                              identifier, "PreassocMacPolicy", NULL);
 +              if (val <= 2)
 +                      technology->preassoc_mac_policy = val;
 +              else
 +                      technology->preassoc_mac_policy = 0;
 +
 +              val = g_key_file_get_uint64(keyfile,
 +                              identifier, "RandomMacLifetime", NULL);
 +              if (val > 0)
 +                      technology->random_mac_lifetime = val;
 +              else
 +                      technology->random_mac_lifetime = 60;
 +      }
 +#endif /* TIZEN_EXT */
  
+       technology->tethering_freq = g_key_file_get_integer(keyfile,
+                               identifier, "Tethering.Freq", NULL);
  done:
        g_free(identifier);
  
@@@ -722,27 -572,10 +738,30 @@@ static void append_properties(DBusMessa
                                        DBUS_TYPE_STRING,
                                        &technology->tethering_passphrase);
  
 -
 +#if defined TIZEN_EXT
 +      connman_dbus_dict_append_basic(&dict, "MacPolicy",
 +                                      DBUS_TYPE_UINT32,
 +                                      &(technology->mac_policy));
 +
 +      connman_dbus_dict_append_basic(&dict, "PreassocMacPolicy",
 +                                      DBUS_TYPE_UINT32,
 +                                      &(technology->preassoc_mac_policy));
 +
 +      connman_dbus_dict_append_basic(&dict, "RandomMacLifetime",
 +                                      DBUS_TYPE_UINT32,
 +                                      &(technology->random_mac_lifetime));
 +
 +      if (technology->type == CONNMAN_SERVICE_TYPE_WIFI)
 +              connman_dbus_dict_append_dict(&dict, "Device.List",
 +                                      append_devices, technology);
 +      if (technology->regdom)
 +              connman_dbus_dict_append_basic(&dict, "CountryCode",
 +                                      DBUS_TYPE_STRING,
 +                                      &technology->regdom);
 +#endif
+       connman_dbus_dict_append_basic(&dict, "TetheringFreq",
+                               DBUS_TYPE_INT32,
+                               &technology->tethering_freq);
        connman_dbus_dict_close(iter, &dict);
  }
  
diff --cc src/wispr.c
index 4674ae4,56007a3..fc60725
mode 100755,100644..100755
index 1e4fcd1,ee40dd7..ee40dd7
mode 100755,100644..100755
index 4a704bb,7274376..7274376
mode 100755,100644..100755
index 8092b5d,cc32596..6defbf2
mode 100755,100644..100755
index f7fa859,5d1455d..5d1455d
mode 100755,100644..100755
diff --cc vpn/vpn-rtnl.c
index 295c05c,5a02d77..5a02d77
mode 100755,100644..100755