Chinaunix首页 | 论坛 | 博客
  • 博客访问: 781441
  • 博文数量: 37
  • 博客积分: 575
  • 博客等级: 中士
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-12 10:43
个人简介

活到老,学到老!

文章分类

全部博文(37)

文章存档

2019年(4)

2018年(4)

2015年(1)

2014年(14)

2011年(1)

2010年(13)

我的朋友

分类: 嵌入式

2010-12-20 11:00:57

由于网络字节序是大端模式,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执行发送

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

jany652011-03-28 16:53:45

我现在在学《TCP/IP详解》第二卷 实现,看的感觉云里雾里的,刚才看了你发表的这篇文章,感觉你已经弄清了其中的来龙去脉,很想知道你是怎么去做的,谢谢!