我正在研究无线路由协议。我在每个节点都创建了一个队列。在这个队列中,每个节点都保存着它已经传输的数据包。如果下一跳没有传输数据包,则前一个节点将在超时后重新传输数据包。问题是当节点试图通过在句柄函数中调用 postRotingHook 来重新传输数据包时,它什么也不做。这个 postRoutingHook 是在本地创建的,因此它实际上并没有发送数据包。那么如何将这个数据包连接到网络进行重传呢?
示例:假设我们有 3 个节点 A、B 和 C。A 是源,B 是中间,C 是目的地。节点 A 最初发送了一个数据包。现在节点 B 将把它转发给节点 C。此时节点 A 将听到这个数据包,它会取消计时器并将这个数据包从它的队列中删除。(在正常情况下)
假设节点B由于某种原因无法转发数据包,那么节点A应该在超时后重新传输数据包。我无法实现此功能。
我的编程场景是:我修改了 GPSR 协议。其中头文件定义了这 5 个 INetfilterHooks 方法。我没有使用任何控制包,例如请求、响应、信标等。我直接处理包含一些控制信息的数据包。我在 datagramPreRoutingHook() 方法(从下层接收数据时)和 datagramLocalOutHook() 方法(从上层接收数据时)实现了我的逻辑。
源节点(在网络层)在调用 datagramLocalOutHook(datagram, destIE, nextHopAddr) 时使用 handlePacketFromHL() ->datagramLocalOutHook(datagram, destIE, nextHopAddr) == INetfilter::IHook::ACCEPT) 从 IPv4.cc 上层接收数据包) 然后控制转到我的路由协议。它进行必要的更改,添加源地址,目标地址,创建选项并将数据包保留在队列中(用于通过调度计时器重新传输),然后返回 ACCEP。然后控制再次转到 IPv4.cc。
在此过程之后,如果我的协议发生超时,则我无法将数据包发送到 IPv4.cc。我调用 postRoutingHook 重新传输数据包,然后它简单地返回 ACCEPT(如头文件中定义的那样)并且什么都不做。我试图通过在我的协议中创建 IPv4 对象来调用 IPv4.cc 的一些方法,但是这些方法受到保护,因此我无法访问这些方法。我尝试制作一些 IPv4.cc 的公共方法,但它在进一步阶段给出错误。
我试图让 INetfilter::IHook 的对象调用其 postRoutingHook() 但也提供错误,因为无法创建抽象类的对象。