NLSR路由协议HELLO包机制修改
修改NLSR的hello包机制,为ndnSIM增加优先级队列的机制
修改移动模型:
注释掉nlsr-conf-reader中的269-276行,发现原来读配置文件的信息时节点初始位置距离过远,在划定边界时越界,节点之间不能正常通信,由配置文件分配位置信息改成自己分配位置信息,使用随机位置生成,减小节点之间的初始距离。
1 | nlsrConfReader.m_mobility.SetPositionAllocator ("ns3::RandomRectanglePositionAllocator", |
修改hello-broadcast-protocal:
目标是想记录每次邻居状态信息active和inactive之间相互转换的时间戳。
发现的几个问题,一个是在超时回调的逻辑中原来用的ndn的schedule,sendHelloInterest
中也用到了ndn的schedule,两者之间产生冲突。将超时回调改为了ns3的schedule。
另外就是超时处理的逻辑中抽取兴趣包信息时提取字段出错,应该是/n/e/c1r0,但是提取出了/n/e/Hello,导致后序根据名称遍历邻居修改状态时不能找到对应的邻居,status状态一直为UNKNOWN,出错。
1 | //LZH:2023/10/10 发现neighbor是/n/e/hello,与邻居表中的前缀都不一样,故改成下面的形式 |
然后在setStatusOfNeighbor中打印时间戳即可。
lsdb的更新逻辑:
发送hello兴趣包后收到数据包并通过校验后进入onContentValidated
函数,说明邻居是活跃的,这时候就对原来的邻居状态进行判断,如果原来是inactive,就进入scheduleAdjLsaBuild
,将插入新的LSA。
scheduleAdjLsaBuild
会计划在m_adjLsaBuildInterval
时间后触发 buildAdjLsa()
函数。
进入函数后,判断LSA是否是可构造的,如果是,进入buildAndInstallOwnAdjLsa
,向LSDB中插入新的LSA。
实际读取的拓扑定义写在/home/zhangyu/ndnSIMAll29(复件)/ns-3/src/ndnSIM/utils/topology/ndn-nlsr-topo-parameters.hpp
文件中。
onLsdbModified
触发后面的FIB更新
超时处理:
hello-broadcast-protocol.hpp
增加超时时间记录。用的是ns3的Schedule不是ndnSIM的Schedule。用ndnSIM的Schedule与前面expressinterest中的回调冲突了。
1 | std::map<ndn::Name, ns3::EventId> m_timeout_event; |
HelloBroadcastProtocol::processBroadcastInterest
修改超时逻辑
1 | // 定时新的超时事件 |
ndn-cxx的face和nfd的face:
重新梳理了一下ndn-cxx的face和nfd的face的联系,以hello-protocal来说明的使用来说明其关系。
ndn-cxx的face功能主要在于联系上层的应用和转发层forwarder。HelloBroadcastProtocol::expressInterest
调用了cxx的face发送兴趣包,在face-impl
中对兴趣包编码并通过internal-face
发送,实际调用的是internal-face-client
的send
,其会调用internal-face-forwarder
的receive
,其进一步调用linkservice对兴趣包解码,然后触发afterreceiveinterest
,afterreceiveinterest
触发NFD转发程序,再根据兴趣包的ingress和ongress决定如何将兴趣包转发。
对于常规的NDN的管理信息,其可能会发送到forwarder中发现FIB中没有下一跳,于是就不转发了。而对于Hello包来说,到forwarder中发现FIB中有下一跳,就会将其转发。
lambda表达式:本质上重载了()运算符。
1 | txop->m_callbackDispatchTable = [&egress, this]() { |
增加优先级tag:
参考NDN新增tag的方案_nclientv2网页-CSDN博客
修改forwarder的逻辑:
原来是直接通过face发送,现在是先发送到优先级队列,再由底层队列取。
发现nlsr的同步包前缀是localhop,希望其不入队,只希望Hello包和业务数据入队。
if(GetWifiMacQueue(egress)会对face进行一系列处理,dynamic_cast可以将基类对象转换为派生类对象。
1 | //LZH 2023/10/26, egress是face类型,不是FaceEndPoint |
在底层txop添加回调事件
当信道是空闲状态时,触发
1 | //txop.h |
在dispatchtable中添加包入队和底层队列从上层取包的逻辑
1 | void |
实际的入队函数:
1 | void |
实际的发包流程,底层队列为空,就来调用发包流程。
1 | void |