openflow消息监听器。
public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx);
Floodlight用来调用openflow消息监听器的方法。( Floodlight会自己调用该方法吗, cntx到底是怎么传进去的)
@param sw:发送此openflow消息的交换机。
@param msg:消息。
@param cntx:一个Floodlight上下文对象,用于在监听器之间传递消息( 如何传递消息?)。
@return: 继续或停止执行的命令。
}
定义 PACKET_IN 消息才处理机制,在最后返回 Command.CONTINUE 将允许这
套消息继续被其他的 PACKET_IN handler 处理。
@Override
public net.floodlightcontroller.core.Ilisterner.Command receive(IOFSwitch sw,
OFMessage msg, FloodlightContext cntx) {
Ethernet eth =
IFloodlightProviderService.bcStore.get(cntx, /*cntx :a Floodlight message context object you can use to pass
* information between listeners
IOFmessageListner中的*/
IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
Long sourceMACHash = Ethernet.toLong(eth.getSourceMACAddress());
if (!macAddresses.contains(sourceMACHash)) {
macAddresses.add(sourceMACHash);
logger.info("MAC Address: {} seen on switch: {}",
HexString.toHexString(sourceMACHash),
sw.getId());
}
return Command.CONTINUE;
}
IFloodlightModule中的类似疑问?
void init(FloodlightModuleContext context) throws FloodlightModuleException;//context怎么传的?
/**
* This is a hook for each module to do its <em>external</em> initializations,
* e.g., register for callbacks or query for state in other modules
*
* It is expected that this function will not block and that modules that want
* non-event driven CPU will spawn their own threads.
*
* @param context
*/
void startUp(FloodlightModuleContext context);