• 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 
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