From 77f4f73034b578e7f44c9b8a167cca9f2c62c3b0 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 30 May 2022 15:45:33 +0900 Subject: [PATCH 01/16] Remove iteration to get external route Change-Id: I592a54f0e54fc7a68beaab76bd75ae939f6f9f50 Signed-off-by: hyunuk.tak --- src/thread-br.c | 83 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/src/thread-br.c b/src/thread-br.c index 7fa9d07..791a13b 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -95,7 +95,6 @@ static int __thread_br_get_external_route_cb(GVariant *val, THREAD_VALIDATE_INPUT_PARAMETER(callback); THREAD_VALIDATE_INPUT_PARAMETER(instance); - GVariantIter iter; uint8_t *prefix_address = NULL; uint8_t prefix_len = 0; uint16_t rloc16 = 0; @@ -106,42 +105,41 @@ static int __thread_br_get_external_route_cb(GVariant *val, thread_instance_s *current_instance = instance; THREAD_DBG("Process callback for get external route"); - g_variant_iter_init(&iter, val); - while (g_variant_iter_next(&iter, "((ayy)qybb)", + g_variant_get(val, "((ayy)qybb)", &prefix_address, &prefix_len, &rloc16, &preference, - &stable, &next_hop_is_self)) { - - thread_route_info_s *route_info = _create_new_route(); - - THREAD_DBG("Got the external route..."); - - THREAD_DBG("prefix_address: %02x%02x:%02x%02x:%02x%02x:%02x%02x", - prefix_address[0], prefix_address[1], prefix_address[2], - prefix_address[3], prefix_address[4], prefix_address[5], - prefix_address[6], prefix_address[7]); - - THREAD_DBG("prefix_len: %u", prefix_len); - THREAD_DBG("rloc16: %u", rloc16); - THREAD_DBG("preference: %u", preference); - THREAD_DBG("stable: %s", stable ? "TRUE" : "FALSE"); - THREAD_DBG("next_hop_is_self: %s", next_hop_is_self ? - "TRUE" : "FALSE"); - memcpy((route_info->prefix).ipv6.fields.m8, prefix_address, - THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t)); - (route_info->prefix).length = prefix_len; - route_info->preference = preference; - route_info->is_stable = stable; - route_info->rloc16 = rloc16; - route_info->is_nexthop_this_device = next_hop_is_self; - current_instance->route_list = g_slist_append( - current_instance->route_list, - route_info); + &stable, &next_hop_is_self); + + thread_route_info_s *route_info = _create_new_route(); + + THREAD_DBG("Got the external route..."); + + THREAD_DBG("prefix_address: %02x%02x:%02x%02x:%02x%02x:%02x%02x", + prefix_address[0], prefix_address[1], prefix_address[2], + prefix_address[3], prefix_address[4], prefix_address[5], + prefix_address[6], prefix_address[7]); + + THREAD_DBG("prefix_len: %u", prefix_len); + THREAD_DBG("rloc16: %u", rloc16); + THREAD_DBG("preference: %u", preference); + THREAD_DBG("stable: %s", stable ? "TRUE" : "FALSE"); + THREAD_DBG("next_hop_is_self: %s", next_hop_is_self ? + "TRUE" : "FALSE"); + memcpy((route_info->prefix).ipv6.fields.m8, prefix_address, + THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t)); + (route_info->prefix).length = prefix_len; + route_info->preference = preference; + route_info->is_stable = stable; + route_info->rloc16 = rloc16; + route_info->is_nexthop_this_device = next_hop_is_self; + current_instance->route_list = g_slist_append( + current_instance->route_list, + route_info); + + if (callback) + (callback)(++count, (thread_route_info_h)route_info, + user_data); - if (callback) - (callback)(++count, (thread_route_info_h)route_info, - user_data); - } THREAD_DBG("Exiting __thread_br_get_external_route_cb ..."); FUNC_EXIT; @@ -278,6 +276,23 @@ int thread_br_get_route_info(thread_route_info_h route, return THREAD_ERROR_NONE; } +int thread_br_get_ipv6_prefix(thread_route_info_h route, + uint8_t *ipv6_prefix) +{ + 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_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)); + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_external_route(thread_instance_h instance, const uint8_t *ipv6_prefix, uint8_t ipv6_prefix_len, uint16_t rloc16, int8_t preference, -- 2.7.4 From adf5f2b5737d3c1c509fcc7e3d03b8818ed63438 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 30 May 2022 15:46:44 +0900 Subject: [PATCH 02/16] Add a new CAPI and test for thread_br_get_ipv6_prefix Change-Id: I899a64ea8b0e1ffdeef511b074ac918c804c2d01 Signed-off-by: hyunuk.tak --- include/thread.h | 18 ++++++++++++++++++ src/thread-br.c | 4 +++- tests/unittest/thread-unittest-br.cpp | 27 +++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/include/thread.h b/include/thread.h index 400f606..f2c6a2c 100644 --- a/include/thread.h +++ b/include/thread.h @@ -492,6 +492,24 @@ int thread_br_get_route_info(thread_route_info_h route, uint8_t *ipv6_prefix, /** * @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. * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index 791a13b..08682f9 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -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; diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index f4f458d..554bced 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -23,6 +23,10 @@ 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(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(RouteInfo::kIpv6Prefix)))); +} + TEST_F(ThreadBRTest, BRAddExternalRouteNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); -- 2.7.4 From c4ab89194fc85845e0644636606d4c216a32ae82 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 30 May 2022 16:18:56 +0900 Subject: [PATCH 03/16] Add a new CAPI and test for thread_br_get_rloc16 Change-Id: Ib53d4190860b70564d6513df3da1f8dbdb6f7e07 Signed-off-by: hyunuk.tak --- include/thread.h | 18 ++++++++++++++++++ src/thread-br.c | 16 ++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 16 ++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/include/thread.h b/include/thread.h index f2c6a2c..6739477 100644 --- a/include/thread.h +++ b/include/thread.h @@ -510,6 +510,24 @@ int thread_br_get_ipv6_prefix(thread_route_info_h route, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get rloc16 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_rloc16(thread_route_info_h route, + uint16_t *rloc16); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an external border routing rule to the network. * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index 08682f9..ed2a655 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -295,6 +295,22 @@ int thread_br_get_ipv6_prefix(thread_route_info_h route, return THREAD_ERROR_NONE; } +int thread_br_get_rloc16(thread_route_info_h route, + uint16_t *rloc16) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(route); + THREAD_VALIDATE_INPUT_PARAMETER(rloc16); + + thread_route_info_s *route_info = (thread_route_info_s*)route; + *rloc16 = route_info->rloc16; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_external_route(thread_instance_h instance, const uint8_t *ipv6_prefix, uint8_t ipv6_prefix_len, uint16_t rloc16, int8_t preference, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 554bced..f05843a 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -25,6 +25,7 @@ class ThreadBRTest : public ::testing::Test public: enum class RouteInfo { kIpv6Prefix, + kRloc16, }; uint8_t ipv6Prefix[THREAD_IPV6_PREFIX_SIZE]; @@ -62,6 +63,12 @@ public: EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_ipv6_prefix(route_info, ipv6Prefix, &ipv6PrefixLen)); } break; + case RouteInfo::kRloc16: + { + uint16_t rloc16; + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_rloc16(route_info, &rloc16)); + } + break; default: break; } @@ -191,6 +198,15 @@ TEST_F(ThreadBRTest, BRGetIpv6PrefixErrorNone) GUINT_TO_POINTER(static_cast(RouteInfo::kIpv6Prefix)))); } +TEST_F(ThreadBRTest, BRGetRloc16ErrorNone) +{ + 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(RouteInfo::kRloc16)))); +} + TEST_F(ThreadBRTest, BRAddExternalRouteNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); -- 2.7.4 From f921a6eae3c75b9506cd6d8657b76626dc48ff36 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 30 May 2022 16:47:14 +0900 Subject: [PATCH 04/16] Add a new CAPI and test for thread_br_get_preference Change-Id: I6a469b91288a4fb74509024d56423528169ac37f Signed-off-by: hyunuk.tak --- include/thread.h | 18 ++++++++++++++++++ src/thread-br.c | 16 ++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 16 ++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/include/thread.h b/include/thread.h index 6739477..97f6204 100644 --- a/include/thread.h +++ b/include/thread.h @@ -528,6 +528,24 @@ int thread_br_get_rloc16(thread_route_info_h route, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get preference 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_preference(thread_route_info_h route, + int8_t *preference); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an external border routing rule to the network. * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index ed2a655..8d8b87d 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -311,6 +311,22 @@ int thread_br_get_rloc16(thread_route_info_h route, return THREAD_ERROR_NONE; } +int thread_br_get_preference(thread_route_info_h route, + int8_t *preference) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(route); + THREAD_VALIDATE_INPUT_PARAMETER(preference); + + thread_route_info_s *route_info = (thread_route_info_s*)route; + *preference = route_info->preference; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_external_route(thread_instance_h instance, const uint8_t *ipv6_prefix, uint8_t ipv6_prefix_len, uint16_t rloc16, int8_t preference, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index f05843a..bdf1c39 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -26,6 +26,7 @@ public: enum class RouteInfo { kIpv6Prefix, kRloc16, + kPreference, }; uint8_t ipv6Prefix[THREAD_IPV6_PREFIX_SIZE]; @@ -69,6 +70,12 @@ public: EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_rloc16(route_info, &rloc16)); } break; + case RouteInfo::kPreference: + { + int8_t preference; + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_preference(route_info, &preference)); + } + break; default: break; } @@ -207,6 +214,15 @@ TEST_F(ThreadBRTest, BRGetRloc16ErrorNone) GUINT_TO_POINTER(static_cast(RouteInfo::kRloc16)))); } +TEST_F(ThreadBRTest, BRGetPreferenceErrorNone) +{ + 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(RouteInfo::kPreference)))); +} + TEST_F(ThreadBRTest, BRAddExternalRouteNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); -- 2.7.4 From c793b99b2c3c9270098eb9a07c4ca3f60efdfa2a Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 30 May 2022 16:57:05 +0900 Subject: [PATCH 05/16] Add a new CAPI and test for thread_br_get_stable Change-Id: I43ffe8efbb6f509f7e4dbadb770cc08b5d26d2df Signed-off-by: hyunuk.tak --- include/thread.h | 18 ++++++++++++++++++ src/thread-br.c | 16 ++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 16 ++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/include/thread.h b/include/thread.h index 97f6204..614ce06 100644 --- a/include/thread.h +++ b/include/thread.h @@ -546,6 +546,24 @@ int thread_br_get_preference(thread_route_info_h route, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get stable 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_stable(thread_route_info_h route, + bool *is_stable); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an external border routing rule to the network. * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index 8d8b87d..3305252 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -327,6 +327,22 @@ int thread_br_get_preference(thread_route_info_h route, return THREAD_ERROR_NONE; } +int thread_br_get_stable(thread_route_info_h route, + bool *is_stable) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(route); + THREAD_VALIDATE_INPUT_PARAMETER(is_stable); + + thread_route_info_s *route_info = (thread_route_info_s*)route; + *is_stable = route_info->is_stable; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_external_route(thread_instance_h instance, const uint8_t *ipv6_prefix, uint8_t ipv6_prefix_len, uint16_t rloc16, int8_t preference, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index bdf1c39..bcd451d 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -27,6 +27,7 @@ public: kIpv6Prefix, kRloc16, kPreference, + kStable, }; uint8_t ipv6Prefix[THREAD_IPV6_PREFIX_SIZE]; @@ -76,6 +77,12 @@ public: EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_preference(route_info, &preference)); } break; + case RouteInfo::kStable: + { + bool isStable; + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_stable(route_info, &isStable)); + } + break; default: break; } @@ -223,6 +230,15 @@ TEST_F(ThreadBRTest, BRGetPreferenceErrorNone) GUINT_TO_POINTER(static_cast(RouteInfo::kPreference)))); } +TEST_F(ThreadBRTest, BRGetStableErrorNone) +{ + 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(RouteInfo::kStable)))); +} + TEST_F(ThreadBRTest, BRAddExternalRouteNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); -- 2.7.4 From d1ccf1a2e7de499e43d23a158c044340577da120 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 30 May 2022 17:03:36 +0900 Subject: [PATCH 06/16] Add a new CAPI and test for thread_br_get_device_nexthop Change-Id: I22568521b1c4b31af8e2652d135118b34d5d5a3d Signed-off-by: hyunuk.tak --- include/thread.h | 18 ++++++++++++++++++ src/thread-br.c | 16 ++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 16 ++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/include/thread.h b/include/thread.h index 614ce06..83e67ce 100644 --- a/include/thread.h +++ b/include/thread.h @@ -564,6 +564,24 @@ int thread_br_get_stable(thread_route_info_h route, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get device next hop 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_device_nexthop(thread_route_info_h route, + bool *is_device_nexthop); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an external border routing rule to the network. * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index 3305252..c8fb303 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -343,6 +343,22 @@ int thread_br_get_stable(thread_route_info_h route, return THREAD_ERROR_NONE; } +int thread_br_get_device_nexthop(thread_route_info_h route, + bool *is_device_nexthop) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(route); + THREAD_VALIDATE_INPUT_PARAMETER(is_device_nexthop); + + thread_route_info_s *route_info = (thread_route_info_s*)route; + *is_device_nexthop = route_info->is_nexthop_this_device; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_external_route(thread_instance_h instance, const uint8_t *ipv6_prefix, uint8_t ipv6_prefix_len, uint16_t rloc16, int8_t preference, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index bcd451d..93789b0 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -28,6 +28,7 @@ public: kRloc16, kPreference, kStable, + kDeviceNexthop, }; uint8_t ipv6Prefix[THREAD_IPV6_PREFIX_SIZE]; @@ -83,6 +84,12 @@ public: EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_stable(route_info, &isStable)); } break; + case RouteInfo::kDeviceNexthop: + { + bool isDeviceNexthop; + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_device_nexthop(route_info, &isDeviceNexthop)); + } + break; default: break; } @@ -239,6 +246,15 @@ TEST_F(ThreadBRTest, BRGetStableErrorNone) GUINT_TO_POINTER(static_cast(RouteInfo::kStable)))); } +TEST_F(ThreadBRTest, BRGetDeviceNexthopErrorNone) +{ + 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(RouteInfo::kDeviceNexthop)))); +} + TEST_F(ThreadBRTest, BRAddExternalRouteNotInitialized) { EXPECT_EQ(THREAD_ERROR_NONE, thread_deinitialize()); -- 2.7.4 From 794f0f2ef698ba44e2e11f5fd9251e683f28b5cb Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Mon, 30 May 2022 17:07:26 +0900 Subject: [PATCH 07/16] Replace get with check Change-Id: Ifcbd2a7db14d25507fe42a8241f194fd28d379cf Signed-off-by: hyunuk.tak --- include/thread.h | 4 ++-- src/thread-br.c | 4 ++-- tests/unittest/thread-unittest-br.cpp | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/thread.h b/include/thread.h index 83e67ce..19a9853 100644 --- a/include/thread.h +++ b/include/thread.h @@ -559,7 +559,7 @@ int thread_br_get_preference(thread_route_info_h route, * * @see thread_external_route_foreach_cb() */ -int thread_br_get_stable(thread_route_info_h route, +int thread_br_check_stable(thread_route_info_h route, bool *is_stable); /** @@ -577,7 +577,7 @@ int thread_br_get_stable(thread_route_info_h route, * * @see thread_external_route_foreach_cb() */ -int thread_br_get_device_nexthop(thread_route_info_h route, +int thread_br_check_device_nexthop(thread_route_info_h route, bool *is_device_nexthop); /** diff --git a/src/thread-br.c b/src/thread-br.c index c8fb303..f15fa2e 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -327,7 +327,7 @@ int thread_br_get_preference(thread_route_info_h route, return THREAD_ERROR_NONE; } -int thread_br_get_stable(thread_route_info_h route, +int thread_br_check_stable(thread_route_info_h route, bool *is_stable) { FUNC_ENTRY; @@ -343,7 +343,7 @@ int thread_br_get_stable(thread_route_info_h route, return THREAD_ERROR_NONE; } -int thread_br_get_device_nexthop(thread_route_info_h route, +int thread_br_check_device_nexthop(thread_route_info_h route, bool *is_device_nexthop) { FUNC_ENTRY; diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 93789b0..4e0cdca 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -81,13 +81,13 @@ public: case RouteInfo::kStable: { bool isStable; - EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_stable(route_info, &isStable)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_check_stable(route_info, &isStable)); } break; case RouteInfo::kDeviceNexthop: { bool isDeviceNexthop; - EXPECT_EQ(THREAD_ERROR_NONE, thread_br_get_device_nexthop(route_info, &isDeviceNexthop)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_check_device_nexthop(route_info, &isDeviceNexthop)); } break; default: @@ -237,7 +237,7 @@ TEST_F(ThreadBRTest, BRGetPreferenceErrorNone) GUINT_TO_POINTER(static_cast(RouteInfo::kPreference)))); } -TEST_F(ThreadBRTest, BRGetStableErrorNone) +TEST_F(ThreadBRTest, BRCheckStableErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); @@ -246,7 +246,7 @@ TEST_F(ThreadBRTest, BRGetStableErrorNone) GUINT_TO_POINTER(static_cast(RouteInfo::kStable)))); } -TEST_F(ThreadBRTest, BRGetDeviceNexthopErrorNone) +TEST_F(ThreadBRTest, BRCheckDeviceNexthopErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); -- 2.7.4 From 7d17415ac53ea7dc0a084fd67f46c6ee1c8dd018 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 31 May 2022 10:21:57 +0900 Subject: [PATCH 08/16] Remove thread_br_get_route_info CAPI Change-Id: Ia279f166cf79084a2b016fbc7abfc2ad6b5039d2 Signed-off-by: hyunuk.tak --- include/thread.h | 19 ----------------- src/thread-br.c | 29 -------------------------- tests/thread-test/thread-br.c | 47 ++++++++++++++++++++++++++----------------- 3 files changed, 28 insertions(+), 67 deletions(-) diff --git a/include/thread.h b/include/thread.h index 19a9853..1f9cb15 100644 --- a/include/thread.h +++ b/include/thread.h @@ -473,25 +473,6 @@ int thread_br_get_external_routes(thread_instance_h instance, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE - * @brief Get Route informations - * @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_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 * diff --git a/src/thread-br.c b/src/thread-br.c index f15fa2e..a592d72 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -247,35 +247,6 @@ int thread_br_get_external_routes(thread_instance_h instance, return THREAD_ERROR_NONE; } -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) -{ - 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_VALIDATE_INPUT_PARAMETER(rloc16); - THREAD_VALIDATE_INPUT_PARAMETER(preference); - THREAD_VALIDATE_INPUT_PARAMETER(is_stable); - THREAD_VALIDATE_INPUT_PARAMETER(is_device_nexthop); - - 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; - *rloc16 = route_info->rloc16; - *preference = route_info->preference; - *is_stable = route_info->is_stable; - *is_device_nexthop = route_info->is_nexthop_this_device; - - FUNC_EXIT; - return THREAD_ERROR_NONE; -} - int thread_br_get_ipv6_prefix(thread_route_info_h route, uint8_t *ipv6_prefix, uint8_t *ipv6_prefix_len) { diff --git a/tests/thread-test/thread-br.c b/tests/thread-test/thread-br.c index 8c40d19..a91e85e 100644 --- a/tests/thread-test/thread-br.c +++ b/tests/thread-test/thread-br.c @@ -118,39 +118,48 @@ static bool __thread_br_get_external_routes_callback(int total, thread_route_inf msg("Found the external route..."); - int ret = thread_br_get_route_info(route_info, - g_ext_ipv6_prefix, &g_ext_ipv6_prefix_len, &g_ext_rloc16, - &g_ext_preference, &g_ext_is_stable, &g_ext_is_device_next_hop); - + uint8_t *prefix_address = NULL; + int ret = thread_br_get_ipv6_prefix(route_info, g_ext_ipv6_prefix, &g_ext_ipv6_prefix_len); if (ret == THREAD_ERROR_NONE) { - msg("thread_br_get_route_info success"); - uint8_t *prefix_address = g_ext_ipv6_prefix; - + prefix_address = g_ext_ipv6_prefix; msg("prefix_address: %02x%02x:%02x%02x:%02x%02x:%02x%02x", prefix_address[0], prefix_address[1], prefix_address[2], prefix_address[3], prefix_address[4], prefix_address[5], prefix_address[6], prefix_address[7]); msg("prefix_len: %u", g_ext_ipv6_prefix_len); + } + + ret = thread_br_get_rloc16(route_info, &g_ext_rloc16); + if (ret == THREAD_ERROR_NONE) { msg("rloc16: %u", g_ext_rloc16); + } + + ret = thread_br_get_preference(route_info, &g_ext_preference); + if (ret == THREAD_ERROR_NONE) { msg("preference: %u", g_ext_preference); + } + + ret = thread_br_check_stable(route_info, &g_ext_is_stable); + if (ret == THREAD_ERROR_NONE) { msg("stable: %s", g_ext_is_stable ? "TRUE" : "FALSE"); + } + + ret = thread_br_check_device_nexthop(route_info, &g_ext_is_device_next_hop); + if (ret == THREAD_ERROR_NONE) { msg("next_hop_is_self: %s", g_ext_is_device_next_hop ? "TRUE" : "FALSE"); + } - /* Create a new route and add to route_list */ - thread_route_info_a *new_route = _create_new_route(); - if (!new_route) - goto OUT; - - new_route->handle = route_info; - memcpy(new_route->prefix_address, prefix_address, - THREAD_IPV6_PREFIX_SIZE); - new_route->prefix_length = g_ext_ipv6_prefix_len; + thread_route_info_a *new_route = _create_new_route(); + if (!new_route) + goto OUT; - route_list = g_slist_append(route_list, new_route); + new_route->handle = route_info; + memcpy(new_route->prefix_address, prefix_address, + THREAD_IPV6_PREFIX_SIZE); + new_route->prefix_length = g_ext_ipv6_prefix_len; - } else - msg("thread_br_get_route_info failed"); + route_list = g_slist_append(route_list, new_route); OUT: msg("Callback exit"); -- 2.7.4 From 70bbe19da54541847ba5635dad41bcf214239ecc Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 31 May 2022 11:33:04 +0900 Subject: [PATCH 09/16] Modify to add array type for external routes dbus variant Change-Id: Iea12013151a5f6a7fe6354109f81edbed7b54940 Signed-off-by: hyunuk.tak --- src/thread-br.c | 66 +++++++++++++++--------------- tests/unittest/mocks/thread-mock-dummy.cpp | 8 +++- 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/src/thread-br.c b/src/thread-br.c index a592d72..588c3b9 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -95,6 +95,7 @@ static int __thread_br_get_external_route_cb(GVariant *val, THREAD_VALIDATE_INPUT_PARAMETER(callback); THREAD_VALIDATE_INPUT_PARAMETER(instance); + GVariantIter iter; uint8_t *prefix_address = NULL; uint8_t prefix_len = 0; uint16_t rloc16 = 0; @@ -105,41 +106,42 @@ static int __thread_br_get_external_route_cb(GVariant *val, thread_instance_s *current_instance = instance; THREAD_DBG("Process callback for get external route"); + g_variant_iter_init(&iter, val); - g_variant_get(val, "((ayy)qybb)", + while (g_variant_iter_next(&iter, "((ayy)qybb)", &prefix_address, &prefix_len, &rloc16, &preference, - &stable, &next_hop_is_self); - - thread_route_info_s *route_info = _create_new_route(); - - THREAD_DBG("Got the external route..."); - - THREAD_DBG("prefix_address: %02x%02x:%02x%02x:%02x%02x:%02x%02x", - prefix_address[0], prefix_address[1], prefix_address[2], - prefix_address[3], prefix_address[4], prefix_address[5], - prefix_address[6], prefix_address[7]); - - THREAD_DBG("prefix_len: %u", prefix_len); - THREAD_DBG("rloc16: %u", rloc16); - THREAD_DBG("preference: %u", preference); - THREAD_DBG("stable: %s", stable ? "TRUE" : "FALSE"); - THREAD_DBG("next_hop_is_self: %s", next_hop_is_self ? - "TRUE" : "FALSE"); - memcpy((route_info->prefix).ipv6.fields.m8, prefix_address, - THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t)); - (route_info->prefix).length = prefix_len; - route_info->preference = preference; - route_info->is_stable = stable; - route_info->rloc16 = rloc16; - route_info->is_nexthop_this_device = next_hop_is_self; - current_instance->route_list = g_slist_append( - current_instance->route_list, - route_info); - - if (callback) - (callback)(++count, (thread_route_info_h)route_info, - user_data); + &stable, &next_hop_is_self)) { + + thread_route_info_s *route_info = _create_new_route(); + + THREAD_DBG("Got the external route..."); + + THREAD_DBG("prefix_address: %02x%02x:%02x%02x:%02x%02x:%02x%02x", + prefix_address[0], prefix_address[1], prefix_address[2], + prefix_address[3], prefix_address[4], prefix_address[5], + prefix_address[6], prefix_address[7]); + + THREAD_DBG("prefix_len: %u", prefix_len); + THREAD_DBG("rloc16: %u", rloc16); + THREAD_DBG("preference: %u", preference); + THREAD_DBG("stable: %s", stable ? "TRUE" : "FALSE"); + THREAD_DBG("next_hop_is_self: %s", next_hop_is_self ? + "TRUE" : "FALSE"); + memcpy((route_info->prefix).ipv6.fields.m8, prefix_address, + THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t)); + (route_info->prefix).length = prefix_len; + route_info->preference = preference; + route_info->is_stable = stable; + route_info->rloc16 = rloc16; + route_info->is_nexthop_this_device = next_hop_is_self; + current_instance->route_list = g_slist_append( + current_instance->route_list, + route_info); + if (callback) + (callback)(++count, (thread_route_info_h)route_info, + user_data); + } THREAD_DBG("Exiting __thread_br_get_external_route_cb ..."); FUNC_EXIT; diff --git a/tests/unittest/mocks/thread-mock-dummy.cpp b/tests/unittest/mocks/thread-mock-dummy.cpp index 8e59794..ee8fd98 100644 --- a/tests/unittest/mocks/thread-mock-dummy.cpp +++ b/tests/unittest/mocks/thread-mock-dummy.cpp @@ -184,16 +184,22 @@ static GVariant *__make_external_routes_result() bool stable = TRUE; bool nextHopIsSelf = TRUE; + GVariantBuilder *externalRoutesBuilder = + g_variant_builder_new(G_VARIANT_TYPE("a((ayy)qybb)")); + GVariantBuilder *prefixBuilder = g_variant_builder_new(G_VARIANT_TYPE("ay")); __make_ipv6_prefix(prefixAddress); for (int i = 0; i < THREAD_IPV6_PREFIX_SIZE; ++i) g_variant_builder_add(prefixBuilder, "y", prefixAddress[i]); - GVariant *externalRoutesResult = g_variant_new("((ayy)qybb)", + g_variant_builder_add(externalRoutesBuilder, "((ayy)qybb)", prefixBuilder, prefixLen, rloc16, preference, stable, nextHopIsSelf); + GVariant *externalRoutesResult = g_variant_new("a((ayy)qybb)", externalRoutesBuilder); + g_variant_builder_unref(prefixBuilder); + g_variant_builder_unref(externalRoutesBuilder); return externalRoutesResult; } -- 2.7.4 From 84ea5ae516ab92731f1a8475a0e7a47266a36f29 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 14 Jun 2022 15:00:29 +0900 Subject: [PATCH 10/16] Add new CAPIs and unittest to create/destroy onmesh prefix Change-Id: I2bf6b08ce39ce7765cbcf9e9dc40f7b83f0e6882 Signed-off-by: hyunuk.tak --- include/thread.h | 36 +++++++++++++++++++++++++ src/thread-br.c | 49 +++++++++++++++++++++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 32 +++++++++++++++++++++++ 3 files changed, 117 insertions(+) diff --git a/include/thread.h b/include/thread.h index 1f9cb15..7c6a811 100644 --- a/include/thread.h +++ b/include/thread.h @@ -601,6 +601,42 @@ int thread_br_remove_external_route(thread_instance_h instance, thread_route_inf /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Create an on-mesh prefix info + * @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_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_create(thread_instance_h instance, + thread_onmesh_prefix_info_h *onmesh_prefix); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Destroy on-mesh prefix info + * @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_onmesh_prefix_create() + */ +int thread_onmesh_prefix_destroy(thread_instance_h instance, + thread_onmesh_prefix_info_h onmesh_prefix); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an on-mesh prefix to the network * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index 588c3b9..f587f7b 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -446,6 +446,55 @@ int thread_br_remove_external_route(thread_instance_h instance, return THREAD_ERROR_NONE; } +int thread_onmesh_prefix_create(thread_instance_h instance, + thread_onmesh_prefix_info_h *onmesh_prefix) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(instance); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_instance_s *current_instance = instance; + retv_if(!current_instance->is_br_enabled, THREAD_ERROR_NOT_ENABLED); + + thread_onmesh_prefix_info_s* new_onmesh_prefix = + _create_new_onmesh_prefix(); + retv_if (!new_onmesh_prefix, THREAD_ERROR_OUT_OF_MEMORY); + + current_instance->onmesh_prefix_list = g_slist_append( + current_instance->onmesh_prefix_list, + new_onmesh_prefix); + + *onmesh_prefix = (thread_onmesh_prefix_info_h)new_onmesh_prefix; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + +int thread_onmesh_prefix_destroy(thread_instance_h instance, + thread_onmesh_prefix_info_h onmesh_prefix) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(instance); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_instance_s *current_instance = instance; + retv_if(!current_instance->is_br_enabled, THREAD_ERROR_NOT_ENABLED); + + if (g_slist_find(current_instance->onmesh_prefix_list, onmesh_prefix)) { + current_instance->onmesh_prefix_list = g_slist_remove( + current_instance->onmesh_prefix_list, + onmesh_prefix); + g_free(onmesh_prefix); + } + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_onmesh_prefix(thread_instance_h instance, const uint8_t *ipv6_prefix, int ipv6_prefix_len, int8_t preference, bool preferred, bool slaac, bool dhcp, bool configure, bool default_route, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 4e0cdca..3e7dbc7 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -335,6 +335,38 @@ TEST_F(ThreadBRTest, BRAddOnmeshPrefixInvalidParameter) dhcp, configure, defaultRoute, onMesh, stable, &onmeshPrefix)); } +TEST_F(ThreadBRTest, BRCreateOnmeshPrefixNotEnabled) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NOT_ENABLED, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); +} + +TEST_F(ThreadBRTest, BRCreateOnmeshPrefixErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); +} + +TEST_F(ThreadBRTest, BRDestroyOnmeshPrefixNotEnabled) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NOT_ENABLED, + thread_onmesh_prefix_destroy(instance, onmeshPrefix)); +} + +TEST_F(ThreadBRTest, BRDestroyOnmeshPrefixErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_destroy(instance, onmeshPrefix)); +} + TEST_F(ThreadBRTest, BRAddOnmeshPrefixNotEnabled) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); -- 2.7.4 From 17b5b58d5e381db36ff7f0b75dfa10181acfbf66 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 14 Jun 2022 16:43:18 +0900 Subject: [PATCH 11/16] Add new CAPIs and unittest to set/get ipv6 prefix for onmesh Change-Id: Ibc0ffc494ef191be37312bbab5795090075d3e9c Signed-off-by: hyunuk.tak --- include/thread.h | 38 +++++++++++++++++++++++++++ src/thread-br.c | 49 +++++++++++++++++++++++++++++++---- tests/unittest/thread-unittest-br.cpp | 31 +++++++++++++++------- 3 files changed, 103 insertions(+), 15 deletions(-) diff --git a/include/thread.h b/include/thread.h index 7c6a811..7b0bee3 100644 --- a/include/thread.h +++ b/include/thread.h @@ -637,6 +637,44 @@ int thread_onmesh_prefix_destroy(thread_instance_h instance, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Set ipv6 prefix to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_set_ipv6_prefix(thread_onmesh_prefix_info_h onmesh_prefix, + const uint8_t *ipv6_prefix, uint8_t ipv6_prefix_len); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get ipv6 prefix to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_get_ipv6_prefix(thread_onmesh_prefix_info_h onmesh_prefix, + uint8_t **ipv6_prefix, uint8_t *ipv6_prefix_len); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an on-mesh prefix to the network * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index f587f7b..94a0ce1 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -456,9 +456,7 @@ int thread_onmesh_prefix_create(thread_instance_h instance, THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); thread_instance_s *current_instance = instance; - retv_if(!current_instance->is_br_enabled, THREAD_ERROR_NOT_ENABLED); - - thread_onmesh_prefix_info_s* new_onmesh_prefix = + thread_onmesh_prefix_info_s *new_onmesh_prefix = _create_new_onmesh_prefix(); retv_if (!new_onmesh_prefix, THREAD_ERROR_OUT_OF_MEMORY); @@ -482,8 +480,6 @@ int thread_onmesh_prefix_destroy(thread_instance_h instance, THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); thread_instance_s *current_instance = instance; - retv_if(!current_instance->is_br_enabled, THREAD_ERROR_NOT_ENABLED); - if (g_slist_find(current_instance->onmesh_prefix_list, onmesh_prefix)) { current_instance->onmesh_prefix_list = g_slist_remove( current_instance->onmesh_prefix_list, @@ -495,6 +491,49 @@ int thread_onmesh_prefix_destroy(thread_instance_h instance, return THREAD_ERROR_NONE; } +int thread_onmesh_prefix_set_ipv6_prefix(thread_onmesh_prefix_info_h onmesh_prefix, + const 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(onmesh_prefix); + THREAD_VALIDATE_INPUT_PARAMETER(ipv6_prefix); + + retv_if(ipv6_prefix_len > THREAD_IPV6_PREFIX_LEN, + THREAD_ERROR_INVALID_PARAMETER); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + memcpy((onmesh_prefix_info->prefix).ipv6.fields.m8, ipv6_prefix, + THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t)); + (onmesh_prefix_info->prefix).length = ipv6_prefix_len; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + +int thread_onmesh_prefix_get_ipv6_prefix(thread_onmesh_prefix_info_h onmesh_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(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + *ipv6_prefix = g_malloc0(THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t)); + retv_if (!ipv6_prefix, THREAD_ERROR_OUT_OF_MEMORY); + + memcpy(*ipv6_prefix, (onmesh_prefix_info->prefix).ipv6.fields.m8, + THREAD_IPV6_PREFIX_SIZE*sizeof(uint8_t)); + *ipv6_prefix_len = (onmesh_prefix_info->prefix).length; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_onmesh_prefix(thread_instance_h instance, const uint8_t *ipv6_prefix, int ipv6_prefix_len, int8_t preference, bool preferred, bool slaac, bool dhcp, bool configure, bool default_route, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 3e7dbc7..dfb76c7 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -335,36 +335,47 @@ TEST_F(ThreadBRTest, BRAddOnmeshPrefixInvalidParameter) dhcp, configure, defaultRoute, onMesh, stable, &onmeshPrefix)); } -TEST_F(ThreadBRTest, BRCreateOnmeshPrefixNotEnabled) +TEST_F(ThreadBRTest, BRCreateOnmeshPrefixErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); - EXPECT_EQ(THREAD_ERROR_NOT_ENABLED, + EXPECT_EQ(THREAD_ERROR_NONE, thread_onmesh_prefix_create(instance, &onmeshPrefix)); } -TEST_F(ThreadBRTest, BRCreateOnmeshPrefixErrorNone) +TEST_F(ThreadBRTest, BRDestroyOnmeshPrefixErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); - EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_destroy(instance, onmeshPrefix)); } -TEST_F(ThreadBRTest, BRDestroyOnmeshPrefixNotEnabled) +TEST_F(ThreadBRTest, BRSetOnmeshIpv6PrefixErrorNone) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); - EXPECT_EQ(THREAD_ERROR_NOT_ENABLED, - thread_onmesh_prefix_destroy(instance, onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_ipv6_prefix(onmeshPrefix, + onmeshIpv6Prefix, onmeshIpv6PrefixLen)); } -TEST_F(ThreadBRTest, BRDestroyOnmeshPrefixErrorNone) +TEST_F(ThreadBRTest, BRGetOnmeshIpv6PrefixErrorNone) { + uint8_t *ipv6Prefix = NULL; + uint8_t ipv6PrefixLen; + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); - EXPECT_EQ(THREAD_ERROR_NONE, thread_br_enable(instance)); EXPECT_EQ(THREAD_ERROR_NONE, thread_onmesh_prefix_create(instance, &onmeshPrefix)); EXPECT_EQ(THREAD_ERROR_NONE, - thread_onmesh_prefix_destroy(instance, onmeshPrefix)); + thread_onmesh_prefix_set_ipv6_prefix(onmeshPrefix, + onmeshIpv6Prefix, onmeshIpv6PrefixLen)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_get_ipv6_prefix(onmeshPrefix, + &ipv6Prefix, &ipv6PrefixLen)); + g_free(ipv6Prefix); } TEST_F(ThreadBRTest, BRAddOnmeshPrefixNotEnabled) -- 2.7.4 From 2de898415cb276a101212afe95e5b98bba061696 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Tue, 14 Jun 2022 17:34:33 +0900 Subject: [PATCH 12/16] Add new CAPIs and unittest to get/set preference for onmesh Change-Id: I39d67a63b775f855b8f1ebef5197a356020cd7e4 Signed-off-by: hyunuk.tak --- include/thread.h | 38 +++++++++++++++++++++++++++++++++++ src/thread-br.c | 32 +++++++++++++++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 22 +++++++++++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/include/thread.h b/include/thread.h index 7b0bee3..b4a92b7 100644 --- a/include/thread.h +++ b/include/thread.h @@ -675,6 +675,44 @@ int thread_onmesh_prefix_get_ipv6_prefix(thread_onmesh_prefix_info_h onmesh_pref /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Set preference to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_set_preference(thread_onmesh_prefix_info_h onmesh_prefix, + uint8_t preference); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get preference to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_get_preference(thread_onmesh_prefix_info_h onmesh_prefix, + uint8_t *preference); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an on-mesh prefix to the network * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index 94a0ce1..38d74ae 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -534,6 +534,38 @@ int thread_onmesh_prefix_get_ipv6_prefix(thread_onmesh_prefix_info_h onmesh_pref return THREAD_ERROR_NONE; } +int thread_onmesh_prefix_set_preference(thread_onmesh_prefix_info_h onmesh_prefix, + uint8_t preference) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + onmesh_prefix_info->preference = preference; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + +int thread_onmesh_prefix_get_preference(thread_onmesh_prefix_info_h onmesh_prefix, + uint8_t *preference) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + *preference = onmesh_prefix_info->preference; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_onmesh_prefix(thread_instance_h instance, const uint8_t *ipv6_prefix, int ipv6_prefix_len, int8_t preference, bool preferred, bool slaac, bool dhcp, bool configure, bool default_route, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index dfb76c7..a37237e 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -34,7 +34,7 @@ public: uint8_t ipv6Prefix[THREAD_IPV6_PREFIX_SIZE]; uint8_t ipv6PrefixLen; uint16_t rloc16; - int8_t preference; + uint8_t preference; bool isStable; bool isDeviceNextHop; @@ -378,6 +378,26 @@ TEST_F(ThreadBRTest, BRGetOnmeshIpv6PrefixErrorNone) g_free(ipv6Prefix); } +TEST_F(ThreadBRTest, BRSetOnmeshPreferenceErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_preference(onmeshPrefix, preference)); +} + +TEST_F(ThreadBRTest, BRGetOnmeshPreferenceErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_preference(onmeshPrefix, preference)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_get_preference(onmeshPrefix, &preference)); +} + TEST_F(ThreadBRTest, BRAddOnmeshPrefixNotEnabled) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); -- 2.7.4 From 99b3e1266597ae5e8c087b11ede46be7242a4b55 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Wed, 15 Jun 2022 08:03:57 +0900 Subject: [PATCH 13/16] Add new CAPIs and unittest to get/set preferred for onmesh Change-Id: Ibc071b7b33541ae530b2a6dac2c04800f1d9afd7 Signed-off-by: hyunuk.tak --- include/thread.h | 38 +++++++++++++++++++++++++++++++++++ src/thread-br.c | 32 +++++++++++++++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 20 ++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/include/thread.h b/include/thread.h index b4a92b7..a2c1aca 100644 --- a/include/thread.h +++ b/include/thread.h @@ -713,6 +713,44 @@ int thread_onmesh_prefix_get_preference(thread_onmesh_prefix_info_h onmesh_prefi /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Set preferred to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_set_preferred(thread_onmesh_prefix_info_h onmesh_prefix, + bool preferred); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get preferred to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_get_preferred(thread_onmesh_prefix_info_h onmesh_prefix, + bool *preferred); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an on-mesh prefix to the network * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index 38d74ae..cc2f9d9 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -566,6 +566,38 @@ int thread_onmesh_prefix_get_preference(thread_onmesh_prefix_info_h onmesh_prefi return THREAD_ERROR_NONE; } +int thread_onmesh_prefix_set_preferred(thread_onmesh_prefix_info_h onmesh_prefix, + bool preferred) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + onmesh_prefix_info->preferred = preferred; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + +int thread_onmesh_prefix_get_preferred(thread_onmesh_prefix_info_h onmesh_prefix, + bool *preferred) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + *preferred = onmesh_prefix_info->preferred; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_onmesh_prefix(thread_instance_h instance, const uint8_t *ipv6_prefix, int ipv6_prefix_len, int8_t preference, bool preferred, bool slaac, bool dhcp, bool configure, bool default_route, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index a37237e..4f94f11 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -398,6 +398,26 @@ TEST_F(ThreadBRTest, BRGetOnmeshPreferenceErrorNone) thread_onmesh_prefix_get_preference(onmeshPrefix, &preference)); } +TEST_F(ThreadBRTest, BRSetOnmeshPreferredErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_preferred(onmeshPrefix, preferred)); +} + +TEST_F(ThreadBRTest, BRGetOnmeshPreferredErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_preferred(onmeshPrefix, preferred)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_get_preferred(onmeshPrefix, &preferred)); +} + TEST_F(ThreadBRTest, BRAddOnmeshPrefixNotEnabled) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); -- 2.7.4 From 171fb479f02eb53132b82cbc508e15765dbaf194 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Wed, 15 Jun 2022 08:13:57 +0900 Subject: [PATCH 14/16] Add new CAPIs and unittest to set/get slaac for onmesh Change-Id: I32cad6c67d21bdb749856f0776cd52d28c9c5081 Signed-off-by: hyunuk.tak --- include/thread.h | 38 +++++++++++++++++++++++++++++++++++ src/thread-br.c | 32 +++++++++++++++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 20 ++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/include/thread.h b/include/thread.h index a2c1aca..20bcf9a 100644 --- a/include/thread.h +++ b/include/thread.h @@ -751,6 +751,44 @@ int thread_onmesh_prefix_get_preferred(thread_onmesh_prefix_info_h onmesh_prefix /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Set slaac to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_set_slaac(thread_onmesh_prefix_info_h onmesh_prefix, + bool slaac); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get slaac to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_get_slaac(thread_onmesh_prefix_info_h onmesh_prefix, + bool *slaac); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an on-mesh prefix to the network * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index cc2f9d9..fe341e7 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -598,6 +598,38 @@ int thread_onmesh_prefix_get_preferred(thread_onmesh_prefix_info_h onmesh_prefix return THREAD_ERROR_NONE; } +int thread_onmesh_prefix_set_slaac(thread_onmesh_prefix_info_h onmesh_prefix, + bool slaac) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + onmesh_prefix_info->slaac = slaac; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + +int thread_onmesh_prefix_get_slaac(thread_onmesh_prefix_info_h onmesh_prefix, + bool *slaac) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + *slaac = onmesh_prefix_info->slaac; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_onmesh_prefix(thread_instance_h instance, const uint8_t *ipv6_prefix, int ipv6_prefix_len, int8_t preference, bool preferred, bool slaac, bool dhcp, bool configure, bool default_route, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 4f94f11..e5ea49a 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -418,6 +418,26 @@ TEST_F(ThreadBRTest, BRGetOnmeshPreferredErrorNone) thread_onmesh_prefix_get_preferred(onmeshPrefix, &preferred)); } +TEST_F(ThreadBRTest, BRSetOnmeshSlaacErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_slaac(onmeshPrefix, slaac)); +} + +TEST_F(ThreadBRTest, BRGetOnmeshSlaacErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_slaac(onmeshPrefix, slaac)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_get_slaac(onmeshPrefix, &slaac)); +} + TEST_F(ThreadBRTest, BRAddOnmeshPrefixNotEnabled) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); -- 2.7.4 From 92b9f46fe13fe9fa3ada8cd8d4e19ed3c2eada2a Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Wed, 15 Jun 2022 09:06:09 +0900 Subject: [PATCH 15/16] Add new CAPIs and unittest to set/get dhcp for onmesh Change-Id: Ib9c9f09fd3e4cea2377284075b01ee598522fa1b Signed-off-by: hyunuk.tak --- include/thread.h | 38 +++++++++++++++++++++++++++++++++++ src/thread-br.c | 32 +++++++++++++++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 20 ++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/include/thread.h b/include/thread.h index 20bcf9a..2949a0e 100644 --- a/include/thread.h +++ b/include/thread.h @@ -789,6 +789,44 @@ int thread_onmesh_prefix_get_slaac(thread_onmesh_prefix_info_h onmesh_prefix, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Set dhcp to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_set_dhcp(thread_onmesh_prefix_info_h onmesh_prefix, + bool dhcp); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get dhcp to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_get_dhcp(thread_onmesh_prefix_info_h onmesh_prefix, + bool *dhcp); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an on-mesh prefix to the network * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index fe341e7..eda713e 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -630,6 +630,38 @@ int thread_onmesh_prefix_get_slaac(thread_onmesh_prefix_info_h onmesh_prefix, return THREAD_ERROR_NONE; } +int thread_onmesh_prefix_set_dhcp(thread_onmesh_prefix_info_h onmesh_prefix, + bool dhcp) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + onmesh_prefix_info->dhcp = dhcp; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + +int thread_onmesh_prefix_get_dhcp(thread_onmesh_prefix_info_h onmesh_prefix, + bool *dhcp) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + *dhcp = onmesh_prefix_info->dhcp; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_onmesh_prefix(thread_instance_h instance, const uint8_t *ipv6_prefix, int ipv6_prefix_len, int8_t preference, bool preferred, bool slaac, bool dhcp, bool configure, bool default_route, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index e5ea49a..70c10ea 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -438,6 +438,26 @@ TEST_F(ThreadBRTest, BRGetOnmeshSlaacErrorNone) thread_onmesh_prefix_get_slaac(onmeshPrefix, &slaac)); } +TEST_F(ThreadBRTest, BRSetOnmeshDhcpErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_dhcp(onmeshPrefix, dhcp)); +} + +TEST_F(ThreadBRTest, BRGetOnmeshDhcpErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_dhcp(onmeshPrefix, dhcp)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_get_dhcp(onmeshPrefix, &dhcp)); +} + TEST_F(ThreadBRTest, BRAddOnmeshPrefixNotEnabled) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); -- 2.7.4 From 1d49256180c2f3498eea7bb2e2f6942a75e45d72 Mon Sep 17 00:00:00 2001 From: "hyunuk.tak" Date: Wed, 15 Jun 2022 09:11:34 +0900 Subject: [PATCH 16/16] Add new CAPIs and unittest to get/set configure for onmesh Change-Id: I161557579fc7a609b83e3a0d24e14c279a0e4dcf Signed-off-by: hyunuk.tak --- include/thread.h | 38 +++++++++++++++++++++++++++++++++++ src/thread-br.c | 32 +++++++++++++++++++++++++++++ tests/unittest/thread-unittest-br.cpp | 20 ++++++++++++++++++ 3 files changed, 90 insertions(+) diff --git a/include/thread.h b/include/thread.h index 2949a0e..98b68ec 100644 --- a/include/thread.h +++ b/include/thread.h @@ -827,6 +827,44 @@ int thread_onmesh_prefix_get_dhcp(thread_onmesh_prefix_info_h onmesh_prefix, /** * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Set configure to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_set_configure(thread_onmesh_prefix_info_h onmesh_prefix, + bool configure); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE + * @brief Get configure to on-mesh prefix info + * @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_onmesh_prefix_create() + * @see thread_onmesh_prefix_destroy() + */ +int thread_onmesh_prefix_get_configure(thread_onmesh_prefix_info_h onmesh_prefix, + bool *configure); + +/** + * @ingroup CAPI_NETWORK_THREAD_BORDERROUTER_MODULE * @brief Add an on-mesh prefix to the network * @since_tizen 7.0 * diff --git a/src/thread-br.c b/src/thread-br.c index eda713e..9afbdda 100644 --- a/src/thread-br.c +++ b/src/thread-br.c @@ -662,6 +662,38 @@ int thread_onmesh_prefix_get_dhcp(thread_onmesh_prefix_info_h onmesh_prefix, return THREAD_ERROR_NONE; } +int thread_onmesh_prefix_set_configure(thread_onmesh_prefix_info_h onmesh_prefix, + bool configure) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + onmesh_prefix_info->configure = configure; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + +int thread_onmesh_prefix_get_configure(thread_onmesh_prefix_info_h onmesh_prefix, + bool *configure) +{ + FUNC_ENTRY; + THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON); + THREAD_CHECK_INIT_STATUS(); + THREAD_VALIDATE_INPUT_PARAMETER(onmesh_prefix); + + thread_onmesh_prefix_info_s *onmesh_prefix_info = + (thread_onmesh_prefix_info_s *)onmesh_prefix; + *configure = onmesh_prefix_info->configure; + + FUNC_EXIT; + return THREAD_ERROR_NONE; +} + int thread_br_add_onmesh_prefix(thread_instance_h instance, const uint8_t *ipv6_prefix, int ipv6_prefix_len, int8_t preference, bool preferred, bool slaac, bool dhcp, bool configure, bool default_route, diff --git a/tests/unittest/thread-unittest-br.cpp b/tests/unittest/thread-unittest-br.cpp index 70c10ea..3e73ec6 100644 --- a/tests/unittest/thread-unittest-br.cpp +++ b/tests/unittest/thread-unittest-br.cpp @@ -458,6 +458,26 @@ TEST_F(ThreadBRTest, BRGetOnmeshDhcpErrorNone) thread_onmesh_prefix_get_dhcp(onmeshPrefix, &dhcp)); } +TEST_F(ThreadBRTest, BRSetOnmeshConfigureErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_configure(onmeshPrefix, configure)); +} + +TEST_F(ThreadBRTest, BRGetOnmeshConfigureErrorNone) +{ + EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_create(instance, &onmeshPrefix)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_set_configure(onmeshPrefix, configure)); + EXPECT_EQ(THREAD_ERROR_NONE, + thread_onmesh_prefix_get_configure(onmeshPrefix, &configure)); +} + TEST_F(ThreadBRTest, BRAddOnmeshPrefixNotEnabled) { EXPECT_EQ(THREAD_ERROR_NONE, thread_enable(&instance)); -- 2.7.4