1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved.
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 #include "include/Network.h"
16 #include <sstream>
17 #include <fstream>
18 #include <iostream>
19 #include <string>
20 #include <unistd.h>
21 #include <dirent.h>
22 #include <cstdio>
23 #include <cstdlib>
24 #include <climits>
25 #include <cctype>
26 #include "sys/time.h"
27 #include "securec.h"
28 #include "include/sp_utils.h"
29 #include "include/sp_log.h"
30 const int LARGE_BUFF_MAX_LEN = 256;
31 namespace OHOS {
32 namespace SmartPerf {
ItemData()33 std::map<std::string, std::string> Network::ItemData()
34 {
35 std::map<std::string, std::string> result = Network::GetNetworkInfo();
36 LOGI("Network ItemData map siez=%u", result.size());
37 if (result.find("networkUp") != result.end() && result["networkUp"].empty()) {
38 result["networkUp"] = "NA";
39 }
40 if (result.find("networkDown") != result.end() && result["networkDown"].empty()) {
41 result["networkDown"] = "NA";
42 }
43 return result;
44 }
45
GetNetworkInfo()46 std::map<std::string, std::string> Network::GetNetworkInfo()
47 {
48 std::map<std::string, std::string> networkInfo;
49 char buff[LARGE_BUFF_MAX_LEN];
50 FILE *fp = fopen("/proc/net/dev", "r");
51 if (fp == nullptr) {
52 std::cout << "net work node is not accessed" << std::endl;
53 return networkInfo;
54 }
55 while (fgets(buff, LARGE_BUFF_MAX_LEN, fp) != nullptr) {
56 if (strstr(buff, "rmnet") || strstr(buff, "eth") || strstr(buff, "wlan")) {
57 if (sscanf_s(buff, "%*s%lld%*lld%*lld%*lld%*lld%*lld%*lld%*lld%lld%*lld%*lld%*lld%*lld%*lld%*lld%*lld",
58 &curRx, &curTx) < 0) {
59 (void)fclose(fp);
60 return networkInfo;
61 }
62 allTx += curTx;
63 allRx += curRx;
64 }
65 }
66 (void)fclose(fp);
67 if (isFirst) {
68 networkInfo["networkUp"] = std::to_string(prevTx);
69 networkInfo["networkDown"] = std::to_string(prevRx);
70 isFirst = false;
71 prevTx = allTx;
72 prevRx = allRx;
73 allTx = 0;
74 allRx = 0;
75 return networkInfo;
76 }
77 if ((allTx == 0 && allRx == 0) || (allTx <= prevTx && allRx <= prevRx)) {
78 networkInfo["networkUp"] = "0";
79 networkInfo["networkDown"] = "0";
80 prevTx = allTx;
81 prevRx = allRx;
82 allTx = 0;
83 allRx = 0;
84 return networkInfo;
85 }
86 diffTx = allTx - prevTx;
87 prevTx = allTx;
88 diffRx = allRx - prevRx;
89 prevRx = allRx;
90 allTx = 0;
91 allRx = 0;
92 networkInfo["networkUp"] = std::to_string(diffTx);
93 networkInfo["networkDown"] = std::to_string(diffRx);
94 return networkInfo;
95 }
96 }
97 }
98