1 /*
2 * Copyright (c) 2024 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 "wifi_direct_dfx.h"
17 #include "conn_log.h"
18 #include "duration_statistic.h"
19 #include "softbus_conn_interface.h"
20 #include "wifi_direct_utils.h"
21
22 namespace OHOS::SoftBus {
23
DfxRecord(bool success,int32_t reason,const ConnectInfo & connectInfo)24 void WifiDirectDfx::DfxRecord(bool success, int32_t reason, const ConnectInfo &connectInfo)
25 {
26 auto wifiDirectConnectInfo = connectInfo.info_;
27 if (success) {
28 DurationStatistic::GetInstance().Record(wifiDirectConnectInfo.requestId, TOTAL_END);
29 DurationStatistic::GetInstance().End(wifiDirectConnectInfo.requestId);
30 DurationStatistic::GetInstance().Clear(wifiDirectConnectInfo.requestId);
31 WifiDirectDfx::GetInstance().Clear(wifiDirectConnectInfo.requestId);
32
33 ConnEventExtra extra = {
34 .result = EVENT_STAGE_RESULT_OK,
35 .requestId = static_cast<int32_t>(wifiDirectConnectInfo.requestId),
36 .frequency = wifiDirectConnectInfo.dfxInfo.frequency,
37 };
38 ReportConnEventExtra(extra, connectInfo);
39 } else {
40 DurationStatistic::GetInstance().Clear(wifiDirectConnectInfo.requestId);
41 WifiDirectDfx::GetInstance().Clear(wifiDirectConnectInfo.requestId);
42 ConnEventExtra extra = {
43 .result = EVENT_STAGE_RESULT_FAILED,
44 .errcode = reason,
45 .requestId = static_cast<int32_t>(wifiDirectConnectInfo.requestId),
46 .frequency = wifiDirectConnectInfo.dfxInfo.frequency,
47 };
48 ReportConnEventExtra(extra, connectInfo);
49 }
50 }
51
Record(uint32_t requestId,uint16_t challengeCode)52 void WifiDirectDfx::Record(uint32_t requestId, uint16_t challengeCode)
53 {
54 std::lock_guard lock(mutex_);
55 challengeCodeMap_.insert(std::make_pair(requestId, challengeCode));
56 }
57
Clear(uint32_t requestId)58 void WifiDirectDfx::Clear(uint32_t requestId)
59 {
60 std::lock_guard lock(mutex_);
61 challengeCodeMap_.erase(requestId);
62 }
63
ReportConnEventExtra(ConnEventExtra & extra,const ConnectInfo & info)64 void WifiDirectDfx::ReportConnEventExtra(ConnEventExtra &extra, const ConnectInfo &info)
65 {
66 CONN_LOGI(CONN_WIFI_DIRECT, "FillConnEventExtra enter");
67 auto wifiDirectConnectInfo = info.info_;
68 enum StatisticLinkType type = wifiDirectConnectInfo.dfxInfo.linkType;
69 if (type == STATISTIC_P2P) {
70 extra.linkType = CONNECT_P2P;
71 } else if (type == STATISTIC_HML) {
72 extra.linkType = CONNECT_HML;
73 } else {
74 extra.linkType = CONNECT_TRIGGER_HML;
75 }
76
77 auto requestId = wifiDirectConnectInfo.requestId;
78 std::string challengeCodeStr;
79 {
80 std::lock_guard lock(mutex_);
81 if (challengeCodeMap_.find(requestId) != challengeCodeMap_.end()) {
82 challengeCodeStr = std::to_string(challengeCodeMap_[requestId]);
83 extra.challengeCode = challengeCodeStr.c_str();
84 }
85 }
86
87 auto stateMapElement = DurationStatistic::GetInstance().GetStateTimeMapElement(requestId);
88 uint64_t startTime = stateMapElement[TOTAL_START];
89 uint64_t endTime = stateMapElement[TOTAL_END];
90 if (startTime != 0 && endTime != 0) {
91 extra.costTime = int32_t(endTime - startTime);
92 extra.negotiateTime = endTime - startTime > 0 ? endTime - startTime : 0;
93 }
94 auto dfxInfo = wifiDirectConnectInfo.dfxInfo;
95 extra.bootLinkType = dfxInfo.bootLinkType;
96 extra.peerNetworkId = wifiDirectConnectInfo.remoteNetworkId;
97 auto localNetworkId = WifiDirectUtils::GetLocalNetworkId();
98 extra.localNetworkId = localNetworkId.c_str();
99 extra.osType = WifiDirectUtils::GetOsType(wifiDirectConnectInfo.remoteNetworkId);
100 auto localDeviceType = WifiDirectUtils::GetDeviceType();
101 auto localDeviceTypeStr = std::to_string(localDeviceType);
102 extra.localDeviceType = localDeviceTypeStr.c_str();
103 auto remoteDeviceType = WifiDirectUtils::GetDeviceType(wifiDirectConnectInfo.remoteNetworkId);
104 auto remoteDeviceTypeStr = std::to_string(remoteDeviceType);
105 extra.remoteDeviceType = remoteDeviceTypeStr.c_str();
106 CONN_EVENT(EVENT_SCENE_CONNECT, EVENT_STAGE_CONNECT_END, extra);
107 }
108 } // namespace OHOS::SoftBus
109