Floodlight的流表下发模块是Forwarding类。处理Packet-in消息的方法是processPacketInMessage(),该方法根据决策(Decision)或者包的类型决定对Packet-in消息执行动作,对于广播包(BroadCast)或多播包(MutiCast),执行泛洪doFlood()方法,其它类型数据包执行doForwardFlow()方法。
Forwarding类中对数据包的几种操作方法:
doForwardFlow()
:转发doFlood()
:泛洪doDropFlow()
:丢包
接下来重点分析doForwardFlow()
方法的实现流程。如图所示:
doForwardFlow方法的工作流程:
- Step1:首先该方法会获取Packet_in消息中的数据包的匹配域,提取数据包中的交换机信息,依次判断源/目的交换机是否存在,是则继续执行,否则执行泛洪
doFlood()
; - Step2:当源、目的交换机均存在,接着会判断两者是否同属一个island(即同一个二层网络),判断后的操作与前面步骤一样;
- Step3:若同属一个island,然后会判断源目的交换机是否同一端口;
- Step4:如果是在同一个island不同端口,便调取路径引擎(routingEngine)中的
getRoute()
方法获取源、目的交换机的路径,最后执行pushRoute()
方法将路径下发到相应的交换机。
个人分析,欢迎指正,若转载请注明出处!