(9) 调用函数netif_set_up使能网络接口,这通过一个简单语句来实现: netif->flags |= NETIF_FLAG_UP; 至此,网卡初始化完成,能正常接收和发送数据包了。下面我们来讨论讨论关于网卡数据包的接收和发送。 LWIP中实现了接收一个数据包和发送一个数据包函数的框架,这两个函数分别是low_level_input和low_level_output,用户需要使用实际网卡驱动程序完成这两个函数。在第一篇中讲过,一个典型的LWIP应用系统包括这样的三个进程:首先是上层应用程序进程,然后是LWIP协议栈进程,最后是底层硬件数据包接收进程。这里我们就来讲讲第三个进程,看看数据包是怎样被接收并往上层传递的。但在这之前,有必要说说以太网网卡所收到的数据包的格式。如下图,
LWIP使用了一个eth_hdr的数据结构来描述以太网数据包包头的14个字节。如下, PACK_STRUCT_BEGIN struct eth_hdr { PACK_STRUCT_FIELD(struct eth_addr dest); //目标MAC地址 PACK_STRUCT_FIELD(struct eth_addr src); //源MAC地址 PACK_STRUCT_FIELD(u16_t type); //类型 } PACK_STRUCT_STRUCT; PACK_STRUCT_END 其中PACK_STRUCT_xxx都是与编译器字对齐相关的宏定义,这里不作详细介绍了。上面的dest、src和type三个字段分别和上图中的目的MAC地址、源MAC地址和类型域字段对应。 在上面讨论的基础上,我们来看看这个数据包接收进程,源代码如下:
|