[net-config]:Refactor the TDLS Discovery Feature
[platform/core/connectivity/net-config.git] / src / wifi-firmware.c
index 621180c..d9a41f9 100755 (executable)
@@ -1,7 +1,7 @@
 /*
  * Network Configuration Module
  *
- * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd. All rights reserved.
+ * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  *
  */
 
-
 #include <errno.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+
 #include "log.h"
 #include "util.h"
 #include "netdbus.h"
 #include "wifi-firmware.h"
 #include "network-statistics.h"
 
+#define WLAN_DRIVER_SCRIPT                     "/usr/bin/wlan.sh"
+#define WLAN_IFACE_NAME                                "wlan0"
 
-#define WLAN_P2P_IFACE_NAME                    "p2p0"
+#define WLAN_P2P_IFACE_NAME_TV                 "p2p0"
+#define WLAN_P2P_IFACE_NAME_COMMON                     "wlan0"
+#define WLAN_P2P_IFACE_NAME ((TIZEN_TV) ? (WLAN_P2P_IFACE_NAME_TV) : (WLAN_P2P_IFACE_NAME_COMMON))
 
 static int __netconfig_sta_firmware_start(void)
 {
        int rv = 0;
+       const char *path = WLAN_DRIVER_SCRIPT;
+       char *const args[] = { "/usr/bin/wlan.sh", "start", NULL };
+       char *const envs[] = { NULL };
+
+       rv = netconfig_execute_file(path, args, envs);
+       if (rv < 0)
+               return -EIO;
 
-       rv = netconfig_interface_up(WIFI_IFNAME);
-       if (!rv)
+       rv = netconfig_interface_up(WLAN_IFACE_NAME);
+       if (rv != TRUE)
                return -EIO;
 
-       INFO("Successfully loaded wireless device driver");
+       DBG("Successfully loaded wireless device driver");
        return 0;
 }
 
 static int __netconfig_sta_firmware_stop(void)
 {
-
        int rv = 0;
+       const char *path = WLAN_DRIVER_SCRIPT;
+       char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
+       char *const envs[] = { NULL };
 
        /* Update statistics before driver remove */
        netconfig_wifi_statistics_update_powered_off();
 
-       rv = netconfig_interface_down(WIFI_IFNAME);
-       if (!rv)
+       rv = netconfig_interface_down(WLAN_IFACE_NAME);
+       if (rv != TRUE)
+               return -EIO;
+
+       rv = netconfig_execute_file(path, args, envs);
+       if (rv < 0)
                return -EIO;
 
-       INFO("Successfully removed wireless device driver");
+       DBG("Successfully removed wireless device driver");
        return 0;
 }
 
-
 static int __netconfig_p2p_firmware_start(void)
 {
-
 #if defined TIZEN_P2P_ENABLE
        int rv = 0;
+       const char *path = WLAN_DRIVER_SCRIPT;
+       char *const args[] = { "/usr/bin/wlan.sh", "p2p", NULL };
+       char *const envs[] = { NULL };
+
+       rv = netconfig_execute_file(path, args, envs);
+       if (rv < 0)
+               return -EIO;
+
+#if defined TIZEN_WLAN_USE_P2P_INTERFACE
        rv = netconfig_interface_up(WLAN_P2P_IFACE_NAME);
-       if (!rv)
+       if (rv != TRUE)
                return -EIO;
+#endif
 
-       INFO("Successfully up  p2p device driver");
-    return 0;
+       DBG("Successfully loaded p2p device driver");
+       return 0;
 #else
-       INFO("P2P Device is not supported");
        return -ENODEV;
 #endif
-
 }
 
 static int __netconfig_p2p_firmware_stop(void)
 {
-
 #if defined TIZEN_P2P_ENABLE
        int rv = 0;
-       rv = netconfig_interface_down(WLAN_P2P_IFACE_NAME);
-       if (!rv)
+       const char *path = WLAN_DRIVER_SCRIPT;
+       char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
+       char *const envs[] = { NULL };
+
+       rv = netconfig_interface_down(WLAN_IFACE_NAME);
+       if (rv != TRUE)
+               return -EIO;
+
+       rv = netconfig_execute_file(path, args, envs);
+       if (rv < 0)
                return -EIO;
 
-       INFO("Successfully down  p2p device driver");
-    return 0;
+       DBG("Successfully removed p2p device driver");
+       return 0;
 #else
-       INFO("P2P Device is not supported");
        return -ENODEV;
 #endif
+}
+
+static int __netconfig_softap_firmware_start(void)
+{
+#if defined TIZEN_TETHERING_ENABLE
+       int rv = 0;
+       const char *path = WLAN_DRIVER_SCRIPT;
+       char *const args[] = { "/usr/bin/wlan.sh", "softap", NULL };
+       char *const envs[] = { NULL };
 
+       rv = netconfig_execute_file(path, args, envs);
+       if (rv < 0)
+               return -EIO;
+
+       if (netconfig_interface_up(WLAN_IFACE_NAME) == FALSE)
+               return -EIO;
+
+       DBG("Successfully loaded softap device driver");
+       return 0;
+#else
+       return -ENODEV;
+#endif
 }
