Add a new CAPI and test for thread_br_get_ipv6_prefix 64/276664/1
authorhyunuk.tak <hyunuk.tak@samsung.com>
Mon, 30 May 2022 06:46:44 +0000 (15:46 +0900)
committerhyunuk.tak <hyunuk.tak@samsung.com>
Thu, 23 Jun 2022 02:21:11 +0000 (11:21 +0900)
Change-Id: I899a64ea8b0e1ffdeef511b074ac918c804c2d01
Signed-off-by: hyunuk.tak <hyunuk.tak@samsung.com>
include/thread.h
src/thread-br.c
tests/unittest/thread-unittest-br.cpp

index 400f606b53cfc23d0dfcedc52fc2b949e8230918..f2c6a2cd565e70c2eefe28396948689ef70e997c 100644 (file)
@@ -490,6 +490,24 @@ int thread_br_get_route_info(thread_route_info_h route, uint8_t *ipv6_prefix,
        uint8_t *ipv6_prefix_len, uint16_t *rloc16, int8_t *preference,
        bool *is_stable, bool *is_device_nexthop);
 
+/**
+ * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE
+ * @brief Get ipv6 prefix for route
+ * @since_tizen 7.0
+ *
+ * @return 0 on success, otherwise a negative error value.
+ * @retval #THREAD_ERROR_NONE  Successful
+ * @retval #THREAD_ERROR_NOT_INITIALIZED  Not initialized
+ * @retval #THREAD_ERROR_OPERATION_FAILED  Operation failed
+ * @retval #THREAD_ERROR_NOT_SUPPORTED  Not supported
+ *
+ * @pre thread API must be initialized with thread_initialize().
+ *
+ * @see thread_external_route_foreach_cb()
+ */
+int thread_br_get_ipv6_prefix(thread_route_info_h route,
+       uint8_t *ipv6_prefix, uint8_t *ipv6_prefix_len);
+
 /**
  * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE
  * @brief Add an external border routing rule to the network.
index 791a13bb96a951c3e0a957f755511934657ed7d1..08682f9ffa6f1292cae78288923a48911af530af 100644 (file)
@@ -277,17 +277,19 @@ int thread_br_get_route_info(thread_route_info_h route,
 }
 
 int thread_br_get_ipv6_prefix(thread_route_info_h route,
-       uint8_t *ipv6_prefix)
+       uint8_t *ipv6_prefix, uint8_t *ipv6_prefix_len)
 {
        FUNC_ENTRY;
        THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON);
        THREAD_CHECK_INIT_STATUS();
        THREAD_VALIDATE_INPUT_PARAMETER(route);
        THREAD_VALIDATE_INPUT_PARAMETER(ipv6_prefix);
+       THREAD_VALIDATE_INPUT_PARAMETER(ipv6_prefix_len);
 
        thread_route_info_s *route_info = (thread_route_info_s*)route;
        memcpy(ipv6_prefix, (route_info->prefix).ipv6.fields.m8,
                        THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t));
+       *ipv6_prefix_len = (route_info->prefix).length;
 
        FUNC_EXIT;
        return THREAD_ERROR_NONE;
index f4f458d7ed7ccc6f9fef4d3d86ab80714d15b3d1..554bced5dd268674a4b349446e86c04d49f2d5ee 100644 (file)
 class ThreadBRTest : public ::testing::Test
 {
 public:
+       enum class RouteInfo {
+               kIpv6Prefix,
+       };
+
        uint8_t ipv6Prefix[THREAD_IPV6_PREFIX_SIZE];
        uint8_t ipv6PrefixLen;
        uint16_t rloc16;
@@ -48,6 +52,20 @@ public:
        static bool GetExternalRoutesCallback(int total,
                thread_route_info_h route_info, void *user_data)
                {
+                       RouteInfo routeInfo = static_cast<RouteInfo>(GPOINTER_TO_UINT(user_data));
+
+                       switch (routeInfo) {
+                       case RouteInfo::kIpv6Prefix:
+                               {
+                                       uint8_t ipv6Prefix[THREAD_IPV6_ADDRESS_SIZE];
+                                       uint8_t ipv6PrefixLen;
+                                       EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_ipv6_prefix(route_info, ipv6Prefix, &ipv6PrefixLen));
+                               }
+                               break;
+                       default:
+                               break;
+                       }
+
                        return true;
                };
 
@@ -164,6 +182,15 @@ TEST_F(ThreadBRTest, BRGetExternalRoutesErrorNone)
                thread_br_get_external_routes(instance, GetExternalRoutesCallback, nullptr));
 }
 
+TEST_F(ThreadBRTest, BRGetIpv6PrefixErrorNone)
+{
+       EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance));
+       EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance));
+       EXPECT_EQ(THREAD_ERROR_NONE,
+               thread_br_get_external_routes(instance, GetExternalRoutesCallback,
+               GUINT_TO_POINTER(static_cast<guint>(RouteInfo::kIpv6Prefix))));
+}
+
 TEST_F(ThreadBRTest, BRAddExternalRouteNotInitialized)
 {
        EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize());