DA: Add set/unset DHCP state callback function 38/283538/2
authorJaehyun Kim <jeik01.kim@samsung.com>
Fri, 28 Oct 2022 08:09:38 +0000 (17:09 +0900)
committerJaehyun Kim <jeik01.kim@samsung.com>
Fri, 28 Oct 2022 08:14:21 +0000 (17:14 +0900)
Change-Id: Ia0c1e8be8150553be3e8823cf6686ec47dddea36
Signed-off-by: Jaehyun Kim <jeik01.kim@samsung.com>
include/wifi-manager-extension.h
src/network_info.h
src/network_internal.h
src/network_signal.c
src/wifi_internal.c
src/wifi_internal.h
src/wifi_manager.c
tools/manager-test/wman_test_main.c

index 737c6e4..c927f83 100644 (file)
@@ -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 */
+
 /**
  * @}
  */
index 9e13e2c..b50085a 100644 (file)
@@ -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];
index dbf1702..ff68827 100644 (file)
@@ -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"
 
index be30864..441222a 100644 (file)
@@ -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__;
index 7666993..4f9731b 100644 (file)
@@ -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:
index 95572c1..75a8a75 100644 (file)
@@ -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];
index c9d07bc..e66d21b 100644 (file)
@@ -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 */
index b41cf02..c4b35fa 100644 (file)
@@ -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;