-static int __netconfig_wifi_firmware_start(
-                       enum netconfig_wifi_firmware type)
+
+static int __netconfig_softap_firmware_stop(void)
 {
+#if defined TIZEN_TETHERING_ENABLE
+       int rv = 0;
+       const char *path = WLAN_DRIVER_SCRIPT;
+       char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
+       char *const envs[] = { NULL };
+
+       rv = netconfig_interface_down(WLAN_IFACE_NAME);
+       if (rv != TRUE)
+               return -EIO;
 
-       INFO(" %d",type);
-       if (netconfig_emulator_is_emulated() == TRUE)
+       rv = netconfig_execute_file(path, args, envs);
+       if (rv < 0)
+               return -EIO;
+
+       DBG("Successfully removed softap device driver");
+       return 0;
+#else
+       return -ENODEV;
+#endif
+}
+
+static int __netconfig_wifi_firmware_start(enum netconfig_wifi_firmware type)
+{
+       if (emulator_is_emulated() == TRUE)
                return -EIO;
 
        switch (type) {
@@ -108,6 +181,8 @@ static int __netconfig_wifi_firmware_start(
                return __netconfig_sta_firmware_start();
        case NETCONFIG_WIFI_P2P:
                return __netconfig_p2p_firmware_start();
+       case NETCONFIG_WIFI_SOFTAP:
+               return __netconfig_softap_firmware_start();
        default:
                break;
        }
@@ -117,7 +192,7 @@ static int __netconfig_wifi_firmware_start(
 
 static int __netconfig_wifi_firmware_stop(enum netconfig_wifi_firmware type)
 {
-       if (netconfig_emulator_is_emulated() == TRUE)
+       if (emulator_is_emulated() == TRUE)
                return -EIO;
 
        switch (type) {
@@ -125,6 +200,8 @@ static int __netconfig_wifi_firmware_stop(enum netconfig_wifi_firmware type)
                return __netconfig_sta_firmware_stop();
        case NETCONFIG_WIFI_P2P:
                return __netconfig_p2p_firmware_stop();
+       case NETCONFIG_WIFI_SOFTAP:
+               return __netconfig_softap_firmware_stop();
        default:
                break;
        }
@@ -145,7 +222,7 @@ int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable)
                alias = NETCONFIG_WIFI_STA;
 #endif
 
-       INFO("Wi-Fi current firmware %d (type: %d %s)", current_driver, type,
+       DBG("Wi-Fi current firmware %d (type: %d %s)", current_driver, type,
                                                        enable == TRUE ? "enable" : "disable");
 
        if (enable == FALSE) {
@@ -154,8 +231,7 @@ int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable)
                } else if (current_driver == alias) {
 
 #if defined WLAN_CONCURRENT_MODE
-                       vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode);
-
+                       netconfig_vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode);
                        if (flight_mode == 0 && type == NETCONFIG_WIFI_STA &&
                                        netconfig_is_wifi_direct_on() == TRUE) {
                                netconfig_interface_down(WIFI_IFNAME);
@@ -163,9 +239,7 @@ int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable)
                                return -EALREADY;
                        }
 
-                       if (type == NETCONFIG_WIFI_P2P &&
-                                       netconfig_wifi_state_get_technology_state() >
-                                               NETCONFIG_WIFI_TECH_OFF) {
+                       if (type == NETCONFIG_WIFI_P2P && wifi_state_get_technology_state() > NETCONFIG_WIFI_TECH_OFF) {
                                netconfig_interface_down(WLAN_P2P_IFACE_NAME);
 
                                return -EALREADY;
@@ -202,21 +276,20 @@ int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable)
 
        err = __netconfig_wifi_firmware_start(type);
        if (err < 0)
-               INFO("Failed to start the Firmware");
+               DBG("Failed to execute script file");
        else
                current_driver = alias;
 
        return err;
 }
 
-gboolean netconfig_iface_wifi_start(
-               NetconfigWifi *wifi, gchar *device, GError **error)
+gboolean handle_start(WifiFirmware *firmware, GDBusMethodInvocation *context, const gchar *device)
 {
        int err;
 
-       g_return_val_if_fail(wifi != NULL, FALSE);
+       g_return_val_if_fail(firmware != NULL, FALSE);
 
-       INFO("Wi-Fi firmware start %s", device != NULL ? device : "null");
+       DBG("Wi-Fi firmware start %s", device != NULL ? device : "null");
 
        if (g_strcmp0("p2p", device) == 0)
                err = netconfig_wifi_firmware(NETCONFIG_WIFI_P2P, TRUE);
@@ -227,24 +300,30 @@ gboolean netconfig_iface_wifi_start(
 
        if (err < 0) {
                if (err == -EALREADY)
-                       netconfig_error_already_exists(error);
-               else
-                       netconfig_error_wifi_driver_failed(error);
+                       netconfig_error_already_exists(context);
+               else if (g_strcmp0("softap", device) == 0 && err == -EIO && netconfig_is_wifi_direct_on() == FALSE) {
+                       if (netconfig_wifi_firmware(NETCONFIG_WIFI_P2P, FALSE) == 0 && netconfig_wifi_firmware(NETCONFIG_WIFI_SOFTAP, TRUE) == 0) {
+                               wifi_firmware_complete_start(firmware, context);
+                               return TRUE;
+                       } else
+                               netconfig_error_wifi_driver_failed(context);
+               } else
+                       netconfig_error_wifi_driver_failed(context);
 
                return FALSE;
        }
 
+       wifi_firmware_complete_start(firmware, context);
        return TRUE;
 }
 
-gboolean netconfig_iface_wifi_stop(
-               NetconfigWifi *wifi, gchar *device, GError **error)
+gboolean handle_stop(WifiFirmware *firmware, GDBusMethodInvocation *context, const gchar *device)
 {
        int err;
 
-       g_return_val_if_fail(wifi != NULL, FALSE);
+       g_return_val_if_fail(firmware != NULL, FALSE);
 
-       INFO("Wi-Fi firmware stop %s", device != NULL ? device : "null");
+       DBG("Wi-Fi firmware stop %s", device != NULL ? device : "null");
 
        if (g_strcmp0("p2p", device) == 0)
                err = netconfig_wifi_firmware(NETCONFIG_WIFI_P2P, FALSE);
@@ -255,12 +334,13 @@ gboolean netconfig_iface_wifi_stop(
 
        if (err < 0) {
                if (err == -EALREADY)
-                       netconfig_error_already_exists(error);
+                       netconfig_error_already_exists(context);
                else
-                       netconfig_error_wifi_driver_failed(error);
+                       netconfig_error_wifi_driver_failed(context);
 
                return FALSE;
        }
 
+       wifi_firmware_complete_stop(firmware, context);
        return TRUE;
 }