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