路由转发设计与实现

一、总体流程与代码流程

总体流程如下

 

解释:

 

一、接收数据流程

  使用中断网络唤醒网络设备  

  设备测试链路状态    

  收到链路包(Ethernet)

  为数据包分配内存

  将数据包载入已分配的内存空间

  将数据包载入backlog队列

  设置标志字段

  释放当前进程的控制权

 

dev_queue_xmit()  - net/core/dev.c

  调用 start_bh_atomic()

  如果 device 有 queue

    调用enqueue()将数据包压入队列

    调用 qdisc_wakeup()  唤醒设备

  或者

     调用 hard_start_xmit()

  调用 end_bh_atomic() 结束

 

 

 

运行网络 “Buttfon Half”

  调度器调用进程

  发送所有等待的数据,net_bh结构中定义的数据

  查看当前队列中所有数据包,将数据包发送给IP

  刷新队列

  退出bottom half

 

 

 

 

在IP层检查数据包

  检查数据包错误? too short, too long, invalid version, checksum error?

  如果需要,重组数据包

  获取数据包的路由信息

  将数据包发送给目的方法(loopback, frowarding)

 

在IP层转发数据包

  检查TTL字段,并且减1

  检查路由选项

    如果有问题发送ICMP消息

  将数据包复制到新的缓冲区释放旧的数据包

  设置IP选项参数

  如果数据太大,对数据包进行分片

  将数据包发送给路由器匹配的网络出口

 

 

传输数据包

  将数据包放在设备出口队列

  唤醒网络设备

  等待调度进程运行网络设备驱动程序

  设备测试链路

  发送以太网头部

  告诉总线已经传输完成

 

posted @ 2017-12-26 11:12  elewei  阅读(585)  评论(0)    收藏  举报