• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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