1 /*
2  * Copyright (c) 2021-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 "ethernet_service_stub.h"
17 
18 #include "i_ethernet_service.h"
19 #include "mac_address_info.h"
20 #include "interface_configuration.h"
21 #include "interface_type.h"
22 #include "ipc_object_stub.h"
23 #include "message_parcel.h"
24 #include "net_manager_constants.h"
25 #include "net_manager_ext_constants.h"
26 #include "netmgr_ext_log_wrapper.h"
27 
28 namespace OHOS {
29 namespace NetManagerStandard {
30 namespace {
31 constexpr uint32_t MAX_SIZE = 16;
32 constexpr uint32_t MAX_IFACE_NAME_LEN = 13;
33 constexpr uint32_t MAX_MAC_ADDR_LEN = 17;
34 constexpr uint32_t MAX_IPV4_ADDR_LEN = 15;
35 constexpr uint32_t MAX_PRE_LEN = 128;
36 } // namespace
37 
EthernetServiceStub()38 EthernetServiceStub::EthernetServiceStub()
39 {
40     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_GET_MAC_ADDR_INFO)] =
41         &EthernetServiceStub::OnGetMacAddress;
42     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_SET_IF_CFG)] =
43         &EthernetServiceStub::OnSetIfaceConfig;
44     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_GET_IF_CFG)] =
45         &EthernetServiceStub::OnGetIfaceConfig;
46     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_IS_ACTIVATE)] =
47         &EthernetServiceStub::OnIsIfaceActive;
48     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_GET_ACTIVATE_INTERFACE)] =
49         &EthernetServiceStub::OnGetAllActiveIfaces;
50     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_RESET_FACTORY)] =
51         &EthernetServiceStub::OnResetFactory;
52     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_REGISTER_INTERFACE_CB)] =
53         &EthernetServiceStub::OnRegisterIfacesStateChanged;
54     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_UNREGISTER_INTERFACE_CB)] =
55         &EthernetServiceStub::OnUnregisterIfacesStateChanged;
56     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_SET_INTERFACE_UP)] =
57         &EthernetServiceStub::OnSetInterfaceUp;
58     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_SET_INTERFACE_DOWN)] =
59         &EthernetServiceStub::OnSetInterfaceDown;
60     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_GET_INTERFACE_CONFIG)] =
61         &EthernetServiceStub::OnGetInterfaceConfig;
62     memberFuncMap_[static_cast<uint32_t>(EthernetInterfaceCode::CMD_SET_INTERFACE_CONFIG)] =
63         &EthernetServiceStub::OnSetInterfaceConfig;
64 }
65 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)66 int32_t EthernetServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
67                                              MessageOption &option)
68 {
69     NETMGR_EXT_LOG_D("stub call start, code = [%{public}d]", code);
70 
71     std::u16string myDescripter = EthernetServiceStub::GetDescriptor();
72     std::u16string remoteDescripter = data.ReadInterfaceToken();
73     if (myDescripter != remoteDescripter) {
74         NETMGR_EXT_LOG_E("descriptor checked fail");
75         return NETMANAGER_EXT_ERR_DESCRIPTOR_MISMATCH;
76     }
77     auto itFunc = memberFuncMap_.find(code);
78     if (itFunc != memberFuncMap_.end()) {
79         auto requestFunc = itFunc->second;
80         if (requestFunc != nullptr) {
81             return (this->*requestFunc)(data, reply);
82         }
83     }
84     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
85 }
86 
OnGetMacAddress(MessageParcel & data,MessageParcel & reply)87 int32_t EthernetServiceStub::OnGetMacAddress(MessageParcel &data, MessageParcel &reply)
88 {
89     std::vector<MacAddressInfo> macAddrList;
90     int32_t ret = GetMacAddress(macAddrList);
91     if (ret != NETMANAGER_EXT_SUCCESS) {
92         NETMGR_EXT_LOG_E("get all mac addresses failed");
93         return ret;
94     }
95     if (macAddrList.size() > MAX_SIZE) {
96         NETMGR_EXT_LOG_E("ifaces size is too large");
97         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
98     }
99     if (!reply.WriteInt32(ret)) {
100         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
101     }
102     if (!reply.WriteUint32(macAddrList.size())) {
103         NETMGR_EXT_LOG_E("iface size write failed");
104         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
105     }
106     for (auto macAddrInfo : macAddrList) {
107         if (!macAddrInfo.Marshalling(reply)) {
108             NETMGR_EXT_LOG_E("proxy Marshalling failed");
109             return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
110         }
111     }
112     return NETMANAGER_EXT_SUCCESS;
113 }
114 
OnSetIfaceConfig(MessageParcel & data,MessageParcel & reply)115 int32_t EthernetServiceStub::OnSetIfaceConfig(MessageParcel &data, MessageParcel &reply)
116 {
117     std::string iface;
118     if (!data.ReadString(iface)) {
119         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
120     }
121     sptr<InterfaceConfiguration> ic = InterfaceConfiguration::Unmarshalling(data);
122     if (ic == nullptr) {
123         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
124     }
125     return SetIfaceConfig(iface, ic);
126 }
127 
OnGetIfaceConfig(MessageParcel & data,MessageParcel & reply)128 int32_t EthernetServiceStub::OnGetIfaceConfig(MessageParcel &data, MessageParcel &reply)
129 {
130     std::string iface;
131     if (!data.ReadString(iface)) {
132         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
133     }
134     sptr<InterfaceConfiguration> ifaceConfig = new (std::nothrow) InterfaceConfiguration();
135     int32_t ret = GetIfaceConfig(iface, ifaceConfig);
136     if (ret == NETMANAGER_EXT_SUCCESS && ifaceConfig != nullptr) {
137         if (!reply.WriteInt32(GET_CFG_SUC)) {
138             NETMGR_EXT_LOG_E("write failed");
139             return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
140         }
141         if (!ifaceConfig->Marshalling(reply)) {
142             NETMGR_EXT_LOG_E("proxy Marshalling failed");
143             return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
144         }
145     }
146     return ret;
147 }
148 
OnIsIfaceActive(MessageParcel & data,MessageParcel & reply)149 int32_t EthernetServiceStub::OnIsIfaceActive(MessageParcel &data, MessageParcel &reply)
150 {
151     std::string iface;
152     if (!data.ReadString(iface)) {
153         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
154     }
155     int32_t activeStatus = 0;
156     int32_t ret = IsIfaceActive(iface, activeStatus);
157     if (ret == NETMANAGER_EXT_SUCCESS) {
158         if (!reply.WriteUint32(activeStatus)) {
159             return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
160         }
161     }
162     return ret;
163 }
164 
OnGetAllActiveIfaces(MessageParcel & data,MessageParcel & reply)165 int32_t EthernetServiceStub::OnGetAllActiveIfaces(MessageParcel &data, MessageParcel &reply)
166 {
167     std::vector<std::string> ifaces;
168     int32_t ret = GetAllActiveIfaces(ifaces);
169     NETMGR_EXT_LOG_E("ret %{public}d", ret);
170     if (ret != NETMANAGER_EXT_SUCCESS || ifaces.size() == 0) {
171         NETMGR_EXT_LOG_E("get all active ifaces failed");
172         return ret;
173     }
174     if (ifaces.size() > MAX_SIZE) {
175         NETMGR_EXT_LOG_E("ifaces size is too large");
176         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
177     }
178     if (!reply.WriteUint32(ifaces.size())) {
179         NETMGR_EXT_LOG_E("iface size write failed");
180         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
181     }
182     for (auto iface : ifaces) {
183         if (!reply.WriteString(iface)) {
184             NETMGR_EXT_LOG_E("iface write failed");
185             return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
186         }
187     }
188     return NETMANAGER_EXT_SUCCESS;
189 }
190 
OnResetFactory(MessageParcel & data,MessageParcel & reply)191 int32_t EthernetServiceStub::OnResetFactory(MessageParcel &data, MessageParcel &reply)
192 {
193     return ResetFactory();
194 }
195 
OnRegisterIfacesStateChanged(MessageParcel & data,MessageParcel & reply)196 int32_t EthernetServiceStub::OnRegisterIfacesStateChanged(MessageParcel &data, MessageParcel &reply)
197 {
198     sptr<InterfaceStateCallback> callback = iface_cast<InterfaceStateCallback>(data.ReadRemoteObject());
199     if (callback == nullptr) {
200         NETMGR_EXT_LOG_E("callback is null.");
201         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
202     }
203 
204     int32_t ret = RegisterIfacesStateChanged(callback);
205     if (!reply.WriteInt32(ret)) {
206         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
207     }
208     return NETMANAGER_EXT_SUCCESS;
209 }
210 
OnUnregisterIfacesStateChanged(MessageParcel & data,MessageParcel & reply)211 int32_t EthernetServiceStub::OnUnregisterIfacesStateChanged(MessageParcel &data, MessageParcel &reply)
212 {
213     sptr<InterfaceStateCallback> callback = iface_cast<InterfaceStateCallback>(data.ReadRemoteObject());
214     if (callback == nullptr) {
215         NETMGR_EXT_LOG_E("callback is null.");
216         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
217     }
218 
219     int32_t ret = UnregisterIfacesStateChanged(callback);
220     if (!reply.WriteInt32(ret)) {
221         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
222     }
223     return NETMANAGER_EXT_SUCCESS;
224 }
225 
OnSetInterfaceUp(MessageParcel & data,MessageParcel & reply)226 int32_t EthernetServiceStub::OnSetInterfaceUp(MessageParcel &data, MessageParcel &reply)
227 {
228     std::string iface;
229     if (!data.ReadString(iface)) {
230         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
231     }
232     return SetInterfaceUp(iface);
233 }
234 
OnSetInterfaceDown(MessageParcel & data,MessageParcel & reply)235 int32_t EthernetServiceStub::OnSetInterfaceDown(MessageParcel &data, MessageParcel &reply)
236 {
237     std::string iface;
238     if (!data.ReadString(iface)) {
239         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
240     }
241     return SetInterfaceDown(iface);
242 }
243 
OnGetInterfaceConfig(MessageParcel & data,MessageParcel & reply)244 int32_t EthernetServiceStub::OnGetInterfaceConfig(MessageParcel &data, MessageParcel &reply)
245 {
246     std::string iface;
247     if (!data.ReadString(iface)) {
248         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
249     }
250     OHOS::nmd::InterfaceConfigurationParcel cfg;
251     int32_t result = GetInterfaceConfig(iface, cfg);
252     if (result != ERR_NONE) {
253         NETMGR_EXT_LOG_E("GetInterfaceConfig is error");
254         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
255     }
256     reply.WriteString(cfg.ifName);
257     reply.WriteString(cfg.hwAddr);
258     reply.WriteString(cfg.ipv4Addr);
259     reply.WriteInt32(cfg.prefixLength);
260     if (cfg.flags.size() > MAX_SIZE) {
261         NETMGR_EXT_LOG_E("cfg flags size is too large");
262         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
263     }
264     reply.WriteInt32(static_cast<int32_t>(cfg.flags.size()));
265     for (auto flag : cfg.flags) {
266         reply.WriteString(flag);
267     }
268     reply.WriteInt32(result);
269     return NETMANAGER_EXT_SUCCESS;
270 }
271 
OnSetInterfaceConfig(MessageParcel & data,MessageParcel & reply)272 int32_t EthernetServiceStub::OnSetInterfaceConfig(MessageParcel &data, MessageParcel &reply)
273 {
274     std::string iface = data.ReadString();
275 
276     OHOS::nmd::InterfaceConfigurationParcel cfg;
277     cfg.ifName = data.ReadString();
278     if (cfg.ifName.size() > MAX_IFACE_NAME_LEN || cfg.ifName.size() == 0) {
279         NETMGR_EXT_LOG_E("ifName=[%{public}s] is too long", cfg.ifName.c_str());
280         return NETMANAGER_EXT_ERR_INVALID_PARAMETER;
281     }
282     cfg.hwAddr = data.ReadString();
283     if (cfg.hwAddr.size() > MAX_MAC_ADDR_LEN) {
284         NETMGR_EXT_LOG_E("hwAddr is too long");
285         return NETMANAGER_EXT_ERR_INVALID_PARAMETER;
286     }
287     cfg.ipv4Addr = data.ReadString();
288     if (cfg.ipv4Addr.size() > MAX_IPV4_ADDR_LEN) {
289         NETMGR_EXT_LOG_E("ipv4Addr is too long");
290         return NETMANAGER_EXT_ERR_INVALID_PARAMETER;
291     }
292     cfg.prefixLength = data.ReadInt32();
293     if (cfg.prefixLength > static_cast<int32_t>(MAX_PRE_LEN)) {
294         NETMGR_EXT_LOG_E("prefixLength=[%{public}d] is too large", cfg.prefixLength);
295         return NETMANAGER_EXT_ERR_INVALID_PARAMETER;
296     }
297 
298     uint32_t vecSize = data.ReadUint32();
299     if (vecSize == 0 || vecSize > MAX_SIZE) {
300         NETMGR_EXT_LOG_E("flags size=[%{public}u] is 0 or too large", vecSize);
301         return NETMANAGER_EXT_ERR_INVALID_PARAMETER;
302     }
303     for (uint32_t idx = 0; idx < vecSize; idx++) {
304         cfg.flags.push_back(data.ReadString());
305     }
306 
307     int32_t result = SetInterfaceConfig(iface, cfg);
308     if (result != ERR_NONE) {
309         NETMGR_EXT_LOG_E("Set interface config failed");
310         return NETMANAGER_EXT_ERR_OPERATION_FAILED;
311     }
312     return NETMANAGER_EXT_SUCCESS;
313 }
314 } // namespace NetManagerStandard
315 } // namespace OHOS
316