
Lwip的文件组织
Lwip/src/api文件夹
Lwip/src/core文件夹
Dhcp.c : dhcp服务相关
Inet.c : 校验和的计算以及主机网络字节转换函数
Mem.c : 内存管理函数集
Memp.c : 以数据结构为参数提供内存申请服务
Netif.c : 网络接口服务集合
Pbuf.c : pbuf结构服务集合
Stats.c : 定义一个struct stats_lwip_stats的全局变量以及初始化
Sys.c : 系统服务集合,建立在用户提供的原始系统服务之上
Udp.c : 一系列Udp层的函数,详细见tcp.c
Tcp.c : 还包括tcp_in.c、tcp_input.c、tcp_out.c、tcp_output.c。 一系列Tcp层的函数,存在于Tcpip主进程中。主动函数包括tcp_bind,tcp_send等,在api_msg.c中的do_xxx()调用。被动函数tcp_input()被ip_input调用;还有一个安装tcp_pcb(也在该文件中定义,链表结构)回调函数的函数tcp_recv。
Lwip/src/core/ipv4文件夹
Lwip/src/include/lwip文件夹
Lwip/src/netif和Lwip/src/include/netif文件夹
Lwip的移植
Lwip/src/core/arch和Lwip/src/include/arch文件夹下
包括Ucos下的信号量、邮箱、进程、定时器相关等。
Lwip/src/netif和Lwip/src/include/netif文件夹下
Ethif_cs00a.c : 按ethernetif.c移植的cs00a接口驱动
Ethif_cs00a.h : cs00a的寄存器定义。
Lwip的代码关系
两类消息API消息(apimsg来自应用程序),input消息(input来自链路层-网卡芯片)
结构体tcpip_msg
Enum tcpip_msg_type { TCPIP_MSG_API,
TCP_MSG_INPUT };
Struct tcpip_msg {
Enum tcpip_msg_type type;
Sys_sem_t *sem;
Union
{
Struct api_msg *apimsg;
Struct
{
Struct pbuf *p;
Struct netif *netif;
}inp;
}msg;
}
………….api_msg 结构、netif结构、pbuf结构
发送数据流程:(从TCP开始,再上层的略去)
Tcp_writetcp_enqueuetcp_output()ip_route()和ip_output_ip()
Netif→output(){point to tcpip_output()}tcpip_thread() 消息处理机制,相当于缓冲区
ip_output()low_level_outputcs00a的寄存器操作(将pbuf内数据放到寄存器中)
使用消息机制,将接收(或发送)帧数据和协议处理两个过程分开。
读数据流程:(到TCP为止,再上层的略去)
一帧数据来中断ethernetif_input()low_level_inputcs00a的寄存器操作
(将寄存器中的数据放到pbuf中)
Netif→input{point to tcpip_input()}tcpip_thread() 消息处理机制,相当于缓冲区
ip_input()tcp_input()tcp_process()tcp_receive()
说明:包头长度在0100~1111之间,即4~15即包头长度在20~60Byte间,一般为20
Identifer、flag、frame offset用于拆分包的信息,包重组时要用到。
TTL生存周期,每经过一个路由器,路由器都将该值减1.
Protocol:1—ICMP 2—IGMP 6—TCP 17—UDP 88—IGRP —OSPF
Header Checksum:头部校验
