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