ucos+lwip学习总结
Ucos+Lwip学习总结 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_cs8900a.c : 按ethernetif.c移植的cs8900a接口驱动 Ethif_cs8900a.h : cs8900a的寄存器定义。
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_write,tcp_enqueue,tcp_output(),ip_route()和ip_output_ip(),
Netif?output(){point to tcpip_output()},tcpip_thread() 消息处理机制,相当于缓冲区 ,ip_output(),low_level_output,cs8900a的寄存器操作(将pbuf内数据放到寄存器中)
使用消息机制,将接收(或发送)帧数据和
处理两个过程分开。
读数据流程:(到TCP为止,再上层的略去)
一帧数据来中断,ethernetif_input(),low_level_input,cs8900a的寄存器操作 (将寄存器中的数据放到pbuf中)
,Netif?input{point to tcpip_input()},tcpip_thread() 消息处理机制,相当于缓冲区 ,ip_input(),tcp_input(),tcp_process(),tcp_receive()
Ip路由部分在此处
理
Ethernet v2 帧格式
6Byte2Byte6Byte
源MAC地址目的MAC地址协议类型数据
0800 IP包
0808 ARP包
数据中IP包头格式
4Byte4Byte8Byte16Byte
包头长度IP版本包总长度(32bit的整服务类
(包含包头,字节单位)数倍)
Frame offsetFlagIdentify(13位)(3位)
Header ChecksumTTLProtocol(CRC校验)
源IP地址
目的IP地址
OptionsPadding
说明:包头长度在0100~1111之间,即4~15即包头长度在20~60Byte间,一般为20
Identifer、flag、frame offset用于拆分包的信息,包重组时要用到。
TTL生存周期,每经过一个路由器,路由器都将该值减1.
Protocol:1—ICMP 2—IGMP 6—TCP 17—UDP 88—IGRP 89—OSPF
Header Checksum:头部校验