1 /*
2 * Copyright (c) 2021-2023 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.h"
17
18 #include <new>
19 #include <sys/time.h>
20
21 #include "ethernet_management.h"
22 #include "interface_configuration.h"
23 #include "iremote_object.h"
24 #include "net_ethernet_base_service.h"
25 #include "net_manager_center.h"
26 #include "net_manager_constants.h"
27 #include "netmanager_base_permission.h"
28 #include "netmgr_ext_log_wrapper.h"
29 #include "netsys_controller.h"
30 #include "system_ability_definition.h"
31
32 namespace OHOS {
33 namespace NetManagerStandard {
34 namespace {
35 constexpr uint16_t DEPENDENT_SERVICE_NET_CONN_MANAGER = 0x0001;
36 constexpr uint16_t DEPENDENT_SERVICE_COMMON_EVENT = 0x0002;
37 constexpr uint16_t DEPENDENT_SERVICE_All = 0x0003;
38 constexpr const char *NET_ACTIVATE_WORK_THREAD = "POLICY_CALLBACK_WORK_THREAD";
39 const bool REGISTER_LOCAL_RESULT_ETH =
40 SystemAbility::MakeAndRegisterAbility(DelayedSingleton<EthernetService>::GetInstance().get());
41 } // namespace
42
EthernetService()43 EthernetService::EthernetService() : SystemAbility(COMM_ETHERNET_MANAGER_SYS_ABILITY_ID, true) {}
44
45 EthernetService::~EthernetService() = default;
46
OnStart()47 void EthernetService::OnStart()
48 {
49 struct timeval tv;
50 gettimeofday(&tv, nullptr);
51 NETMGR_EXT_LOG_D("EthernetService::OnStart begin");
52 if (state_ == STATE_RUNNING) {
53 NETMGR_EXT_LOG_D("EthernetService the state is already running");
54 return;
55 }
56 if (!Init()) {
57 NETMGR_EXT_LOG_E("EthernetService init failed");
58 return;
59 }
60 state_ = STATE_RUNNING;
61 gettimeofday(&tv, nullptr);
62 NETMGR_EXT_LOG_D("EthernetService::OnStart end");
63 }
64
OnStop()65 void EthernetService::OnStop()
66 {
67 state_ = STATE_STOPPED;
68 registerToService_ = false;
69
70 if (policyCallRunner_) {
71 policyCallRunner_->Stop();
72 }
73 }
74
Dump(int32_t fd,const std::vector<std::u16string> & args)75 int32_t EthernetService::Dump(int32_t fd, const std::vector<std::u16string> &args)
76 {
77 NETMGR_EXT_LOG_D("Start Dump, fd: %{public}d", fd);
78 std::string result;
79 if (ethManagement_ == nullptr) {
80 return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
81 }
82 ethManagement_->GetDumpInfo(result);
83 int32_t ret = dprintf(fd, "%s\n", result.c_str());
84 return ret < 0 ? NETMANAGER_EXT_ERR_LOCAL_PTR_NULL : NETMANAGER_EXT_SUCCESS;
85 }
86
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)87 void EthernetService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
88 {
89 switch (systemAbilityId) {
90 case COMM_NET_CONN_MANAGER_SYS_ABILITY_ID:
91 NETMGR_EXT_LOG_D("EthernetService::OnAddSystemAbility Conn");
92 dependentServiceState_ |= DEPENDENT_SERVICE_NET_CONN_MANAGER;
93 break;
94 case COMMON_EVENT_SERVICE_ID:
95 NETMGR_EXT_LOG_D("EthernetService::OnAddSystemAbility CES");
96 dependentServiceState_ |= DEPENDENT_SERVICE_COMMON_EVENT;
97 break;
98 default:
99 NETMGR_EXT_LOG_D("EthernetService::OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
100 break;
101 }
102 if (dependentServiceState_ == DEPENDENT_SERVICE_All) {
103 InitManagement();
104 }
105 }
106
Init()107 bool EthernetService::Init()
108 {
109 if (!REGISTER_LOCAL_RESULT_ETH) {
110 NETMGR_EXT_LOG_E("EthernetService Register to local sa manager failed");
111 return false;
112 }
113 if (!registerToService_) {
114 if (!Publish(DelayedSingleton<EthernetService>::GetInstance().get())) {
115 NETMGR_EXT_LOG_E("EthernetService Register to sa manager failed");
116 return false;
117 }
118 registerToService_ = true;
119 }
120 AddSystemAbilityListener(COMM_NET_CONN_MANAGER_SYS_ABILITY_ID);
121 AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
122 interfaceStateCallback_ = new (std::nothrow) GlobalInterfaceStateCallback(*this);
123 if (interfaceStateCallback_ == nullptr) {
124 NETMGR_EXT_LOG_E("allInterfaceStateCallback_ is nullptr");
125 return false;
126 }
127 NetsysController::GetInstance().RegisterCallback(interfaceStateCallback_);
128 serviceComm_ = new (std::nothrow) EthernetServiceCommon();
129 if (serviceComm_ == nullptr) {
130 NETMGR_EXT_LOG_E("serviceComm_ is nullptr");
131 return false;
132 }
133 NetManagerCenter::GetInstance().RegisterEthernetService(serviceComm_);
134
135 if (!policyCallRunner_) {
136 policyCallRunner_ = AppExecFwk::EventRunner::Create(NET_ACTIVATE_WORK_THREAD);
137 }
138 if (!policyCallHandler_) {
139 policyCallHandler_ = std::make_shared<AppExecFwk::EventHandler>(policyCallRunner_);
140 }
141 return true;
142 }
143
InitManagement()144 void EthernetService::InitManagement()
145 {
146 NETMGR_EXT_LOG_D("EthernetService::InitManagement Enter");
147 if (ethManagement_ == nullptr) {
148 ethManagement_ = std::make_shared<EthernetManagement>();
149 ethManagement_->Init();
150 }
151 }
152
OnInterfaceAddressUpdated(const std::string & addr,const std::string & ifName,int flags,int scope)153 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceAddressUpdated(const std::string &addr,
154 const std::string &ifName, int flags,
155 int scope)
156 {
157 return 0;
158 }
159
OnInterfaceAddressRemoved(const std::string & addr,const std::string & ifName,int flags,int scope)160 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceAddressRemoved(const std::string &addr,
161 const std::string &ifName, int flags,
162 int scope)
163 {
164 return 0;
165 }
166
OnInterfaceAdded(const std::string & iface)167 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceAdded(const std::string &iface)
168 {
169 NETMGR_EXT_LOG_D("iface: %{public}s, added", iface.c_str());
170 ethernetService_.NotifyMonitorIfaceCallbackAsync(
171 [=](const sptr<InterfaceStateCallback> &callback) { callback->OnInterfaceAdded(iface); });
172 return 0;
173 }
174
OnInterfaceRemoved(const std::string & iface)175 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceRemoved(const std::string &iface)
176 {
177 NETMGR_EXT_LOG_D("iface: %{public}s, removed", iface.c_str());
178 ethernetService_.NotifyMonitorIfaceCallbackAsync(
179 [=](const sptr<InterfaceStateCallback> &callback) { callback->OnInterfaceRemoved(iface); });
180 return 0;
181 }
182
OnInterfaceChanged(const std::string & iface,bool up)183 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceChanged(const std::string &iface, bool up)
184 {
185 return 0;
186 }
187
OnInterfaceLinkStateChanged(const std::string & ifName,bool up)188 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceLinkStateChanged(const std::string &ifName, bool up)
189 {
190 NETMGR_EXT_LOG_D("iface: %{public}s, up: %{public}d", ifName.c_str(), up);
191 ethernetService_.NotifyMonitorIfaceCallbackAsync(
192 [=](const sptr<InterfaceStateCallback> &callback) { callback->OnInterfaceChanged(ifName, up); });
193 return 0;
194 }
195
OnRouteChanged(bool updated,const std::string & route,const std::string & gateway,const std::string & ifName)196 int32_t EthernetService::GlobalInterfaceStateCallback::OnRouteChanged(bool updated, const std::string &route,
197 const std::string &gateway,
198 const std::string &ifName)
199 {
200 return 0;
201 }
202
OnDhcpSuccess(NetsysControllerCallback::DhcpResult & dhcpResult)203 int32_t EthernetService::GlobalInterfaceStateCallback::OnDhcpSuccess(NetsysControllerCallback::DhcpResult &dhcpResult)
204 {
205 return 0;
206 }
207
OnBandwidthReachedLimit(const std::string & limitName,const std::string & iface)208 int32_t EthernetService::GlobalInterfaceStateCallback::OnBandwidthReachedLimit(const std::string &limitName,
209 const std::string &iface)
210 {
211 return 0;
212 }
213
SetIfaceConfig(const std::string & iface,sptr<InterfaceConfiguration> & ic)214 int32_t EthernetService::SetIfaceConfig(const std::string &iface, sptr<InterfaceConfiguration> &ic)
215 {
216 NETMGR_EXT_LOG_D("Set iface: %{public}s config", iface.c_str());
217 if (!NetManagerPermission::IsSystemCaller()) {
218 NETMGR_EXT_LOG_E("Caller not have sys permission");
219 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
220 }
221 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
222 NETMGR_EXT_LOG_E("EthernetService SetIfaceConfig no js permission");
223 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
224 }
225
226 if (ethManagement_ == nullptr) {
227 NETMGR_EXT_LOG_E("ethManagement is null");
228 return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
229 }
230 return ethManagement_->UpdateDevInterfaceCfg(iface, ic);
231 }
232
GetIfaceConfig(const std::string & iface,sptr<InterfaceConfiguration> & ifaceConfig)233 int32_t EthernetService::GetIfaceConfig(const std::string &iface, sptr<InterfaceConfiguration> &ifaceConfig)
234 {
235 NETMGR_EXT_LOG_D("Get iface: %{public}s config", iface.c_str());
236 if (!NetManagerPermission::IsSystemCaller()) {
237 NETMGR_EXT_LOG_E("Caller not have sys permission");
238 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
239 }
240 if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
241 NETMGR_EXT_LOG_E("EthernetService GetIfaceConfig no js permission");
242 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
243 }
244
245 if (ethManagement_ == nullptr) {
246 return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
247 }
248 return ethManagement_->GetDevInterfaceCfg(iface, ifaceConfig);
249 }
250
IsIfaceActive(const std::string & iface,int32_t & activeStatus)251 int32_t EthernetService::IsIfaceActive(const std::string &iface, int32_t &activeStatus)
252 {
253 NETMGR_EXT_LOG_D("Get iface: %{public}s is active", iface.c_str());
254 if (!NetManagerPermission::IsSystemCaller()) {
255 NETMGR_EXT_LOG_E("Caller not have sys permission");
256 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
257 }
258 if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
259 NETMGR_EXT_LOG_E("EthernetService IsIfaceActive no js permission");
260 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
261 }
262
263 if (ethManagement_ == nullptr) {
264 return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
265 }
266 return ethManagement_->IsIfaceActive(iface, activeStatus);
267 }
268
GetAllActiveIfaces(std::vector<std::string> & activeIfaces)269 int32_t EthernetService::GetAllActiveIfaces(std::vector<std::string> &activeIfaces)
270 {
271 if (!NetManagerPermission::IsSystemCaller()) {
272 NETMGR_EXT_LOG_E("Caller not have sys permission");
273 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
274 }
275 if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
276 NETMGR_EXT_LOG_E("EthernetService GetAllActiveIfaces no js permission");
277 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
278 }
279
280 if (ethManagement_ == nullptr) {
281 return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
282 }
283 return ethManagement_->GetAllActiveIfaces(activeIfaces);
284 }
285
ResetFactory()286 int32_t EthernetService::ResetFactory()
287 {
288 if (!NetManagerPermission::IsSystemCaller()) {
289 NETMGR_EXT_LOG_E("Caller not have sys permission");
290 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
291 }
292 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
293 NETMGR_EXT_LOG_E("EthernetService GetAllActiveIfaces no js permission");
294 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
295 }
296
297 if (ethManagement_ == nullptr) {
298 return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
299 }
300 return ethManagement_->ResetFactory();
301 }
302
RegisterIfacesStateChanged(const sptr<InterfaceStateCallback> & callback)303 int32_t EthernetService::RegisterIfacesStateChanged(const sptr<InterfaceStateCallback> &callback)
304 {
305 if (callback == nullptr) {
306 NETMGR_EXT_LOG_E("Register interface callback failed");
307 return NETMANAGER_EXT_ERR_PARAMETER_ERROR;
308 }
309 if (!NetManagerPermission::IsSystemCaller()) {
310 NETMGR_EXT_LOG_E("Caller not have sys permission");
311 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
312 }
313 if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
314 NETMGR_EXT_LOG_E("RegisterIfacesStateChanged no permission");
315 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
316 }
317 return RegisterMonitorIfaceCallbackAsync(callback);
318 }
319
UnregisterIfacesStateChanged(const sptr<InterfaceStateCallback> & callback)320 int32_t EthernetService::UnregisterIfacesStateChanged(const sptr<InterfaceStateCallback> &callback)
321 {
322 if (callback == nullptr) {
323 NETMGR_EXT_LOG_E("Unregister interface callback failed");
324 return NETMANAGER_EXT_ERR_PARAMETER_ERROR;
325 }
326 if (!NetManagerPermission::IsSystemCaller()) {
327 NETMGR_EXT_LOG_E("Caller not have sys permission");
328 return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
329 }
330 if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
331 NETMGR_EXT_LOG_E("RegisterIfacesStateChanged no permission");
332 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
333 }
334 return UnregisterMonitorIfaceCallbackAsync(callback);
335 }
336
SetInterfaceUp(const std::string & iface)337 int32_t EthernetService::SetInterfaceUp(const std::string &iface)
338 {
339 NETMGR_EXT_LOG_D("Set interface: %{public}s up", iface.c_str());
340 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
341 NETMGR_EXT_LOG_E("EthernetService SetInterfaceUp no permission");
342 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
343 }
344 return NetsysController::GetInstance().SetInterfaceUp(iface);
345 }
346
SetInterfaceDown(const std::string & iface)347 int32_t EthernetService::SetInterfaceDown(const std::string &iface)
348 {
349 NETMGR_EXT_LOG_D("Set interface: %{public}s down", iface.c_str());
350 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
351 NETMGR_EXT_LOG_E("EthernetService SetInterfaceDown no permission");
352 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
353 }
354 return NetsysController::GetInstance().SetInterfaceDown(iface);
355 }
356
GetInterfaceConfig(const std::string & iface,OHOS::nmd::InterfaceConfigurationParcel & config)357 int32_t EthernetService::GetInterfaceConfig(const std::string &iface, OHOS::nmd::InterfaceConfigurationParcel &config)
358 {
359 NETMGR_EXT_LOG_D("Get interface: %{public}s config", iface.c_str());
360 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
361 NETMGR_EXT_LOG_E("EthernetService GetInterfaceConfig no permission");
362 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
363 }
364 config.ifName = iface;
365 return NetsysController::GetInstance().GetInterfaceConfig(config);
366 }
367
SetInterfaceConfig(const std::string & iface,OHOS::nmd::InterfaceConfigurationParcel & cfg)368 int32_t EthernetService::SetInterfaceConfig(const std::string &iface, OHOS::nmd::InterfaceConfigurationParcel &cfg)
369 {
370 NETMGR_EXT_LOG_D("Set interface: %{public}s config", iface.c_str());
371 if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
372 NETMGR_EXT_LOG_E("EthernetService SetInterfaceConfig no permission");
373 return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
374 }
375 cfg.ifName = iface;
376 return NetsysController::GetInstance().SetInterfaceConfig(cfg);
377 }
378
RegisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> & callback)379 int32_t EthernetService::RegisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> &callback)
380 {
381 int32_t ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
382 if (policyCallHandler_) {
383 policyCallHandler_->PostSyncTask([this, &callback, &ret]() {
384 for (auto iterCb = monitorIfaceCallbacks_.begin(); iterCb != monitorIfaceCallbacks_.end(); iterCb++) {
385 if ((*iterCb)->AsObject().GetRefPtr() == callback->AsObject().GetRefPtr()) {
386 NETMGR_EXT_LOG_D("Register interface callback failed, callback already exists");
387 ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
388 return;
389 }
390 }
391 monitorIfaceCallbacks_.push_back(callback);
392 NETMGR_EXT_LOG_D("Register interface callback success");
393 ret = NETMANAGER_EXT_SUCCESS;
394 });
395 }
396 return ret;
397 }
398
UnregisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> & callback)399 int32_t EthernetService::UnregisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> &callback)
400 {
401 int32_t ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
402 if (policyCallHandler_) {
403 policyCallHandler_->PostSyncTask([this, &callback, &ret]() {
404 for (auto iterCb = monitorIfaceCallbacks_.begin(); iterCb != monitorIfaceCallbacks_.end(); iterCb++) {
405 if ((*iterCb)->AsObject().GetRefPtr() == callback->AsObject().GetRefPtr()) {
406 monitorIfaceCallbacks_.erase(iterCb);
407 NETMGR_EXT_LOG_D("Unregister interface callback success.");
408 ret = NETMANAGER_EXT_SUCCESS;
409 return;
410 }
411 }
412 NETMGR_EXT_LOG_E("Unregister interface callback is doesnot exist.");
413 ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
414 });
415 }
416 return ret;
417 }
418
NotifyMonitorIfaceCallbackAsync(OnFunctionT onFunction)419 void EthernetService::NotifyMonitorIfaceCallbackAsync(OnFunctionT onFunction)
420 {
421 if (policyCallHandler_) {
422 policyCallHandler_->PostSyncTask([this, &onFunction]() {
423 std::for_each(monitorIfaceCallbacks_.begin(), monitorIfaceCallbacks_.end(), onFunction);
424 });
425 }
426 }
427 } // namespace NetManagerStandard
428 } // namespace OHOS
429