IPSP : Add new unit test cases for IPSP 03/58303/12 accepted/tizen/common/20160809.184102 accepted/tizen/ivi/20160809.232754 accepted/tizen/mobile/20160809.232821 accepted/tizen/tv/20160809.232636 accepted/tizen/wearable/20160809.232849 submit/tizen/20160809.064342
authorTaejin Woo <tt.woo@samsung.com>
Tue, 31 May 2016 05:36:49 +0000 (14:36 +0900)
committerPyun DoHyun <dh79.pyun@samsung.com>
Mon, 1 Aug 2016 04:27:02 +0000 (21:27 -0700)
This patch adds new test cases to set BT interface info callback &
test cases for sample Application to send/receive IPv6 data over IPSP L2CAP
channel using TCP/IP socket communication on BT interface.

Change-Id: I51ae02e759d2f3d669fcb1622e193127155dedd0
Signed-off-by: paras.kumar <paras.kumar@samsung.com>
include/bluetooth_private.h
src/bluetooth-common.c
src/bluetooth-ipsp.c
test/bt_unit_test.c
test/bt_unit_test.h

index d83cd30..f9abb99 100644 (file)
@@ -115,6 +115,7 @@ typedef enum {
 #endif
        BT_EVENT_IPSP_INIT_STATE_CHANGED, /**< IPSP Init status changed callback */
        BT_EVENT_IPSP_CONNECTION_STATUS, /**< IPSP connection status callback */
+       BT_EVENT_IPSP_INTERFACE_INFO, /**< IPSP connection BT Interface's Info Callback */
        BT_EVENT_LE_DATA_LENGTH_CHANGED, /** LE data length changed callback */
        BT_EVENT_ADVERTISING_STATE_CHANGED, /**< Advertising state changed callback */
        BT_EVENT_MANUFACTURER_DATA_CHANGED, /**< Manufacturer data changed callback */
@@ -545,50 +546,65 @@ typedef void (*bt_le_ipsp_init_state_changed_cb)
  * @internal
  * @brief Initialize Bluetooth LE IPSP service and set the callback
  */
-int _bt_le_ipsp_initialize(bt_le_ipsp_init_state_changed_cb callback, void *user_data);
+int bt_le_ipsp_initialize(bt_le_ipsp_init_state_changed_cb callback, void *user_data);
 
 /**
  * @internal
  * @brief De-Initialize Bluetooth LE IPSP service and unset the callback
  */
-int _bt_le_ipsp_deinitialize(void);
+int bt_le_ipsp_deinitialize(void);
 
 /**
  * @internal
  * @brief Connect to a IPSP service over LE to remote device.
  */
-int _bt_le_ipsp_connect(const char *address);
+int bt_le_ipsp_connect(const char *address);
 
 /**
  * @internal
  * @brief Disconnect to a IPSP service over LE to remote device.
  */
-int _bt_le_ipsp_disconnect(const char *address);
+int bt_le_ipsp_disconnect(const char *address);
 
 /**
 * @internal
 * @brief Check whether IPSP service is initialized
 */
-int _bt_le_ipsp_is_initialized(void);
+int bt_le_ipsp_is_initialized(void);
 
 /**
  * @internal
  * @brief IPSP Connection state changed callback
  */
-typedef void (*_bt_le_ipsp_connection_state_changed_cb)
+typedef void (*bt_le_ipsp_connection_state_changed_cb)
                (int result, bool connected, const char *remote_address, void *user_data);
 /**
  * @internal
  * @brief Set IPSP connection state event change callback.
  */
-int _bt_le_ipsp_set_connection_state_changed_cb(_bt_le_ipsp_connection_state_changed_cb callback,
+int bt_le_ipsp_set_connection_state_changed_cb(bt_le_ipsp_connection_state_changed_cb callback,
                                                void *user_data);
 
 /**
  * @internal
  * @brief Unset IPSP connection state event change callback.
  */
-int _bt_le_ipsp_unset_connection_state_changed_cb(void);
+int bt_le_ipsp_unset_connection_state_changed_cb(void);
+
+/**
+ * @internal
+ * @brief IPSP Connection Interface Info callback
+ */
+typedef void (*bt_le_ipsp_interface_info_cb)
+               (int result, const char *remote_address, const char *if_name,
+               void *user_data);
+
+/**
+ * @internal
+ * @brief Set IPSP connection state event change callback.
+ */
+int bt_le_ipsp_add_interface_info_cb(bt_le_ipsp_interface_info_cb callback,
+                                               void *user_data);
 
 /**
  * @ingroup CAPI_NETWORK_BLUETOOTH_LE_MODULE
index e40f8bd..b1bc964 100644 (file)
@@ -764,6 +764,7 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
        media_metadata_attributes_t *metadata = NULL;
        bluetooth_authentication_request_info_t *auth_information = NULL;
        bt_le_data_length_params_t  *data_length_info = NULL;
+       bt_ipsp_interface_info_t *ipsp_iface_info = NULL;
 
        event_index = __bt_get_cb_index(event);
 
@@ -1824,7 +1825,7 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                BT_INFO("BLUETOOTH_EVENT_IPSP_CONNECTED");
                bd_addr = (bluetooth_device_address_t *)(param->param_data);
                _bt_convert_address_to_string(&device_addr, bd_addr);
-               ((_bt_le_ipsp_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               ((bt_le_ipsp_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
                (_bt_get_error_code(param->result), TRUE, device_addr,
                 bt_event_slot_container[event_index].user_data);
                break;
@@ -1832,10 +1833,18 @@ static void __bt_event_proxy(int event, bluetooth_event_param_t *param, void *us
                BT_INFO("BLUETOOTH_EVENT_IPSP_DISCONNECTED");
                bd_addr = (bluetooth_device_address_t *)(param->param_data);
                _bt_convert_address_to_string(&device_addr, bd_addr);
-               ((_bt_le_ipsp_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
+               ((bt_le_ipsp_connection_state_changed_cb)bt_event_slot_container[event_index].callback)
                (_bt_get_error_code(param->result), FALSE, device_addr,
                 bt_event_slot_container[event_index].user_data);
                break;
+       case BLUETOOTH_EVENT_IPSP_INTERFACE_INFO:
+               BT_INFO("BLUETOOTH_EVENT_IPSP_INTERFACE_INFO");
+               ipsp_iface_info = (bt_ipsp_interface_info_t *)(param->param_data);
+               _bt_convert_address_to_string(&device_addr, &ipsp_iface_info->btaddr);
+               ((bt_le_ipsp_interface_info_cb)bt_event_slot_container[event_index].callback)
+               (_bt_get_error_code(param->result), device_addr, ipsp_iface_info->if_name,
+                bt_event_slot_container[event_index].user_data);
+               break;
        case BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED:
                BT_INFO("__bt_le_set_data_length_changed_cb() will be called");
                data_length_info = (bt_le_data_length_params_t *)(param->param_data);
@@ -2583,6 +2592,8 @@ static int __bt_get_cb_index(int event)
        case BLUETOOTH_EVENT_IPSP_CONNECTED:
        case BLUETOOTH_EVENT_IPSP_DISCONNECTED:
                return BT_EVENT_IPSP_CONNECTION_STATUS; /* LCOV_EXCL_LINE */
+       case BLUETOOTH_EVENT_IPSP_INTERFACE_INFO:
+               return BT_EVENT_IPSP_INTERFACE_INFO;
        case BLUETOOTH_EVENT_LE_DATA_LENGTH_CHANGED:
                return BT_EVENT_LE_DATA_LENGTH_CHANGED; /* LCOV_EXCL_LINE */
 #ifdef TIZEN_WEARABLE
index 925bad3..2ed0ff1 100644 (file)
@@ -53,7 +53,7 @@ int __bt_check_ipsp_init_status(void)
        return BT_ERROR_NONE;
 }
 
-int _bt_le_ipsp_is_initialized(void)
+int bt_le_ipsp_is_initialized(void)
 {
        BT_CHECK_IPSP_SUPPORT();
        BT_CHECK_INIT_STATUS();
@@ -61,7 +61,7 @@ int _bt_le_ipsp_is_initialized(void)
        return BT_ERROR_NONE;
 }
 
-int _bt_le_ipsp_initialize(bt_le_ipsp_init_state_changed_cb callback,
+int bt_le_ipsp_initialize(bt_le_ipsp_init_state_changed_cb callback,
                                                                void *user_data)
 {
        int error;
@@ -86,7 +86,7 @@ int _bt_le_ipsp_initialize(bt_le_ipsp_init_state_changed_cb callback,
        return BT_ERROR_NONE;
 }
 
-int _bt_le_ipsp_deinitialize(void)
+int bt_le_ipsp_deinitialize(void)
 {
        int error;
 
@@ -105,7 +105,7 @@ int _bt_le_ipsp_deinitialize(void)
        return BT_ERROR_NONE;
 }
 
-int _bt_le_ipsp_connect(const char *address)
+int bt_le_ipsp_connect(const char *address)
 {
        int ret;
        bluetooth_device_address_t bd_addr = { {0,} };
@@ -124,7 +124,7 @@ int _bt_le_ipsp_connect(const char *address)
        return ret;
 }
 
-int _bt_le_ipsp_disconnect(const char *address)
+int bt_le_ipsp_disconnect(const char *address)
 {
        int ret;
        bluetooth_device_address_t bd_addr = { {0,} };
@@ -143,7 +143,7 @@ int _bt_le_ipsp_disconnect(const char *address)
        return ret;
 }
 
-int _bt_le_ipsp_set_connection_state_changed_cb(_bt_le_ipsp_connection_state_changed_cb callback, void *user_data)
+int bt_le_ipsp_set_connection_state_changed_cb(bt_le_ipsp_connection_state_changed_cb callback, void *user_data)
 {
        BT_CHECK_IPSP_SUPPORT();
        BT_CHECK_INIT_STATUS();
@@ -153,7 +153,7 @@ int _bt_le_ipsp_set_connection_state_changed_cb(_bt_le_ipsp_connection_state_cha
        return BT_ERROR_NONE;
 }
 
-int _bt_le_ipsp_unset_connection_state_changed_cb(void)
+int bt_le_ipsp_unset_connection_state_changed_cb(void)
 {
        BT_CHECK_IPSP_SUPPORT();
        BT_CHECK_INIT_STATUS();
@@ -161,4 +161,14 @@ int _bt_le_ipsp_unset_connection_state_changed_cb(void)
        _bt_unset_cb(BT_EVENT_IPSP_CONNECTION_STATUS);
        return BT_ERROR_NONE;
 }
+
+int bt_le_ipsp_add_interface_info_cb(bt_le_ipsp_interface_info_cb callback, void *user_data)
+{
+       BT_CHECK_IPSP_SUPPORT();
+       BT_CHECK_INIT_STATUS();
+       BT_CHECK_INPUT_PARAMETER(callback);
+       _bt_set_cb(BT_EVENT_IPSP_INTERFACE_INFO, callback, user_data);
+
+       return BT_ERROR_NONE;
+}
 /* LCOV_EXCL_STOP */
index dedb641..8b726be 100644 (file)
 #ifdef ARCH64
 #include <stdint.h>
 #endif
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <netdb.h>
+#include <sys/types.h>
+#include <ifaddrs.h>
+#include <linux/if_link.h>
 
 #include "bluetooth.h"
 #include "bluetooth_internal.h"
@@ -60,6 +67,7 @@ const char *custom_uuid = "fa87c0d0-afac-11de-8a39-0800200c9a66";
 
 static bt_unit_test_table_e current_tc_table;
 static char remote_addr[18] = "F6:FB:8F:D8:C8:7C";
+static char ipsp_iface_name[17] = "";
 static bool input_automated_test_delay = false;
 
 /* For HDP profile TEST */
@@ -75,6 +83,8 @@ static int server_fd;
 static int client_fd;
 static int custom_server_fd;
 static int custom_client_fd;
+static int ipsp_server_sock = 0;
+static int ipsp_client_sock = 0;
 
 static int bt_onoff_cnt = 0;
 static int bt_onoff_cnt_success = 0;
@@ -779,27 +789,39 @@ tc_table_t tc_hid[] = {
 tc_table_t tc_ipsp[] = {
        /* IPSP functions */
        {"BACK"
-               , BT_UNIT_TEST_FUNCTION_BACK},
-       {"bt_le_ipsp_register"
-               , BT_UNIT_TEST_FUNCTION_IPSP_REGISTER},
-       {"bt_le_ipsp_unregister"
-               , BT_UNIT_TEST_FUNCTION_IPSP_UNREGISTER},
-       {"bt_le_ipsp_initialize"
-               , BT_UNIT_TEST_FUNCTION_IPSP_INITIALIZE},
-       {"bt_le_ipsp_deinitialize"
-               , BT_UNIT_TEST_FUNCTION_IPSP_DEINITIALIZE},
-       {"bt_le_ipsp_connect"
-               , BT_UNIT_TEST_FUNCTION_IPSP_CONNECT},
-       {"bt_le_ipsp_disconnect"
-               , BT_UNIT_TEST_FUNCTION_IPSP_DISCONNECT},
-       {"bt_le_ipsp_start_advertising"
-               , BT_UNIT_TEST_FUNCTION_IPSP_START_ADVERTISING},
-       {"bt_ipsp_set_connection_state_changed_cb"
-               , BT_UNIT_TEST_FUNCTION_IPSP_SET_CONNECTION_STATE_CHANGED_CB},
-       {"bt_ipsp_nsset_connection_state_changed_cb"
-               , BT_UNIT_TEST_FUNCTION_IPSP_UNSET_CONNECTION_STATE_CHANGED_CB},
+                               , BT_UNIT_TEST_FUNCTION_BACK},
+       {"bt_le_ipsp_register[Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_REGISTER},
+       {"bt_le_ipsp_unregister[Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_UNREGISTER},
+       {"bt_le_ipsp_initialize[Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_INITIALIZE},
+       {"bt_le_ipsp_deinitialize[Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_DEINITIALIZE},
+       {"bt_le_ipsp_connect[Client role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_CONNECT},
+       {"bt_le_ipsp_disconnect[Client role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_DISCONNECT},
+       {"bt_le_ipsp_start_advertising[Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_START_ADVERTISING},
+       {"bt_ipsp_set_connection_state_changed_cb[Client/Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_SET_CONNECTION_STATE_CHANGED_CB},
+       {"bt_ipsp_unset_connection_state_changed_cb[Client/Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_UNSET_CONNECTION_STATE_CHANGED_CB},
+       {"bt_ipsp_set_connection_bt_iface_info_cb[Client/Server role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_SET_CONNECTION_BT_IFACE_INFO_CB},
+       {"bt_ipsp_create_ipsp_app_server_socket[Server App role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_CREATE_APP_SERVER_SOCKET},
+       {"bt_ipsp_connect_with_ipsp_app_server_socket[Client App role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_CONNECT_WITH_APP_SERVER_SOCKET},
+       {"bt_ipsp_send_ipv6_application_data[Client/Server App role][Max 255 bytes]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_SEND_IPV6_APP_DATA},
+       {"bt_ipsp_recv_ipv6_application_data[Client/Server App role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_RECV_IPV6_APP_DATA},
+       {"bt_ipsp_close_socket[Client/Server App role]"
+                               , BT_UNIT_TEST_FUNCTION_IPSP_CLOSE_SOCKET},
        {"Select this menu to set parameters and then select the function again."
-               , BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS},
+                               , BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS},
        {NULL                                   , 0x0000},
 };
 
@@ -2656,6 +2678,17 @@ void __bt_le_ipsp_connection_state_changed_cb(int result,
        TC_PRT("Connected: %d", connected);
 }
 
+void __bt_le_ipsp_interface_info_cb(int result,
+               const char *remote_address, const char *iface_name,
+               void *user_data)
+{
+       TC_PRT("__bt_le_ipsp_interface_info_cb: called");
+       TC_PRT("result: %s", __bt_get_error_message(result));
+       TC_PRT("Remote BT address : %s", remote_address);
+       TC_PRT("Local BT Interface : %s is UP", iface_name);
+       memcpy(ipsp_iface_name, iface_name, strlen(iface_name));
+}
+
 #ifdef TIZEN_WEARABLE
 void __bt_hf_sco_state_changed_cb(int result,
        bool opened, void *user_data)
@@ -3944,6 +3977,97 @@ int test_set_params(int test_id, char *param)
        }
        case BT_UNIT_TEST_TABLE_IPSP: {
                switch (test_id) {
+               case BT_UNIT_TEST_FUNCTION_IPSP_CONNECT_WITH_APP_SERVER_SOCKET : {
+                       if (param_index == 0) {
+                               g_test_param.param_count = 1;
+                               g_test_param.params = g_malloc0(sizeof(char *) * g_test_param.param_count);
+                               param_type = BT_UNIT_TEST_PARAM_TYPE_STRING;
+                       }
+
+                       if (param_index > 0) {
+                               int len = strlen(param);
+                               g_test_param.params[param_index - 1] = g_malloc0(len + 1);
+                               /* Remove new line character */
+                               param[len - 1] = '\0';
+                               strcpy(g_test_param.params[param_index - 1], param);
+                       }
+
+                       if (param_index == g_test_param.param_count) {
+                               need_to_set_params = false;
+                               test_input_callback(GINT_TO_POINTER(test_id));
+                               param_index = 0;
+                               return 0;
+                       }
+
+                       TC_PRT("IPSP Client : Input IPSP App server's IPv6 address to connect :");
+
+                       param_index++;
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_IPSP_SEND_IPV6_APP_DATA : {
+                       if (param_index == 0) {
+                               g_test_param.param_count = 2;
+                               g_test_param.params = g_malloc0(sizeof(char *) * g_test_param.param_count);
+                               param_type = BT_UNIT_TEST_PARAM_TYPE_STRING;
+                       }
+
+                       if (param_index > 0) {
+                               int len = strlen(param);
+                               g_test_param.params[param_index - 1] = g_malloc0(len + 1);
+                               /* Remove new line character */
+                               param[len - 1] = '\0';
+                               strcpy(g_test_param.params[param_index - 1], param);
+                       }
+
+                       if (param_index == g_test_param.param_count) {
+                               need_to_set_params = false;
+                               test_input_callback(GINT_TO_POINTER(test_id));
+                               param_index = 0;
+                               return 0;
+                       }
+
+                       switch (param_index) {
+                       case 0:
+                               TC_PRT("IPSP : Input current role of Application[Server[0] / Client[1] :");
+                               break;
+                       case 1:
+                       TC_PRT("IPSP : input data to send :");
+                               break;
+                       }
+
+                               param_index++;
+
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_IPSP_RECV_IPV6_APP_DATA : {
+                       if (param_index == 0) {
+                               g_test_param.param_count = 1;
+                               g_test_param.params = g_malloc0(sizeof(char *) * g_test_param.param_count);
+                               param_type = BT_UNIT_TEST_PARAM_TYPE_STRING;
+                       }
+
+                       if (param_index > 0) {
+                               int len = strlen(param);
+                               g_test_param.params[param_index - 1] = g_malloc0(len + 1);
+                               /* Remove new line character */
+                               param[len - 1] = '\0';
+                       strcpy(g_test_param.params[param_index - 1], param);
+               }
+
+               if (param_index == g_test_param.param_count) {
+                       need_to_set_params = false;
+                       test_input_callback(GINT_TO_POINTER(test_id));
+                       param_index = 0;
+                       return 0;
+               }
+
+               TC_PRT("IPSP : Input current role of Application[Server[0]/Client[1] :");
+
+               param_index++;
+
+               break;
+       }
+
                default:
                        TC_PRT("There is no param to set\n");
                        need_to_set_params = false;
@@ -7435,7 +7559,7 @@ int test_input_callback(void *data)
                case BT_UNIT_TEST_FUNCTION_IPSP_INITIALIZE:
                        /* Initialize IPSP server */
                        if (server != NULL && ipsp_h.svc != NULL) {
-                               ret = _bt_le_ipsp_initialize(
+                               ret = bt_le_ipsp_initialize(
                                                &__bt_le_ipsp_init_state_changed_cb,
                                                NULL);
                                TC_PRT("bt_le_ipsp_initialize : returns %s\n", __bt_get_error_message(ret));
@@ -7445,18 +7569,20 @@ int test_input_callback(void *data)
                        break;
                case BT_UNIT_TEST_FUNCTION_IPSP_DEINITIALIZE:
                        /* De-Initialize IPSP server */
-                       ret = _bt_le_ipsp_deinitialize();
+                       ret = bt_le_ipsp_deinitialize();
                        TC_PRT("bt_le_ipsp_deinitialize : returns %s\n", __bt_get_error_message(ret));
                        break;
                case BT_UNIT_TEST_FUNCTION_IPSP_CONNECT:
-                       ret = _bt_le_ipsp_connect(remote_addr);
+                       ret = bt_le_ipsp_connect(remote_addr);
                        break;
                case BT_UNIT_TEST_FUNCTION_IPSP_DISCONNECT:
-                       ret = _bt_le_ipsp_disconnect(remote_addr);
+                       TC_PRT("PKPK : case BT_UNIT_TEST_FUNCTION_IPSP_DISCONNECT called");
+
+                       ret = bt_le_ipsp_disconnect(remote_addr);
                        break;
                case BT_UNIT_TEST_FUNCTION_IPSP_START_ADVERTISING: {
                        const char *ipsp_svc_uuid_16 = "1820";
-                       ret = _bt_le_ipsp_is_initialized();
+                       ret = bt_le_ipsp_is_initialized();
                        if (ret != BT_ERROR_NONE) {
                                TC_PRT("bt_le_ipsp_add_advertising_data: returns %s\n", __bt_get_error_message(ret));
                                break;
@@ -7507,16 +7633,240 @@ int test_input_callback(void *data)
                        break;
                }
                case BT_UNIT_TEST_FUNCTION_IPSP_SET_CONNECTION_STATE_CHANGED_CB:
-                       ret = _bt_le_ipsp_set_connection_state_changed_cb(
-                                       __bt_le_ipsp_connection_state_changed_cb,
-                                       NULL);
+                       ret = bt_le_ipsp_set_connection_state_changed_cb(
+                                       __bt_le_ipsp_connection_state_changed_cb, NULL);
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
                        break;
 
                case BT_UNIT_TEST_FUNCTION_IPSP_UNSET_CONNECTION_STATE_CHANGED_CB:
-                       ret = _bt_le_ipsp_unset_connection_state_changed_cb();
+                       ret = bt_le_ipsp_unset_connection_state_changed_cb();
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+
+               case BT_UNIT_TEST_FUNCTION_IPSP_SET_CONNECTION_BT_IFACE_INFO_CB:
+                       ret = bt_le_ipsp_add_interface_info_cb(
+                                       __bt_le_ipsp_interface_info_cb, NULL);
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
                        break;
+
+               case BT_UNIT_TEST_FUNCTION_IPSP_CREATE_APP_SERVER_SOCKET: {
+                       int serverSocket = 0;
+                       struct ifaddrs *ifap, *ifa;
+                       struct sockaddr_in6 serverAddr, clientAddr;
+                       socklen_t clilen;
+                       char host[NI_MAXHOST];
+                       char client_ipv6[100] = {0, };
+                       char *addr = NULL;
+
+                       printf("\n****** IPSP Application Server Started ******\n");
+
+                       getifaddrs (&ifap);
+
+                       for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+                               if (ifa->ifa_addr->sa_family == AF_INET6) {
+                                       if (!memcmp(ifa->ifa_name, ipsp_iface_name, IFNAMSIZ)) {
+                                               getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), host, NI_MAXHOST,
+                                                                       NULL, 0, NI_NUMERICHOST);
+                                               addr = strchr(host, '%');
+                                               if (addr != NULL) {
+                                                       addr = g_strndup(host, (addr - host));
+                                                       TC_PRT("Found match Interface: %s and addr : %s\n", ifa->ifa_name, addr);
+                                               }
+                                       }
+                               }
+                       }
+
+                       freeifaddrs(ifap);
+
+                       bzero((char *) &serverAddr, sizeof(serverAddr));
+
+                       serverAddr.sin6_flowinfo = 0;
+                       serverAddr.sin6_family = AF_INET6;
+                       serverAddr.sin6_addr = in6addr_any;
+                       serverAddr.sin6_port = htons(3344);
+                       serverAddr.sin6_scope_id = if_nametoindex(ipsp_iface_name);
+                       inet_pton(AF_INET6, addr, &(serverAddr.sin6_addr.s6_addr));
+
+                       g_free(addr);
+
+                       /* Create the IPSP APP server socket */
+                       serverSocket = socket(AF_INET6, SOCK_STREAM, 0);
+                       if (serverSocket < 0)
+                               TC_PRT("\nIPSP server Error : In socket creation !");
+                       else
+                               TC_PRT("\nIPSP Server : Socket created..");
+
+
+                       /* Bind the address struct to the socket */
+                       if (bind(serverSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0)
+                               TC_PRT("\nIPSP server Error : In socket binding !");
+                       else
+                               TC_PRT("\nIPSP Server : Socket binding done..");
+
+
+                       /* Listen on the socket, with 1 max connection requests queued */
+                       if(listen(serverSocket, 1) < 0)
+                               TC_PRT("\nIPSP server Error : In socket listening !");
+                       else
+                               TC_PRT("\nIPSP server : Socket listening, waiting for connection...\n");
+
+                       /* Accept call creates a new socket for the incoming connection */
+                       clilen = sizeof(clientAddr);
+                       ipsp_server_sock = accept(serverSocket, (struct sockaddr *) &clientAddr, &clilen);
+                       if (ipsp_server_sock  < 0)
+                               TC_PRT("\nIPSP server Error : While accepting incoming connection !");
+
+                       inet_ntop(AF_INET6, &(clientAddr.sin6_addr), client_ipv6, 100);
+                       TC_PRT("\n****** IPSP server : Incoming connection from client... %s successful, ready to send/receive IPV6 data ******", client_ipv6);
+
+                       close(serverSocket);
+
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_IPSP_CONNECT_WITH_APP_SERVER_SOCKET: {
+                       char *saddr = NULL;
+                       struct sockaddr_in6 serverAddr;
+                       struct hostent *server;
+
+                       if (g_test_param.param_count < 1) {
+                               TC_PRT("Input IPSP Application's server IPv6 address first !");
+                               break;
+                       }
+                       saddr = g_test_param.params[0];
+
+                       printf("\n****** IPSP Application Client Started ******\n");
+
+                       /* Create the IPSP APP Client socket */
+                       ipsp_client_sock = socket(AF_INET6, SOCK_STREAM, 0);
+                       if (ipsp_client_sock < 0)
+                               TC_PRT("\nIPSP Client Error : In socket creation !");
+                       else
+                               TC_PRT("\nIPSP Client : Socket created..");
+
+                       /* Sockets Layer Call: gethostbyname2() */
+                       server = gethostbyname2(saddr, AF_INET6);
+
+                       if (server == NULL)
+                               TC_PRT("\nIPSP Client Error : No such host !");
+
+                       memset((char *) &serverAddr, 0, sizeof(serverAddr));
+                       serverAddr.sin6_flowinfo = 0;
+                       serverAddr.sin6_family = AF_INET6;
+                       serverAddr.sin6_addr=in6addr_any;
+                       serverAddr.sin6_port = htons(3344);
+                       serverAddr.sin6_scope_id = if_nametoindex(ipsp_iface_name);
+
+                       memmove((char *) &serverAddr.sin6_addr.s6_addr, (char *) server->h_addr, server->h_length);
+
+                       /* Connect with IPSP APP Server socket */
+                       if (connect(ipsp_client_sock, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0)
+                               TC_PRT("\nIPSP Client Error : %d while connecting with server !", errno);
+                       else
+                               TC_PRT("\n****** IPSP Client : Connection with : %s successful, ready to send/receive IPV6 data ******\n", saddr);
+
+                       __bt_free_test_param(&g_test_param);
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_IPSP_SEND_IPV6_APP_DATA : {
+                       int role = -1, n = 0;
+                       char *data = NULL;
+
+                       if (g_test_param.param_count < 2) {
+                               TC_PRT("IPSP Error : Input IPSP Application's role and data to send first !");
+                               break;
+                       }
+
+                       role = atoi(g_test_param.params[0]);
+                       data = g_test_param.params[1];
+
+                       if (role == 0) {
+                               if (ipsp_server_sock) {
+                                       TC_PRT("IPSP : Current role is IPSP Sever !");
+
+                                       //Sockets Layer Call: send()
+                                       send(ipsp_server_sock, data, strlen(data) + 1, 0);
+                                       if (n < 0)
+                                               TC_PRT("\nIPSP Error : While sending data !");
+                               } else {
+                                       TC_PRT("IPSP Error: There is no connected server socket !");
+                               }
+                       } else if (role == 1) {
+                               if (ipsp_client_sock) {
+                                       //Sockets Layer Call: send()
+                                       send(ipsp_client_sock, data, strlen(data) + 1, 0);
+                                       if (n < 0)
+                                               TC_PRT("\nIPSP Error : While sending data !");
+                               } else {
+                                       TC_PRT("IPSP Error: There is no connected client socket !");
+                               }
+                       } else {
+                               TC_PRT("IPSP Error: Please input the proper role !");
+                       }
+                       __bt_free_test_param(&g_test_param);
+
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_IPSP_RECV_IPV6_APP_DATA : {
+                       int role = -1, n;
+                       char buffer[256] = {0};
+
+                       if (g_test_param.param_count < 1) {
+                               TC_PRT("IPSP Error : Input IPSP Application's role first !");
+                               break;
+                       }
+
+                       role = atoi(g_test_param.params[0]);
+
+                       if (role == 0) {
+                               if (ipsp_server_sock) {
+                                       TC_PRT("IPSP : Current role is IPSP Sever,  ready to receive data !");
+
+                                       //Sockets Layer Call: recv()
+                                       n = recv(ipsp_server_sock, buffer, 255, 0);
+                                       if (n < 0)
+                                               TC_PRT("\nIPSP Server Error : While receiving data from client !");
+
+                                       TC_PRT("\nIPSP Server : Message received from client: %s\n", buffer);
+                               } else {
+                                       TC_PRT("IPSP Error: There is no connected or active server socket !");
+                               }
+                       } else if (role == 1) {
+                               if (ipsp_client_sock) {
+                                       TC_PRT("IPSP : Current role is IPSP Client, ready to receive data !");
+
+                                       //Sockets Layer Call: recv()
+                                       n = recv(ipsp_client_sock, buffer, 255, 0);
+                                       if (n < 0)
+                                               TC_PRT("\nIPSP Client Error : %d while receiving data from server!", errno);
+
+                                       TC_PRT("\nIPSP Client : Message received from server: %s\n", buffer);
+                               } else {
+                                       TC_PRT("IPSP Error: There is no connected or active client socket !");
+                               }
+                       } else {
+                               TC_PRT("IPSP Error: Please input the proper role !");
+                       }
+
+                       __bt_free_test_param(&g_test_param);
+
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_IPSP_CLOSE_SOCKET : {
+                       if (ipsp_server_sock) {
+                               TC_PRT("IPSP server : Closing server socket..");
+                               close(ipsp_server_sock);
+                               ipsp_server_sock = 0;
+                       }
+
+                       if (ipsp_client_sock) {
+                               TC_PRT("IPSP Client : Closing client socket..");
+                               close(ipsp_client_sock);
+                               ipsp_client_sock = 0;
+                       }
+
+                       break;
+               }
+
                case BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS:
                        need_to_set_params = true;
                        TC_PRT("Select the function again");
index d83f353..c1506ec 100644 (file)
@@ -335,6 +335,12 @@ typedef enum {
        BT_UNIT_TEST_FUNCTION_IPSP_START_ADVERTISING,
        BT_UNIT_TEST_FUNCTION_IPSP_SET_CONNECTION_STATE_CHANGED_CB,
        BT_UNIT_TEST_FUNCTION_IPSP_UNSET_CONNECTION_STATE_CHANGED_CB,
+       BT_UNIT_TEST_FUNCTION_IPSP_SET_CONNECTION_BT_IFACE_INFO_CB,
+       BT_UNIT_TEST_FUNCTION_IPSP_CREATE_APP_SERVER_SOCKET,
+       BT_UNIT_TEST_FUNCTION_IPSP_CONNECT_WITH_APP_SERVER_SOCKET,
+       BT_UNIT_TEST_FUNCTION_IPSP_SEND_IPV6_APP_DATA,
+       BT_UNIT_TEST_FUNCTION_IPSP_RECV_IPV6_APP_DATA,
+       BT_UNIT_TEST_FUNCTION_IPSP_CLOSE_SOCKET,
        BT_UNIT_TEST_FUNCTION_HDP_REGISTER_SINK_APP = 1,
        BT_UNIT_TEST_FUNCTION_HDP_UNREGISTER_SINK_APP,
        BT_UNIT_TEST_FUNCTION_HDP_CONNECT_TO_SOURCE,