[tizen 4.0]: Add new CAPI to get the supplicant disconnect reason code 51/115151/7 accepted/tizen/common/20170303.090742 accepted/tizen/ivi/20170303.065636 accepted/tizen/mobile/20170303.065549 accepted/tizen/tv/20170303.065604 accepted/tizen/wearable/20170303.065622 submit/tizen/20170303.005553
authorManeesh Jain <maneesh.jain@samsung.com>
Thu, 16 Feb 2017 11:53:51 +0000 (17:23 +0530)
committertaesub kim <taesub.kim@samsung.com>
Wed, 22 Feb 2017 00:16:13 +0000 (09:16 +0900)
Add following new CAPI wifi_manager_ap_get_disconnect_reason()to support
the same.

Change-Id: Ib2b12f26fdd0b09ad992967b0e464f25ff67f400
Signed-off-by: Maneesh Jain <maneesh.jain@samsung.com>
include/network_interface.h
include/wifi-manager.h
src/network_interface.c
src/wifi_ap.c
test/wifi_manager_test.c

index ba7cb4d93f8cbf08d7ece5ba690dc5c647be4d25..9e7da3e79ac6e8fbf30b8b93bbfedb522056805e 100755 (executable)
@@ -148,6 +148,7 @@ typedef struct {
        gboolean is_hidden;                                                             /** Hidden network */
        net_error_state_type_e          ProfileErrorState;      /** Service error state */
        char                                            Favourite;                      /** Favourite flag */
+       int disconnect_reason;                                                  /** Supplicant Disconnect Reason Code */
 } net_profile_info_s;
 
 typedef struct {
index bcb722a4c66d20dc5080dfbb2a74f5e4acfe1be2..23a2dfc3ccdeec471e8a0c7b8f7d1664373c5585 100755 (executable)
@@ -43,23 +43,91 @@ typedef void *wifi_manager_h;
  * @since_tizen 3.0
  */
 typedef enum {
-       WIFI_MANAGER_ERROR_NONE = TIZEN_ERROR_NONE,                             /**< Successful */
-       WIFI_MANAGER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER,   /**< Invalid parameter */
-       WIFI_MANAGER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY,           /**< Out of memory error */
-       WIFI_MANAGER_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION,   /**< Invalid operation */
-       WIFI_MANAGER_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED = TIZEN_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED, /**< Address family not supported */
-       WIFI_MANAGER_ERROR_OPERATION_FAILED = TIZEN_ERROR_WIFI_MANAGER|0x01,    /**< Operation failed */
-       WIFI_MANAGER_ERROR_NO_CONNECTION = TIZEN_ERROR_WIFI_MANAGER|0x02,       /**< There is no connected AP */
-       WIFI_MANAGER_ERROR_NOW_IN_PROGRESS = TIZEN_ERROR_NOW_IN_PROGRESS,       /**< Now in progress */
-       WIFI_MANAGER_ERROR_ALREADY_EXISTS = TIZEN_ERROR_WIFI_MANAGER|0x03,      /**< Already exists */
-       WIFI_MANAGER_ERROR_OPERATION_ABORTED = TIZEN_ERROR_WIFI_MANAGER|0x04,   /**< Operation is aborted */
-       WIFI_MANAGER_ERROR_DHCP_FAILED = TIZEN_ERROR_WIFI_MANAGER|0x05,         /**< DHCP failed */
-       WIFI_MANAGER_ERROR_INVALID_KEY = TIZEN_ERROR_WIFI_MANAGER|0x06,         /**< Invalid key */
-       WIFI_MANAGER_ERROR_NO_REPLY = TIZEN_ERROR_WIFI_MANAGER|0x07,            /**< No reply */
-       WIFI_MANAGER_ERROR_SECURITY_RESTRICTED = TIZEN_ERROR_WIFI_MANAGER|0x08, /**< Restricted by security system policy */
-       WIFI_MANAGER_ERROR_ALREADY_INITIALIZED = TIZEN_ERROR_WIFI_MANAGER|0x09, /**< Already initialized */
-       WIFI_MANAGER_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED,   /**< Permission Denied */
-       WIFI_MANAGER_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED            /**< Not Supported */
+       /**
+        * Successful
+        */
+       WIFI_MANAGER_ERROR_NONE = TIZEN_ERROR_NONE,
+
+       /**
+        * Invalid parameter
+        */
+       WIFI_MANAGER_ERROR_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER,
+
+       /**
+        * Out of memory error
+        */
+       WIFI_MANAGER_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY,
+
+       /**
+        * Invalid operation
+        */
+       WIFI_MANAGER_ERROR_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION,
+
+       /**
+        * Address family not supported
+        */
+       WIFI_MANAGER_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED = TIZEN_ERROR_ADDRESS_FAMILY_NOT_SUPPORTED,
+
+       /**
+        * Operation failed
+        */
+       WIFI_MANAGER_ERROR_OPERATION_FAILED = TIZEN_ERROR_WIFI_MANAGER|0x01,
+
+       /**
+        * There is no connected AP
+        */
+       WIFI_MANAGER_ERROR_NO_CONNECTION = TIZEN_ERROR_WIFI_MANAGER|0x02,
+
+       /**
+        * Now in progress
+        */
+       WIFI_MANAGER_ERROR_NOW_IN_PROGRESS = TIZEN_ERROR_NOW_IN_PROGRESS,
+
+       /**
+        * Already exists
+        */
+       WIFI_MANAGER_ERROR_ALREADY_EXISTS = TIZEN_ERROR_WIFI_MANAGER|0x03,
+
+       /**
+        * Operation is aborted
+        */
+       WIFI_MANAGER_ERROR_OPERATION_ABORTED = TIZEN_ERROR_WIFI_MANAGER|0x04,
+
+       /**
+        * DHCP failed
+        */
+       WIFI_MANAGER_ERROR_DHCP_FAILED = TIZEN_ERROR_WIFI_MANAGER|0x05,
+
+       /**
+        * Invalid key
+        */
+       WIFI_MANAGER_ERROR_INVALID_KEY = TIZEN_ERROR_WIFI_MANAGER|0x06,
+
+       /**
+        * No reply
+        */
+       WIFI_MANAGER_ERROR_NO_REPLY = TIZEN_ERROR_WIFI_MANAGER|0x07,
+
+       /**
+        * Restricted by security system policy
+        */
+       WIFI_MANAGER_ERROR_SECURITY_RESTRICTED = TIZEN_ERROR_WIFI_MANAGER|0x08,
+
+       /**
+        * Already initialized
+        */
+       WIFI_MANAGER_ERROR_ALREADY_INITIALIZED = TIZEN_ERROR_WIFI_MANAGER|0x09,
+
+       /**
+        * Permission Denied
+        */
+       WIFI_MANAGER_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED,
+
+       /**
+        * Not Supported
+        */
+       WIFI_MANAGER_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED
+
 } wifi_manager_error_e;
 
 /**
@@ -77,8 +145,8 @@ typedef enum {
  * @since_tizen 3.0
  */
 typedef enum {
-       WIFI_MANAGER_DEVICE_STATE_DEACTIVATED = 0,          /**< Wi-Fi is Deactivated */
-       WIFI_MANAGER_DEVICE_STATE_ACTIVATED = 1,            /**< Wi-Fi is activated */
+       WIFI_MANAGER_DEVICE_STATE_DEACTIVATED = 0,    /**< Wi-Fi is Deactivated */
+       WIFI_MANAGER_DEVICE_STATE_ACTIVATED = 1,      /**< Wi-Fi is activated */
 } wifi_manager_device_state_e;
 
 /**
@@ -86,11 +154,11 @@ typedef enum {
  * @since_tizen 3.0
  */
 typedef enum {
-       WIFI_MANAGER_CONNECTION_STATE_FAILURE = -1,         /**< Connection failed state */
-       WIFI_MANAGER_CONNECTION_STATE_DISCONNECTED = 0,     /**< Disconnected state */
-       WIFI_MANAGER_CONNECTION_STATE_ASSOCIATION = 1,      /**< Association state */
-       WIFI_MANAGER_CONNECTION_STATE_CONFIGURATION = 2,    /**< Configuration state */
-       WIFI_MANAGER_CONNECTION_STATE_CONNECTED = 3,        /**< Connected state */
+       WIFI_MANAGER_CONNECTION_STATE_FAILURE = -1,       /**< Connection failed state */
+       WIFI_MANAGER_CONNECTION_STATE_DISCONNECTED = 0,   /**< Disconnected state */
+       WIFI_MANAGER_CONNECTION_STATE_ASSOCIATION = 1,    /**< Association state */
+       WIFI_MANAGER_CONNECTION_STATE_CONFIGURATION = 2,  /**< Configuration state */
+       WIFI_MANAGER_CONNECTION_STATE_CONNECTED = 3,      /**< Connected state */
 } wifi_manager_connection_state_e;
 
 /**
@@ -120,11 +188,31 @@ typedef enum {
  * @since_tizen 3.0
  */
 typedef enum {
-       WIFI_MANAGER_IP_CONFIG_TYPE_NONE = 0,       /**< Not defined */
-       WIFI_MANAGER_IP_CONFIG_TYPE_STATIC  = 1,    /**< Manual IP configuration */
-       WIFI_MANAGER_IP_CONFIG_TYPE_DYNAMIC = 2,    /**< Config IP using DHCP client*/
-       WIFI_MANAGER_IP_CONFIG_TYPE_AUTO = 3,       /**< Config IP from Auto IP pool (169.254/16). Later with DHCP client, if available */
-       WIFI_MANAGER_IP_CONFIG_TYPE_FIXED = 4,      /**< Indicates an IP address that can not be modified */
+       /**
+        * Not defined
+        */
+       WIFI_MANAGER_IP_CONFIG_TYPE_NONE = 0,
+
+       /**
+        * Manual IP configuration
+        */
+       WIFI_MANAGER_IP_CONFIG_TYPE_STATIC  = 1,
+
+       /**
+        * Config IP using DHCP client
+        */
+       WIFI_MANAGER_IP_CONFIG_TYPE_DYNAMIC = 2,
+
+       /**
+        * Config IP from Auto IP pool (169.254/16). Later with DHCP client, if available
+        */
+       WIFI_MANAGER_IP_CONFIG_TYPE_AUTO = 3,
+
+       /**
+        * Indicates an IP address that can not be modified
+        */
+       WIFI_MANAGER_IP_CONFIG_TYPE_FIXED = 4,
+
 } wifi_manager_ip_config_type_e;
 
 /**
@@ -141,9 +229,22 @@ typedef enum {
  * @since_tizen 3.0
  */
 typedef enum {
-       WIFI_MANAGER_PROXY_TYPE_DIRECT = 0,         /**< Direct connection */
-       WIFI_MANAGER_PROXY_TYPE_AUTO = 1,           /**< Auto configuration(Use PAC file). If URL property is not set, DHCP/WPAD auto-discover will be tried */
-       WIFI_MANAGER_PROXY_TYPE_MANUAL = 2          /**< Manual configuration */
+       /**
+        * Direct connection
+        */
+       WIFI_MANAGER_PROXY_TYPE_DIRECT = 0,
+
+       /**
+        * Auto configuration(Use PAC file). If URL property is not set,
+        * DHCP/WPAD auto-discover will be tried
+        */
+       WIFI_MANAGER_PROXY_TYPE_AUTO = 1,
+
+       /**
+        * Manual configuration
+        */
+       WIFI_MANAGER_PROXY_TYPE_MANUAL = 2
+
 } wifi_manager_proxy_type_e;
 
 /**
@@ -220,8 +321,203 @@ typedef enum {
 } wifi_manager_eap_auth_type_e;
 
 /**
-* @}
-*/
+ * @brief Enumeration for Wi-Fi disconnect reason, provided by the supplicant.
+ * @since_tizen 4.0 @endif
+ */
+typedef enum {
+       /**
+        * Unspecified reason
+        */
+       WIFI_REASON_UNSPECIFIED = 1,
+
+       /**
+        * Previous authentication no longer valid
+        */
+       WIFI_REASON_PREV_AUTH_NOT_VALID = 2,
+
+       /**
+        * Deauthenticated because sending STA is leaving (or has left) IBSS or ESS
+        */
+       WIFI_REASON_DEAUTH_LEAVING = 3,
+
+       /**
+        * Disassociated due to inactivity
+        */
+       WIFI_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
+
+       /**
+        * Disassociated because AP is unable to handle all currently associated STAs
+        */
+       WIFI_REASON_DISASSOC_AP_BUSY = 5,
+
+       /**
+        * Class 2 frame received from nonauthenticated STA
+        */
+       WIFI_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
+
+       /**
+        * Class 3 frame received from nonassociated STA
+        */
+       WIFI_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
+
+       /**
+        * Disassociated because sending STA is leaving (or has left) BSS
+        */
+       WIFI_REASON_DISASSOC_STA_HAS_LEFT = 8,
+
+       /**
+        * STA requesting (re)association is not authenticated with responding STA
+        */
+       WIFI_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
+
+       /**
+        * Disassociated because the information in the Power Capability
+        * element is unacceptable
+        */
+       WIFI_REASON_PWR_CAPABILITY_NOT_VALID = 10,
+
+       /**
+        * Disassociated because the information in the Supported Channels
+        * element is unacceptable
+        */
+       WIFI_REASON_SUPPORTED_CHANNEL_NOT_VALID = 11,
+
+       /**
+        * Invalid element i.e., an element defined in this standard for which the
+        * content does not meet the specifications in Clause 8
+        */
+       WIFI_REASON_INVALID_IE = 13,
+
+       /**
+        * Message Integrity Code (MIC) failure
+        */
+       WIFI_REASON_MICHAEL_MIC_FAILURE = 14,
+
+       /**
+        * 4-Way Handshake timeout
+        */
+       WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
+
+       /**
+        * Group Key Handshake timeout
+        */
+       WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16,
+
+       /**
+        * Element in 4-Way Handshake different from (Re)Association Request/Probe
+        * Response/Beacon frame
+        */
+       WIFI_REASON_IE_IN_4WAY_DIFFERS = 17,
+
+       /**
+        * Invalid group cipher
+        */
+       WIFI_REASON_GROUP_CIPHER_NOT_VALID = 18,
+
+       /**
+        * Invalid pairwise cipher
+        */
+       WIFI_REASON_PAIRWISE_CIPHER_NOT_VALID = 19,
+
+       /**
+        * Invalid AKMP
+        */
+       WIFI_REASON_AKMP_NOT_VALID = 20,
+
+       /**
+        * Unsupported RSNE version
+        */
+       WIFI_REASON_UNSUPPORTED_RSN_IE_VERSION = 21,
+
+       /**
+        * Invalid RSNE capabilities
+        */
+       WIFI_REASON_INVALID_RSN_IE_CAPAB = 22,
+
+       /**
+        * IEEE 802.1X authentication failed
+        */
+       WIFI_REASON_IEEE_802_1X_AUTH_FAILED = 23,
+
+       /**
+        * Cipher suite rejected because of the security policy
+        */
+       WIFI_REASON_CIPHER_SUITE_REJECTED = 24,
+
+       /**
+        * TDLS direct-link teardown due to TDLS peer STA unreachable via the
+        * TDLS direct link
+        */
+       WIFI_REASON_TDLS_TEARDOWN_UNREACHABLE = 25,
+
+       /**
+        * TDLS direct-link teardown for unspecified reason
+        */
+       WIFI_REASON_TDLS_TEARDOWN_UNSPECIFIED = 26,
+
+       /**
+        * Disassociated because excessive number of frames need to be acknowledged,
+        * but are not acknowledged due to AP transmissions and/or poor channel conditions
+        */
+       WIFI_REASON_DISASSOC_LOW_ACK = 34,
+
+       /**
+        * SME cancels the mesh peering instance with the reason other than reaching
+        * the maximum number of peer mesh STAs
+        */
+       WIFI_REASON_MESH_PEERING_CANCELLED = 52,
+
+       /**
+        * The mesh STA has reached the supported maximum number of peer mesh STAs
+        */
+       WIFI_REASON_MESH_MAX_PEERS = 53,
+
+       /**
+        * The received information violates the Mesh Configuration policy
+        * configured in the mesh STA profile
+        */
+       WIFI_REASON_MESH_CONFIG_POLICY_VIOLATION = 54,
+
+       /**
+        * The mesh STA has received a Mesh Peering Close message requesting
+        * to close the mesh peering
+        */
+       WIFI_REASON_MESH_CLOSE_RCVD = 55,
+
+       /**
+        * The mesh STA has resent dot11MeshMaxRetries Mesh Peering Open messages,
+        * without receiving a Mesh Peering Confirm message
+        */
+       WIFI_REASON_MESH_MAX_RETRIES = 56,
+
+       /**
+        * The confirmTimer for the mesh peering instance times out
+        */
+       WIFI_REASON_MESH_CONFIRM_TIMEOUT = 57,
+
+       /**
+        * The mesh STA fails to unwrap the GTK or the values in the wrapped
+        * contents do not match
+        */
+       WIFI_REASON_MESH_INVALID_GTK = 58,
+
+       /**
+        * The mesh STA receives inconsistent information about the mesh parameters
+        * between Mesh Peering Management frames
+        */
+       WIFI_REASON_MESH_INCONSISTENT_PARAMS = 59,
+
+       /**
+        * The mesh STA does not have proxy inform ation for this external destination
+        */
+       WIFI_REASON_MESH_INVALID_SECURITY_CAP = 60,
+
+} wifi_disconnect_reason_e;
+
+
+/**
+ * @}
+ */
 
 /**
  * @addtogroup CAPI_NETWORK_WIFI_MANAGER_TDLS_MODULE
@@ -1772,6 +2068,21 @@ int wifi_manager_ap_get_eap_auth_type(wifi_manager_ap_h ap, wifi_manager_eap_aut
  */
 int wifi_manager_ap_set_eap_auth_type(wifi_manager_ap_h ap, wifi_manager_eap_auth_type_e type);
 
+
+/**
+ * @brief Gets the Wi-Fi disconnect reason from the supplicant.
+ * @since_tizen 3.0
+ * @param[in] ap                    The access point handle
+ * @param[out] disconnect_reason    The supplicant disconnect reason
+ * @return 0 on success, otherwise negative error value
+ * @retval #WIFI_MANAGER_ERROR_NONE                 Successful
+ * @retval #WIFI_MANAGER_ERROR_INVALID_PARAMETER    Invalid parameter
+ * @retval #WIFI_MANAGER_ERROR_OPERATION_FAILED     Operation failed
+ * @retval #WIFI_MANAGER_ERROR_NOT_SUPPORTED        Not supported
+ */
+int wifi_manager_ap_get_disconnect_reason(wifi_manager_ap_h ap,
+                                                       wifi_disconnect_reason_e *disconnect_reason);
+
 /**
 * @}
 */
index 7b898a0a7c3ae76143cd6cfe3cf7a4e99fc806a6..895da81c99909694e6948927455fb0f55a8e3578 100755 (executable)
@@ -822,6 +822,9 @@ static int __net_extract_wifi_info(GVariantIter *array, net_profile_info_s* Prof
                } else if (g_strcmp0(key, "Frequency") == 0) {
                        ProfInfo->frequency = (unsigned int)g_variant_get_uint16(var);
 
+               } else if (g_strcmp0(key, "DisconnectReason") == 0) {
+                       ProfInfo->disconnect_reason = (unsigned int)g_variant_get_uint32(var);
+
                } else if (g_strcmp0(key, "EAP") == 0) {
                        value = g_variant_get_string(var, NULL);
 
@@ -1207,6 +1210,7 @@ int net_init_profile_info(net_profile_info_s *ProfInfo)
        ProfInfo->security_info.sec_mode = 0;
        ProfInfo->security_info.enc_mode = 0;
        ProfInfo->security_info.wps_support = FALSE;
+       ProfInfo->disconnect_reason = 0;
 
        net_info = &(ProfInfo->net_info);
 
index 54b6342e57e646f0cce76f23258ff2e971093599..2bd791e140f25168b887e72c4ff70616f51d459b 100755 (executable)
@@ -1568,3 +1568,22 @@ EXPORT_API int wifi_manager_ap_set_eap_auth_type(wifi_manager_ap_h ap,
 
        return WIFI_MANAGER_ERROR_NONE;
 }
+
+EXPORT_API int wifi_manager_ap_get_disconnect_reason(wifi_manager_ap_h ap,
+                                                       wifi_disconnect_reason_e *disconnect_reason)
+{
+       CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
+
+       if (_wifi_check_ap_validity(ap) == false || disconnect_reason == NULL) {
+               WIFI_LOG(WIFI_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
+               return WIFI_MANAGER_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       net_profile_info_s *profile_info = ap;
+       *disconnect_reason = (int)profile_info->disconnect_reason;
+
+       WIFI_LOG(WIFI_INFO, "[Disconnect Reason Code %d\n",
+                               *disconnect_reason);
+
+       return WIFI_MANAGER_ERROR_NONE;
+}
index 524510fa9e4092d92f15e7e3f6e03fca22f68f82..6173decc128e9629c7d42f6d1fdb183f9ea0e7d7 100755 (executable)
@@ -746,6 +746,7 @@ static bool __test_found_print_ap_info_callback(wifi_manager_ap_h ap, void *user
        wifi_manager_eap_auth_type_e eap_auth_type;
        bool bool_value;
        char *ap_name_part = (char*)user_data;
+       wifi_disconnect_reason_e disconnect_reason;
 
        rv = wifi_manager_ap_get_essid(ap, &ap_name);
        if (rv != WIFI_MANAGER_ERROR_NONE) {
@@ -783,6 +784,11 @@ static bool __test_found_print_ap_info_callback(wifi_manager_ap_h ap, void *user
                        printf("Favorite : %s\n", bool_value ? "TRUE" : "FALSE");
                else
                        printf("Fail to get Favorite\n");
+               if (wifi_manager_ap_get_disconnect_reason(ap, &disconnect_reason)
+                                                                               == WIFI_MANAGER_ERROR_NONE)
+                       printf("Disconnect reason : %d\n", disconnect_reason);
+               else
+                       printf("Fail to get disconnect reason\n");
 
                /* Network info */
                if (wifi_manager_ap_get_connection_state(ap, &conn_state) == WIFI_MANAGER_ERROR_NONE)