From a24d116e72dc59087d6f1632d405e43e56af7615 Mon Sep 17 00:00:00 2001 From: Jaehyun Kim Date: Fri, 28 Oct 2022 17:09:38 +0900 Subject: [PATCH] DA: Add set/unset DHCP state callback function Change-Id: Ia0c1e8be8150553be3e8823cf6686ec47dddea36 Signed-off-by: Jaehyun Kim --- include/wifi-manager-extension.h | 63 ++++++++++++++++++++++++++++++++++ src/network_info.h | 4 +++ src/network_internal.h | 3 ++ src/network_signal.c | 68 +++++++++++++++++++++++++++++++++++++ src/wifi_internal.c | 21 ++++++++++++ src/wifi_internal.h | 4 +++ src/wifi_manager.c | 44 ++++++++++++++++++++++++ tools/manager-test/wman_test_main.c | 16 +++++++++ 8 files changed, 223 insertions(+) diff --git a/include/wifi-manager-extension.h b/include/wifi-manager-extension.h index 737c6e4..c927f83 100644 --- a/include/wifi-manager-extension.h +++ b/include/wifi-manager-extension.h @@ -79,6 +79,17 @@ typedef enum { WIFI_MANAGER_ROAM_SUCCESS, /**< Wi-Fi Roaming is successful. */ } wifi_manager_roam_e; +#if defined TIZEN_DA +/** + * @brief Enumeration for the Wi-Fi DHCP state. + * @since_tizen 7.5 + */ +typedef enum { + WIFI_MANAGER_DHCP_STATE_FAILED = -1, /* DHCP Fail */ + WIFI_MANAGER_DHCP_STATE_SUCCESS = 0, /* DHCP Success */ +} wifi_manager_dhcp_state_e; +#endif /* TIZEN_DA */ + /** * @brief The Wi-Fi netlink scan handle. * @since_tizen 5.0 @@ -795,6 +806,58 @@ int wifi_manager_set_roaming_cb(wifi_manager_h wifi, */ int wifi_manager_unset_roaming_cb(wifi_manager_h wifi); +#if defined TIZEN_DA +/** + * @brief Called when the DHCP state is changed. + * @since_tizen 7.5 + * @param[in] state The DHCP state + * @param[in] lease_time The DHCP lease time + * @param[in] user_data The user data passed from the callback registration function + * @see wifi_manager_dhcp_set_event_cb() + * @see wifi_manager_dhcp_unset_event_cb() + */ + +typedef void(*wifi_manager_dhcp_event_cb)(wifi_manager_dhcp_state_e state, int lease_time, void *user_data); + +/** + * @brief set DHCP event callback + * @since_tizen 7.5 + * @privlevel public + * @privilege %http://tizen.org/privilege/network.set + * + * @param[in] wifi The Wi-Fi handle + * @param[in] callback The callback function to be called + * @param[in] user_data The user data passed to the callback function + * + * @return 0 on success, otherwise negative error value + * @retval #WIFI_MANAGER_ERROR_NONE Successful + * @retval #WIFI_MANAGER_ERROR_INVALID_OPERATION Invalid operation + * @retval #WIFI_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIFI_MANAGER_ERROR_OPERATION_FAILED Operation failed + * @retval #WIFI_MANAGER_ERROR_PERMISSION_DENIED Permission Denied + * @retval #WIFI_MANAGER_ERROR_NOT_SUPPORTED Not supported + */ +int wifi_manager_dhcp_set_event_cb(wifi_manager_h wifi, wifi_manager_dhcp_event_cb callback, void *user_data); + +/** + * @brief unset DHCP event callback + * @since_tizen 7.5 + * @privlevel public + * @privilege %http://tizen.org/privilege/network.set + * + * @param[in] wifi The Wi-Fi handle + * + * @return 0 on success, otherwise negative error value + * @retval #WIFI_MANAGER_ERROR_NONE Successful + * @retval #WIFI_MANAGER_ERROR_INVALID_OPERATION Invalid operation + * @retval #WIFI_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #WIFI_MANAGER_ERROR_OPERATION_FAILED Operation failed + * @retval #WIFI_MANAGER_ERROR_PERMISSION_DENIED Permission Denied + * @retval #WIFI_MANAGER_ERROR_NOT_SUPPORTED Not supported + */ +int wifi_manager_dhcp_unset_event_cb(wifi_manager_h wifi); +#endif /* TIZEN_DA */ + /** * @} */ diff --git a/src/network_info.h b/src/network_info.h index 9e13e2c..b50085a 100644 --- a/src/network_info.h +++ b/src/network_info.h @@ -74,6 +74,7 @@ typedef enum { NET_EVENT_WIFI_ROAM_STATE_IND, #if defined TIZEN_DA NET_EVENT_WIFI_TIMEOUT_RSP, + NET_EVENT_WIFI_DHCP_STATE_IND, #endif /* TIZEN_DA */ } net_event_e; @@ -145,6 +146,9 @@ typedef struct { guint subscribe_id_connman_scanstarted; guint subscribe_id_connman_roaming; guint subscribe_id_netconfig_wifi; +#if defined TIZEN_DA + guint subscribe_id_connman_dhcp; +#endif /* TIZEN_DA */ char interface_name[NET_WLAN_IF_NAME_LEN]; char mac_address[WIFI_MAC_ADDR_LEN + 1]; diff --git a/src/network_internal.h b/src/network_internal.h index dbf1702..ff68827 100644 --- a/src/network_internal.h +++ b/src/network_internal.h @@ -87,6 +87,9 @@ extern "C" { #define SIGNAL_SCAN_DONE "ScanDone" #define SIGNAL_SCAN_CHANGED "ScanChanged" #define SIGNAL_ROAMING_STATE_CHANGED "RoamingStateChanged" +#if defined TIZEN_DA +#define SIGNAL_DHCP_CHANGED "DhcpChanged" +#endif /* TIZEN_DA */ #define CONNMAN_WIFI_TECHNOLOGY_PREFIX CONNMAN_PATH "/technology/wifi" diff --git a/src/network_signal.c b/src/network_signal.c index be30864..441222a 100644 --- a/src/network_signal.c +++ b/src/network_signal.c @@ -1957,6 +1957,51 @@ static int __net_handle_dpp_removed(network_info_s *network_info, return NET_ERR_NONE; } +#if defined TIZEN_DA +static int __net_handle_dhcp_changed(network_info_s *network_info, GVariant *param) +{ + __NETWORK_FUNC_ENTER__; + + const char *key = NULL; + int value = 0; + GVariant *var; + net_event_info_s *event_data = NULL; + + event_data = g_try_malloc0(sizeof(net_event_info_s)); + if (event_data == NULL) { + __NETWORK_FUNC_EXIT__; + return NET_ERR_OUT_OF_MEMORY; + } + + g_variant_get(param, "(sv)", &key, &var); + + if (g_strcmp0(key, "DHCP_SUCCESS") == 0 || g_strcmp0(key, "DHCP_FAIL") == 0) { + if (g_variant_is_of_type(var, G_VARIANT_TYPE_INT32)) + value = g_variant_get_int32(var); + + WIFI_LOG(WIFI_INFO, "Key:[%s] value:[%d]", key, value); + + event_data->Event = NET_EVENT_WIFI_DHCP_STATE_IND; + event_data->Error = NET_ERR_NONE; + event_data->Datalength = sizeof(gint); + event_data->Data = &value; + + if (network_info->event_callback) + network_info->event_callback(event_data, network_info->user_data); + } + + g_free(event_data); + + g_free((gchar *)key); + if (NULL != var) + g_variant_unref(var); + + WIFI_LOG(WIFI_INFO, "Exit Function"); + __NETWORK_FUNC_EXIT__; + return NET_ERR_NONE; +} +#endif /* TIZEN_DA */ + static void __net_connman_manager_signal_filter(GDBusConnection *conn, const gchar *name, const gchar *path, const gchar *interface, const gchar *sig, GVariant *param, gpointer user_data) @@ -1969,6 +2014,10 @@ static void __net_connman_manager_signal_filter(GDBusConnection *conn, __net_handle_scan_done(network_info, param); else if (g_strcmp0(sig, SIGNAL_ROAMING_STATE_CHANGED) == 0) __net_handle_roaming_changed(network_info, param); +#if defined TIZEN_DA + else if (g_strcmp0(sig, SIGNAL_DHCP_CHANGED) == 0) + __net_handle_dhcp_changed(network_info, param); +#endif /* TIZEN_DA */ } static void __net_netconfig_signal_filter(GDBusConnection *conn, @@ -2332,6 +2381,21 @@ int _net_register_signal(network_info_s *network_info) network_info, NULL); +#if defined TIZEN_DA + /* Create connman service dhcp connection */ + network_info->subscribe_id_connman_dhcp = g_dbus_connection_signal_subscribe( + network_info->connection, + CONNMAN_SERVICE, + CONNMAN_MANAGER_INTERFACE, + SIGNAL_DHCP_CHANGED, + CONNMAN_MANAGER_PATH, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + __net_connman_manager_signal_filter, + network_info, + NULL); +#endif /* TIZEN_DA */ + /* LCOV_EXCL_START */ if (network_info->subscribe_id_connman_state == 0 || network_info->subscribe_id_connman_error == 0 || @@ -2374,6 +2438,10 @@ void _net_deregister_signal(network_info_s *network_info) network_info->subscribe_id_connman_roaming); g_dbus_connection_signal_unsubscribe(network_info->connection, network_info->subscribe_id_netconfig_wifi); +#if defined TIZEN_DA + g_dbus_connection_signal_unsubscribe(network_info->connection, + network_info->subscribe_id_connman_dhcp); +#endif /* TIZEN_DA */ } __NETWORK_FUNC_EXIT__; diff --git a/src/wifi_internal.c b/src/wifi_internal.c index 7666993..4f9731b 100644 --- a/src/wifi_internal.c +++ b/src/wifi_internal.c @@ -1258,6 +1258,21 @@ static void __dpp_removed_cb(wifi_manager_handle_s *wifi_handle, g_p_dpp_current = NULL; } +#if defined TIZEN_DA +static void __dhcp_state_cb(wifi_manager_handle_s *wifi_handle, int lease_time) +{ + wifi_manager_dhcp_state_e state; + + if (lease_time > 0) + state = WIFI_MANAGER_DHCP_STATE_SUCCESS; + else + state = WIFI_MANAGER_DHCP_STATE_FAILED; + + if (wifi_handle->dhcp_event_cb) + wifi_handle->dhcp_event_cb(state, lease_time, wifi_handle->dhcp_event_user_data); +} +#endif /* TIZEN_DA */ + static void __roaming_state_changed_cb(wifi_manager_handle_s *wifi_handle, net_roam_event_info_s *roam_event_info) { @@ -1576,6 +1591,12 @@ static void _wifi_evt_cb(net_event_info_s *event_cb, void *user_data) __connected_cb(wifi_handle, result); break; + case NET_EVENT_WIFI_DHCP_STATE_IND: + { + int *lease_time = (int *)event_cb->Data; + __dhcp_state_cb(wifi_handle, *lease_time); + } + break; #endif /* TIZEN_DA */ //LCOV_EXCL_STOP default: diff --git a/src/wifi_internal.h b/src/wifi_internal.h index 95572c1..75a8a75 100644 --- a/src/wifi_internal.h +++ b/src/wifi_internal.h @@ -263,6 +263,10 @@ typedef struct { void *dpp_event_user_data; wifi_manager_roaming_state_changed_cb roaming_state_changed_cb; void *roaming_state_changed_user_data; +#if defined TIZEN_DA + wifi_manager_dhcp_event_cb dhcp_event_cb; + void *dhcp_event_user_data; +#endif /* TIZEN_DA */ network_info_s *network_info; char interface_name[NET_WLAN_IF_NAME_LEN]; diff --git a/src/wifi_manager.c b/src/wifi_manager.c index c9d07bc..e66d21b 100644 --- a/src/wifi_manager.c +++ b/src/wifi_manager.c @@ -2226,3 +2226,47 @@ EXPORT_API int wifi_manager_unset_roaming_cb(wifi_manager_h wifi) __NETWORK_CAPI_FUNC_EXIT__; return WIFI_MANAGER_ERROR_NONE; } + +#if defined TIZEN_DA +static int __wifi_set_dhcp_event_cb(wifi_manager_h wifi, + void *callback, void *user_data) +{ + wifi_manager_handle_s *local_handle = (wifi_manager_handle_s *)wifi; + + local_handle->dhcp_event_cb = callback; + local_handle->dhcp_event_user_data = user_data; + + return WIFI_MANAGER_ERROR_NONE; +} + +EXPORT_API int wifi_manager_dhcp_set_event_cb(wifi_manager_h wifi, + wifi_manager_dhcp_event_cb callback, void *user_data) +{ + __NETWORK_CAPI_FUNC_ENTER__; + + CHECK_FEATURE_SUPPORTED(WIFI_FEATURE); + + RET_ERR_IF_HANDLE_IS_NOT_VALID_OR_NOT_INITIALIZED(wifi, __NETWORK_CAPI_FUNC_EXIT__); + + if (callback == NULL) { + WIFI_LOG(WIFI_ERROR, "Invalid parameter"); + __NETWORK_CAPI_FUNC_EXIT__; + return WIFI_MANAGER_ERROR_INVALID_PARAMETER; + } + + __NETWORK_CAPI_FUNC_EXIT__; + return __wifi_set_dhcp_event_cb(wifi, callback, user_data); +} + +EXPORT_API int wifi_manager_dhcp_unset_event_cb(wifi_manager_h wifi) +{ + __NETWORK_CAPI_FUNC_ENTER__; + + CHECK_FEATURE_SUPPORTED(WIFI_FEATURE); + + RET_ERR_IF_HANDLE_IS_NOT_VALID_OR_NOT_INITIALIZED(wifi, __NETWORK_CAPI_FUNC_EXIT__); + + __NETWORK_CAPI_FUNC_EXIT__; + return __wifi_set_dhcp_event_cb(wifi, NULL, NULL); +} +#endif /* TIZEN_DA */ diff --git a/tools/manager-test/wman_test_main.c b/tools/manager-test/wman_test_main.c index b41cf02..c4b35fa 100644 --- a/tools/manager-test/wman_test_main.c +++ b/tools/manager-test/wman_test_main.c @@ -162,6 +162,16 @@ static void __test_roaming_state_changed_callback(wifi_manager_roam_e state, printf(", cur_bssid: %s, dst_bssid: %s\n", cur_bssid, dst_bssid); } +#if defined TIZEN_DA +static void __test_dhcp_changed_callback(wifi_manager_dhcp_state_e state, int lease_time, void *user_data) +{ + if (state == WIFI_MANAGER_DHCP_STATE_SUCCESS) + printf("[%s] DHCP state changed callback, state : Success, lease time : %d\n", (char *)user_data, lease_time); + else + printf("[%s] DHCP state changed callback, state : Fail\n", (char *)user_data); +} +#endif /* TIZEN_DA */ + int wman_test_init(void) { int rv = wifi_manager_initialize(&wifi); @@ -177,6 +187,9 @@ int wman_test_init(void) wifi_manager_tdls_set_discovered_cb(wifi, __test_tdls_discover_callback, "1"); wifi_manager_set_module_state_changed_cb(wifi, __test_get_wifi_module_state_callback, "1"); wifi_manager_set_roaming_cb(wifi, __test_roaming_state_changed_callback, "1"); +#if defined TIZEN_DA + wifi_manager_dhcp_set_event_cb(wifi, __test_dhcp_changed_callback, "1"); +#endif /* TIZEN_DA */ } else { printf("[1] Wifi init failed [%s]\n", wman_test_strerror(rv)); @@ -193,6 +206,9 @@ int wman_test_init(void) wifi_manager_tdls_set_state_changed_cb(wifi2, __test_tdls_state_callback, "2"); wifi_manager_tdls_set_discovered_cb(wifi, __test_tdls_discover_callback, "2"); wifi_manager_set_module_state_changed_cb(wifi, __test_get_wifi_module_state_callback, "2"); +#if defined TIZEN_DA + wifi_manager_dhcp_set_event_cb(wifi2, __test_dhcp_changed_callback, "2"); +#endif /* TIZEN_DA */ } else { printf("[2] Wifi init failed [%s]\n", wman_test_strerror(rv)); return -1; -- 2.7.4