• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "native_c/wifi_hid2d.h"
17 #include "native_cpp/wifi_standard/include/wifi_hid2d.h"
18 #include "define.h"
19 #include "wifi_logger.h"
20 #include "wifi_c_utils.h"
21 #include "wifi_common_util.h"
22 #include "native_c/wifi_device.h"
23 
24 DEFINE_WIFILOG_LABEL("WifiCHid2d");
25 
26 std::unique_ptr<OHOS::Wifi::Hid2d> wifiHid2dPtr = OHOS::Wifi::Hid2d::GetInstance(WIFI_P2P_ABILITY_ID);
27 
Hid2dRequestGcIp(const unsigned char gcMac[MAC_LEN],unsigned int ipAddr[IPV4_ARRAY_LEN])28 WifiErrorCode Hid2dRequestGcIp(const unsigned char gcMac[MAC_LEN], unsigned int ipAddr[IPV4_ARRAY_LEN])
29 {
30     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
31 
32     std::string strMac = OHOS::Wifi::MacArrayToStr(gcMac);
33     std::string strIpAddr;
34     OHOS::Wifi::ErrCode ret = wifiHid2dPtr->Hid2dRequestGcIp(strMac, strIpAddr);
35     if (ret != OHOS::Wifi::WIFI_OPT_SUCCESS) {
36         WIFI_LOGE("Request gc ip failed!");
37         return ERROR_WIFI_UNKNOWN;
38     }
39     return OHOS::Wifi::IpStrToArray(strIpAddr, ipAddr);
40 }
41 
Hid2dSharedlinkIncrease()42 WifiErrorCode Hid2dSharedlinkIncrease()
43 {
44     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
45     return GetCErrorCode(wifiHid2dPtr->Hid2dSharedlinkIncrease());
46 }
47 
Hid2dSharedlinkDecrease()48 WifiErrorCode Hid2dSharedlinkDecrease()
49 {
50     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
51     return GetCErrorCode(wifiHid2dPtr->Hid2dSharedlinkDecrease());
52 }
53 
Hid2dCreateGroup(const int frequency,FreqType type)54 WifiErrorCode Hid2dCreateGroup(const int frequency, FreqType type)
55 {
56     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
57     return GetCErrorCode(wifiHid2dPtr->Hid2dCreateGroup(frequency, OHOS::Wifi::FreqType(static_cast<int>(type))));
58 }
59 
Hid2dRemoveGcGroup(const char gcIfName[IF_NAME_LEN])60 WifiErrorCode Hid2dRemoveGcGroup(const char gcIfName[IF_NAME_LEN])
61 {
62     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
63     return GetCErrorCode(wifiHid2dPtr->Hid2dRemoveGcGroup(gcIfName));
64 }
65 
Hid2dConnect(const Hid2dConnectConfig * config)66 WifiErrorCode Hid2dConnect(const Hid2dConnectConfig *config)
67 {
68     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
69     CHECK_PTR_RETURN(config, ERROR_WIFI_INVALID_ARGS);
70 
71     OHOS::Wifi::Hid2dConnectConfig cppConfig;
72     cppConfig.SetSsid(config->ssid);
73     cppConfig.SetBssid(OHOS::Wifi::MacArrayToStr(config->bssid));
74     cppConfig.SetPreSharedKey(config->preSharedKey);
75     cppConfig.SetFrequency(config->frequency);
76     cppConfig.SetDhcpMode(OHOS::Wifi::DhcpMode(static_cast<int>(config->dhcpMode)));
77     return GetCErrorCode(wifiHid2dPtr->Hid2dConnect(cppConfig));
78 }
79 
Hid2dConfigIPAddr(const char ifName[IF_NAME_LEN],const IpAddrInfo * ipInfo)80 WifiErrorCode Hid2dConfigIPAddr(const char ifName[IF_NAME_LEN], const IpAddrInfo* ipInfo)
81 {
82     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
83     CHECK_PTR_RETURN(ipInfo, ERROR_WIFI_INVALID_ARGS);
84 
85     OHOS::Wifi::IpAddrInfo ipAddrInfo;
86     ipAddrInfo.ip = OHOS::Wifi::IpArrayToStr(ipInfo->ip);
87     ipAddrInfo.gateway = OHOS::Wifi::IpArrayToStr(ipInfo->gateway);
88     ipAddrInfo.netmask = OHOS::Wifi::IpArrayToStr(ipInfo->netmask);
89     return GetCErrorCode(wifiHid2dPtr->Hid2dConfigIPAddr(ifName, ipAddrInfo));
90 }
91 
Hid2dReleaseIPAddr(const char ifName[IF_NAME_LEN])92 WifiErrorCode Hid2dReleaseIPAddr(const char ifName[IF_NAME_LEN])
93 {
94     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
95     return GetCErrorCode(wifiHid2dPtr->Hid2dReleaseIPAddr(ifName));
96 }
97 
ConvertRecommendChannelRequest(const RecommendChannelRequest * request,OHOS::Wifi::RecommendChannelRequest & req)98 static void ConvertRecommendChannelRequest(const RecommendChannelRequest *request,
99     OHOS::Wifi::RecommendChannelRequest& req)
100 {
101     req.remoteIfName = request->remoteIfName;
102     req.remoteIfMode = request->remoteIfMode;
103     req.localIfName = request->localIfName;
104     req.localIfMode = request->localIfMode;
105     req.prefBand = request->prefBand;
106     req.prefBandwidth = OHOS::Wifi::PreferBandwidth(static_cast<int>(request->prefBandwidth));
107 }
108 
ConvertRecommendChannelResponse(const OHOS::Wifi::RecommendChannelResponse & rsp,RecommendChannelResponse * response)109 static void ConvertRecommendChannelResponse(const OHOS::Wifi::RecommendChannelResponse& rsp,
110     RecommendChannelResponse* response)
111 {
112     response->status = RecommendStatus(static_cast<int>(rsp.status));
113     response->index = rsp.index;
114     response->centerFreq = rsp.centerFreq;
115     response->centerFreq1 = rsp.centerFreq1;
116     response->centerFreq2 = rsp.centerFreq2;
117     response->bandwidth = rsp.bandwidth;
118 }
119 
Hid2dGetRecommendChannel(const RecommendChannelRequest * request,RecommendChannelResponse * response)120 WifiErrorCode Hid2dGetRecommendChannel(const RecommendChannelRequest *request, RecommendChannelResponse *response)
121 {
122     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
123     CHECK_PTR_RETURN(request, ERROR_WIFI_INVALID_ARGS);
124     CHECK_PTR_RETURN(response, ERROR_WIFI_INVALID_ARGS);
125 
126     WifiLinkedInfo linkedInfo;
127     WifiErrorCode ret = GetLinkedInfo(&linkedInfo);
128     if (ret == WIFI_SUCCESS && linkedInfo.connState == WIFI_CONNECTED) {
129         response->status = RS_SUCCESS;
130         response->index = 0;
131 
132         constexpr int FREQ_2G_MAX = 2472;
133         constexpr int CHANNEL_14_FREQ = 2484;
134         if (linkedInfo.frequency <= FREQ_2G_MAX || linkedInfo.frequency == CHANNEL_14_FREQ) {
135             response->centerFreq = linkedInfo.frequency;
136             response->centerFreq1 = 0;
137         } else {
138             response->centerFreq = 0;
139             response->centerFreq1 = linkedInfo.frequency;
140         }
141         response->centerFreq2 = 0;
142         response->bandwidth = linkedInfo.band;
143         return WIFI_SUCCESS;
144     }
145 
146     OHOS::Wifi::RecommendChannelRequest req;
147     OHOS::Wifi::RecommendChannelResponse rsp;
148     ConvertRecommendChannelRequest(request, req);
149     OHOS::Wifi::ErrCode retCode = wifiHid2dPtr->Hid2dGetRecommendChannel(req, rsp);
150     if (retCode != OHOS::Wifi::WIFI_OPT_SUCCESS) {
151         return GetCErrorCode(retCode);
152     }
153     ConvertRecommendChannelResponse(rsp, response);
154     return WIFI_SUCCESS;
155 }
156 
Hid2dGetChannelListFor5G(int * chanList,int len)157 WifiErrorCode Hid2dGetChannelListFor5G(int *chanList, int len)
158 {
159     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
160     CHECK_PTR_RETURN(chanList, ERROR_WIFI_INVALID_ARGS);
161 
162     std::vector<int> vecChannelList;
163     OHOS::Wifi::ErrCode ret = wifiHid2dPtr->Hid2dGetChannelListFor5G(vecChannelList);
164     if (ret == OHOS::Wifi::WIFI_OPT_SUCCESS) {
165         size_t idx = 0;
166         for (; idx != vecChannelList.size() && (int)(idx + 1) < len; ++idx) {
167             *chanList = vecChannelList[idx];
168             ++chanList;
169         }
170         if (idx != vecChannelList.size()) {
171             WIFI_LOGW("Get channel list for 5G, `chanList` is too small!");
172         }
173         *chanList = 0;
174     }
175     return GetCErrorCode(ret);
176 }
177 
Hid2dGetSelfWifiCfgInfo(SelfCfgType cfgType,char cfgData[CFG_DATA_MAX_BYTES],int * getDatValidLen)178 WifiErrorCode Hid2dGetSelfWifiCfgInfo(SelfCfgType cfgType, char cfgData[CFG_DATA_MAX_BYTES], int* getDatValidLen)
179 {
180     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
181     CHECK_PTR_RETURN(getDatValidLen, ERROR_WIFI_INVALID_ARGS);
182     return GetCErrorCode(wifiHid2dPtr->Hid2dGetSelfWifiCfgInfo(
183         OHOS::Wifi::SelfCfgType(static_cast<int>(cfgType)), cfgData, getDatValidLen));
184 }
185 
Hid2dSetPeerWifiCfgInfo(PeerCfgType cfgType,char cfgData[CFG_DATA_MAX_BYTES],int setDataValidLen)186 WifiErrorCode Hid2dSetPeerWifiCfgInfo(PeerCfgType cfgType, char cfgData[CFG_DATA_MAX_BYTES], int setDataValidLen)
187 {
188     CHECK_PTR_RETURN(wifiHid2dPtr, ERROR_WIFI_NOT_AVAILABLE);
189     return GetCErrorCode(wifiHid2dPtr->Hid2dSetPeerWifiCfgInfo(
190         OHOS::Wifi::PeerCfgType(static_cast<int>(cfgType)), cfgData, setDataValidLen));
191 }
192 
Hid2dIsWideBandwidthSupported()193 int Hid2dIsWideBandwidthSupported()
194 {
195     constexpr int NOT_SUPPORT = 0; // false
196     return NOT_SUPPORT;
197 }
198