summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgdbus/watch.c46
-rwxr-xr-xgsupplicant/supplicant.c75
-rw-r--r--packaging/connman.spec2
3 files changed, 119 insertions, 4 deletions
diff --git a/gdbus/watch.c b/gdbus/watch.c
index 447e4867..1ca3c4bd 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/supplicant.c b/gsupplicant/supplicant.c
index 759e165b..2dccc951 100755
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -2455,16 +2455,30 @@ static char *create_group(struct g_supplicant_bss *bss)
return g_string_free(str, FALSE);
}
+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)
{
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 +2489,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);
@@ -5570,6 +5582,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 +5656,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
diff --git a/packaging/connman.spec b/packaging/connman.spec
index 6fa2f94c..4a6815e5 100644
--- a/packaging/connman.spec
+++ b/packaging/connman.spec
@@ -5,7 +5,7 @@
Name: connman
Version: 1.37
-Release: 39
+Release: 41
License: GPL-2.0+
Summary: Connection Manager
Url: http://connman.net