diff options
-rw-r--r-- | include/bluetooth_private.h | 32 | ||||
-rw-r--r-- | src/bluetooth-common.c | 15 | ||||
-rw-r--r-- | src/bluetooth-ipsp.c | 24 | ||||
-rw-r--r-- | test/bt_unit_test.c | 408 | ||||
-rw-r--r-- | test/bt_unit_test.h | 6 |
5 files changed, 439 insertions, 46 deletions
diff --git a/include/bluetooth_private.h b/include/bluetooth_private.h index d83cd30..f9abb99 100644 --- a/include/bluetooth_private.h +++ b/include/bluetooth_private.h @@ -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 diff --git a/src/bluetooth-common.c b/src/bluetooth-common.c index e40f8bd..b1bc964 100644 --- a/src/bluetooth-common.c +++ b/src/bluetooth-common.c @@ -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 diff --git a/src/bluetooth-ipsp.c b/src/bluetooth-ipsp.c index 925bad3..2ed0ff1 100644 --- a/src/bluetooth-ipsp.c +++ b/src/bluetooth-ipsp.c @@ -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 */ diff --git a/test/bt_unit_test.c b/test/bt_unit_test.c index dedb641..8b726be 100644 --- a/test/bt_unit_test.c +++ b/test/bt_unit_test.c @@ -30,6 +30,13 @@ #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"); diff --git a/test/bt_unit_test.h b/test/bt_unit_test.h index d83f353..c1506ec 100644 --- a/test/bt_unit_test.h +++ b/test/bt_unit_test.h @@ -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, |