🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
low\_level\_output()函数只是完成了网卡驱动接收,但是还没将pbuf数据包递交给上层,那么又是谁将pbuf数据包递交给上层的呢?我们在前面讲解4.3 小节的时候,就知道ethernetif\_input()函数会被周期性调用(如果是采用操作系统方式,往往会将该函数变成线程形式运行),这样子就能接收网卡的数据,在接收完毕,就能将数据通过网卡netif的input接口将pbuf递交给上层,该函数的实现具体见: ``` 1 void ethernetif_input(struct netif *netif) 2 { 3 err_t err; 4 struct pbuf *p; 5 6 /* move received packet into a new pbuf */ 7 p = low_level_input(netif); 8 9 /* no packet could be read, silently ignore this */ 10 if (p == NULL) return; 11 12 /* entry point to the LwIP stack */ 13 err = netif->input(p, netif); 14 15 if (err != ERR_OK) 16 { 17 LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); 18 pbuf_free(p); 19 p = NULL; 20 } 21 } ```