Pox.py 里面除了一堆的注释以外,真正有用的只有几句会运行的:
boot()函数在/pox/boot.py里,内容如下:
把pox和ext两个文件夹的路径加入系统path中
_do_launch去启动各个模块,启动pox
_do_import()函数将相关组件模块导入
定义Options和POXoptions两个类,用于定义选项
定义了其他预启动项,如写日记等等。
核心的启动代码是以下的代码:
_do_launch()启动了pox及相关组件。之后通过_post_startup()启动openflow.of_01。core.goUp则启动了core里面的登记Debug信息和事件机制。
core.py里面最后一句:core=POXCore(),使得整个类有了实例化,在外部调用时,直接使用core。
组件加载
在启动pox的时候,相应会启动pox的许多组件,而不是单一的仅仅启动一个pox的主程序。启动了相关组件之后,才能去管理各个组件,并通过handler去管理消息队列中的不同的事件,实现事件的管理。组件的加载与初始化在boot()文件里的_do_launch()函数里,代码如下:
首先创建component_order的列表,用于存放组件的名称。然后再逐个启动,初始化。
第162行,将名字分为两部分;163行则决定了启动的默认顺序:
使用_do_import()函数将相关组件模块引入。
if launch in sys.modules[name].__dict__:
检查launch是否属于sys.modules这个字典。而dict是python里面的特性字典,,用于存放类的实例的所有特性。
下一行 f = sys.modules[name].__dict__[launch]
从模块中,实例化函数。
最后,f(**params)
初始化函数
组件启动:
去看一看core.registerNew()这个函数:
可执行语句很少,基本上注释已经完全涵盖了这个函数的作用。主要是在pox注册一个新的线程,如果已存在名字则重载,返回新的实例。同时我们看到在这个函数里面使用到了register()函数,register()实现了在初始化的时候,将相关组件加入到了pox.core.core之中。Core raise了一个ComponentRegistered事件,接着进入等待阶段。
进行到这里,我们需要做的还有一件事,就是将组件的event_handler与相应的events绑定到一起。
事件绑定
在每一个组件里面都会有初始函数,而每一个初始函数里面多包含事件绑定的开始们那就是listenTo()函数:
listenTo()函数在哪里出现呢?寻找之后,你会发现他出现在一个非常重要的文件——revent.py里面。
继续调用autoBindEvents()函数实现绑定。
我们可以看出这个函数的作用:handler端的sink和event的source连接起来,方式为:
事件处理
事件处理的函数主要有:raiseEventsNoErrors()和raiseEvents()函数。