From b6cd45f379a57844039deeddc951070386c29ef5 Mon Sep 17 00:00:00 2001 From: l00635678 Date: Mon, 28 Jul 2025 21:55:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=9C=BA=E5=BC=80softAP?= =?UTF-8?q?=E7=83=AD=E7=82=B9=EF=BC=8C=E8=BE=85=E5=8A=A9=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=90=8E=E4=BC=9A=E9=A2=91=E7=B9=81=E5=8F=91?= =?UTF-8?q?=E9=80=81RA=E8=B7=AF=E7=94=B1=E5=85=AC=E5=91=8A=EF=BC=9B?= =?UTF-8?q?=E5=AF=B9=E6=AF=94PLU=E5=8F=8C=E6=A1=86=E6=9E=B6=E6=89=8B?= =?UTF-8?q?=E6=9C=BA13=E5=88=86=E9=92=9F=E5=8F=AA=E5=8F=91=E9=80=81?= =?UTF-8?q?=E4=BA=863=E6=AC=A1RA=E8=B7=AF=E7=94=B1=E5=85=AC=E5=91=8A?= =?UTF-8?q?=EF=BC=9B=E6=97=A0=E6=B3=95=E6=81=A2=E5=A4=8D=EF=BC=9B=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E6=97=B6=E9=97=B4=E7=82=B9=EF=BC=9A2025/06/23=2011:22?= =?UTF-8?q?:23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: l00635678 --- .../include/router_advertisement_daemon.h | 7 ++-- .../src/networkshare_sub_statemachine.cpp | 5 +-- .../src/router_advertisement_daemon.cpp | 36 ++++++++++--------- .../router_advertisement_daemon_test.cpp | 26 ++++++++++---- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/services/networksharemanager/include/router_advertisement_daemon.h b/services/networksharemanager/include/router_advertisement_daemon.h index f2f76a21..7d85541a 100644 --- a/services/networksharemanager/include/router_advertisement_daemon.h +++ b/services/networksharemanager/include/router_advertisement_daemon.h @@ -42,13 +42,9 @@ namespace OHOS { namespace NetManagerStandard { constexpr uint32_t HW_MAC_LENGTH = 6; - -// eg:11:22:33:44:55:66 or 11-22-33-44-55-66 -constexpr uint32_t HW_MAC_STR_LENGTH = 17; constexpr uint32_t IPV6_ADDR_LEN = 16; constexpr uint32_t DEFAULT_RTR_INTERVAL_SEC = 600; constexpr uint32_t DEFAULT_LIFETIME = 6 * DEFAULT_RTR_INTERVAL_SEC; -constexpr int32_t MAC_SSCANF_SPACE = 3; // www.rfc-editor.org/rfc/rfc4861#section-4.6 constexpr uint32_t UNITS_OF_OCTETS = 8; @@ -147,7 +143,8 @@ private: uint8_t raPacket_[IPV6_MIN_MTU] = {}; uint16_t raPacketLength_ = 0; std::shared_ptr raParams_; - FfrtTimer ffrtTimer_; + std::shared_ptr sendRaFfrtQueue_ = nullptr; + ffrt::task_handle taskHandle_ = nullptr; }; } // namespace NetManagerStandard diff --git a/services/networksharemanager/src/networkshare_sub_statemachine.cpp b/services/networksharemanager/src/networkshare_sub_statemachine.cpp index e23625b6..1bdac0e6 100644 --- a/services/networksharemanager/src/networkshare_sub_statemachine.cpp +++ b/services/networksharemanager/src/networkshare_sub_statemachine.cpp @@ -36,7 +36,6 @@ namespace OHOS { namespace NetManagerStandard { namespace { -constexpr int DHCP_IPV6_ENABLE = 1; constexpr const char *NEXT_HOT = "0.0.0.0"; constexpr const char *IPV6_NEXT_HOT = ""; const std::regex REGEX_MAC(std::string(R"(^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$)")); @@ -82,7 +81,9 @@ constexpr int32_t EUI64_FF = 0xFF; constexpr int32_t EUI64_FE = 0xFE; constexpr uint8_t NET_FAMILY_IPV4 = 1; constexpr uint8_t NET_FAMILY_IPV6 = 2; -const std::string CELLULAR_IFACE_NAME = "rmnet"; +constexpr uint32_t DHCP_IPV6_ENABLE = 1; +constexpr int32_t MAC_SSCANF_SPACE = 3; +constexpr const char* CELLULAR_IFACE_NAME = "rmnet"; } // namespace NetworkShareSubStateMachine::NetworkShareSubStateMachine( diff --git a/services/networksharemanager/src/router_advertisement_daemon.cpp b/services/networksharemanager/src/router_advertisement_daemon.cpp index f45223dd..003cd516 100644 --- a/services/networksharemanager/src/router_advertisement_daemon.cpp +++ b/services/networksharemanager/src/router_advertisement_daemon.cpp @@ -28,11 +28,16 @@ namespace { * MinRtrAdvInterval: MUST be no less than 3seconds and no greater than 0.75 * MaxRtrAdvInterval. * Default: 0.33 * MaxRtrAdvInterval If * MaxRtrAdvInterval >= 9 seconds; otherwise, the - * Default is MaxRtrAdvInterval. + * Default is random number in MinRtrAdvInterval to MaxRtrAdvInterval. */ -constexpr uint32_t MAX_URGENT_RTR_ADVERTISEMENTS = 10; +// Both initial and final RAs, but also for changes in RA contents. +// From https://tools.ietf.org/html/rfc4861#section-10 . +constexpr uint32_t MAX_URGENT_RTR_ADVERTISEMENTS = 5; constexpr uint32_t RECV_RS_TIMEOUT = 1; -constexpr uint32_t SEND_RA_INTERVAL = 3000; +// eg:11:22:33:44:55:66 or 11-22-33-44-55-66 +constexpr uint32_t HW_MAC_STR_LENGTH = 17; +constexpr uint32_t SECOND_TO_MICROSECOND = 1000 * 1000; +constexpr uint32_t SEND_RA_INTERVAL = 3 * SECOND_TO_MICROSECOND; constexpr size_t RA_HEADER_SIZE = 16; /** @@ -55,6 +60,7 @@ constexpr const char *DST_IPV6 = "ff02::1"; RouterAdvertisementDaemon::RouterAdvertisementDaemon() { + sendRaFfrtQueue_ = std::make_shared("SendRa"); raParams_ = std::make_shared(); } @@ -95,17 +101,19 @@ int32_t RouterAdvertisementDaemon::StartRa() recvRsThread_ = std::thread([sp]() { sp->RunRecvRsThread(); }); pthread_setname_np(recvRsThread_.native_handle(), "OH_Net_RecvRs"); recvRsThread_.detach(); - ffrtTimer_.Start(SEND_RA_INTERVAL, [sp]() { sp->ProcessSendRaPacket(); }); + auto callback = [sp]() { sp->ProcessSendRaPacket(); }; + taskHandle_ = sendRaFfrtQueue_->submit_h(callback); return NETMANAGER_EXT_SUCCESS; } void RouterAdvertisementDaemon::StopRa() { NETMGR_EXT_LOG_I("StopRa"); - // close timer - ffrtTimer_.Stop(); - HupRaThread(); + if (taskHandle_ != nullptr) { + sendRaFfrtQueue_->cancel(taskHandle_); + taskHandle_ = nullptr; + } } bool RouterAdvertisementDaemon::CreateRASocket() @@ -234,18 +242,14 @@ void RouterAdvertisementDaemon::BuildNewRa(const RaParams &newRa) void RouterAdvertisementDaemon::ResetRaRetryInterval() { + auto sp = shared_from_this(); + auto callback = [sp]() { sp->ProcessSendRaPacket(); }; + uint32_t delayTime = DEFAULT_RTR_INTERVAL_SEC * SECOND_TO_MICROSECOND; if (sendRaTimes_ < MAX_URGENT_RTR_ADVERTISEMENTS) { sendRaTimes_++; - return; - } - if (sendRaTimes_ == MAX_URGENT_RTR_ADVERTISEMENTS) { - itimerval setvalue = {}; - itimerval oldvalue = {}; - setvalue.it_interval.tv_sec = DEFAULT_RTR_INTERVAL_SEC; - setvalue.it_value.tv_sec = 1; - sendRaTimes_++; - return; + delayTime = SEND_RA_INTERVAL; } + taskHandle_ = sendRaFfrtQueue_->submit_h(callback, ffrt::task_attr().delay(delayTime)); } bool RouterAdvertisementDaemon::AssembleRaLocked() diff --git a/test/networksharemanager/unittest/networkshare_manager_test/router_advertisement_daemon_test.cpp b/test/networksharemanager/unittest/networkshare_manager_test/router_advertisement_daemon_test.cpp index b1d01270..978956d9 100644 --- a/test/networksharemanager/unittest/networkshare_manager_test/router_advertisement_daemon_test.cpp +++ b/test/networksharemanager/unittest/networkshare_manager_test/router_advertisement_daemon_test.cpp @@ -14,6 +14,7 @@ */ #include +#include #ifdef GTEST_API_ #define private public #define protected public @@ -64,11 +65,12 @@ HWTEST_F(RouterAdvertisementDaemonTest, StartStopRaTest, TestSize.Level1) EXPECT_EQ(ret, NETMANAGER_EXT_SUCCESS); EXPECT_TRUE(routerAdvertiseDaemon->IsSocketValid()); routerAdvertiseDaemon->StopRa(); - while (routerAdvertiseDaemon->raParams_ != nullptr) - { + while (routerAdvertiseDaemon->raParams_ != nullptr) { std::this_thread::sleep_for(std::chrono::milliseconds(5)); } EXPECT_FALSE(routerAdvertiseDaemon->IsSocketValid()); + routerAdvertiseDaemon->StopRa(); + EXPECT_EQ(routerAdvertiseDaemon->taskHandle_, nullptr); } /** @@ -77,7 +79,7 @@ HWTEST_F(RouterAdvertisementDaemonTest, StartStopRaTest, TestSize.Level1) * creating RA messages. * @tc.type: FUNC */ -HWTEST_F(RouterAdvertisementDaemonTest, CreateRASocketTest, TestSize.Level1) +HWTEST_F(RouterAdvertisementDaemonTest, CreateRASocketTest001, TestSize.Level1) { auto routerAdvertiseDaemon = std::make_shared(); auto ret = routerAdvertiseDaemon->CreateRASocket(); @@ -85,6 +87,21 @@ HWTEST_F(RouterAdvertisementDaemonTest, CreateRASocketTest, TestSize.Level1) EXPECT_TRUE(routerAdvertiseDaemon->IsSocketValid()); } +/** + * @tc.name: CreateRASocketTest + * @tc.desc: Test RouterAdvertisementDaemon CreateRASocket.Test the socket for + * creating RA messages. + * @tc.type: FUNC + */ +HWTEST_F(RouterAdvertisementDaemonTest, CreateRASocketTest002, TestSize.Level1) +{ + auto routerAdvertiseDaemon = std::make_shared(); + routerAdvertiseDaemon->Init(std::string(IFNAMSIZ, ' ')); + auto ret = routerAdvertiseDaemon->CreateRASocket(); + EXPECT_FALSE(ret); + EXPECT_FALSE(routerAdvertiseDaemon->IsSocketValid()); +} + /** * @tc.name: CloseRaSocketTest * @tc.desc: Test RouterAdvertisementDaemon CloseRaSocket.Test the socket for @@ -204,9 +221,6 @@ HWTEST_F(RouterAdvertisementDaemonTest, ResetRaRetryIntervalTest, TestSize.Level routerAdvertiseDaemon->sendRaTimes_ = 12; routerAdvertiseDaemon->ResetRaRetryInterval(); EXPECT_EQ(routerAdvertiseDaemon->sendRaTimes_, 12); - routerAdvertiseDaemon->sendRaTimes_ = 10; - routerAdvertiseDaemon->ResetRaRetryInterval(); - EXPECT_NE(routerAdvertiseDaemon->sendRaTimes_, 12); } /** -- Gitee