1 /*
2 * Copyright (c) 2020-2022 Huawei Device Co., Ltd.
3 *
4 * HDF is dual licensed: you can use it either under the terms of
5 * the GPL, or the BSD license, at your option.
6 * See the LICENSE file in the root of this repository for complete details.
7 */
8
9 #include "net_device.h"
10 #include "securec.h"
11
12 #include "osal_mem.h"
13 #include "net_device_impl.h"
14 #include "net_device_adapter.h"
15
16 #define HDF_LOG_TAG "NetDevice"
17
18 static struct NetDeviceImpl *g_netDeviceImplTable[MAX_NETDEVICE_COUNT] = {NULL};
19
FindAvailableTable(uint32_t * index)20 static bool FindAvailableTable(uint32_t *index)
21 {
22 uint32_t i;
23
24 if (index == NULL) {
25 HDF_LOGE("%s Find Available table index error!", __func__);
26 return false;
27 }
28 for (i = 0; i < MAX_NETDEVICE_COUNT; i++) {
29 if (g_netDeviceImplTable[i] == NULL) {
30 *index = i;
31 return true;
32 }
33 }
34 return false;
35 }
36
AddNetDeviceImplToTable(uint32_t index,struct NetDeviceImpl * netDeviceImpl)37 static bool AddNetDeviceImplToTable(uint32_t index, struct NetDeviceImpl *netDeviceImpl)
38 {
39 if (index >= MAX_NETDEVICE_COUNT) {
40 HDF_LOGE("%s error because of not enough space!", __func__);
41 return false;
42 }
43 g_netDeviceImplTable[index] = netDeviceImpl;
44 return true;
45 }
46
DeleteNetDeviceImplFromTable(const struct NetDeviceImpl * netDeviceImpl)47 static void DeleteNetDeviceImplFromTable(const struct NetDeviceImpl *netDeviceImpl)
48 {
49 int32_t i;
50
51 for (i = 0; i < MAX_NETDEVICE_COUNT; i++) {
52 if (g_netDeviceImplTable[i] == netDeviceImpl) {
53 g_netDeviceImplTable[i] = NULL;
54 return;
55 }
56 }
57 return;
58 }
59
InitNetDeviceImpl(NetDevice * nd,NetIfCategory ifCategory)60 static struct NetDeviceImpl *InitNetDeviceImpl(NetDevice *nd, NetIfCategory ifCategory)
61 {
62 struct NetDeviceImpl *ndImpl = NULL;
63 if (nd == NULL) {
64 return NULL;
65 }
66 ndImpl = (struct NetDeviceImpl *)OsalMemCalloc(sizeof(struct NetDeviceImpl));
67 if (ndImpl == NULL) {
68 HDF_LOGE("%s fail: OsalMemCalloc fail!", __func__);
69 return NULL;
70 }
71
72 ndImpl->netDevice = nd;
73 if (RegisterNetDeviceImpl(ndImpl) != HDF_SUCCESS) {
74 HDF_LOGE("%s fail: resiter lite impl fail!", __func__);
75 OsalMemFree(ndImpl);
76 ndImpl = NULL;
77 }
78 return ndImpl;
79 }
80
DeInitNetDeviceImpl(struct NetDeviceImpl * netDeviceImpl)81 static void DeInitNetDeviceImpl(struct NetDeviceImpl *netDeviceImpl)
82 {
83 if (netDeviceImpl == NULL) {
84 HDF_LOGE("%s success : already free!", __func__);
85 return;
86 }
87
88 /* release osPrivate */
89 if (netDeviceImpl->interFace != NULL && netDeviceImpl->interFace->deInit != NULL) {
90 netDeviceImpl->interFace->deInit(netDeviceImpl);
91 }
92
93 /* step 1 : release interFace. step 2 : release netdevice */
94 if (netDeviceImpl->netDevice != NULL) {
95 UnRegisterNetDeviceImpl(netDeviceImpl);
96 OsalMemFree(netDeviceImpl->netDevice);
97 netDeviceImpl->netDevice = NULL;
98 }
99
100 /* last release netDeviceImpl */
101 OsalMemFree(netDeviceImpl);
102 HDF_LOGI("%s success!", __func__);
103 return;
104 }
105
GetImplByNetDevice(const struct NetDevice * netDevice)106 static struct NetDeviceImpl *GetImplByNetDevice(const struct NetDevice *netDevice)
107 {
108 struct NetDeviceImpl *ndImpl = NULL;
109 int32_t i;
110
111 for (i = 0; i < MAX_NETDEVICE_COUNT; i++) {
112 if (g_netDeviceImplTable[i] != NULL && g_netDeviceImplTable[i]->netDevice != NULL) {
113 if (netDevice == g_netDeviceImplTable[i]->netDevice) {
114 ndImpl = g_netDeviceImplTable[i];
115 return ndImpl;
116 }
117 }
118 }
119 HDF_LOGE("%s Get Impl by netdevice failed", __func__);
120 return ndImpl;
121 }
122
123 #ifdef CONFIG_DRIVERS_HDF_NETDEV_EXT
GetLinuxInfByNetDevice(const struct NetDevice * netDevice)124 struct net_device *GetLinuxInfByNetDevice(const struct NetDevice *netDevice)
125 {
126 struct NetDeviceImpl *impl = NULL;
127 struct FullNetDevicePriv *priv = NULL;
128
129 impl = GetImplByNetDevice(netDevice);
130 if (impl == NULL || impl->osPrivate == NULL) {
131 return NULL;
132 }
133
134 priv = (struct FullNetDevicePriv *)impl->osPrivate;
135 return priv->dev;
136 }
137
GetHdfNetDeviceByLinuxInf(struct net_device * dev)138 struct NetDevice *GetHdfNetDeviceByLinuxInf(struct net_device *dev)
139 {
140 struct NetDevice *netDev = NULL;
141 struct FullNetDevicePriv *priv = (struct FullNetDevicePriv *)netdev_priv(dev);
142 netDev = priv->impl->netDevice;
143 return netDev;
144 }
145 #endif
146
NetDeviceInit(const char * ifName,uint32_t len,NetLinkType type,NetIfCategory ifCategory)147 struct NetDevice *NetDeviceInit(const char *ifName, uint32_t len, NetLinkType type, NetIfCategory ifCategory)
148 {
149 NetDevice *netDevice = NULL;
150 struct NetDeviceImpl *ndImpl = NULL;
151 uint32_t index = 0;
152 int32_t ret;
153
154 if ((ifName == NULL) || (strlen(ifName) != len) || (strlen(ifName) > IFNAMSIZ - 1)) {
155 HDF_LOGE("%s fail: ifName = null or len not right!", __func__);
156 return NULL;
157 }
158 netDevice = (NetDevice *)OsalMemCalloc(sizeof(NetDevice));
159 if (netDevice == NULL) {
160 HDF_LOGE("%s fail: OsalMemCalloc fail!", __func__);
161 return NULL;
162 }
163 if (strcpy_s(netDevice->name, IFNAMSIZ, ifName) != EOK) {
164 HDF_LOGE("%s fail: strcpy_s fail!", __func__);
165 OsalMemFree(netDevice);
166 return NULL;
167 }
168 netDevice->netifCateg = ifCategory;
169 ndImpl = InitNetDeviceImpl(netDevice, ifCategory);
170 if (ndImpl == NULL) {
171 HDF_LOGE("%s fail: InitNetDeviceImpl fail!", __func__);
172 OsalMemFree(netDevice);
173 return NULL;
174 }
175 if (FindAvailableTable(&index)) {
176 AddNetDeviceImplToTable(index, ndImpl);
177 } else {
178 DeInitNetDeviceImpl(ndImpl);
179 HDF_LOGE("%s fail: Not extra table.", __func__);
180 return NULL;
181 }
182 /* INIT OSPrivate */
183 ret = HDF_FAILURE;
184 if (ndImpl->interFace != NULL && ndImpl->interFace->init != NULL) {
185 ret = ndImpl->interFace->init(ndImpl);
186 }
187 if (ret != HDF_SUCCESS) {
188 HDF_LOGE("%s fail : interface->init fail!", __func__);
189 DeleteNetDeviceImplFromTable(ndImpl);
190 DeInitNetDeviceImpl(ndImpl);
191 return NULL;
192 }
193 netDevice->linkLayerType = type;
194 HDF_LOGI("Init Net Device success!");
195 return netDevice;
196 }
197
NetDeviceDeInit(struct NetDevice * netDevice)198 int32_t NetDeviceDeInit(struct NetDevice *netDevice)
199 {
200 struct NetDeviceImpl *ndImpl = NULL;
201
202 if (netDevice == NULL) {
203 HDF_LOGI("%s success: already deinit!", __func__);
204 return HDF_SUCCESS;
205 }
206 ndImpl = GetImplByNetDevice(netDevice);
207 if (ndImpl == NULL) {
208 HDF_LOGI("%s success: already free.", __func__);
209 OsalMemFree(netDevice);
210 return HDF_SUCCESS;
211 }
212 DeleteNetDeviceImplFromTable(ndImpl);
213 DeInitNetDeviceImpl(ndImpl);
214 return HDF_SUCCESS;
215 }
216
NetDeviceAdd(struct NetDevice * netDevice)217 int32_t NetDeviceAdd(struct NetDevice *netDevice)
218 {
219 struct NetDeviceImplOp *op = NULL;
220 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
221
222 if (ndImpl == NULL) {
223 HDF_LOGE("%s fail: netDevice not exist!", __func__);
224 return HDF_ERR_INVALID_PARAM;
225 }
226 op = ndImpl->interFace;
227 if (op == NULL || op->add == NULL) {
228 HDF_LOGE("%s fail: Impl Add not exist.", __func__);
229 return HDF_ERR_INVALID_PARAM;
230 }
231 return op->add(ndImpl);
232 }
233
NetDeviceDelete(struct NetDevice * netDevice)234 int32_t NetDeviceDelete(struct NetDevice *netDevice)
235 {
236 struct NetDeviceImplOp *op = NULL;
237 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
238
239 if (ndImpl == NULL) {
240 HDF_LOGE("%s fail: netDevice not exist!", __func__);
241 return HDF_ERR_INVALID_PARAM;
242 }
243 op = ndImpl->interFace;
244 if (op == NULL || op->delete == NULL) {
245 HDF_LOGE("%s fail: Impl op Delete exist.", __func__);
246 return HDF_ERR_INVALID_PARAM;
247 }
248 return op->delete(ndImpl);
249 }
250
NetDeviceGetInstByName(const char * name)251 struct NetDevice *NetDeviceGetInstByName(const char *name)
252 {
253 int32_t i;
254
255 if (name == NULL) {
256 HDF_LOGE("%s fail: name = NULL.", __func__);
257 return NULL;
258 }
259 for (i = 0; i < MAX_NETDEVICE_COUNT; i++) {
260 if (g_netDeviceImplTable[i] != NULL && g_netDeviceImplTable[i]->netDevice != NULL) {
261 if (strcmp(g_netDeviceImplTable[i]->netDevice->name, name) == 0) {
262 return g_netDeviceImplTable[i]->netDevice;
263 }
264 }
265 }
266 HDF_LOGE("%s fail: %s: name not exist.", __func__, name);
267 return NULL;
268 }
269
NetDeviceIsAnyInstRunning(void)270 bool NetDeviceIsAnyInstRunning(void)
271 {
272 struct NetDevice *netDev = NULL;
273 int32_t i;
274
275 for (i = 0; i < MAX_NETDEVICE_COUNT; i++) {
276 if (g_netDeviceImplTable[i] != NULL && g_netDeviceImplTable[i]->netDevice != NULL) {
277 netDev = g_netDeviceImplTable[i]->netDevice;
278 if ((GET_NET_DEV_FLAGS(netDev) & NET_DEVICE_IFF_RUNNING) != 0) {
279 return true;
280 }
281 }
282 }
283 return false;
284 }
285
NetDeviceIsInstRunning(const struct NetDevice * netDevice)286 bool NetDeviceIsInstRunning(const struct NetDevice *netDevice)
287 {
288 if (netDevice == NULL) {
289 return false;
290 }
291 if ((GET_NET_DEV_FLAGS(netDevice) & NET_DEVICE_IFF_RUNNING) != 0) {
292 return true;
293 }
294 return false;
295 }
296
NetDevGetRegisterCount(void)297 uint32_t NetDevGetRegisterCount(void)
298 {
299 uint32_t count = 0;
300 int32_t i;
301
302 for (i = 0; i < MAX_NETDEVICE_COUNT; i++) {
303 if (g_netDeviceImplTable[i] != NULL && g_netDeviceImplTable[i]->netDevice != NULL) {
304 count++;
305 }
306 }
307 return count;
308 }
309
NetDeviceGetCap(void)310 uint32_t NetDeviceGetCap(void)
311 {
312 return MAX_NETDEVICE_COUNT;
313 }
314
NetDeviceGetInstByIndex(uint32_t index)315 struct NetDevice *NetDeviceGetInstByIndex(uint32_t index)
316 {
317 if (index < MAX_NETDEVICE_COUNT) {
318 if (g_netDeviceImplTable[index] != NULL) {
319 return g_netDeviceImplTable[index]->netDevice;
320 } else {
321 return NULL;
322 }
323 }
324 return NULL;
325 }
326
NetIfSetAddr(const struct NetDevice * netDevice,const IpV4Addr * ipAddr,const IpV4Addr * netMask,const IpV4Addr * gw)327 int32_t NetIfSetAddr(const struct NetDevice *netDevice, const IpV4Addr *ipAddr, const IpV4Addr *netMask,
328 const IpV4Addr *gw)
329 {
330 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
331 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->setIpAddr != NULL) {
332 return ndImpl->interFace->setIpAddr(ndImpl, ipAddr, netMask, gw);
333 }
334 HDF_LOGE("%s: netDevice not init or already free.", __func__);
335 return HDF_ERR_INVALID_PARAM;
336 }
337
NetIfRxImpl(const struct NetDevice * netDevice,NetBuf * buff,ReceiveFlag flag)338 static int32_t NetIfRxImpl(const struct NetDevice *netDevice, NetBuf *buff, ReceiveFlag flag)
339 {
340 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
341 ProcessingResult ret = PROCESSING_CONTINUE;
342
343 if (ndImpl == NULL || ndImpl->interFace == NULL || ndImpl->interFace->receive == NULL) {
344 HDF_LOGE("%s: NetIfRxImpl fail : netdevice not exist!", __func__);
345 return HDF_ERR_INVALID_PARAM;
346 }
347
348 /* to do driver special process */
349 if (netDevice->netDeviceIf != NULL && netDevice->netDeviceIf->specialEtherTypeProcess != NULL) {
350 ret = netDevice->netDeviceIf->specialEtherTypeProcess(netDevice, buff);
351 }
352 /* Sent to TCP/IP Stack. */
353 if (ret == PROCESSING_CONTINUE) {
354 return ndImpl->interFace->receive(ndImpl, buff, flag);
355 } else if (ret == PROCESSING_COMPLETE) {
356 HDF_LOGI("NetIfRxImpl specialEtherType Process not need TCP/IP stack!");
357 return HDF_SUCCESS;
358 } else {
359 HDF_LOGE("%s: NetIfRxImpl specialEtherType Process error", __func__);
360 return HDF_FAILURE;
361 }
362 }
363
NetIfSetMacAddr(struct NetDevice * netDevice,const unsigned char * macAddr,unsigned char length)364 int32_t NetIfSetMacAddr(struct NetDevice *netDevice, const unsigned char *macAddr, unsigned char length)
365 {
366 HDF_STATUS ret;
367 struct NetDeviceImpl *ndImpl = NULL;
368
369 if (macAddr == NULL || length != MAC_ADDR_SIZE) {
370 HDF_LOGE("%s fail: input param error!", __func__);
371 return HDF_ERR_INVALID_PARAM;
372 }
373 if (memcpy_s(netDevice->macAddr, MAC_ADDR_SIZE, macAddr, MAC_ADDR_SIZE) != EOK) {
374 HDF_LOGE("%s fail : memcpy_s fail!", __func__);
375 return HDF_FAILURE;
376 }
377 if (netDevice->netDeviceIf != NULL && netDevice->netDeviceIf->setMacAddr != NULL) {
378 ret = netDevice->netDeviceIf->setMacAddr(netDevice, (void*)macAddr);
379 if (ret != HDF_SUCCESS) {
380 HDF_LOGE("%s fail : setMacAddr fail!", __func__);
381 return ret;
382 }
383 }
384 ndImpl = GetImplByNetDevice(netDevice);
385 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->changeMacAddr != NULL) {
386 return ndImpl->interFace->changeMacAddr(ndImpl);
387 }
388 return HDF_FAILURE;
389 }
390
NetIfRx(const struct NetDevice * netDevice,NetBuf * buff)391 int32_t NetIfRx(const struct NetDevice *netDevice, NetBuf *buff)
392 {
393 return NetIfRxImpl(netDevice, buff, IN_INTERRUPT);
394 }
395
NetIfRxNi(const struct NetDevice * netDevice,NetBuf * buff)396 int32_t NetIfRxNi(const struct NetDevice *netDevice, NetBuf *buff)
397 {
398 return NetIfRxImpl(netDevice, buff, NO_IN_INTERRUPT);
399 }
400
NetIfSetStatus(const struct NetDevice * netDevice,NetIfStatus status)401 int32_t NetIfSetStatus(const struct NetDevice *netDevice, NetIfStatus status)
402 {
403 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
404 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->setStatus != NULL) {
405 return ndImpl->interFace->setStatus(ndImpl, status);
406 }
407 HDF_LOGE("%s: netDevice not init or already free.", __func__);
408 return HDF_ERR_INVALID_PARAM;
409 }
410
411 #if defined(CONFIG_DRIVERS_HDF_IMX8MM_ETHERNET)
412 #define NAPI_ADD_NUM (64)
NetIfNapiAdd(struct NetDevice * netDevice,struct napi_struct * napi,int (* poll)(struct napi_struct *,int),int weight)413 void NetIfNapiAdd(struct NetDevice *netDevice, struct napi_struct *napi,
414 int (*poll)(struct napi_struct *, int), int weight)
415 {
416 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
417
418 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->netif_napi_add != NULL) {
419 ndImpl->interFace->netif_napi_add(ndImpl, napi, poll, NAPI_ADD_NUM);
420 }
421 HDF_LOGE("%s: NetIfNapiAdd failed.", __func__);
422 }
423
NetIfGetTxQueue(struct NetDevice * netDevice,unsigned int index)424 struct netdev_queue *NetIfGetTxQueue(struct NetDevice *netDevice, unsigned int index)
425 {
426 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
427
428 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->get_tx_queue != NULL) {
429 return ndImpl->interFace->get_tx_queue(ndImpl, index);
430 }
431 HDF_LOGE("%s: NetIfGetTxqueue failed.", __func__);
432 return NULL;
433 }
434
NetIfTypeTrans(struct NetDevice * netDevice,struct sk_buff * skb)435 __be16 NetIfTypeTrans(struct NetDevice *netDevice, struct sk_buff *skb)
436 {
437 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
438
439 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->type_trans != NULL) {
440 return ndImpl->interFace->type_trans(ndImpl, skb);
441 }
442 HDF_LOGE("%s: NetIfEnteRx failed.", __func__);
443 return NULL;
444 }
445
NetIfEnteAllocBuf(struct NetDevice * netDevice,uint32_t length)446 struct sk_buff *NetIfEnteAllocBuf(struct NetDevice *netDevice, uint32_t length)
447 {
448 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
449
450 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->alloc_buf != NULL) {
451 return ndImpl->interFace->alloc_buf(ndImpl, length);
452 }
453 HDF_LOGE("%s: NetIfEnteAllocBuf failed.", __func__);
454 return NULL;
455 }
456
NetIfStartQueue(struct NetDevice * netDevice)457 void NetIfStartQueue(struct NetDevice *netDevice)
458 {
459 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
460
461 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->start_queue != NULL) {
462 ndImpl->interFace->start_queue(ndImpl);
463 }
464 HDF_LOGE("%s: NetIfStartAllqueue failed.", __func__);
465 }
466
NetIfDisableTx(struct NetDevice * netDevice)467 void NetIfDisableTx(struct NetDevice *netDevice)
468 {
469 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
470
471 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->disable_tx != NULL) {
472 ndImpl->interFace->disable_tx(ndImpl);
473 }
474 HDF_LOGE("%s: NetIfDisableTx failed.", __func__);
475 }
476
NetIfSetDev(struct NetDevice * netDevice,struct device * dev)477 void NetIfSetDev(struct NetDevice *netDevice, struct device *dev)
478 {
479 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
480
481 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->set_dev != NULL) {
482 ndImpl->interFace->set_dev(ndImpl, dev);
483 }
484 HDF_LOGE("%s: NetIfSetDev failed.", __func__);
485 }
486
NetIfWakeQueue(struct NetDevice * netDevice)487 void NetIfWakeQueue(struct NetDevice *netDevice)
488 {
489 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
490
491 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->wake_queue != NULL) {
492 ndImpl->interFace->wake_queue(ndImpl);
493 }
494 HDF_LOGE("%s: NetIfWakequeue failed.", __func__);
495 }
496
NetIfOfPhyConnect(struct NetDevice * netDevice,struct device_node * phy_np,void (* hndlr)(struct net_device *),u32 flags,phy_interface_t iface)497 struct phy_device *NetIfOfPhyConnect(struct NetDevice *netDevice,
498 struct device_node *phy_np,
499 void (*hndlr)(struct net_device *),
500 u32 flags,
501 phy_interface_t iface)
502 {
503 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
504
505 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->of_phyconnect != NULL) {
506 return ndImpl->interFace->of_phyconnect(ndImpl, phy_np, hndlr, 0, iface);
507 }
508 HDF_LOGE("%s: NetIfOfPhyConnect failed.", __func__);
509 return NULL;
510 }
511 #endif
512
NetIfSetLinkStatus(const struct NetDevice * netDevice,NetIfLinkStatus status)513 int32_t NetIfSetLinkStatus(const struct NetDevice *netDevice, NetIfLinkStatus status)
514 {
515 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
516 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->setLinkStatus != NULL) {
517 return ndImpl->interFace->setLinkStatus(ndImpl, status);
518 }
519 HDF_LOGE("%s: netDevice not init or already free.", __func__);
520 return HDF_ERR_INVALID_PARAM;
521 }
522
NetIfGetLinkStatus(const struct NetDevice * netDevice,NetIfLinkStatus * status)523 int32_t NetIfGetLinkStatus(const struct NetDevice *netDevice, NetIfLinkStatus *status)
524 {
525 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
526 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->getLinkStatus != NULL) {
527 return ndImpl->interFace->getLinkStatus(ndImpl, status);
528 }
529 HDF_LOGE("%s: netDevice not init or already free.", __func__);
530 return HDF_ERR_INVALID_PARAM;
531 }
532
NetIfDhcpsStart(const struct NetDevice * netDevice,char * ip,uint16_t ipNum)533 int32_t NetIfDhcpsStart(const struct NetDevice *netDevice, char *ip, uint16_t ipNum)
534 {
535 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
536 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->dhcpsStart != NULL) {
537 return ndImpl->interFace->dhcpsStart(ndImpl, ip, ipNum);
538 }
539 HDF_LOGE("%s: netDevice not init or already free.", __func__);
540 return HDF_ERR_INVALID_PARAM;
541 }
542
NetIfDhcpsStop(const struct NetDevice * netDevice)543 int32_t NetIfDhcpsStop(const struct NetDevice *netDevice)
544 {
545 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
546 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->dhcpsStop != NULL) {
547 return ndImpl->interFace->dhcpsStop(ndImpl);
548 }
549 HDF_LOGE("%s: netDevice not init or already free.", __func__);
550 return HDF_ERR_INVALID_PARAM;
551 }
552
NetIfDhcpStart(const struct NetDevice * netDevice)553 int32_t NetIfDhcpStart(const struct NetDevice *netDevice)
554 {
555 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
556 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->dhcpStart != NULL) {
557 return ndImpl->interFace->dhcpStart(ndImpl);
558 }
559 HDF_LOGE("%s: netDevice not init or already free.", __func__);
560 return HDF_ERR_INVALID_PARAM;
561 }
562
NetIfDhcpStop(const struct NetDevice * netDevice)563 int32_t NetIfDhcpStop(const struct NetDevice *netDevice)
564 {
565 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
566 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->dhcpStop != NULL) {
567 return ndImpl->interFace->dhcpStop(ndImpl);
568 }
569 HDF_LOGE("%s: netDevice not init or already free.", __func__);
570 return HDF_ERR_INVALID_PARAM;
571 }
572
NetIfDhcpIsBound(const struct NetDevice * netDevice)573 int32_t NetIfDhcpIsBound(const struct NetDevice *netDevice)
574 {
575 struct NetDeviceImpl *ndImpl = GetImplByNetDevice(netDevice);
576 if (ndImpl != NULL && ndImpl->interFace != NULL && ndImpl->interFace->dhcpIsBound != NULL) {
577 return ndImpl->interFace->dhcpIsBound(ndImpl);
578 }
579 HDF_LOGE("%s: netDevice not init or already free.", __func__);
580 return HDF_ERR_INVALID_PARAM;
581 }
582
583 /*
584 * Alloc a net buffer for the net device and reserve headroom depended on net device setting
585 *
586 * @param : dev The net device
587 * size The net buffer size
588 * @return : A new net buffer on success or NULL on fail
589 */
NetBufDevAlloc(const struct NetDevice * dev,uint32_t size)590 NetBuf *NetBufDevAlloc(const struct NetDevice *dev, uint32_t size)
591 {
592 uint32_t reserve = 0;
593 NetBuf *nb = NULL;
594
595 if (dev != NULL) {
596 reserve = dev->neededHeadRoom + dev->neededTailRoom;
597 }
598
599 size += reserve;
600
601 nb = NetBufAlloc(size);
602 if (nb == NULL) {
603 return NULL;
604 }
605
606 if (dev != NULL) {
607 nb->dev = (void *)dev;
608 NetBufPop(nb, E_TAIL_BUF, dev->neededHeadRoom);
609 NetBufPop(nb, E_DATA_BUF, dev->neededHeadRoom);
610 }
611
612 return nb;
613 }
614