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