中英文对照:
Packet:数据包(分组)
1.recv(Packet* packet, Handler*)
接收到一个数据包后,根据它的类型对它进行不同的处理,
如果有有效地SR(source route)头部,
判断目的ip地址是否是就是本节点的ip地址,
如果是,则用handlePacketReceipt函数来处理这个数据包;
如果不是,那么看是否为路由询问包,
如果是,则用handleRouteRequest函数来处理它;
如果不是,则这个数据包就是想要被转发的数据包,用handleForwarding函数来处理
(注:每一个被转发的数据包或者说分组都是用这个handleForwarding函数来处理的)
如果是无效的SR头部,
在广播的情况下,广播这个数据包;
在单播的情况下,用handlePktWithoutSR函数来处理。
(注:默认的每一个被本地节点发送的数据包都是用这个函数来处理的)
2.handlePktWithoutSR(SRPacket& p, bool retry)
处理从本节点发送出去的数据包,
如果能从缓存中找到到目的节点的路由,则用此路由发送这个数据包:
if (route_cache->findRoute(p.dest, p.route, 1))
sendOutPacketWithRoute(p, true);
如果不能找到现成的路由,调用getRouteForPacket(p, retry)函数来给这个数据包寻找一条路由。
2.1 sendOutPacketWithRoute
if (srh->route_request()) { //如果是路由询问包则等待一个随机时间后把这个数据分组发送到下一层
Scheduler::instance().schedule(ll, p.pkt, Random::uniform(RREQ_JITTER)
+ delay);
} else { //如果是普通的数据包,则不等待,直接发送到下一层
Scheduler::instance().schedule(ll, p.pkt, delay);
}
这里要注意的是,发送到下一层的数据包已经剥离了SR头部了。发送的不是p,而是p.pkt。
2.2getRouteForPacket
调用了sendOutRtReq
2.2.1sendOutRtReq
把自己的节点ID加入到path后,发送数据包:
p.route.appendToPath(net_id)
sendOutPacketWithRoute(p, false)
这里有个疑问,路由询问包应该是广播发送才对的啊。