Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186100
  • 博文数量: 21
  • 博客积分: 218
  • 博客等级: 二等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-03 14:50
个人简介

技术宅

文章存档

2020年(3)

2018年(1)

2017年(2)

2016年(1)

2015年(1)

2013年(1)

2012年(3)

2011年(9)

我的朋友

分类:

2012-03-28 21:24: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执行发送

阅读(2437) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~