这是一个指向pbuf类型的指针,它用于指向下一个pbuf结构体。由于每个MAC包的数据段最大只是1500字节,而来自上层的数据包往往很大,LwIP把大数据包分装到多个pbuf结构体,并把这些pbuf组成链表,通过next指针来索引。
(2) payload
这是一个指向实际数据的指针。当MAC控制器接收到MAC数据包时,整个MAC包(包括MAC地址)直接被存储到payload指向的存储区。
(3) tot_len和len
len成员表示本pbuf结构体的长度,tot_len表示本pbuf及下一个pbuf (next指向的pbuf)长度的和。len等于它的tot_len,就可以判断链表的结束。 (4) type和flags
type表示pbuf的存储类型,共有四种,分别为PBUF_RAM、PBUF_ROM、PBUF_REF和PBUF_POOL,针对不同的应用而使用不同的存储方式。flags在存储分配时被赋值为0,作用不明,可能是作者为了兼容而保留的。
(5) ref
ref用于记录pbuf的访问次数,在LwIP中存在一根据访问次数来决定内存释放的机制 netif初始化指向了enc28j60,后期调用均调用enc28j60这个网卡 (1) next
这个next指针是netif结构体类型,它与pbuf的next指针作用类似,也是用作链表。netif结构体是用来存储网卡属性的,由netif结构体构成的链表即表示同一个设备上不同网卡的属性,LwIP就通过本next指针访问这个链表。
(2) ip_addr、netmask和gw
这三个结构体成员分别用来存储本网卡的IP地址、子网掩码和网关。
(3) err_t (* input)(structpbuf *p, structnetif *inp) 初始化为ethernet_input() 这个函数是用来接收底层硬件输入的数据包的。
(4) err_t (* output)(structnetif *netif, structpbuf *p, structip_addr *ipaddr) 它指向一个用于IP层输出的函数,初始化为etharp_output。调用下层(5)函数。 (5) err_t (* linkoutput)(structnetif *netif, structpbuf *p)
这个函数指针是指向最底层的网卡发送数据包函数,初始化为low_level_output。output函数把它的输入参数IP地址转化成MAC地址后,添加到pbuf的payload成员,组成完整MAC包,再由本函数linkoutput输出到网络中。 (6) state 初始化为null
(7) mtu在low_level_init函数,软件实现
MAC数据段的最大长度为1500字节,所以本成员我们一般会直接赋值为1500。 (8) hwaddr_len和hwaddr[NETIF_MAX_HWADDR_LEN]
hwaddr_len存储的是MAC地长度,hwaddr[]数组则存储了本网卡的MAC完整地址。调用enc28j60Init(netif->hwaddr);写进网卡
(9) flags在low_level_init函数
本成员保存了网卡允许使用的功能,如使用广播地址、ARP功能等。
(10) char name[2]和u8 num在ethernetif_init函数初始化
ame用于保存网络接口的名字当网络接口名字出现相同的时候,使用num的数值进行区分,初始化num为0,表示只有一个网卡。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务