diff options
author | Jaehyun Kim <jeik01.kim@samsung.com> | 2020-08-27 23:32:34 +0900 |
---|---|---|
committer | Jaehyun Kim <jeik01.kim@samsung.com> | 2020-08-27 23:32:34 +0900 |
commit | c45eee86f5a3fb041df570f23b2b477c38af0cce (patch) | |
tree | f0a30ba5b7f3370f880115c39a532f854b810f01 /src/device.c | |
parent | 26dbdca524427fa4b1bbdecdc9d0e9351cdc830b (diff) | |
download | connman-c45eee86f5a3fb041df570f23b2b477c38af0cce.tar.gz connman-c45eee86f5a3fb041df570f23b2b477c38af0cce.tar.bz2 connman-c45eee86f5a3fb041df570f23b2b477c38af0cce.zip |
Add support for handling multiple wifi interfacessubmit/tizen/20200828.142119
Change-Id: I4762c8d3444167dce34498634de4948e822f865f
Signed-off-by: Jaehyun Kim <jeik01.kim@samsung.com>
Diffstat (limited to 'src/device.c')
-rwxr-xr-x | src/device.c | 193 |
1 files changed, 192 insertions, 1 deletions
diff --git a/src/device.c b/src/device.c index 2029871e..78b01f77 100755 --- a/src/device.c +++ b/src/device.c @@ -38,6 +38,10 @@ static GSList *device_list = NULL; static gchar **device_filter = NULL; static gchar **nodevice_filter = NULL; +#if defined TIZEN_EXT +static DBusConnection *connection; +#endif + enum connman_pending_type { PENDING_NONE = 0, PENDING_ENABLE = 1, @@ -72,11 +76,20 @@ struct connman_device { time_t last_user_selection_time; char *last_user_selection_ident; char *last_connected_ident; + DBusMessage *pending_reply; + int max_scan_ssids; + bool is_5_0_ghz_supported; #endif }; static void clear_pending_trigger(struct connman_device *device) { +#if defined TIZEN_EXT + if (device->pending_reply) { + dbus_message_unref(device->pending_reply); + device->pending_reply = NULL; + } +#endif if (device->pending_timeout > 0) { g_source_remove(device->pending_timeout); device->pending_timeout = 0; @@ -190,6 +203,19 @@ static gboolean device_pending_reset(gpointer user_data) DBG("device %p", device); +#if defined TIZEN_EXT + DBusMessage *reply; + + /* Power request timed out, send ETIMEDOUT. */ + if (device->pending_reply) { + reply = __connman_error_failed(device->pending_reply, ETIMEDOUT); + if (reply) + g_dbus_send_message(connection, reply); + + dbus_message_unref(device->pending_reply); + device->pending_reply = NULL; + } +#endif /* Power request timedout, reset power pending state. */ device->pending_timeout = 0; device->powered_pending = PENDING_NONE; @@ -436,6 +462,51 @@ static void device_destruct(struct connman_device *device) g_free(device); } +#if defined TIZEN_EXT +static void device_send_changed(const char *ifname, enum connman_service_type type, + const char *key, bool state) +{ + DBusMessage *signal; + DBusMessageIter iter, dict; + dbus_bool_t value = state; + const char *tech_path = connman_techonology_get_path(type); + + if (!tech_path || !ifname) + return; + + DBG("%s %s %s", ifname, key, state ? "TRUE" : "FALSE"); + + signal = dbus_message_new_signal(tech_path, + CONNMAN_TECHNOLOGY_INTERFACE, "DeviceChanged"); + if (!signal) + return; + + dbus_message_iter_init_append(signal, &iter); + + connman_dbus_dict_open(&iter, &dict); + connman_dbus_dict_append_basic(&dict, "Ifname", + DBUS_TYPE_STRING, + &ifname); + connman_dbus_dict_append_basic(&dict, key, + DBUS_TYPE_BOOLEAN, + &value); + connman_dbus_dict_close(&iter, &dict); + + dbus_connection_send(connection, signal, NULL); + dbus_message_unref(signal); +} + +static void device_send_reply(struct connman_device *device) +{ + if (device->pending_reply) { + g_dbus_send_reply(connection, + device->pending_reply, DBUS_TYPE_INVALID); + dbus_message_unref(device->pending_reply); + device->pending_reply = NULL; + } +} +#endif + /** * connman_device_create: * @node: device node name (for example an address) @@ -611,6 +682,10 @@ int connman_device_set_powered(struct connman_device *device, if (device->powered == powered) return -EALREADY; +#if defined TIZEN_EXT + device_send_reply(device); +#endif + clear_pending_trigger(device); device->powered_pending = PENDING_NONE; @@ -619,6 +694,11 @@ int connman_device_set_powered(struct connman_device *device, type = __connman_device_get_service_type(device); +#if defined TIZEN_EXT + device_send_changed(device->interface, type, "Powered", powered); + technology_save_device(device); +#endif + if (!device->powered) { __connman_technology_disabled(type); return 0; @@ -1102,6 +1182,54 @@ struct connman_network *connman_device_get_network(struct connman_device *device return g_hash_table_lookup(device->networks, identifier); } +#if defined TIZEN_EXT +struct connman_network *connman_device_get_default_network( + struct connman_device *device) +{ + return device->network; +} + +void connman_device_set_pending_reply(struct connman_device *device, + DBusMessage *msg) +{ + device->pending_reply = dbus_message_ref(msg); +} + +void connman_device_send_connected_signal(struct connman_device *device, + bool connected) +{ + enum connman_service_type type; + + if (!device) + return; + + type = __connman_device_get_service_type(device); + device_send_changed(device->interface, type, "Connected", connected); +} + +void connman_device_set_max_scan_ssids(struct connman_device *device, + int max_scan_ssids) +{ + device->max_scan_ssids = max_scan_ssids; +} + +int connman_device_get_max_scan_ssids(struct connman_device *device) +{ + return device->max_scan_ssids; +} + +void connman_device_set_wifi_5ghz_supported(struct connman_device *device, + bool is_5_0_ghz_supported) +{ + device->is_5_0_ghz_supported = is_5_0_ghz_supported; +} + +bool connman_device_get_wifi_5ghz_supported(struct connman_device *device) +{ + return device->is_5_0_ghz_supported; +} +#endif + /** * connman_device_remove_network: * @device: device structure @@ -1314,7 +1442,7 @@ static int device_specific_scan(enum connman_service_type type, } int __connman_device_request_specific_scan(enum connman_service_type type, - int scan_type, GSList *specific_scan_list) + const char *ifname, int scan_type, GSList *specific_scan_list) { bool success = false; int last_err = -ENOSYS; @@ -1352,6 +1480,9 @@ int __connman_device_request_specific_scan(enum connman_service_type type, continue; } + if (ifname && g_strcmp0(device->interface, ifname) != 0) + continue; + err = device_specific_scan(type, device, scan_type, specific_scan_list); if (err == 0 || err == -EINPROGRESS) { success = true; @@ -1367,6 +1498,58 @@ int __connman_device_request_specific_scan(enum connman_service_type type, return last_err; } +int connman_device_request_device_scan(enum connman_service_type type, + const char * ifname, bool force_full_scan) +{ + bool success = false; + int last_err = -ENOSYS; + GSList *list; + int err; + + switch (type) { + case CONNMAN_SERVICE_TYPE_UNKNOWN: + case CONNMAN_SERVICE_TYPE_SYSTEM: + case CONNMAN_SERVICE_TYPE_ETHERNET: + case CONNMAN_SERVICE_TYPE_BLUETOOTH: + case CONNMAN_SERVICE_TYPE_CELLULAR: + case CONNMAN_SERVICE_TYPE_GPS: + case CONNMAN_SERVICE_TYPE_VPN: + case CONNMAN_SERVICE_TYPE_GADGET: + return -EOPNOTSUPP; + case CONNMAN_SERVICE_TYPE_WIFI: + case CONNMAN_SERVICE_TYPE_P2P: +#if defined TIZEN_EXT_WIFI_MESH + case CONNMAN_SERVICE_TYPE_MESH: +#endif + break; + } + + for (list = device_list; list; list = list->next) { + struct connman_device *device = list->data; + + if (!device_has_service_type(device, type)) + continue; + + if (g_strcmp0(device->interface, ifname) != 0) + continue; + + err = device_scan(type, device, force_full_scan); + + if (err == 0 || err == -EINPROGRESS) { + success = true; + } else { + last_err = err; + DBG("device %p err %d", device, err); + } + break; + } + + if (success) + return 0; + + return last_err; +} + #if defined TIZEN_EXT_WIFI_MESH static int device_abort_scan(enum connman_service_type type, struct connman_device *device) @@ -1882,6 +2065,10 @@ int __connman_device_init(const char *device, const char *nodevice) { DBG(""); +#if defined TIZEN_EXT + connection = connman_dbus_get_connection(); +#endif + if (device) device_filter = g_strsplit(device, ",", -1); @@ -1899,4 +2086,8 @@ void __connman_device_cleanup(void) g_strfreev(nodevice_filter); g_strfreev(device_filter); + +#if defined TIZEN_EXT + dbus_connection_unref(connection); +#endif } |