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