From 467fb3eda1f418c21f0e2908ab0557d960ec8e68 Mon Sep 17 00:00:00 2001
From: l00635678
Date: Mon, 3 Mar 2025 21:19:52 +0800
Subject: [PATCH] =?UTF-8?q?netmanager-CPP=5FCRASH-1=E6=AC=A1=20apr:0.02?=
=?UTF-8?q?=E6=AC=A1/=E5=8D=83=E5=B0=8F=E6=97=B6(=E4=B8=A5=E9=87=8D)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: k-lee9575
---
.../include/router_advertisement_daemon.h | 12 ++----
.../src/router_advertisement_daemon.cpp | 40 ++++++-------------
2 files changed, 16 insertions(+), 36 deletions(-)
diff --git a/services/networksharemanager/include/router_advertisement_daemon.h b/services/networksharemanager/include/router_advertisement_daemon.h
index 23b0ce1a..f2f76a21 100644
--- a/services/networksharemanager/include/router_advertisement_daemon.h
+++ b/services/networksharemanager/include/router_advertisement_daemon.h
@@ -36,6 +36,7 @@
#include
#include
#include
+#include "ffrt_timer.h"
namespace OHOS {
namespace NetManagerStandard {
@@ -69,10 +70,6 @@ constexpr uint8_t ND_OPTION_SLLA_TYPE = 1;
constexpr uint8_t ND_OPTION_PIO_TYPE = 3;
constexpr uint8_t ND_OPTION_MTU_TYPE = 5;
constexpr uint8_t ND_OPTION_RDNSS_TYPE = 25;
-struct DeprecatedInfoTracker {
- std::vector deprecatedPrefixes;
- std::vector deprecatedDnses;
-};
#pragma pack(1)
struct Icmpv6HeadSt {
@@ -114,17 +111,16 @@ struct Icmpv6RdnsOpt {
uint8_t dnsServer[0] = {};
};
#pragma pack()
-class RouterAdvertisementDaemon {
+class RouterAdvertisementDaemon : public std::enable_shared_from_this {
public:
RouterAdvertisementDaemon();
~RouterAdvertisementDaemon() = default;
int32_t Init(const std::string &ifaceName);
int32_t StartRa();
void StopRa();
- static void ProcessSendRaPacket(int inputSignal);
+ void ProcessSendRaPacket();
RaParams GetDeprecatedRaParams(RaParams &oldRa, RaParams &newRa);
void BuildNewRa(const RaParams &newRa);
- static RouterAdvertisementDaemon *pThis;
private:
bool IsSocketValid();
@@ -151,7 +147,7 @@ private:
uint8_t raPacket_[IPV6_MIN_MTU] = {};
uint16_t raPacketLength_ = 0;
std::shared_ptr raParams_;
- DeprecatedInfoTracker deprecatedInfoTracker_;
+ FfrtTimer ffrtTimer_;
};
} // namespace NetManagerStandard
diff --git a/services/networksharemanager/src/router_advertisement_daemon.cpp b/services/networksharemanager/src/router_advertisement_daemon.cpp
index b2a14315..8e78d50d 100644
--- a/services/networksharemanager/src/router_advertisement_daemon.cpp
+++ b/services/networksharemanager/src/router_advertisement_daemon.cpp
@@ -32,8 +32,7 @@ namespace {
*/
constexpr uint32_t MAX_URGENT_RTR_ADVERTISEMENTS = 10;
constexpr uint32_t RECV_RS_TIMEOUT = 1;
-constexpr uint32_t SEND_RA_INTERVAL = 3;
-constexpr uint32_t SEND_RA_DELAY = 1;
+constexpr uint32_t SEND_RA_INTERVAL = 3000;
constexpr size_t RA_HEADER_SIZE = 16;
/**
@@ -54,7 +53,6 @@ constexpr uint32_t DEFAULT_HOP_LIMIT = 255;
constexpr const char *DST_IPV6 = "ff02::1";
} // namespace
-RouterAdvertisementDaemon *RouterAdvertisementDaemon::pThis = nullptr;
RouterAdvertisementDaemon::RouterAdvertisementDaemon()
{
raParams_ = std::make_shared();
@@ -92,23 +90,23 @@ int32_t RouterAdvertisementDaemon::StartRa()
NETMGR_EXT_LOG_E("StartRa fail due to socket");
return NETMANAGER_EXT_ERR_PARAMETER_ERROR;
}
- pThis = this;
stopRaThread_ = false;
- recvRsThread_ = std::thread([this]() { this->RunRecvRsThread(); });
+ auto sp = shared_from_this();
+ 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(); });
return NETMANAGER_EXT_SUCCESS;
}
void RouterAdvertisementDaemon::StopRa()
{
NETMGR_EXT_LOG_I("StopRa");
+ // close timer
+ ffrtTimer_.Stop();
+
HupRaThread();
CloseRaSocket();
-
- // close timer
- itimerval value = {};
- setitimer(ITIMER_REAL, &value, nullptr);
}
bool RouterAdvertisementDaemon::CreateRASocket()
@@ -172,35 +170,21 @@ bool RouterAdvertisementDaemon::MaybeSendRa(sockaddr_in6 &dest)
return true;
}
-void RouterAdvertisementDaemon::ProcessSendRaPacket(int inputSignal)
+void RouterAdvertisementDaemon::ProcessSendRaPacket()
{
- if (pThis == nullptr) {
- NETMGR_EXT_LOG_E("pThis is nullptr!");
- return;
- }
- if (!pThis->IsSocketValid() || pThis->stopRaThread_) {
+ if (!IsSocketValid() || stopRaThread_) {
NETMGR_EXT_LOG_E("socket closed or stopRaThread!");
return;
}
- if (pThis->AssembleRaLocked()) {
- pThis->MaybeSendRa(pThis->dstIpv6Addr_);
+ if (AssembleRaLocked()) {
+ MaybeSendRa(dstIpv6Addr_);
}
- pThis->ResetRaRetryInterval();
+ ResetRaRetryInterval();
}
void RouterAdvertisementDaemon::RunRecvRsThread()
{
NETMGR_EXT_LOG_I("Start to receive Rs thread, socket[%{public}d]", socket_);
- if (signal(SIGALRM, ProcessSendRaPacket) == SIG_ERR) {
- NETMGR_EXT_LOG_E("signal error!");
- CloseRaSocket();
- return;
- }
- itimerval setvalue = {};
- setvalue.it_interval.tv_sec = SEND_RA_INTERVAL;
- setvalue.it_value.tv_sec = SEND_RA_DELAY;
- setitimer(ITIMER_REAL, &setvalue, nullptr);
-
sockaddr_in6 solicitor = {};
uint8_t solicitation[IPV6_MIN_MTU] = {};
socklen_t sendLen = sizeof(solicitation);
--
Gitee