带网关DSR路由协议的流程

本文详细介绍了DSR路由协议的初始化流程,包括网关和下一跳列表的初始化、路由缓存和请求表的建立、数据包处理机制等。在数据包处理中,重点讨论了DSR头部字段的处理,如DSR_SRC_OPT、DSR_IN_OPT、DSR_FORWARD_OPT等,并涉及到网关发现、路由请求和应答的交互。此外,还阐述了数据包在pre_route、local_out和gw_post_route钩子函数中的处理逻辑,以及在DSR进程中的操作。
摘要由CSDN通过智能技术生成

 

初始化部分的流程

 

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中调用rtsmbuffer_ack_del函数,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值