1 在Main中先是加载模块,启动REST服务,而后构建一个实现了IFloodlightProviderService接口的实例(即Controller)并运行,进入Controller的run()方法;
位置:net.floodlightcontroller.core.Main.java ;
功能:初始化IFloodlightModuleContext变量,启动Controller和RESTApi Service
2 位置:net.floodlightcontroller.core.internal.Controller.java
Run()方法启动Controller,监听Switch的请求和将监听事前发送给各个监听模块。
此时所有的环境初始化工作已经完成,构建一个基于netty的TCP server,最重要的是流水线factory OpenflowPipelineFactory 的设置,里面是controller上流,下流处理的handler。
Floodlight 使用的是Netty架构,在Controller.java 入口函数中显示创建ServerBootstrap:
//使用到了JBoss 的Netty框架
//创建Netty的服务端ServerBootstrap
final ServerBootstrap bootstrap = createServerBootStrap();
bootstrap.setOption("reuseAddr", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.sendBufferSize",Controller.SEND_BUFFER_SIZE);
//创建处理Switch连接的工厂
ChannelPipelineFactory pfact =
new OpenflowPipelineFactory(this, null);
//设置服务端处理连接的工厂
bootstrap.setPipelineFactory(pfact);
InetSocketAddress sa = (openFlowHost == null) ? new InetSocketAddress(openFlowPort)
: new InetSocketAddress(openFlowHost, openFlowPort);
//将服务端加入线程池
final ChannelGroup cg = new DefaultChannelGroup(); cg.add(bootstrap.bind(sa));
log.info("Listening for switch connections on {}", sa);
设置套接字选项ChannelPipeline,此时监听套接字就准备好处理来自SW的各种消息;这里最核心的就是 OpenflowPipelineFactory ,会加入各个业务相关的Handler,ChannelPipeline工厂代码如下:
public ChannelPipeline getPipeline()