From: hyunuk tak Date: Wed, 10 Jun 2020 04:54:48 +0000 (+0000) Subject: Merge "Add to check ins status on client" into tizen X-Git-Tag: submit/tizen/20200610.045555^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=223b3849e11ed411895f574d3f3a3a08c2ec78ce;hp=e89b177c65a78dd607d582c397008c61f43726ff;p=platform%2Fupstream%2Fconnman.git Merge "Add to check ins status on client" into tizen --- diff --git a/gdbus/watch.c b/gdbus/watch.c index 447e486..1ca3c4b 100755 --- a/gdbus/watch.c +++ b/gdbus/watch.c @@ -136,6 +136,51 @@ static struct filter_data *filter_data_find(DBusConnection *connection) return NULL; } +#if defined TIZEN_EXT +#define SENDER_PREFIX ",sender='%s'" +#define PATH_PREFIX ",path='%s'" +#define IFACE_PREFIX ",interface='%s'" +#define MEMBER_PREFIX ",member='%s'" +#define ARG0_PREFIX ",arg0='%s'" + +static gboolean check_rule_length(int remains, const char *prefix, const char *data) +{ + if (!prefix || !data) + return FALSE; + + return strlen(prefix) - 2 + strlen(data) < remains; +} + +static void format_rule(struct filter_data *data, char *rule, size_t size) +{ + const char *sender; + int offset; + + offset = snprintf(rule, size, "type='signal'"); + sender = data->name ? : data->owner; + + if (sender && + check_rule_length(size - offset, SENDER_PREFIX, sender)) + offset += snprintf(rule + offset, size - offset, + SENDER_PREFIX, sender); + if (data->path && + check_rule_length(size - offset, PATH_PREFIX, data->path)) + offset += snprintf(rule + offset, size - offset, + PATH_PREFIX, data->path); + if (data->interface && + check_rule_length(size - offset, IFACE_PREFIX, data->interface)) + offset += snprintf(rule + offset, size - offset, + IFACE_PREFIX, data->interface); + if (data->member && + check_rule_length(size - offset, MEMBER_PREFIX, data->member)) + offset += snprintf(rule + offset, size - offset, + MEMBER_PREFIX, data->member); + if (data->argument && + check_rule_length(size - offset, ARG0_PREFIX, data->argument)) + snprintf(rule + offset, size - offset, + ARG0_PREFIX, data->argument); +} +#else static void format_rule(struct filter_data *data, char *rule, size_t size) { const char *sender; @@ -160,6 +205,7 @@ static void format_rule(struct filter_data *data, char *rule, size_t size) snprintf(rule + offset, size - offset, ",arg0='%s'", data->argument); } +#endif static gboolean add_match(struct filter_data *data, DBusHandleMessageFunction filter) diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h index 6cf85f3..d748ff6 100755 --- a/gsupplicant/gsupplicant.h +++ b/gsupplicant/gsupplicant.h @@ -225,6 +225,7 @@ struct _GSupplicantSSID { const char *phase1; const char *pac_file; uint16_t ieee80211w; + unsigned int keymgmt; const char *connector; const char *c_sign_key; const char *net_access_key; @@ -476,6 +477,11 @@ const unsigned char *g_supplicant_network_get_countrycode(GSupplicantNetwork *network); void *g_supplicant_network_get_bssid_list(GSupplicantNetwork *network); GSupplicantPhy_mode g_supplicant_network_get_phy_mode(GSupplicantNetwork *network); +dbus_bool_t g_supplicant_network_get_transition_mode(GSupplicantNetwork *network); +const unsigned char *g_supplicant_network_get_transition_mode_bssid(GSupplicantNetwork *network); +const void *g_supplicant_network_get_transition_mode_ssid(GSupplicantNetwork *network, + unsigned int *transition_mode_ssid_len); + #endif #if defined TIZEN_EXT void g_supplicant_network_set_last_connected_bssid(GSupplicantNetwork *network, const unsigned char *bssid); diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index 759e165..c8d34e9 100755 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -306,6 +306,10 @@ struct g_supplicant_bss { dbus_bool_t sae; dbus_bool_t owe; dbus_bool_t dpp; + dbus_bool_t owe_transition_mode; + unsigned int transition_mode_ssid_len; + unsigned char transition_mode_bssid[6]; + unsigned char transition_mode_ssid[32]; #endif }; @@ -334,8 +338,10 @@ struct _GSupplicantNetwork { GSList *vsie_list; unsigned char country_code[COUNTRY_CODE_LENGTH]; GSupplicantPhy_mode phy_mode; -#endif -#if defined TIZEN_EXT + dbus_bool_t owe_transition_mode; + unsigned int transition_mode_ssid_len; + unsigned char transition_mode_bssid[6]; + unsigned char transition_mode_ssid[32]; unsigned char last_connected_bssid[WIFI_BSSID_LEN_MAX]; GHashTable *assoc_reject_table; #endif @@ -1815,6 +1821,34 @@ const unsigned char *g_supplicant_network_get_bssid(GSupplicantNetwork *network) return (const unsigned char *)network->best_bss->bssid; } +dbus_bool_t g_supplicant_network_get_transition_mode(GSupplicantNetwork *network) +{ + if (network == NULL) + return FALSE; + + return network->owe_transition_mode; +} + + +const unsigned char *g_supplicant_network_get_transition_mode_bssid(GSupplicantNetwork *network) +{ + if (network == NULL) + return NULL; + + return (const unsigned char *)network->transition_mode_bssid; +} + +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; + } + + *transition_mode_ssid_len = network->transition_mode_ssid_len; + return network->transition_mode_ssid; +} unsigned int g_supplicant_network_get_maxrate(GSupplicantNetwork *network) { @@ -2454,6 +2488,14 @@ static char *create_group(struct g_supplicant_bss *bss) return g_string_free(str, FALSE); } +#if defined TIZEN_EXT +static void update_network_with_best_bss(GSupplicantNetwork *network, + struct g_supplicant_bss *best_bss) +{ + network->signal = best_bss->signal; + network->frequency = best_bss->frequency; + network->best_bss = best_bss; +} static bool update_best_bss(GSupplicantNetwork *network, struct g_supplicant_bss *bss, struct g_supplicant_bss *best_bss) @@ -2461,10 +2503,16 @@ static bool update_best_bss(GSupplicantNetwork *network, int score_new; int score_best; + if (network->best_bss == NULL) { + update_network_with_best_bss(network, bss); + return true; + } + score_new = calculate_score( compare_bssid(bss->bssid, network->last_connected_bssid), get_assoc_reject_cnt(network->assoc_reject_table, bss->bssid), bss->frequency, bss->signal); + score_best = calculate_score( compare_bssid(network->best_bss->bssid, network->last_connected_bssid), get_assoc_reject_cnt(network->assoc_reject_table, network->best_bss->bssid), @@ -2475,9 +2523,7 @@ static bool update_best_bss(GSupplicantNetwork *network, MAC2STR(bss->bssid), score_new, MAC2STR(network->best_bss->bssid), score_best); - network->signal = bss->signal; - network->frequency = bss->frequency; - network->best_bss = bss; + update_network_with_best_bss(network, bss); SUPPLICANT_DBG("Update best BSS for %s", network->name); @@ -2486,7 +2532,7 @@ static bool update_best_bss(GSupplicantNetwork *network, return false; } - +#endif static int add_or_replace_bss_to_network(struct g_supplicant_bss *bss) { GSupplicantInterface *interface = bss->interface; @@ -2536,6 +2582,10 @@ static int add_or_replace_bss_to_network(struct g_supplicant_bss *bss) } #if defined TIZEN_EXT + network->owe_transition_mode = bss->owe_transition_mode; + memcpy(network->transition_mode_ssid, bss->transition_mode_ssid, bss->transition_mode_ssid_len); + memcpy(network->transition_mode_bssid, bss->transition_mode_bssid, WIFI_BSSID_LEN_MAX); + network->keymgmt = bss->keymgmt; if (g_slist_length(bss->vsie_list) > 0) { @@ -2806,6 +2856,7 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) unsigned int value; int ie_len; #if defined TIZEN_EXT + const unsigned char OWE_WFA_OUI[] = { 0x50, 0x6f, 0x9a, 0x1c }; int r_len, j; unsigned char *rates = NULL; unsigned char *ext_rates = NULL; @@ -2844,6 +2895,37 @@ static void bss_process_ies(DBusMessageIter *iter, void *user_data) #if defined TIZEN_EXT unsigned char *vsie; int vsie_len = 0; + + if(ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, OWE_WFA_OUI, sizeof(OWE_WFA_OUI)) == 0) { + SUPPLICANT_DBG("IE: match vendor specific data : OWE Transition Mode"); + +/* + Tag: Vendor Specific: Wi-Fi Alliance: OWE Transition Mode + Tag Number: Vendor Specific (221) -> ie[0] + Tag length: 26 -> ie[1] + OUI: 50:6f:9a (Wi-Fi Alliance) -> ie[2] + Vendor Specific OUI Type: 28 -> ie[5] + BSSID: 92:fd:f0:20:2b:09 -> ie[6] + SSID length: 15 -> ie[12] + SSID: Wi-Fi-5.2.3-owe -> ie[13] + +0000 dd 1a 50 6f 9a 1c 92 fd f0 20 2b 09 0f 57 69 2d ..Po..... +..Wi- +0010 46 69 2d 35 2e 32 2e 33 2d 6f 77 65 Fi-5.2.3-owe + +*/ + bss->owe_transition_mode = TRUE; + if (ie[1] >= 11) { // Tag length is at least up to ssid length position. + memcpy(bss->transition_mode_bssid, ie+6, WIFI_BSSID_LEN_MAX); + if (ie[12] > 0 && ie[12] < 32) { + memcpy(bss->transition_mode_ssid, ie+13, ie[12]); + bss->transition_mode_ssid_len = ie[12]; + } else + bss->transition_mode_ssid_len = 0; + } else + bss->owe_transition_mode = FALSE; + continue; + } + if(ie[0] == VENDOR_SPECIFIC_INFO && memcmp(ie+2, WPS_OUI, sizeof(WPS_OUI)) != 0) { SUPPLICANT_DBG("IE: match vendor specific data"); @@ -3011,7 +3093,7 @@ static void bss_compute_security(struct g_supplicant_bss *bss) bss->security = G_SUPPLICANT_SECURITY_IEEE8021X; else if (bss->sae) bss->security = G_SUPPLICANT_SECURITY_SAE; - else if (bss->owe) + else if (bss->owe || bss->owe_transition_mode) bss->security = G_SUPPLICANT_SECURITY_OWE; else if (bss->dpp) bss->security = G_SUPPLICANT_SECURITY_DPP; @@ -5570,6 +5652,53 @@ static void interface_create_params(DBusMessageIter *iter, void *user_data) supplicant_dbus_dict_close(iter, &dict); } +#if defined TIZEN_EXT +static void interface_get_state(const char *key, DBusMessageIter *iter, + void *user_data) +{ + struct interface_create_data *data = user_data; + GSupplicantInterface *interface = NULL; + const char *str = NULL; + + SUPPLICANT_DBG("key[%s]", key); + + if (!data) { + SUPPLICANT_DBG("data is NULL"); + return; + } + + interface = data->interface; + if (!interface) { + SUPPLICANT_DBG("interface is NULL"); + return; + } + + if (iter) + dbus_message_iter_get_basic(iter, &str); + + if (str) { + if (string2state(str) != interface->state) + interface->state = string2state(str); + } + + if (interface->state == G_SUPPLICANT_STATE_DISABLED) + interface->ready = FALSE; + else + interface->ready = TRUE; + + SUPPLICANT_DBG("state %s (%d)", str, interface->state); + + if (data->callback) { + data->callback(0, interface, data->user_data); +#if defined TIZEN_EXT_WIFI_MESH + callback_mesh_support(interface); +#endif + } + + interface_create_data_free(data); +} +#endif + static void interface_get_result(const char *error, DBusMessageIter *iter, void *user_data) { @@ -5597,6 +5726,16 @@ static void interface_get_result(const char *error, goto done; } +#if defined TIZEN_EXT + data->interface = interface; + err = supplicant_dbus_property_get(path, + SUPPLICANT_INTERFACE ".Interface", + "State", interface_get_state, data, NULL); + + if (err == 0) + return; +#endif + if (data->callback) { data->callback(0, interface, data->user_data); #if !defined TIZEN_EXT @@ -6974,7 +7113,10 @@ static void add_network_security(DBusMessageIter *dict, GSupplicantSSID *ssid) add_network_security_proto(dict, ssid); break; case G_SUPPLICANT_SECURITY_SAE: - key_mgmt = "SAE"; + if (ssid->keymgmt & G_SUPPLICANT_KEYMGMT_WPA_PSK) + key_mgmt = "SAE WPA-PSK"; // WFA (WPA3 & WPA2 Mixed -> WPA2 only) + else + key_mgmt = "SAE"; add_network_security_psk(dict, ssid); break; case G_SUPPLICANT_SECURITY_OWE: @@ -7057,7 +7199,11 @@ static void interface_add_network_params(DBusMessageIter *iter, void *user_data) ssid->ssid_len); #if defined TIZEN_EXT - if (ssid->bssid) { + bool owe_transition_mode = FALSE; + if ((ssid->security == G_SUPPLICANT_SECURITY_OWE) && !(ssid->keymgmt & G_SUPPLICANT_KEYMGMT_OWE)) + owe_transition_mode = TRUE; + + if (ssid->bssid && !owe_transition_mode) { char *bssid = NULL; bssid = g_try_malloc0(18); if (bssid == NULL) { diff --git a/include/network.h b/include/network.h index a9f4f01..c5b1055 100755 --- a/include/network.h +++ b/include/network.h @@ -186,6 +186,13 @@ int connman_network_set_bssid(struct connman_network *network, const unsigned char *bssid); unsigned char *connman_network_get_bssid(struct connman_network *network); +int connman_network_set_transition_mode_bssid(struct connman_network *network, + const unsigned char *transition_mode_bssid); + +unsigned char *connman_network_get_transition_mode_bssid(struct connman_network *network); + +bool connman_network_check_transition_mode(struct connman_network *network1, struct connman_network *network2); + int connman_network_set_maxrate(struct connman_network *network, unsigned int maxrate); diff --git a/packaging/connman.spec b/packaging/connman.spec index 7ff85eb..f1385ed 100644 --- a/packaging/connman.spec +++ b/packaging/connman.spec @@ -5,7 +5,7 @@ Name: connman Version: 1.37 -Release: 39 +Release: 42 License: GPL-2.0+ Summary: Connection Manager Url: http://connman.net @@ -43,9 +43,6 @@ Provides: %{name}-profile_common = %{version}-%{release} Provides: %{name}-profile_mobile = %{version}-%{release} Provides: %{name}-profile_wearable = %{version}-%{release} -%define upgrade_script_filename 500.connman_upgrade.sh -%define upgrade_script_path /usr/share/upgrade/scripts - %description Connection Manager provides a daemon for managing Internet connections within embedded devices running the Linux operating system. @@ -236,10 +233,6 @@ cp src/connman.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/ cp vpn/vpn-dbus.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/connman-vpn-dbus.conf %endif -#OS Upgrade -mkdir -p %{buildroot}%{upgrade_script_path} -cp -f scripts/%{upgrade_script_filename} %{buildroot}%{upgrade_script_path} - %post #chsmack -a 'System' /%{_localstatedir}/lib/connman #chsmack -a 'System' /%{_localstatedir}/lib/connman/settings @@ -273,7 +266,6 @@ systemctl daemon-reload %attr(644,root,root) %{_libdir}/systemd/system/sockets.target.wants/connman.socket %endif %license COPYING -%{upgrade_script_path}/%{upgrade_script_filename} %files test %manifest connman.manifest diff --git a/plugins/wifi.c b/plugins/wifi.c index cbc6b15..7f26417 100755 --- a/plugins/wifi.c +++ b/plugins/wifi.c @@ -2395,6 +2395,18 @@ static void setup_autoscan(struct wifi_data *wifi) wifi->autoscan = parse_autoscan_params(AUTOSCAN_EXPONENTIAL); return; } +#if defined TIZEN_EXT + else { + if (wifi->autoscan) { + g_free(wifi->autoscan); + wifi->autoscan = NULL; + } + + DBG("BackgroundScanning is disabled"); + + return; + } +#endif /* * On the contrary, if BackgroundScanning is disabled, update autoscan @@ -3601,6 +3613,8 @@ done: if(g_strcmp0(ssid->eap, "fast") == 0) ssid->pac_file = g_strdup(WIFI_EAP_FAST_PAC_FILE); + + ssid->keymgmt = connman_network_get_keymgmt(network); #endif if (connman_setting_get_bool("BackgroundScanning")) @@ -4784,6 +4798,10 @@ static void network_added(GSupplicantNetwork *supplicant_network) bool wps_advertizing; #if defined TIZEN_EXT + bool owe_transition_mode; + const unsigned char *transition_mode_ssid; + const unsigned char *transition_mode_bssid; + unsigned int transition_mode_ssid_len; GSList *vsie_list = NULL; const unsigned char *country_code; ieee80211_modes_e phy_mode; @@ -4888,6 +4906,15 @@ static void network_added(GSupplicantNetwork *supplicant_network) #if defined TIZEN_EXT connman_network_set_bssid(network, g_supplicant_network_get_bssid(supplicant_network)); + owe_transition_mode = (bool)g_supplicant_network_get_transition_mode(supplicant_network); + connman_network_set_bool(network, "WiFi.TRANSITION_MODE", owe_transition_mode); + if (owe_transition_mode) { + transition_mode_ssid = (unsigned char *)g_supplicant_network_get_transition_mode_ssid(supplicant_network, &transition_mode_ssid_len); + connman_network_set_blob(network, "WiFi.TRANSITION_MODE_SSID", + transition_mode_ssid, transition_mode_ssid_len); + transition_mode_bssid = g_supplicant_network_get_transition_mode_bssid(supplicant_network); + connman_network_set_transition_mode_bssid(network, transition_mode_bssid); + } connman_network_set_maxrate(network, g_supplicant_network_get_maxrate(supplicant_network)); connman_network_set_enc_mode(network, @@ -5174,7 +5201,22 @@ static void network_associated(GSupplicantNetwork *network) if (wifi->network) { if (wifi->network == connman_network) return; - +#if TIZEN_EXT + unsigned int ssid_len; + DBG("network1 ssid[%s] , OWE[%d],ssid[%s]", + (char *)connman_network_get_blob(wifi->network,"WiFi.SSID", &ssid_len), + connman_network_get_bool(wifi->network,"WiFi.TRANSITION_MODE"), + (char *)connman_network_get_blob(wifi->network,"WiFi.TRANSITION_MODE_SSID", &ssid_len)); + + DBG("network1 ssid[%s], OWE[%d], ssid[%s]", + (char *)connman_network_get_blob(connman_network,"WiFi.SSID",&ssid_len), + connman_network_get_bool(connman_network,"WiFi.TRANSITION_MODE"), + (char *)connman_network_get_blob(connman_network,"WiFi.TRANSITION_MODE_SSID", &ssid_len)); + if (connman_network_check_transition_mode(wifi->network, connman_network)) {//OWE trasition mode check + DBG("OWE transition mode is TRUE"); + return; + } +#endif /* * This should never happen, we got associated with * a network different than the one we were expecting. diff --git a/scripts/500.connman_upgrade.sh b/scripts/500.connman_upgrade.sh deleted file mode 100644 index a21336e..0000000 --- a/scripts/500.connman_upgrade.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -PATH=/bin:/usr/bin:/sbin:/usr/sbin - -#------------------------------------------------------------# -# connman patch script for upgrade (3.0 -> the latest tizen) # -#------------------------------------------------------------# - -chmod 755 /var/lib/connman -chown -R network_fw:network_fw /var/lib/connman diff --git a/src/network.c b/src/network.c index 334202c..243b502 100755 --- a/src/network.c +++ b/src/network.c @@ -140,6 +140,10 @@ struct connman_network { #if defined TIZEN_EXT unsigned char last_connected_bssid[WIFI_BSSID_LEN_MAX]; GHashTable *assoc_reject_table; + bool owe_transition_mode; + void *transition_mode_ssid; + int transition_mode_ssid_len; + unsigned char transition_mode_bssid[WIFI_BSSID_LEN_MAX]; #endif } wifi; @@ -2349,6 +2353,41 @@ unsigned char *connman_network_get_bssid(struct connman_network *network) return (unsigned char *)network->wifi.bssid; } +int connman_network_set_transition_mode_bssid(struct connman_network *network, + const unsigned char *transition_mode_bssid) +{ + int i = 0; + + if (transition_mode_bssid == NULL) + return -EINVAL; + + for (;i < WIFI_BSSID_LEN_MAX;i++) + network->wifi.transition_mode_bssid[i] = transition_mode_bssid[i]; + + return 0; +} + +unsigned char *connman_network_get_transition_mode_bssid(struct connman_network *network) +{ + return (unsigned char *)network->wifi.transition_mode_bssid; +} + +bool connman_network_check_transition_mode(struct connman_network *network1, struct connman_network *network2) +{ + + if (network1 == NULL || network2 == NULL) + return FALSE; + + if (network1->wifi.owe_transition_mode == FALSE || network2->wifi.owe_transition_mode == FALSE) + return FALSE; + + if ((memcmp(network1->wifi.bssid, network2->wifi.transition_mode_bssid, WIFI_BSSID_LEN_MAX) == 0) + && (memcmp(network1->wifi.transition_mode_bssid, network2->wifi.bssid, WIFI_BSSID_LEN_MAX) == 0)) + return TRUE; + else + return FALSE; +} + int connman_network_set_maxspeed(struct connman_network *network, int maxspeed) { @@ -2885,6 +2924,8 @@ int connman_network_set_bool(struct connman_network *network, network->default_internet = value; else if (g_strcmp0(key, "WiFi.HS20AP") == 0) network->wifi.isHS20AP = value; + else if (g_strcmp0(key, "WiFi.TRANSITION_MODE") == 0) + network->wifi.owe_transition_mode = value; #endif return -EINVAL; @@ -2913,6 +2954,8 @@ bool connman_network_get_bool(struct connman_network *network, return network->default_internet; else if (g_str_equal(key, "WiFi.HS20AP")) return network->wifi.isHS20AP; + else if (g_strcmp0(key, "WiFi.TRANSITION_MODE")) + return network->wifi.owe_transition_mode; #endif return false; @@ -2964,6 +3007,16 @@ int connman_network_set_blob(struct connman_network *network, network->wifi.ssid_len = size; } else network->wifi.ssid_len = 0; +#ifdef TIZEN_EXT + } else if (g_str_equal(key, "WiFi.TRANSITION_MODE_SSID")) { + g_free(network->wifi.transition_mode_ssid); + network->wifi.transition_mode_ssid = g_try_malloc(size); + if (network->wifi.transition_mode_ssid) { + memcpy(network->wifi.transition_mode_ssid, data, size); + network->wifi.transition_mode_ssid_len = size; + } else + network->wifi.transition_mode_ssid_len = 0; +#endif } else { return -EINVAL; } @@ -2986,8 +3039,13 @@ const void *connman_network_get_blob(struct connman_network *network, if (size) *size = network->wifi.ssid_len; return network->wifi.ssid; +#ifdef TIZEN_EXT + } else if (g_str_equal(key, "WiFi.TRANSITION_MODE_SSID")) { + if (size) + *size = network->wifi.transition_mode_ssid_len; + return network->wifi.transition_mode_ssid; +#endif } - return NULL; }