• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021-2022 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 "napi_ethernet.h"
17 
18 #include <array>
19 #include <new>
20 
21 #include <napi/native_common.h>
22 
23 #include "ethernet_client.h"
24 #include "i_ethernet_service.h"
25 #include "iservice_registry.h"
26 #include "napi_common.h"
27 #include "netmgr_ext_log_wrapper.h"
28 #include "system_ability_definition.h"
29 #include "netmanager_base_common_utils.h"
30 
31 // underside macro can delete context, if napi_status is not napi_ok.
32 #define NAPI_CALL_BASE_ENHANCE(env, theCall, retVal, context) \
33     do {                                                      \
34         if ((theCall) != napi_ok) {                           \
35             delete context;                                   \
36             context = nullptr;                                \
37             GET_AND_THROW_LAST_ERROR((env));                  \
38             return retVal;                                    \
39         }                                                     \
40     } while (0)                                               \
41 
42 #define NAPI_CALL_ENHANCE(env, theCall, context) NAPI_CALL_BASE_ENHANCE(env, theCall, nullptr, context)
43 
44 #define NAPI_CALL_RETURN_VOID_ENHANCE(env, theCall, context) \
45     NAPI_CALL_BASE_ENHANCE(env, theCall, NAPI_RETVAL_NOTHING, context)
46 
47 namespace OHOS {
48 namespace NetManagerStandard {
49 namespace {
50 constexpr const char *DNS_SEPARATOR = ",";
51 constexpr int32_t DNS_MAX_SIZE = 10;
52 }
ExecSetIfaceConfig(napi_env env,void * data)53 void NapiEthernet::ExecSetIfaceConfig(napi_env env, void *data)
54 {
55     if (data == nullptr) {
56         NETMGR_EXT_LOG_E("data is nullptr");
57         return;
58     }
59     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
60     if (context == nullptr) {
61         NETMGR_EXT_LOG_E("context is nullptr");
62         return;
63     }
64     if (context->ipMode == 0 && (context->ipAddr.empty() || context->netMask.empty())) {
65         NETMGR_EXT_LOG_E("static ip or mask have empty");
66         return;
67     }
68     INetAddr addr0;
69     sptr<InterfaceConfiguration> config = new (std::nothrow) InterfaceConfiguration();
70     if (config == nullptr) {
71         NETMGR_EXT_LOG_E("config is nullptr");
72         return;
73     }
74     config->mode_ = static_cast<IPSetMode>(context->ipMode);
75     config->ipStatic_.ipAddr_.address_ = context->ipAddr;
76     config->ipStatic_.route_.address_ = context->route;
77     config->ipStatic_.gateway_.address_ = context->gateway;
78     config->ipStatic_.netMask_.address_ = context->netMask;
79     for (const auto &dns : CommonUtils::Split(context->dnsServers, DNS_SEPARATOR)) {
80         INetAddr addr;
81         addr.address_ = dns;
82         config->ipStatic_.dnsServers_.push_back(addr);
83         if (config->ipStatic_.dnsServers_.size() == DNS_MAX_SIZE) {
84             break;
85         }
86     }
87     config->ipStatic_.domain_ = context->domain;
88     context->result = DelayedSingleton<EthernetClient>::GetInstance()->SetIfaceConfig(context->iface, config);
89     NETMGR_EXT_LOG_D("ExecSetIfaceConfig result =[%{public}d]", context->result);
90 }
91 
CompleteSetIfaceConfig(napi_env env,napi_status status,void * data)92 void NapiEthernet::CompleteSetIfaceConfig(napi_env env, napi_status status, void *data)
93 {
94     if (data == nullptr) {
95         NETMGR_EXT_LOG_E("data is nullptr");
96         return;
97     }
98     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
99     if (context == nullptr) {
100         NETMGR_EXT_LOG_E("context is nullptr");
101         return;
102     }
103     napi_value info = nullptr;
104     if (context->result != ERR_NONE) {
105         napi_create_int32(env, context->result, &info);
106     } else {
107         info = NapiCommon::CreateUndefined(env);
108     }
109     if (context->callbackRef == nullptr) {
110         if (context->result != ERR_NONE) {
111             NAPI_CALL_RETURN_VOID_ENHANCE(env, napi_reject_deferred(env, context->deferred, info), context);
112         } else {
113             NAPI_CALL_RETURN_VOID_ENHANCE(env, napi_resolve_deferred(env, context->deferred, info), context);
114         }
115     } else {
116         napi_value callbackValues[CALLBACK_ARGV_CNT] = {nullptr, nullptr};
117         napi_value recv = nullptr;
118         napi_value result = nullptr;
119         napi_value callbackFunc = nullptr;
120         napi_get_undefined(env, &recv);
121         napi_get_reference_value(env, context->callbackRef, &callbackFunc);
122         if (context->result != ERR_NONE) {
123             callbackValues[CALLBACK_ARGV_INDEX_0] = info;
124         } else {
125             callbackValues[CALLBACK_ARGV_INDEX_1] = info;
126         }
127         napi_call_function(env, recv, callbackFunc, std::size(callbackValues), callbackValues, &result);
128         napi_delete_reference(env, context->callbackRef);
129     }
130     napi_delete_async_work(env, context->work);
131     delete context;
132     context = nullptr;
133 }
134 
ExecGetIfaceConfig(napi_env env,void * data)135 void NapiEthernet::ExecGetIfaceConfig(napi_env env, void *data)
136 {
137     if (data == nullptr) {
138         NETMGR_EXT_LOG_E("data is nullptr");
139         return;
140     }
141     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
142     if (context == nullptr) {
143         NETMGR_EXT_LOG_E("context is nullptr");
144         return;
145     }
146     sptr<InterfaceConfiguration> config =
147         DelayedSingleton<EthernetClient>::GetInstance()->GetIfaceConfig(context->iface);
148     if (config != nullptr) {
149         context->result = 1;
150         context->ipMode = config->mode_;
151         context->ipAddr = config->ipStatic_.ipAddr_.address_;
152         context->route = config->ipStatic_.route_.address_;
153         context->gateway = config->ipStatic_.gateway_.address_;
154         context->netMask = config->ipStatic_.netMask_.address_;
155         context->domain = config->ipStatic_.domain_;
156         for (uint32_t i = 0; i < config->ipStatic_.dnsServers_.size(); i++) {
157             context->dnsServers = context->dnsServers + config->ipStatic_.dnsServers_[i].address_;
158             if (config->ipStatic_.dnsServers_.size() - i > 1) {
159                 context->dnsServers = context->dnsServers + DNS_SEPARATOR;
160             }
161         }
162     } else {
163         context->result = -1;
164     }
165 }
166 
CompleteGetIfaceConfig(napi_env env,napi_status status,void * data)167 void NapiEthernet::CompleteGetIfaceConfig(napi_env env, napi_status status, void *data)
168 {
169     if (data == nullptr) {
170         NETMGR_EXT_LOG_E("data is nullptr");
171         return;
172     }
173     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
174     if (context == nullptr) {
175         NETMGR_EXT_LOG_E("context is nullptr");
176         return;
177     }
178     napi_value info = nullptr;
179     napi_value infoFail = nullptr;
180     napi_create_object(env, &info);
181     napi_create_int32(env, context->result, &infoFail);
182     NapiCommon::SetPropertyInt32(env, info, "mode", context->ipMode);
183     NapiCommon::SetPropertyString(env, info, "ipAddr", context->ipAddr);
184     NapiCommon::SetPropertyString(env, info, "route", context->route);
185     NapiCommon::SetPropertyString(env, info, "gateway", context->gateway);
186     NapiCommon::SetPropertyString(env, info, "netMask", context->netMask);
187     NapiCommon::SetPropertyString(env, info, "dnsServers", context->dnsServers);
188     NapiCommon::SetPropertyString(env, info, "domain", context->domain);
189     if (context->callbackRef == nullptr) {
190         if (context->result == -1) {
191             NAPI_CALL_RETURN_VOID_ENHANCE(env, napi_reject_deferred(env, context->deferred, infoFail), context);
192         } else {
193             NAPI_CALL_RETURN_VOID_ENHANCE(env, napi_resolve_deferred(env, context->deferred, info), context);
194         }
195     } else {
196         napi_value callbackValues[CALLBACK_ARGV_CNT] = {nullptr, nullptr};
197         napi_value recv = nullptr;
198         napi_value result = nullptr;
199         napi_value callbackFunc = nullptr;
200         napi_get_undefined(env, &recv);
201         napi_get_reference_value(env, context->callbackRef, &callbackFunc);
202         if (context->result == -1) {
203             callbackValues[ARGV_INDEX_0] = infoFail;
204         } else {
205             callbackValues[ARGV_INDEX_1] = info;
206         }
207         napi_call_function(env, recv, callbackFunc, std::size(callbackValues), callbackValues, &result);
208         napi_delete_reference(env, context->callbackRef);
209     }
210     napi_delete_async_work(env, context->work);
211     delete context;
212     context = nullptr;
213 }
214 
ExecIsIfaceActive(napi_env env,void * data)215 void NapiEthernet::ExecIsIfaceActive(napi_env env, void *data)
216 {
217     if (data == nullptr) {
218         NETMGR_EXT_LOG_E("data is nullptr");
219         return;
220     }
221     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
222     if (context == nullptr) {
223         NETMGR_EXT_LOG_E("context is nullptr");
224         return;
225     }
226     if (context->isIface) {
227         context->ifActivate = DelayedSingleton<EthernetClient>::GetInstance()->IsIfaceActive(context->iface);
228     } else {
229         context->ifActivate = DelayedSingleton<EthernetClient>::GetInstance()->GetAllActiveIfaces().size() > 0;
230     }
231     NETMGR_EXT_LOG_D("ifActivate == [%{public}d]", context->ifActivate);
232 }
233 
CompleteIsIfaceActive(napi_env env,napi_status status,void * data)234 void NapiEthernet::CompleteIsIfaceActive(napi_env env, napi_status status, void *data)
235 {
236     if (data == nullptr) {
237         NETMGR_EXT_LOG_E("data is nullptr");
238         return;
239     }
240     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
241     if (context == nullptr) {
242         NETMGR_EXT_LOG_E("context is nullptr");
243         return;
244     }
245     napi_value info = nullptr;
246     napi_create_int32(env, context->ifActivate, &info);
247     if (context->callbackRef == nullptr) {
248         NAPI_CALL_RETURN_VOID_ENHANCE(env, napi_resolve_deferred(env, context->deferred, info), context);
249     } else {
250         napi_value callbackValues[CALLBACK_ARGV_CNT] = {nullptr, nullptr};
251         napi_value recv = nullptr;
252         napi_value result = nullptr;
253         napi_value callbackFunc = nullptr;
254         napi_get_undefined(env, &recv);
255         napi_get_reference_value(env, context->callbackRef, &callbackFunc);
256         callbackValues[ARGV_INDEX_1] = info;
257         napi_call_function(env, recv, callbackFunc, std::size(callbackValues), callbackValues, &result);
258         napi_delete_reference(env, context->callbackRef);
259     }
260     napi_delete_async_work(env, context->work);
261     delete context;
262     context = nullptr;
263 }
264 
ExecGetAllActiveIfaces(napi_env env,void * data)265 void NapiEthernet::ExecGetAllActiveIfaces(napi_env env, void *data)
266 {
267     if (data == nullptr) {
268         NETMGR_EXT_LOG_E("data is nullptr");
269         return;
270     }
271     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
272     if (context == nullptr) {
273         NETMGR_EXT_LOG_E("context is nullptr");
274         return;
275     }
276     context->ethernetNameList = DelayedSingleton<EthernetClient>::GetInstance()->GetAllActiveIfaces();
277 }
278 
CompleteGetAllActiveIfaces(napi_env env,napi_status status,void * data)279 void NapiEthernet::CompleteGetAllActiveIfaces(napi_env env, napi_status status, void *data)
280 {
281     if (data == nullptr) {
282         NETMGR_EXT_LOG_E("data is nullptr");
283         return;
284     }
285     EthernetAsyncContext *context = static_cast<EthernetAsyncContext *>(data);
286     if (context == nullptr) {
287         NETMGR_EXT_LOG_E("context is nullptr");
288         return;
289     }
290 
291     // creat function return
292     napi_value infoAttay = nullptr;
293     napi_value info = nullptr;
294     if (context->ethernetNameList.size() > 0) {
295         napi_create_array_with_length(env, context->ethernetNameList.size(), &infoAttay);
296         for (size_t index = 0; index < context->ethernetNameList.size(); index++) {
297             napi_create_string_utf8(env, context->ethernetNameList[index].c_str(), NAPI_AUTO_LENGTH, &info);
298             napi_set_element(env, infoAttay, index, info);
299         }
300     } else {
301         napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, &infoAttay);
302     }
303     if (context->callbackRef == nullptr) {
304         NAPI_CALL_RETURN_VOID_ENHANCE(env, napi_resolve_deferred(env, context->deferred, infoAttay), context);
305     } else {
306         napi_value callbackValues[CALLBACK_ARGV_CNT] = {nullptr, nullptr};
307         napi_value recv = nullptr;
308         napi_value result = nullptr;
309         napi_value callbackFunc = nullptr;
310         napi_get_undefined(env, &recv);
311         napi_get_reference_value(env, context->callbackRef, &callbackFunc);
312         callbackValues[CALLBACK_ARGV_INDEX_1] = infoAttay;
313         napi_call_function(env, recv, callbackFunc, std::size(callbackValues), callbackValues, &result);
314         napi_delete_reference(env, context->callbackRef);
315     }
316     napi_delete_async_work(env, context->work);
317     delete context;
318     context = nullptr;
319 }
320 
SetIfaceConfig(napi_env env,napi_callback_info info)321 napi_value NapiEthernet::SetIfaceConfig(napi_env env, napi_callback_info info)
322 {
323     size_t argc = ARGV_NUM_3;
324     napi_value argv[] = {nullptr, nullptr, nullptr};
325     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
326 
327     EthernetAsyncContext *context = new EthernetAsyncContext();
328 
329     NAPI_CALL_ENHANCE(env, napi_get_value_string_utf8(env, argv[ARGV_INDEX_0], context->iface, ETHERNET_NAME_MAX_BYTE,
330                                               &(context->ethernetNameRealBytes)), context);
331 
332     NapiCommon::GetPropertyInt32(env, argv[ARGV_INDEX_1], "mode", context->ipMode);
333     if (context->ipMode == IPSetMode::STATIC) {
334         NapiCommon::GetPropertyString(env, argv[ARGV_INDEX_1], "ipAddr", context->ipAddr);
335         NapiCommon::GetPropertyString(env, argv[ARGV_INDEX_1], "route", context->route);
336         NapiCommon::GetPropertyString(env, argv[ARGV_INDEX_1], "gateway", context->gateway);
337         NapiCommon::GetPropertyString(env, argv[ARGV_INDEX_1], "netMask", context->netMask);
338         NapiCommon::GetPropertyString(env, argv[ARGV_INDEX_1], "dnsServers", context->dnsServers);
339         NapiCommon::GetPropertyString(env, argv[ARGV_INDEX_1], "domain", context->domain);
340     }
341     napi_value result = nullptr;
342     if (argc == ARGV_NUM_2) {
343         if (context->callbackRef == nullptr) {
344             NAPI_CALL_ENHANCE(env, napi_create_promise(env, &context->deferred, &result), context);
345         } else {
346             NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &result), context);
347         }
348     } else if (argc == ARGV_NUM_3) {
349         NAPI_CALL_ENHANCE(env, napi_create_reference(env, argv[ARGV_INDEX_2], CALLBACK_REF_CNT,
350             &context->callbackRef), context);
351     } else {
352         NETMGR_EXT_LOG_E("SetIfaceConfig  exception");
353     }
354 
355     // creat async work
356     napi_value resource = nullptr;
357     napi_value resourceName = nullptr;
358     NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &resource), context);
359     NAPI_CALL_ENHANCE(env, napi_create_string_utf8(env, "SetIfaceConfig", NAPI_AUTO_LENGTH, &resourceName), context);
360     NAPI_CALL_ENHANCE(env, napi_create_async_work(env, resource, resourceName, ExecSetIfaceConfig,
361         CompleteSetIfaceConfig, (void *)context, &context->work), context);
362     NAPI_CALL_ENHANCE(env, napi_queue_async_work(env, context->work), context);
363     return result;
364 }
365 
GetIfaceConfig(napi_env env,napi_callback_info info)366 napi_value NapiEthernet::GetIfaceConfig(napi_env env, napi_callback_info info)
367 {
368     size_t argc = ARGV_NUM_2;
369     napi_value argv[] = {nullptr, nullptr};
370     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
371 
372     EthernetAsyncContext *context = new EthernetAsyncContext();
373 
374     NAPI_CALL_ENHANCE(env, napi_get_value_string_utf8(env, argv[ARGV_INDEX_0], context->iface, ETHERNET_NAME_MAX_BYTE,
375                                               &(context->ethernetNameRealBytes)), context);
376 
377     napi_value result = nullptr;
378     if (argc == ARGV_NUM_1) {
379         if (context->callbackRef == nullptr) {
380             NAPI_CALL_ENHANCE(env, napi_create_promise(env, &context->deferred, &result), context);
381         } else {
382             NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &result), context);
383         }
384     } else if (argc == ARGV_NUM_2) {
385         NAPI_CALL_ENHANCE(env, napi_create_reference(env, argv[ARGV_INDEX_1], CALLBACK_REF_CNT,
386             &context->callbackRef), context);
387     } else {
388         NETMGR_EXT_LOG_E("GetIfaceConfig  exception");
389     }
390 
391     // creat async work
392     napi_value resource = nullptr;
393     napi_value resourceName = nullptr;
394     NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &resource), context);
395     NAPI_CALL_ENHANCE(env, napi_create_string_utf8(env, "GetIfaceConfig", NAPI_AUTO_LENGTH, &resourceName), context);
396     NAPI_CALL_ENHANCE(env, napi_create_async_work(env, resource, resourceName, ExecGetIfaceConfig,
397         CompleteGetIfaceConfig, (void *)context, &context->work), context);
398     NAPI_CALL_ENHANCE(env, napi_queue_async_work(env, context->work), context);
399     return result;
400 }
401 
IsIfaceActive(napi_env env,napi_callback_info info)402 napi_value NapiEthernet::IsIfaceActive(napi_env env, napi_callback_info info)
403 {
404     size_t argc = ARGV_NUM_2;
405     napi_value argv[] = {nullptr, nullptr};
406     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
407 
408     EthernetAsyncContext *context = new EthernetAsyncContext();
409 
410     if (argc != ARGV_NUM_0 && NapiCommon::MatchValueType(env, argv[ARGV_INDEX_0], napi_string)) {
411         NAPI_CALL_ENHANCE(env, napi_get_value_string_utf8(env, argv[ARGV_INDEX_0], context->iface,
412             ETHERNET_NAME_MAX_BYTE, &(context->ethernetNameRealBytes)), context);
413         NETMGR_EXT_LOG_E("IsIfaceActive [%{public}s]", context->iface);
414     }
415     napi_value result = nullptr;
416     if (argc == ARGV_NUM_0) {
417         context->isIface = false;
418         NAPI_CALL_ENHANCE(env, napi_create_promise(env, &context->deferred, &result), context);
419     } else if (argc == ARGV_NUM_1) {
420         if (NapiCommon::MatchValueType(env, argv[ARGV_INDEX_0], napi_function)) {
421             context->isIface = false;
422             NAPI_CALL_ENHANCE(env, napi_create_reference(env, argv[ARGV_INDEX_0], CALLBACK_REF_CNT,
423                 &context->callbackRef), context);
424         } else {
425             context->isIface = true;
426             if (context->callbackRef == nullptr) {
427                 NAPI_CALL_ENHANCE(env, napi_create_promise(env, &context->deferred, &result), context);
428             } else {
429                 NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &result), context);
430             }
431         }
432     } else if (argc == ARGV_NUM_2) {
433         context->isIface = true;
434         NAPI_CALL_ENHANCE(env, napi_create_reference(env, argv[ARGV_INDEX_1], CALLBACK_REF_CNT,
435             &context->callbackRef), context);
436     } else {
437         NETMGR_EXT_LOG_E("IsIfaceActive  exception");
438     }
439 
440     // creat async work
441     napi_value resource = nullptr;
442     napi_value resourceName = nullptr;
443     NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &resource), context);
444     NAPI_CALL_ENHANCE(env, napi_create_string_utf8(env, "IsIfaceActive", NAPI_AUTO_LENGTH, &resourceName), context);
445     NAPI_CALL_ENHANCE(env, napi_create_async_work(env, resource, resourceName, ExecIsIfaceActive, CompleteIsIfaceActive,
446                                           (void *)context, &context->work), context);
447     NAPI_CALL_ENHANCE(env, napi_queue_async_work(env, context->work), context);
448     return result;
449 }
450 
GetAllActiveIfaces(napi_env env,napi_callback_info info)451 napi_value NapiEthernet::GetAllActiveIfaces(napi_env env, napi_callback_info info)
452 {
453     size_t argc = ARGV_NUM_1;
454     napi_value argv[] = {nullptr};
455     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr));
456 
457     EthernetAsyncContext *context = new EthernetAsyncContext();
458     napi_value result = nullptr;
459     if (argc == ARGV_NUM_0) {
460         if (context->callbackRef == nullptr) {
461             NAPI_CALL_ENHANCE(env, napi_create_promise(env, &context->deferred, &result), context);
462         } else {
463             NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &result), context);
464         }
465     } else if (argc == ARGV_NUM_1) {
466         NAPI_CALL_ENHANCE(env, napi_create_reference(env, argv[ARGV_INDEX_0], CALLBACK_REF_CNT,
467             &context->callbackRef), context);
468     } else {
469         NETMGR_EXT_LOG_E("GetAllActiveIfaces  exception.");
470     }
471 
472     // creat async work
473     napi_value resource = nullptr;
474     napi_value resourceName = nullptr;
475     NAPI_CALL_ENHANCE(env, napi_get_undefined(env, &resource), context);
476     NAPI_CALL_ENHANCE(env, napi_create_string_utf8(env, "GetAllActiveIfaces", NAPI_AUTO_LENGTH, &resourceName),
477         context);
478     NAPI_CALL_ENHANCE(env, napi_create_async_work(env, resource, resourceName, ExecGetAllActiveIfaces,
479                                           CompleteGetAllActiveIfaces, (void *)context, &context->work), context);
480     NAPI_CALL_ENHANCE(env, napi_queue_async_work(env, context->work), context);
481     return result;
482 }
483 
DeclareEthernetData(napi_env env,napi_value exports)484 napi_value NapiEthernet::DeclareEthernetData(napi_env env, napi_value exports)
485 {
486     napi_property_descriptor desc[] = {
487         DECLARE_NAPI_STATIC_PROPERTY("STATIC",
488                                      NapiCommon::NapiValueByInt32(env, static_cast<int32_t>(IPSetMode::STATIC))),
489         DECLARE_NAPI_STATIC_PROPERTY("DHCP", NapiCommon::NapiValueByInt32(env, static_cast<int32_t>(IPSetMode::DHCP))),
490     };
491     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
492     return exports;
493 }
494 
DeclareEthernetInterface(napi_env env,napi_value exports)495 napi_value NapiEthernet::DeclareEthernetInterface(napi_env env, napi_value exports)
496 {
497     napi_property_descriptor desc[] = {
498         DECLARE_NAPI_FUNCTION("setIfaceConfig", SetIfaceConfig),
499         DECLARE_NAPI_FUNCTION("getIfaceConfig", GetIfaceConfig),
500         DECLARE_NAPI_FUNCTION("isIfaceActive", IsIfaceActive),
501         DECLARE_NAPI_FUNCTION("getAllActiveIfaces", GetAllActiveIfaces),
502     };
503     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
504     return exports;
505 }
506 
RegisterEthernetInterface(napi_env env,napi_value exports)507 napi_value NapiEthernet::RegisterEthernetInterface(napi_env env, napi_value exports)
508 {
509     DeclareEthernetInterface(env, exports);
510     DeclareEthernetData(env, exports);
511     return nullptr;
512 }
513 
514 static napi_module _ethernetModule = {
515     .nm_version = 1,
516     .nm_flags = 0,
517     .nm_filename = nullptr,
518     .nm_register_func = NapiEthernet::RegisterEthernetInterface,
519     .nm_modname = "net.ethernet",
520     .nm_priv = ((void *)0),
521     .reserved = {0},
522 };
523 
RegisterEthernetModule(void)524 extern "C" __attribute__((constructor)) void RegisterEthernetModule(void)
525 {
526     napi_module_register(&_ethernetModule);
527 }
528 } // namespace NetManagerStandard
529 } // namespace OHOS
530