• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     ethernetServiceFfrtQueue_.reset();
70 }
71 
Dump(int32_t fd,const std::vector<std::u16string> & args)72 int32_t EthernetService::Dump(int32_t fd, const std::vector<std::u16string> &args)
73 {
74     NETMGR_EXT_LOG_D("Start Dump, fd: %{public}d", fd);
75     std::string result;
76     ethManagement_.GetDumpInfo(result);
77     int32_t ret = dprintf(fd, "%s\n", result.c_str());
78     return ret < 0 ? NETMANAGER_EXT_ERR_LOCAL_PTR_NULL : NETMANAGER_EXT_SUCCESS;
79 }
80 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)81 void EthernetService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
82 {
83     switch (systemAbilityId) {
84         case COMM_NET_CONN_MANAGER_SYS_ABILITY_ID:
85             NETMGR_EXT_LOG_D("EthernetService::OnAddSystemAbility Conn");
86             dependentServiceState_ |= DEPENDENT_SERVICE_NET_CONN_MANAGER;
87             break;
88         case COMMON_EVENT_SERVICE_ID:
89             NETMGR_EXT_LOG_D("EthernetService::OnAddSystemAbility CES");
90             dependentServiceState_ |= DEPENDENT_SERVICE_COMMON_EVENT;
91             break;
92         default:
93             NETMGR_EXT_LOG_D("EthernetService::OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
94             break;
95     }
96     if (dependentServiceState_ == DEPENDENT_SERVICE_All) {
97         InitManagement();
98     }
99 }
100 
Init()101 bool EthernetService::Init()
102 {
103     if (!REGISTER_LOCAL_RESULT_ETH) {
104         NETMGR_EXT_LOG_E("EthernetService Register to local sa manager failed");
105         return false;
106     }
107     if (!registerToService_) {
108         if (!Publish(DelayedSingleton<EthernetService>::GetInstance().get())) {
109             NETMGR_EXT_LOG_E("EthernetService Register to sa manager failed");
110             return false;
111         }
112         registerToService_ = true;
113     }
114     AddSystemAbilityListener(COMM_NET_CONN_MANAGER_SYS_ABILITY_ID);
115     AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
116     interfaceStateCallback_ = new (std::nothrow) GlobalInterfaceStateCallback(*this);
117     if (interfaceStateCallback_ == nullptr) {
118         NETMGR_EXT_LOG_E("allInterfaceStateCallback_ is nullptr");
119         return false;
120     }
121     NetsysController::GetInstance().RegisterCallback(interfaceStateCallback_);
122     serviceComm_ = new (std::nothrow) EthernetServiceCommon();
123     if (serviceComm_ == nullptr) {
124         NETMGR_EXT_LOG_E("serviceComm_ is nullptr");
125         return false;
126     }
127     NetManagerCenter::GetInstance().RegisterEthernetService(serviceComm_);
128     ethernetServiceFfrtQueue_ = std::make_shared<ffrt::queue>("EthernetService");
129     return true;
130 }
131 
InitManagement()132 void EthernetService::InitManagement()
133 {
134     NETMGR_EXT_LOG_D("EthernetService::InitManagement Enter");
135     ethManagement_.Init();
136 }
137 
OnInterfaceAddressUpdated(const std::string & addr,const std::string & ifName,int flags,int scope)138 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceAddressUpdated(const std::string &addr,
139                                                                                  const std::string &ifName, int flags,
140                                                                                  int scope)
141 {
142     return 0;
143 }
144 
OnInterfaceAddressRemoved(const std::string & addr,const std::string & ifName,int flags,int scope)145 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceAddressRemoved(const std::string &addr,
146                                                                                  const std::string &ifName, int flags,
147                                                                                  int scope)
148 {
149     return 0;
150 }
151 
OnInterfaceAdded(const std::string & iface)152 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceAdded(const std::string &iface)
153 {
154     NETMGR_EXT_LOG_D("iface: %{public}s, added", iface.c_str());
155     ethernetService_.NotifyMonitorIfaceCallbackAsync(
156         [=](const sptr<InterfaceStateCallback> &callback) { callback->OnInterfaceAdded(iface); });
157     return 0;
158 }
159 
OnInterfaceRemoved(const std::string & iface)160 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceRemoved(const std::string &iface)
161 {
162     NETMGR_EXT_LOG_D("iface: %{public}s, removed", iface.c_str());
163     ethernetService_.NotifyMonitorIfaceCallbackAsync(
164         [=](const sptr<InterfaceStateCallback> &callback) { callback->OnInterfaceRemoved(iface); });
165     return 0;
166 }
167 
OnInterfaceChanged(const std::string & iface,bool up)168 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceChanged(const std::string &iface, bool up)
169 {
170     return 0;
171 }
172 
OnInterfaceLinkStateChanged(const std::string & ifName,bool up)173 int32_t EthernetService::GlobalInterfaceStateCallback::OnInterfaceLinkStateChanged(const std::string &ifName, bool up)
174 {
175     NETMGR_EXT_LOG_D("iface: %{public}s, up: %{public}d", ifName.c_str(), up);
176     ethernetService_.NotifyMonitorIfaceCallbackAsync(
177         [=](const sptr<InterfaceStateCallback> &callback) { callback->OnInterfaceChanged(ifName, up); });
178     return 0;
179 }
180 
OnRouteChanged(bool updated,const std::string & route,const std::string & gateway,const std::string & ifName)181 int32_t EthernetService::GlobalInterfaceStateCallback::OnRouteChanged(bool updated, const std::string &route,
182                                                                       const std::string &gateway,
183                                                                       const std::string &ifName)
184 {
185     return 0;
186 }
187 
OnDhcpSuccess(NetsysControllerCallback::DhcpResult & dhcpResult)188 int32_t EthernetService::GlobalInterfaceStateCallback::OnDhcpSuccess(NetsysControllerCallback::DhcpResult &dhcpResult)
189 {
190     return 0;
191 }
192 
OnBandwidthReachedLimit(const std::string & limitName,const std::string & iface)193 int32_t EthernetService::GlobalInterfaceStateCallback::OnBandwidthReachedLimit(const std::string &limitName,
194                                                                                const std::string &iface)
195 {
196     return 0;
197 }
198 
SetIfaceConfig(const std::string & iface,sptr<InterfaceConfiguration> & ic)199 int32_t EthernetService::SetIfaceConfig(const std::string &iface, sptr<InterfaceConfiguration> &ic)
200 {
201     NETMGR_EXT_LOG_D("Set iface: %{public}s config", iface.c_str());
202     if (!NetManagerPermission::IsSystemCaller()) {
203         NETMGR_EXT_LOG_E("Caller not have sys permission");
204         return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
205     }
206     if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
207         NETMGR_EXT_LOG_E("EthernetService SetIfaceConfig no js permission");
208         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
209     }
210 
211     return ethManagement_.UpdateDevInterfaceCfg(iface, ic);
212 }
213 
GetIfaceConfig(const std::string & iface,sptr<InterfaceConfiguration> & ifaceConfig)214 int32_t EthernetService::GetIfaceConfig(const std::string &iface, sptr<InterfaceConfiguration> &ifaceConfig)
215 {
216     NETMGR_EXT_LOG_D("Get 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::GET_NETWORK_INFO)) {
222         NETMGR_EXT_LOG_E("EthernetService GetIfaceConfig no js permission");
223         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
224     }
225 
226     return ethManagement_.GetDevInterfaceCfg(iface, ifaceConfig);
227 }
228 
IsIfaceActive(const std::string & iface,int32_t & activeStatus)229 int32_t EthernetService::IsIfaceActive(const std::string &iface, int32_t &activeStatus)
230 {
231     NETMGR_EXT_LOG_D("Get iface: %{public}s is active", iface.c_str());
232     if (!NetManagerPermission::IsSystemCaller()) {
233         NETMGR_EXT_LOG_E("Caller not have sys permission");
234         return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
235     }
236     if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
237         NETMGR_EXT_LOG_E("EthernetService IsIfaceActive no js permission");
238         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
239     }
240 
241     return ethManagement_.IsIfaceActive(iface, activeStatus);
242 }
243 
GetAllActiveIfaces(std::vector<std::string> & activeIfaces)244 int32_t EthernetService::GetAllActiveIfaces(std::vector<std::string> &activeIfaces)
245 {
246     if (!NetManagerPermission::IsSystemCaller()) {
247         NETMGR_EXT_LOG_E("Caller not have sys permission");
248         return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
249     }
250     if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
251         NETMGR_EXT_LOG_E("EthernetService GetAllActiveIfaces no js permission");
252         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
253     }
254 
255     return ethManagement_.GetAllActiveIfaces(activeIfaces);
256 }
257 
ResetFactory()258 int32_t EthernetService::ResetFactory()
259 {
260     if (!NetManagerPermission::IsSystemCaller()) {
261         NETMGR_EXT_LOG_E("Caller not have sys permission");
262         return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
263     }
264     if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
265         NETMGR_EXT_LOG_E("EthernetService GetAllActiveIfaces no js permission");
266         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
267     }
268 
269     return ethManagement_.ResetFactory();
270 }
271 
RegisterIfacesStateChanged(const sptr<InterfaceStateCallback> & callback)272 int32_t EthernetService::RegisterIfacesStateChanged(const sptr<InterfaceStateCallback> &callback)
273 {
274     if (callback == nullptr) {
275         NETMGR_EXT_LOG_E("Register interface callback failed");
276         return NETMANAGER_EXT_ERR_PARAMETER_ERROR;
277     }
278     if (!NetManagerPermission::IsSystemCaller()) {
279         NETMGR_EXT_LOG_E("Caller not have sys permission");
280         return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
281     }
282     if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
283         NETMGR_EXT_LOG_E("RegisterIfacesStateChanged no permission");
284         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
285     }
286     return RegisterMonitorIfaceCallbackAsync(callback);
287 }
288 
UnregisterIfacesStateChanged(const sptr<InterfaceStateCallback> & callback)289 int32_t EthernetService::UnregisterIfacesStateChanged(const sptr<InterfaceStateCallback> &callback)
290 {
291     if (callback == nullptr) {
292         NETMGR_EXT_LOG_E("Unregister interface callback failed");
293         return NETMANAGER_EXT_ERR_PARAMETER_ERROR;
294     }
295     if (!NetManagerPermission::IsSystemCaller()) {
296         NETMGR_EXT_LOG_E("Caller not have sys permission");
297         return NETMANAGER_EXT_ERR_NOT_SYSTEM_CALL;
298     }
299     if (!NetManagerPermission::CheckPermission(Permission::GET_NETWORK_INFO)) {
300         NETMGR_EXT_LOG_E("RegisterIfacesStateChanged no permission");
301         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
302     }
303     return UnregisterMonitorIfaceCallbackAsync(callback);
304 }
305 
SetInterfaceUp(const std::string & iface)306 int32_t EthernetService::SetInterfaceUp(const std::string &iface)
307 {
308     NETMGR_EXT_LOG_D("Set interface: %{public}s up", iface.c_str());
309     if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
310         NETMGR_EXT_LOG_E("EthernetService SetInterfaceUp no permission");
311         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
312     }
313     return NetsysController::GetInstance().SetInterfaceUp(iface);
314 }
315 
SetInterfaceDown(const std::string & iface)316 int32_t EthernetService::SetInterfaceDown(const std::string &iface)
317 {
318     NETMGR_EXT_LOG_D("Set interface: %{public}s down", iface.c_str());
319     if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
320         NETMGR_EXT_LOG_E("EthernetService SetInterfaceDown no permission");
321         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
322     }
323     return NetsysController::GetInstance().SetInterfaceDown(iface);
324 }
325 
GetInterfaceConfig(const std::string & iface,OHOS::nmd::InterfaceConfigurationParcel & config)326 int32_t EthernetService::GetInterfaceConfig(const std::string &iface, OHOS::nmd::InterfaceConfigurationParcel &config)
327 {
328     NETMGR_EXT_LOG_D("Get interface: %{public}s config", iface.c_str());
329     if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
330         NETMGR_EXT_LOG_E("EthernetService GetInterfaceConfig no permission");
331         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
332     }
333     config.ifName = iface;
334     return NetsysController::GetInstance().GetInterfaceConfig(config);
335 }
336 
SetInterfaceConfig(const std::string & iface,OHOS::nmd::InterfaceConfigurationParcel & cfg)337 int32_t EthernetService::SetInterfaceConfig(const std::string &iface, OHOS::nmd::InterfaceConfigurationParcel &cfg)
338 {
339     NETMGR_EXT_LOG_D("Set interface: %{public}s config", iface.c_str());
340     if (!NetManagerPermission::CheckPermission(Permission::CONNECTIVITY_INTERNAL)) {
341         NETMGR_EXT_LOG_E("EthernetService SetInterfaceConfig no permission");
342         return NETMANAGER_EXT_ERR_PERMISSION_DENIED;
343     }
344     cfg.ifName = iface;
345     return NetsysController::GetInstance().SetInterfaceConfig(cfg);
346 }
347 
RegisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> & callback)348 int32_t EthernetService::RegisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> &callback)
349 {
350     int32_t ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
351     if (!ethernetServiceFfrtQueue_) {
352         NETMGR_EXT_LOG_E("FFRT Init Fail");
353         return ret;
354     }
355     ffrt::task_handle RegisterMonitorIfaceTask = ethernetServiceFfrtQueue_->submit_h([this, &callback, &ret]() {
356         for (auto iterCb = monitorIfaceCallbacks_.begin(); iterCb != monitorIfaceCallbacks_.end(); iterCb++) {
357             if ((*iterCb)->AsObject().GetRefPtr() == callback->AsObject().GetRefPtr()) {
358                 NETMGR_EXT_LOG_D("Register interface callback failed, callback already exists");
359                 ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
360                 return;
361             }
362         }
363         monitorIfaceCallbacks_.push_back(callback);
364         NETMGR_EXT_LOG_D("Register interface callback success");
365         ret = NETMANAGER_EXT_SUCCESS;
366     }, ffrt::task_attr().name("RegisterMonitorIfaceCallbackAsync"));
367     ethernetServiceFfrtQueue_->wait(RegisterMonitorIfaceTask);
368     return ret;
369 }
370 
UnregisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> & callback)371 int32_t EthernetService::UnregisterMonitorIfaceCallbackAsync(const sptr<InterfaceStateCallback> &callback)
372 {
373     int32_t ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
374     if (!ethernetServiceFfrtQueue_) {
375         NETMGR_EXT_LOG_E("FFRT Init Fail");
376         return ret;
377     }
378     ffrt::task_handle UnregisterMonitorIfaceTask = ethernetServiceFfrtQueue_->submit_h([this, &callback, &ret]() {
379         for (auto iterCb = monitorIfaceCallbacks_.begin(); iterCb != monitorIfaceCallbacks_.end(); iterCb++) {
380             if ((*iterCb)->AsObject().GetRefPtr() == callback->AsObject().GetRefPtr()) {
381                 monitorIfaceCallbacks_.erase(iterCb);
382                 NETMGR_EXT_LOG_D("Unregister interface callback success.");
383                 ret = NETMANAGER_EXT_SUCCESS;
384                 return;
385             }
386         }
387             NETMGR_EXT_LOG_E("Unregister interface callback is doesnot exist.");
388             ret = NETMANAGER_EXT_ERR_OPERATION_FAILED;
389     }, ffrt::task_attr().name("UnregisterMonitorIfaceCallbackAsync"));
390     ethernetServiceFfrtQueue_->wait(UnregisterMonitorIfaceTask);
391     return ret;
392 }
393 
NotifyMonitorIfaceCallbackAsync(OnFunctionT onFunction)394 void EthernetService::NotifyMonitorIfaceCallbackAsync(OnFunctionT onFunction)
395 {
396     if (!ethernetServiceFfrtQueue_) {
397         NETMGR_EXT_LOG_E("FFRT Init Fail");
398         return;
399     }
400     ffrt::task_handle NotifyMonitorIfaceTask_ = ethernetServiceFfrtQueue_->submit_h([this, &onFunction]() {
401         std::for_each(monitorIfaceCallbacks_.begin(), monitorIfaceCallbacks_.end(), onFunction);
402     }, ffrt::task_attr().name("NotifyMonitorIfaceCallbackAsync"));
403     ethernetServiceFfrtQueue_->wait(NotifyMonitorIfaceTask_);
404 }
405 } // namespace NetManagerStandard
406 } // namespace OHOS
407