Add new API to set/get remote address(GATT) 46/260946/1
authorSeonah Moon <seonah1.moon@samsung.com>
Wed, 7 Jul 2021 09:45:58 +0000 (18:45 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Wed, 7 Jul 2021 09:46:05 +0000 (18:46 +0900)
Change-Id: I2e6523b01af33aa7d7bfd99a4f7720f484adb4ab

include/vine.h
plugins/ble-gatt/ble-gatt-plugin.cpp
src/include/vine-dp.h
src/vine-dp.cpp
src/vine.cpp
tests/unittest/vine-unittest-dp.cpp
tool/tool_run.cpp

index c9a663f..0931fd1 100755 (executable)
@@ -921,6 +921,36 @@ int vine_dp_get_id(vine_dp_h dp, char **id);
 int vine_dp_set_iface_name(vine_dp_h dp, const char *iface_or_ip);
 
 /**
+ * @brief Sets the remote address.
+ * @remarks This is used with VINE_DP_METHOD_BLE_GATT.
+ * @since_tizen 6.5
+ * @param[in] dp The data path handle
+ * @param[in] address The remote address
+ * @return 0 on success, otherwise a negative error value
+ * @retval #VINE_ERROR_NONE    Successful
+ * @retval #VINE_ERROR_INVALID_PARAMETER       Invalid parameter
+ * @retval #VINE_ERROR_INVALID_OPERATION       Invalid operation
+ * @retval #VINE_ERROR_NOT_SUPPORTED Not supported
+ * @see vine_dp_create()
+ */
+int vine_dp_set_remote_address(vine_dp_h dp, const char *address);
+
+/**
+ * @brief Gets the remote address.
+ * @remarks This is used with VINE_DP_METHOD_BLE_GATT.
+ * @since_tizen 6.5
+ * @param[in] dp The data path handle
+ * @param[out] address The remote address
+ * @return 0 on success, otherwise a negative error value
+ * @retval #VINE_ERROR_NONE    Successful
+ * @retval #VINE_ERROR_INVALID_PARAMETER       Invalid parameter
+ * @retval #VINE_ERROR_INVALID_OPERATION       Invalid operation
+ * @retval #VINE_ERROR_NOT_SUPPORTED Not supported
+ * @see vine_dp_create()
+ */
+int vine_dp_get_remote_address(vine_dp_h dp, char **address);
+
+/**
  * @brief Sets the address family.
  * @remarks This is ignored when dp type is VINE_DP_TYPE_CLIENT.
  * @since_tizen 6.5
index dccb252..c8a3292 100755 (executable)
@@ -28,6 +28,8 @@ using namespace std;
 #define VINE_GATT_CHAR_UUID "00002af6-0000-1000-8000-00805f9b34fb"
 #define VINE_GATT_DESC_UUID "fa87c0d0-afac-11de-8a39-0800200c9a66"
 
+#define BT_ADDRESS_LEN 17
+
 typedef enum {
        VINE_GATT_ROLE_UNKNOWN = 0,
        VINE_GATT_ROLE_SERVER,
@@ -399,6 +401,9 @@ int gatt_open(vine_dp_plugin_h handle, int addr_family,
        gatt->descriptor = descriptor;
 
        VINE_LOGI("Succeeded to start GATT server.");
+
+       //if (g_callbacks.opened_cb)
+       //      g_callbacks.opened_cb(VINE_DATA_PATH_ERROR_NONE, -1, gatt->user);
        return VINE_DATA_PATH_ERROR_NONE;
 
 ERR:
@@ -463,6 +468,16 @@ int gatt_close(vine_dp_plugin_h handle)
 int gatt_get_local_address_info(vine_dp_plugin_h handle,
                int *addr_family, char local_ip[], int *port)
 {
+       char *addr = NULL;
+       int ret = bt_adapter_get_address(&addr);
+       if (ret != BT_ERROR_NONE) {
+               VINE_LOGE("Failed to get local address.");
+               free(addr);
+               return __convert_bt_error_to_data_path_error(ret);
+       }
+
+       strncpy(local_ip, addr, BT_ADDRESS_LEN);
+       free(addr);
        return VINE_DATA_PATH_ERROR_NONE;
 }
 
index 498aefd..b389085 100644 (file)
@@ -49,6 +49,8 @@ public:
 
        virtual int set_method(vine_dp_method_e method) = 0;
        virtual int get_id(char **id) = 0;
+       virtual int set_remote_address(const char *address) = 0;
+       virtual int get_remote_address(char **address) = 0;
        virtual int set_addr_family(vine_address_family_e addr_family) = 0;
        virtual int set_remote_ip(vine_address_family_e, const std::string &ip) = 0;
        virtual int get_remote_ip(vine_address_family_e *addr_family, char **ip) = 0;
@@ -110,6 +112,8 @@ public:
 
        virtual int set_method(vine_dp_method_e method);
        virtual int get_id(char **id);
+       virtual int set_remote_address(const char *address);
+       virtual int get_remote_address(char **address);
        virtual int set_addr_family(vine_address_family_e addr_family);
        virtual int set_remote_ip(vine_address_family_e, const std::string &ip);
        virtual int get_remote_ip(vine_address_family_e *addr_family, char **ip);
@@ -155,6 +159,8 @@ public:
 
        virtual int set_method(vine_dp_method_e method);
        virtual int get_id(char **id);
+       virtual int set_remote_address(const char *address);
+       virtual int get_remote_address(char **address);
        virtual int set_addr_family(vine_address_family_e addr_family);
        virtual int set_remote_ip(vine_address_family_e, const std::string &ip);
        virtual int get_remote_ip(vine_address_family_e *addr_family, char **ip);
@@ -175,6 +181,7 @@ public:
 
 private:
        vine_data_path_h mDataPath;
+       std::string mPeerAddr;
        vine_address_family_e mAddrFamily;
        std::string mPeerIp;
        int mPeerPort;
@@ -210,6 +217,8 @@ public:
 
        virtual int set_method(vine_dp_method_e method);
        virtual int get_id(char **id);
+       virtual int set_remote_address(const char *address);
+       virtual int get_remote_address(char **address);
        virtual int set_addr_family(vine_address_family_e addr_family);
        virtual int set_remote_ip(vine_address_family_e, const std::string &ip);
        virtual int get_remote_ip(vine_address_family_e *addr_family, char **ip);
@@ -285,6 +294,8 @@ int _vine_dp_create(vine_session_h session, vine_dp_type_e type, vine_dp_h *dp);
 int _vine_dp_destroy(vine_dp_h dp);
 int _vine_dp_set_method(vine_dp_h dp, vine_dp_method_e method);
 int _vine_dp_get_id(vine_dp_h dp, char **id);
+int _vine_dp_set_remote_address(vine_dp_h dp, const char *address);
+int _vine_dp_get_remote_address(vine_dp_h dp, char **address);
 int _vine_dp_set_iface_name(vine_dp_h dp, const char *iface_name);
 int _vine_dp_set_addr_family(vine_dp_h dp, vine_address_family_e addr_family);
 int _vine_dp_set_remote_ip(vine_dp_h dp, vine_address_family_e addr_family, const char *ip);
index 5fb28ca..6ab8e65 100644 (file)
@@ -498,6 +498,16 @@ int DPServer::get_id(char **id)
        return VINE_ERROR_INVALID_OPERATION;
 }
 
+int DPServer::set_remote_address(const char *address)
+{
+       return VINE_ERROR_INVALID_OPERATION;
+}
+
+int DPServer::get_remote_address(char **address)
+{
+       return VINE_ERROR_INVALID_OPERATION;
+}
+
 int DPServer::set_addr_family(vine_address_family_e addr_family)
 {
        mAddrFamily = addr_family;
@@ -720,6 +730,24 @@ int DPClient::get_id(char **id)
        return VINE_ERROR_INVALID_OPERATION;
 }
 
+int DPClient::set_remote_address(const char *address)
+{
+       RET_VAL_IF(isCreatedByServerDp, VINE_ERROR_INVALID_OPERATION, "cannot set remote address");
+       RET_VAL_IF(mMethod == VINE_DATA_PATH_METHOD_LWS, VINE_ERROR_INVALID_OPERATION,
+                       "cannot set remote address");
+
+       mPeerAddr = address;
+       return VINE_ERROR_NONE;
+}
+
+int DPClient::get_remote_address(char **address)
+{
+       if (mPeerAddr.size() == 0)
+               return VINE_ERROR_OPERATION_FAILED;
+       *address = STRDUP(mPeerAddr.c_str());
+       return VINE_ERROR_NONE;
+}
+
 int DPClient::set_addr_family(vine_address_family_e addr_family)
 {
        return VINE_ERROR_INVALID_OPERATION;
@@ -829,7 +857,9 @@ int DPClient::open(vine_dp_opened_cb callback, void *user_data)
        mOpenState = VINE_DP_OPEN_STATE_WAIT;
 
        int ret = vine_data_path_connect(mMethod,
-                       mAddrFamily, mPeerIp.c_str(), mPeerPort,
+                       mAddrFamily,
+                       mMethod == VINE_DATA_PATH_METHOD_BLE_GATT ? mPeerAddr.c_str() : mPeerIp.c_str(),
+                       mPeerPort,
                        mIfaceName.size() > 0 ? mIfaceName.c_str() : NULL,
                        mSecurity, NULL, NULL,
                        _connected_cb, static_cast<void *>(this), &mDataPath, mEventQueue);
@@ -921,6 +951,16 @@ int DPPubSub::get_id(char **id)
        return VINE_ERROR_NONE;
 }
 
+int DPPubSub::set_remote_address(const char *address)
+{
+       return VINE_ERROR_INVALID_OPERATION;
+}
+
+int DPPubSub::get_remote_address(char **address)
+{
+       return VINE_ERROR_INVALID_OPERATION;
+}
+
 int DPPubSub::set_addr_family(vine_address_family_e addr_family)
 {
        mAddrFamily = addr_family;
@@ -1458,6 +1498,24 @@ int _vine_dp_get_id(vine_dp_h dp, char **id)
        return _dp->get_id(id);
 }
 
+int _vine_dp_set_remote_address(vine_dp_h dp, const char *address)
+{
+       RET_VAL_IF(dp == NULL, VINE_ERROR_INVALID_PARAMETER, "dp is null.");
+       RET_VAL_IF(address == NULL, VINE_ERROR_INVALID_PARAMETER, "address is null.");
+
+       DataPath *_dp = static_cast<DataPath *>(dp);
+       return _dp->set_remote_address(address);
+}
+
+int _vine_dp_get_remote_address(vine_dp_h dp, char **address)
+{
+       RET_VAL_IF(dp == NULL, VINE_ERROR_INVALID_PARAMETER, "dp is null.");
+       RET_VAL_IF(address == NULL, VINE_ERROR_INVALID_PARAMETER, "address is null.");
+
+       DataPath *_dp = static_cast<DataPath *>(dp);
+       return _dp->get_remote_address(address);
+}
+
 int _vine_dp_set_iface_name(vine_dp_h dp, const char *iface_name)
 {
        RET_VAL_IF(dp == NULL, VINE_ERROR_INVALID_PARAMETER, "dp is null.");
index 2931ecb..8290152 100755 (executable)
@@ -366,6 +366,22 @@ API int vine_dp_get_id(vine_dp_h dp, char **id)
        return _vine_dp_get_id(dp, id);
 }
 
+API int vine_dp_set_remote_address(vine_dp_h dp, const char *address)
+{
+       __VINE_FUNC_ENTER__;
+       CHECK_FEATURE_SUPPORTED;
+
+       return _vine_dp_set_remote_address(dp, address);
+}
+
+API int vine_dp_get_remote_address(vine_dp_h dp, char **address)
+{
+       __VINE_FUNC_ENTER__;
+       CHECK_FEATURE_SUPPORTED;
+
+       return _vine_dp_get_remote_address(dp, address);
+}
+
 API int vine_dp_set_iface_name(vine_dp_h dp, const char *iface_name)
 {
        __VINE_FUNC_ENTER__;
index a6daf59..8dd6838 100755 (executable)
@@ -20,6 +20,7 @@
 
 #include "mocks/vine-mock-memory.h"
 
+#define TEST_MAC "ab:cd:ef:ab:cd:ef"
 #define TEST_IP "192.168.1.123"
 
 class VineDpTest : public ::testing::Test {
@@ -138,6 +139,30 @@ TEST_F(VineDpTest, GetIdP)
        EXPECT_EQ(VINE_ERROR_NONE, vine_dp_get_id(pubsub_dp, &id));
 }
 
+TEST_F(VineDpTest, SetRemoteAddressN)
+{
+       EXPECT_EQ(VINE_ERROR_INVALID_PARAMETER, vine_dp_set_remote_address(client_dp, NULL));
+       EXPECT_EQ(VINE_ERROR_INVALID_PARAMETER, vine_dp_set_remote_address(NULL, TEST_MAC));
+       EXPECT_EQ(VINE_ERROR_INVALID_OPERATION, vine_dp_set_remote_address(client_dp, TEST_MAC));
+       EXPECT_EQ(VINE_ERROR_INVALID_OPERATION, vine_dp_set_remote_address(server_dp, TEST_MAC));
+       EXPECT_EQ(VINE_ERROR_INVALID_OPERATION, vine_dp_set_remote_address(pubsub_dp, TEST_MAC));
+}
+
+TEST_F(VineDpTest, SetRemoteAddressP)
+{
+       vine_dp_set_method(client_dp, VINE_DP_METHOD_BLE_GATT);
+       EXPECT_EQ(VINE_ERROR_NONE, vine_dp_set_remote_address(client_dp, TEST_MAC));
+}
+
+TEST_F(VineDpTest, GetRemoteAddressP)
+{
+       char *addr;
+       EXPECT_EQ(VINE_ERROR_INVALID_PARAMETER, vine_dp_get_remote_address(client_dp, NULL));
+       EXPECT_EQ(VINE_ERROR_INVALID_PARAMETER, vine_dp_get_remote_address(NULL, &addr));
+       EXPECT_EQ(VINE_ERROR_INVALID_OPERATION, vine_dp_get_remote_address(server_dp, &addr));
+       EXPECT_EQ(VINE_ERROR_INVALID_OPERATION, vine_dp_get_remote_address(pubsub_dp, &addr));
+}
+
 TEST_F(VineDpTest, SetRemoteIpN)
 {
        EXPECT_EQ(VINE_ERROR_INVALID_PARAMETER,
index 9bfd677..d5e7e84 100755 (executable)
@@ -554,8 +554,10 @@ static void _set_dp_info(vine_dp_type_e type)
        vine_dp_set_address_family(vine_configs.dp, addr_family);
        vine_dp_set_max_connections(vine_configs.dp, tool_config_get_max_conn());
 
-       if (vine_configs.with_ble)
+       if (vine_configs.with_ble) {
                vine_dp_set_method(vine_configs.dp, VINE_DP_METHOD_BLE_GATT);
+               vine_dp_set_remote_address(vine_configs.dp,     tool_config_get_remote_address());
+       }
 
        if (type == VINE_DP_TYPE_CLIENT) {
                vine_dp_set_remote_port(vine_configs.dp, tool_config_get_port());