lwip中各种函数,标志位的总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mem_init( ) 内存堆的初始化函数,主要是告知内存堆的起止地址,以及初始化空闲表,由lwip 初始化时自己调用,该接口为内部私有接口,不对用户层开放
mem_malloc( ) 申请分配内存。
将总共需要的字节数作为参数传递给该函数,返回值是指向最新分配的内存的指针,而如果内存没有分配好,则返回值是NULL
mem_calloc( ) 是对mem_malloc( )函数的简单包装,他有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小,与mem_malloc()不同的是它会把动态分配的内存清零。
有经验的程序员更喜欢使用mem_ calloc (), memp_num:这个静态数组用于保存各种类型缓冲池的成员数目memp_sizes:这个静态数组用于保存各种类型缓冲池的结构大小memp_tab:这个指针数组用于指向各种类型缓冲池当前空闲节点
memp_init():内存池的初始化,主要是为每种内存池建立链表memp_tab,其链表是逆序的,此外,如果有统计功能使能的话,也把记录了各种内存池的数目。
memp_malloc():如果相应的memp_tab链表还有空闲的节点,则从中切出一个节点返回,
否则返回空。
memp_free()把释放的节点添加到相应的链表memp_tab头上。
系统是调用内存堆分配函数mem_malloc进行内存分配的。
分配
空间的大小包括pbuf结构头大小SIZEOF_STRUCT_PBUF,需要的数据存储空间大小length,还有一个offset系统是调用内存堆分配函数mem_malloc进行内存分配的。
段区域的offset的大小,这段区域用来存储数据的包头,如TCP包头,IP包头等
pbuf_free(A)函数来删除pbuf结构
PBUF_POOL 类型和PBUF_ROM类型、PBUF_REF类型需要通过memp_free()函数删除,PBUF_RAM类型需要通过mem_free()函数删除
memp_memory是缓冲池的起始地址,前面已有所讨论; MEMP_MAX是POOL 类型数; memp_tab 用于指向某类POOL 空闲链表的起始节点;memp_num表示各种类型POOL的个数; memp_sizes表示各种类型单个POOL的大小,对于MEMP_PBUF_POOL和MEMP_PBUF型的POOL,其大小是pbuf 头和pbuf可装载数据大小的总和。
网络接口
在LWIP中,是通过一个叫做netif的网络结构体来描述一个硬件网络接口的
struct netif {
struct netif *next; // 指向下一个netif结构的指针
struct ip_addr ip_addr; // IP 地址相关配置struct ip_addr netmask;
struct ip_addr gw;
err_t (* input)(struct pbuf *p, struct netif *inp); //调用这个函数可以从网卡上取得一个数据包
err_t (* output)(struct netif *netif, struct pbuf *p, // IP 层调用这个函数可以向网卡发送
structip_addr*ipaddr); //一个数据包
err_t (* linkoutput)(struct netif *netif, struct pbuf *p); // ARP
模块调用这个函数向网卡发送一个数据包
void *state; // 用户可以独立发挥该指针,用于指向用户关心的网卡信息
u8_t hwaddr_len; // 硬件地址长度,对于以太网就是MAC地址长度,为6各字节
u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; //MAC 地址
u16_t mtu; // 一次可以传送的最大字节数,对于以太网一般设为1500
u8_t flags; // 网卡状态信息标志位
char name[2]; // 网络接口使用的设备驱动类型的种类u8_t num; // 用来标示使用同种驱动类型的
不同网络接口
};
output字段向一个函数该函数的三个参数是pbuf类型、netif 类型和
ip_addr类型,返回参数是err_t类型。
其中pbuf代表要发送的数据包。
ipaddr 代表网卡需要将该数据包发送到的地址,该地址应该是接收实际的链路层帧的主机的Ip地址
ethernetif_init底层接口初始化函数
tcpip_input 函数是向IP层递交数据包的函数
netif->next = netif_list; //将初始化后的节点插入链表netif_list netif_list = netif; // netif_list 指向链表头
low_level_init(netif); //底层硬件初始化函数
static void low_level_init(struct netif *netif)
{
netif->hwaddr_len = ETHARP_HWADDR_LEN; //设置变量enc28j60的hwaddr_len字段
netif->hwaddr[0] = 'F'; //初始化变量enc28j60的MAC地址netif-
>hwaddr[1] = 'O'; //设什么地址用户自由发挥吧,但是不要与其他网络设备的MAC地址重复。
netif->hwaddr[2] = 'R';
netif->hwaddr[3] = 'E';
netif->hwaddr[4] = 'S';
netif->hwaddr[5] = 'T';
netif->mtu = 1500//最大允许传输单元
netif->flags = NETIF_FLAG_BROADCAST | \
NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
enc28j60_init(netif->hwaddr); //与底层驱动硬件驱动程序密切相关的硬件初始化函数
}
netif_set_default函数初始化缺省网络接口。
协议栈除了
有个netif_list全局变量指向netif网络接口结构的链表,还有个全局变量netif_default全局变量指向缺省的网络接口结构。
以太网的数据接收
LWIP使用了一个eth_hdr的数据结构来描述以太网数据包包头的14个字节
关于网卡数据包的接收和发送。
LWIP 中实现了接收一个数据包和发送一个数据包函数的框架,这两个函数分别是low_level_input和low_level_outpu
PACK_STRUCT_xxx都是与编译器字对齐相关的宏定义
htons(ethhdr->type)函数的使用,htons函数的功能是将一个。