dsr路由流程

来源:百度知道 编辑:UC知道 时间:2024/05/27 19:19:45
哥哥些 急啊啊啊啊啊啊暗暗啊啊啊啊啊啊
跪求啊!!!!

nexthop_list_init(); 初始化下一跳列表,主要用来保存下一跳的信息,确定ack的请求机会
gw_list_init(); 初始化网关列表
routecache_init(); 初始化路由缓存
reqtable_init(); 初始化路由请求表,记录收到的路由请求的信息
rtsmbuffer_init(); 初始化重发缓冲区,保存发出数据中,需要ack回复的数据报的信息
sendbuffer_init(); 初始化发送缓冲区 ,临时存储 发送路由请求之后,受到路由应答请求之前,发送的数据报
dsr_stat_init(); 初始化统计信息
init_packet_queue(); 初始化用户空间队列
对全局变量 ipq_queue_t q 进行初始化,
注册一个处理netfilter队列的函数 netfilter_receive,一旦有数据进入队列就调用,做两件事情:
1.调用ipq_enqueue函数(收到的包和发出的包都由他加入到q队列中,进入的包有dsr头,而发出的包没有dsr头,所以在程序中使用了两次switch来吧接受的发送的udp包添加的q中)
发出的hello包,info设置为空,根据不同的协议头,把元素加入到不同的list中
接受到的数据包,info字段是由netfileter自己填写的
2.唤醒dsr进程。
startup_dsr(); 创建DSR进程,负责处理用户空间队列的数据报
注册pre_route local_out gw_post_route3个钩子 ,gw_post_route为最后一个被调用的钩子
pre_route 钩子
1如果发现数据包中dsrhdr的头部需要ack标志为1,则直接发送一个ack回复,不进入用户空间排队。
2如果是ack数据包,也就是下游节点返回的ack应答,然后进入dsr_in_ack_op_handler中进行处理,之前的判断已经没有必要了,不过还是按照从前的习惯保留了。其中在dsr_in_ack_op_handler中调用