1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "wrapper_decoder.h"
17
18 #include <climits>
19 #include <cstdio>
20 #include <cstdlib>
21 #include <cstring>
22 #include <map>
23 #include <memory>
24 #include <vector>
25
26 #include <arpa/inet.h>
27 #include <net/if.h>
28 #include <netinet/in.h>
29 #include <sys/socket.h>
30 #include <sys/types.h>
31
32 #include <linux/genetlink.h>
33 #include <linux/if_addr.h>
34 #include <linux/if_link.h>
35 #include <linux/netfilter/nfnetlink.h>
36 #include <linux/netfilter/nfnetlink_log.h>
37
38 #include "netlink_define.h"
39 #include "netmanager_base_common_utils.h"
40 #include "netnative_log_wrapper.h"
41
42 namespace OHOS {
43 namespace nmd {
44 using namespace OHOS::NetManagerStandard::CommonUtils;
45 using namespace NetlinkDefine;
46 namespace {
47 constexpr int16_t LOCAL_QLOG_NL_EVENT = 112;
48 constexpr int16_t LOCAL_NFLOG_PACKET = NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET;
49
50 constexpr int16_t ULOG_MAC_LEN = 80;
51 constexpr int16_t ULOG_PREFIX_LEN = 32;
52
53 // The message key for Ascii decode.
54 constexpr const char *SYMBOL_AT = "@";
55 constexpr const char *SYMBOL_EQUAL = "=";
56 constexpr const char *KEY_ACTION = "ACTION=";
57 constexpr const char *KEY_SEQNUM = "SEQNUM=";
58 constexpr const char *KEY_SUBSYSTEM = "SUBSYSTEM=";
59 constexpr const char *VALUE_ADD = "add";
60 constexpr const char *VALUE_REMOVE = "remove";
61 constexpr const char *VALUE_CHANGE = "change";
62 constexpr const char *SYMBOL_ADDRESS_SPLIT = "_";
63 constexpr const char *ADDRESS_SPLIT = "-";
64 constexpr const char *ROUTE_DEFAULT_ADDR = "0.0.0.0";
65 constexpr const char *ROUTE_DEFAULT_SPLIT = "::";
66 constexpr const char *ROUTE_ADDRESS_SPLIT = "/";
67 constexpr const char *RTA_GATEWAY_STR = "RTA_GATEWAY";
68 constexpr const char *RTA_DST_STR = "RTA_DST";
69 constexpr const char *RTA_OIF_STR = "RTA_OIF";
70
71 struct ULogMessage {
72 uint64_t mark;
73 int64_t timeStampSec;
74 int64_t timeStampUsec;
75 uint32_t hook;
76 char indevName[IFNAMSIZ];
77 char outdevName[IFNAMSIZ];
78 size_t dataLen;
79 char prefix[ULOG_PREFIX_LEN];
80 uint8_t macLen;
81 uint8_t mac[ULOG_MAC_LEN];
82 uint8_t payload[0];
83 };
84
85 const std::map<int32_t, std::string> MSG_NAME_MAP = {
86 {RTM_NEWLINK, "RTM_NEWLINK"},
87 {RTM_DELLINK, "RTM_DELLINK"},
88 {RTM_NEWADDR, "RTM_NEWADDR"},
89 {RTM_DELADDR, "RTM_DELADDR"},
90 {RTM_NEWROUTE, "RTM_NEWROUTE"},
91 {RTM_DELROUTE, "RTM_DELROUTE"},
92 {RTM_NEWNDUSEROPT, "RTM_NEWNDUSEROPT"},
93 {LOCAL_QLOG_NL_EVENT, "LOCAL_QLOG_NL_EVENT"},
94 {LOCAL_NFLOG_PACKET, "LOCAL_NFLOG_PACKET"},
95 };
96
97 struct ServerInfo {
98 std::string ipAddr;
99 std::string ifName;
ServerInfoOHOS::nmd::__anon14cf8fee0111::ServerInfo100 ServerInfo(const std::string &ipAddr, const std::string &ifName) : ipAddr(ipAddr), ifName(ifName) {}
101 };
102
103 struct ServerList {
104 std::vector<ServerInfo> infos;
SerializeOHOS::nmd::__anon14cf8fee0111::ServerList105 std::string Serialize()
106 {
107 std::string str;
108 for (const auto &info : infos) {
109 str += info.ipAddr + SYMBOL_ADDRESS_SPLIT;
110 if (!info.ifName.empty()) {
111 str += info.ifName + ADDRESS_SPLIT;
112 }
113 }
114 return str;
115 }
116
AddOHOS::nmd::__anon14cf8fee0111::ServerList117 void Add(const std::string &ipAddr, const std::string &ifName)
118 {
119 infos.emplace_back(ipAddr, ifName);
120 }
121 };
122
CastNameToStr(int32_t form)123 const std::string CastNameToStr(int32_t form)
124 {
125 const auto &itr = MSG_NAME_MAP.find(form);
126 if (itr == MSG_NAME_MAP.end()) {
127 return {};
128 }
129 return itr->second;
130 }
131
CheckRtNetlinkLength(const nlmsghdr * hdrMsg,size_t size)132 bool CheckRtNetlinkLength(const nlmsghdr *hdrMsg, size_t size)
133 {
134 int32_t type = hdrMsg->nlmsg_type;
135 bool ret = hdrMsg->nlmsg_len >= NLMSG_LENGTH(int(size));
136 if (!ret) {
137 if (MSG_NAME_MAP.find(type) != MSG_NAME_MAP.end()) {
138 const std::string &netlinkType = MSG_NAME_MAP.at(type);
139 NETNATIVE_LOGE("Got a short %{public}s message\n", netlinkType.c_str());
140 }
141 }
142 return ret;
143 }
144
IsDataEmpty(bool isValid,const std::string & attrName,const std::string & msgName)145 inline bool IsDataEmpty(bool isValid, const std::string &attrName, const std::string &msgName)
146 {
147 if (isValid) {
148 NETNATIVE_LOGE("Error Msg Repeated: attrName : %{public}s msgName: %{public}s", attrName.c_str(),
149 msgName.c_str());
150 }
151 return !isValid;
152 }
153
IsPayloadValidated(rtattr * dest,uint32_t size)154 inline bool IsPayloadValidated(rtattr *dest, uint32_t size)
155 {
156 int destLen = RTA_PAYLOAD(dest);
157 int32_t rtaSize = static_cast<int32_t>(size);
158 bool ret = destLen >= rtaSize;
159 if (!ret) {
160 NETNATIVE_LOGE("Short IFA_CACHEINFO dest = %{public}d, size = %{public}d", destLen, rtaSize);
161 }
162 return ret;
163 }
164
165 const std::map<std::string, NetsysEventMessage::Type> ASCII_PARAM_LIST = {
166 {"IFINDEX", NetsysEventMessage::Type::IFINDEX},
167 {"INTERFACE", NetsysEventMessage::Type::INTERFACE}};
168
169 const std::map<std::string, NetsysEventMessage::SubSys> SUB_SYS_LIST = {
170 {"net", NetsysEventMessage::SubSys::NET},
171 };
172 } // namespace
173
WrapperDecoder(std::shared_ptr<NetsysEventMessage> message)174 WrapperDecoder::WrapperDecoder(std::shared_ptr<NetsysEventMessage> message) : message_(message) {}
175
DecodeAscii(const char * buffer,int32_t buffSize)176 bool WrapperDecoder::DecodeAscii(const char *buffer, int32_t buffSize)
177 {
178 std::string buf = buffer;
179 const char *start = buffer;
180 const char *end = start + buffSize;
181 std::vector<std::string> recvmsg;
182 if (buffSize == 0) {
183 return false;
184 }
185 const auto msg = Split(buf, SYMBOL_AT);
186 const std::string path = msg[1];
187 if (path.empty()) {
188 return false;
189 }
190 const auto action = msg[0];
191 if (action.empty()) {
192 return false;
193 }
194
195 // Skip the first line.
196 start += strlen(start) + 1;
197 while (start < end) {
198 if (start != nullptr) {
199 recvmsg.emplace_back(start);
200 }
201 // Skip to next line.
202 start += strlen(start) + 1;
203 }
204
205 // Split the message and push them into params.
206 PushAsciiMessage(recvmsg);
207 return true;
208 }
209
PushAsciiMessage(const std::vector<std::string> & recvmsg)210 bool WrapperDecoder::PushAsciiMessage(const std::vector<std::string> &recvmsg)
211 {
212 for (auto &i : recvmsg) {
213 if (i.compare(0, strlen(KEY_ACTION), KEY_ACTION) == 0) {
214 if (i.compare(strlen(KEY_ACTION), strlen(VALUE_ADD), VALUE_ADD) == 0) {
215 message_->SetAction(NetsysEventMessage::Action::ADD);
216 } else if (i.compare(strlen(KEY_ACTION), strlen(VALUE_REMOVE), VALUE_REMOVE) == 0) {
217 message_->SetAction(NetsysEventMessage::Action::REMOVE);
218 } else if (i.compare(strlen(KEY_ACTION), strlen(VALUE_CHANGE), VALUE_CHANGE) == 0) {
219 message_->SetAction(NetsysEventMessage::Action::CHANGE);
220 }
221 } else if (i.compare(0, strlen(KEY_SEQNUM), KEY_SEQNUM) == 0) {
222 const auto seq = Split(i, SYMBOL_EQUAL);
223 if (seq.size() == SPLIT_SIZE) {
224 message_->SetSeq(std::strtol(seq[1].c_str(), nullptr, DECIMALISM));
225 }
226 } else if (i.compare(0, strlen(KEY_SUBSYSTEM), KEY_SUBSYSTEM) == 0) {
227 const auto subsys = Split(i, SYMBOL_EQUAL);
228 if ((subsys.size() == SPLIT_SIZE) && (SUB_SYS_LIST.find(subsys[1]) != SUB_SYS_LIST.end())) {
229 message_->SetSubSys(SUB_SYS_LIST.at(subsys[1]));
230 }
231 } else {
232 SaveOtherMsg(i);
233 }
234 }
235 return true;
236 }
237
DecodeBinary(const char * buffer,int32_t buffSize)238 bool WrapperDecoder::DecodeBinary(const char *buffer, int32_t buffSize)
239 {
240 const nlmsghdr *hdrMsg = nullptr;
241 bool result = false;
242 for (hdrMsg = reinterpret_cast<const nlmsghdr *>(buffer);
243 NLMSG_OK(hdrMsg, (unsigned)buffSize) && (hdrMsg->nlmsg_type != NLMSG_DONE);
244 hdrMsg = NLMSG_NEXT(hdrMsg, buffSize)) {
245 if (CastNameToStr(hdrMsg->nlmsg_type).empty()) {
246 NETNATIVE_LOGW("Netlink message type is unexpected as : %{public}d\n", hdrMsg->nlmsg_type);
247 continue;
248 }
249 switch (hdrMsg->nlmsg_type) {
250 case RTM_NEWLINK:
251 result = InterpreteInfoMsg(hdrMsg);
252 break;
253 case LOCAL_QLOG_NL_EVENT:
254 result = InterpreteUlogMsg(hdrMsg);
255 break;
256 case RTM_NEWADDR:
257 case RTM_DELADDR:
258 result = InterpreteAddressMsg(hdrMsg);
259 break;
260 case RTM_NEWROUTE:
261 case RTM_DELROUTE:
262 result = InterpreteRtMsg(hdrMsg);
263 break;
264 default:
265 result = false;
266 NETNATIVE_LOG_D("message type error as :%{public}d\n", hdrMsg->nlmsg_type);
267 break;
268 }
269 if (result) {
270 return true;
271 }
272 }
273 return false;
274 }
275
InterpreteInfoMsg(const nlmsghdr * hdrMsg)276 bool WrapperDecoder::InterpreteInfoMsg(const nlmsghdr *hdrMsg)
277 {
278 if (hdrMsg == nullptr) {
279 return false;
280 }
281 auto info = reinterpret_cast<ifinfomsg *>(NLMSG_DATA(hdrMsg));
282 if (info == nullptr || !CheckRtNetlinkLength(hdrMsg, sizeof(*info)) || (info->ifi_flags & IFF_LOOPBACK) != 0) {
283 return false;
284 }
285
286 int32_t len = IFLA_PAYLOAD(hdrMsg);
287 rtattr *rtaInfo = nullptr;
288 for (rtaInfo = IFLA_RTA(info); RTA_OK(rtaInfo, len); rtaInfo = RTA_NEXT(rtaInfo, len)) {
289 if (rtaInfo == nullptr) {
290 NETNATIVE_LOGE("Unavailable ifinfomsg\n");
291 return false;
292 }
293 if (rtaInfo->rta_type == IFLA_IFNAME) {
294 message_->PushMessage(NetsysEventMessage::Type::INTERFACE,
295 std::string(reinterpret_cast<const char *>(RTA_DATA(rtaInfo))));
296 message_->PushMessage(NetsysEventMessage::Type::IFINDEX, std::to_string(info->ifi_index));
297 auto action = (info->ifi_flags & IFF_LOWER_UP) ? NetsysEventMessage::Action::LINKUP
298 : NetsysEventMessage::Action::LINKDOWN;
299 message_->SetAction(action);
300 message_->SetSubSys(NetsysEventMessage::SubSys::NET);
301 return true;
302 }
303 }
304 return false;
305 }
306
InterpreteUlogMsg(const nlmsghdr * hdrMsg)307 bool WrapperDecoder::InterpreteUlogMsg(const nlmsghdr *hdrMsg)
308 {
309 std::string devname;
310 ULogMessage *pm = reinterpret_cast<ULogMessage *>(NLMSG_DATA(hdrMsg));
311 if (!CheckRtNetlinkLength(hdrMsg, sizeof(*pm))) {
312 return false;
313 }
314 devname = pm->indevName[0] ? pm->indevName : pm->outdevName;
315 message_->PushMessage(NetsysEventMessage::Type::ALERT_NAME, std::string(pm->prefix));
316 message_->PushMessage(NetsysEventMessage::Type::INTERFACE, devname);
317 message_->SetSubSys(NetsysEventMessage::SubSys::QLOG);
318 message_->SetAction(NetsysEventMessage::Action::CHANGE);
319 return true;
320 }
321
InterpreteAddressMsg(const nlmsghdr * hdrMsg)322 bool WrapperDecoder::InterpreteAddressMsg(const nlmsghdr *hdrMsg)
323 {
324 ifaddrmsg *addrMsg = reinterpret_cast<ifaddrmsg *>(NLMSG_DATA(hdrMsg));
325 ifa_cacheinfo *cacheInfo = nullptr;
326 char addresses[INET6_ADDRSTRLEN] = "";
327 char interfaceName[IFNAMSIZ] = "";
328 uint32_t flags;
329
330 if (!CheckRtNetlinkLength(hdrMsg, sizeof(*addrMsg))) {
331 return false;
332 }
333 int32_t nlType = hdrMsg->nlmsg_type;
334 if (nlType != RTM_NEWADDR && nlType != RTM_DELADDR) {
335 NETNATIVE_LOGE("InterpreteAddressMsg on incorrect message nlType 0x%{public}x\n", nlType);
336 return false;
337 }
338 const std::string rtMsgType = CastNameToStr(nlType);
339 flags = addrMsg->ifa_flags;
340 int32_t len = IFA_PAYLOAD(hdrMsg);
341 for (rtattr *rtAttr = IFA_RTA(addrMsg); RTA_OK(rtAttr, len); rtAttr = RTA_NEXT(rtAttr, len)) {
342 if (rtAttr == nullptr) {
343 NETNATIVE_LOGE("Invalid ifaddrmsg\n");
344 return false;
345 }
346 switch (rtAttr->rta_type) {
347 case IFA_ADDRESS:
348 if (!InterpreteIFaceAddr(addrMsg, addresses, sizeof(addresses), rtMsgType, interfaceName, rtAttr)) {
349 // This is not an error, but we don't want to continue.
350 NETNATIVE_LOG_D("InterpreteIFaceAddr failed");
351 }
352 break;
353 case IFA_CACHEINFO:
354 if (IsDataEmpty(cacheInfo, "IFA_CACHEINFO", rtMsgType) &&
355 !IsPayloadValidated(rtAttr, sizeof(*cacheInfo))) {
356 break;
357 }
358 cacheInfo = reinterpret_cast<ifa_cacheinfo *>(RTA_DATA(rtAttr));
359 break;
360 case IFA_FLAGS:
361 flags = *(reinterpret_cast<uint32_t *>(RTA_DATA(rtAttr)));
362 break;
363 default:
364 break;
365 }
366 }
367 if (addresses[0] == '\0') {
368 NETNATIVE_LOGE("IFA_ADDRESS not exist in %{public}s\n", rtMsgType.c_str());
369 return false;
370 }
371 message_->SetAction((nlType == RTM_NEWADDR) ? NetsysEventMessage::Action::ADDRESSUPDATE
372 : NetsysEventMessage::Action::ADDRESSREMOVED);
373 return SaveAddressMsg(addresses, addrMsg, std::to_string(flags), cacheInfo, interfaceName);
374 }
375
InterpreteIFaceAddr(ifaddrmsg * ifAddr,char * addrStr,socklen_t sockLen,const std::string & msgType,char * ifName,rtattr * rta)376 bool WrapperDecoder::InterpreteIFaceAddr(ifaddrmsg *ifAddr, char *addrStr, socklen_t sockLen,
377 const std::string &msgType, char *ifName, rtattr *rta)
378 {
379 if (*addrStr != 0) {
380 NETNATIVE_LOGE("IFA_ADDRESS already exist in %{public}s", msgType.c_str());
381 return false;
382 }
383
384 switch (ifAddr->ifa_family) {
385 case AF_INET: {
386 in_addr *ipv4Addr = reinterpret_cast<in_addr *>(RTA_DATA(rta));
387 if (!IsPayloadValidated(rta, sizeof(*ipv4Addr))) {
388 return false;
389 }
390 inet_ntop(AF_INET, ipv4Addr, addrStr, sockLen);
391 break;
392 }
393 case AF_INET6: {
394 in6_addr *ipv6Addr = reinterpret_cast<in6_addr *>(RTA_DATA(rta));
395 if (!IsPayloadValidated(rta, sizeof(*ipv6Addr))) {
396 return false;
397 }
398 inet_ntop(AF_INET6, ipv6Addr, addrStr, sockLen);
399 break;
400 }
401 default:
402 NETNATIVE_LOGE("Address family is unknown %{public}d\n", ifAddr->ifa_family);
403 return false;
404 }
405
406 if (!if_indextoname(ifAddr->ifa_index, ifName)) {
407 NETNATIVE_LOGW("The interface index %{public}d in %{public}s is unknown", ifAddr->ifa_index, msgType.c_str());
408 }
409 return true;
410 }
411
SaveAddressMsg(const std::string addrStr,const ifaddrmsg * addrMsg,const std::string flags,const ifa_cacheinfo * cacheInfo,const std::string interfaceName)412 bool WrapperDecoder::SaveAddressMsg(const std::string addrStr, const ifaddrmsg *addrMsg, const std::string flags,
413 const ifa_cacheinfo *cacheInfo, const std::string interfaceName)
414 {
415 if (addrStr.empty()) {
416 NETNATIVE_LOGE("No IFA_ADDRESS");
417 return false;
418 }
419 message_->SetSubSys(NetsysEventMessage::SubSys::NET);
420 message_->PushMessage(NetsysEventMessage::Type::INTERFACE, interfaceName);
421 message_->PushMessage(NetsysEventMessage::Type::ADDRESS,
422 addrStr + ROUTE_ADDRESS_SPLIT + std::to_string(addrMsg->ifa_prefixlen));
423 message_->PushMessage(NetsysEventMessage::Type::FLAGS, flags);
424 message_->PushMessage(NetsysEventMessage::Type::SCOPE, std::to_string(addrMsg->ifa_scope));
425 message_->PushMessage(NetsysEventMessage::Type::IFINDEX, std::to_string(addrMsg->ifa_index));
426 if (cacheInfo != nullptr) {
427 message_->PushMessage(NetsysEventMessage::Type::PREFERRED, std::to_string(cacheInfo->ifa_prefered));
428 message_->PushMessage(NetsysEventMessage::Type::VALID, std::to_string(cacheInfo->ifa_valid));
429 message_->PushMessage(NetsysEventMessage::Type::CSTAMP, std::to_string(cacheInfo->cstamp));
430 message_->PushMessage(NetsysEventMessage::Type::TSTAMP, std::to_string(cacheInfo->tstamp));
431 }
432
433 return true;
434 }
435
InterpreteRtMsg(const nlmsghdr * hdrMsg)436 bool WrapperDecoder::InterpreteRtMsg(const nlmsghdr *hdrMsg)
437 {
438 uint8_t type = hdrMsg->nlmsg_type;
439 rtmsg *rtMsg = CheckRtParam(hdrMsg, type);
440 if (rtMsg == nullptr) {
441 return false;
442 }
443 char device[IFNAMSIZ] = {0};
444 char dst[INET6_ADDRSTRLEN] = {0};
445 char gateWay[INET6_ADDRSTRLEN] = {0};
446 int32_t rtmFamily = rtMsg->rtm_family;
447 int32_t rtmDstLen = rtMsg->rtm_dst_len;
448 std::string msgName = CastNameToStr(type);
449 size_t size = RTM_PAYLOAD(hdrMsg);
450 rtattr *rtAttr = nullptr;
451 for (rtAttr = RTM_RTA(rtMsg); RTA_OK(rtAttr, (int)size); rtAttr = RTA_NEXT(rtAttr, size)) {
452 switch (rtAttr->rta_type) {
453 case RTA_GATEWAY:
454 if (IsDataEmpty(*gateWay, RTA_GATEWAY_STR, msgName) &&
455 !inet_ntop(rtmFamily, RTA_DATA(rtAttr), gateWay, sizeof(gateWay))) {
456 return false;
457 }
458 break;
459 case RTA_DST:
460 if (IsDataEmpty(*dst, RTA_DST_STR, msgName) &&
461 !inet_ntop(rtmFamily, RTA_DATA(rtAttr), dst, sizeof(dst))) {
462 return false;
463 }
464 break;
465 case RTA_OIF:
466 if (IsDataEmpty(*device, RTA_OIF_STR, msgName) &&
467 if_indextoname(*(reinterpret_cast<int32_t *>(RTA_DATA(rtAttr))), device) == nullptr) {
468 return false;
469 }
470 break;
471 default:
472 break;
473 }
474 }
475 if (!SaveRtMsg(dst, gateWay, device, rtmDstLen, rtmFamily)) {
476 return false;
477 }
478 auto action =
479 (type == RTM_NEWROUTE) ? NetsysEventMessage::Action::ROUTEUPDATED : NetsysEventMessage::Action::ROUTEREMOVED;
480 message_->SetAction(action);
481 return true;
482 }
483
CheckRtParam(const nlmsghdr * hdrMsg,uint8_t type)484 rtmsg *WrapperDecoder::CheckRtParam(const nlmsghdr *hdrMsg, uint8_t type)
485 {
486 if (type != RTM_NEWROUTE && type != RTM_DELROUTE) {
487 NETNATIVE_LOGE("read message error type %{public}d\n", type);
488 return nullptr;
489 }
490
491 rtmsg *rtm = reinterpret_cast<rtmsg *>(NLMSG_DATA(hdrMsg));
492 if (!CheckRtNetlinkLength(hdrMsg, sizeof(*rtm))) {
493 return nullptr;
494 }
495
496 if ((rtm->rtm_protocol != RTPROT_KERNEL && rtm->rtm_protocol != RTPROT_RA) ||
497 (rtm->rtm_scope != RT_SCOPE_UNIVERSE) || (rtm->rtm_type != RTN_UNICAST) || (rtm->rtm_src_len != 0) ||
498 (rtm->rtm_flags & RTM_F_CLONED)) {
499 return nullptr;
500 }
501 return rtm;
502 }
503
SaveRtMsg(std::string dst,const std::string gateWay,const std::string device,int32_t length,int32_t family)504 bool WrapperDecoder::SaveRtMsg(std::string dst, const std::string gateWay, const std::string device, int32_t length,
505 int32_t family)
506 {
507 if (length == 0) {
508 if (family == AF_INET) {
509 dst.append(ROUTE_DEFAULT_ADDR);
510 }
511 if (family == AF_INET6) {
512 dst.append(ROUTE_DEFAULT_SPLIT);
513 }
514 }
515 if (dst.empty() || (gateWay.empty() && device.empty())) {
516 NETNATIVE_LOGE("read message error dstSize: %{public}zu, gateWaySize: %{public}zu, deviceSize: %{public}zu",
517 dst.size(), gateWay.size(), device.size());
518 return false;
519 }
520
521 message_->SetSubSys(NetsysEventMessage::SubSys::NET);
522 message_->PushMessage(NetsysEventMessage::Type::ROUTE, dst + ROUTE_ADDRESS_SPLIT + std::to_string(length));
523 message_->PushMessage(NetsysEventMessage::Type::GATEWAY, gateWay);
524 message_->PushMessage(NetsysEventMessage::Type::INTERFACE, device);
525 return true;
526 }
527
SaveOtherMsg(const std::string & info)528 void WrapperDecoder::SaveOtherMsg(const std::string &info)
529 {
530 auto msgList = Split(info, SYMBOL_EQUAL);
531 if (msgList.size() == SPLIT_SIZE) {
532 const auto key = msgList[0];
533 auto value = msgList[1];
534 if (ASCII_PARAM_LIST.find(key) != ASCII_PARAM_LIST.end()) {
535 message_->PushMessage(ASCII_PARAM_LIST.at(key), value);
536 }
537 }
538 }
539 } // namespace nmd
540 } // namespace OHOS
541