一个算是正常的中国码农!
分类: 嵌入式
2013-07-16 15:51:35
由于网络字节序是大端模式,ARM体系用的是小端模式,所以代码中很多地方用到了大小端的转换
一、接收,从函数所在的C文件也可以看出组包分包的流程
1、(Hardware.c)以太网接收中断入口函数EthernetIntHandler,当接收到一个帧时,产生ETH_INT_RX中断,调用Rec_Packet函数接收以太网MAC帧
if(ulTemp & ETH_INT_RX) /*判断是否为接收中断*/
{
Rec_Packet(); /*在中断里处理接收函数*/
}
2、(Ethernet.c)调用EthernetPacketGetNonBlocking函数,将以太网MAC帧从接收FIFO读取到接收缓冲区REC_BUFF,并调用Rec_Ethernet_Packed
3、(Ethernet.c)Rec_Ethernet_Packed解析并处理MAC帧,取出IP帧,调用IP_PROCESS
4、(Ip.c)IP_PROCESS解析IP帧,分析包类型,通过uCOS-II的消息队列机制通知应用层(应用层有一个等待消息队列的任务)
这一步是为了减少中断函数响应时间,将费时的拷贝和接收任务交给应用层处理
5、(应用层)等待消息队列的任务接收到消息队列,示例中为UDP包,调用Udp_Process处理此包
6、(Udp.c)Udp_Process首先将UDP数据包拷贝到UDP接收缓冲区UdpRecBuff,又通过uCOS-II的信号量机制通知套接字接口recvfrom
7、(zlg_socket.c)recvfrom阻塞等待信号量投递过来的udp数据包
8、应用层调用套接字recvfrom获取udp数据
二、发送,原理上是接收的逆过程,简述如下
1、应用层调用sendto发送数据包
2、(zlg_socket.c)sendto为IP组包做准备,调用Send_Ip_Frame
3、(Ip.c)Send_Ip_Frame执行IP组包,调用Send_Ip_To_LLC为IP数据包的目标IP查找MAC地址,并发送
4、(Ethernet.c)Send_Ip_To_LLC按照正确的MAC调用Send_ethernet_Frame为IP、ARP数据包产生ETHERNET包头,并发送
5、(Ethernet.c)Send_ethernet_Frame调用Send_Packet发送该帧
6、(Hardware.c)Send_Packet调用底层驱动程序发送数据包,所有的数据发送都要通过该程序
7、(Ethernet.c)底层驱动EthernetPacketPut调用EthernetPacketPutInternal将数据移到发送Fifo执行发送