当pox运行了一个转发app时,pox是怎么通过事件系统来运行这个app的,下面我们以l2_learning.py为例来分析下这个事件系统:
l2_learning.py文件定义了两个类:LearningSwitch、l2_learning,LearningSwitch类中的handle_PacketIn函数定义了交换机自学习的能力,l2_learning类实现了交换机一旦连接了就使其成为一个自学习交换机。启动pox时,组件中的launch函数会执行,下面看看l2_learning中launch函数:
launch函数中最重要的一句话:core.registerNew(l2.learning,str_to_bool(transparent))
registerNew函数调用了register函数,register函数中会触发ComponentRegistered事件,
也就是说core.registerNew(l2.learning,str_to_bool(transparent))这句代码会使得core触发一个事件:ComponentRegistered事件。下面给出代码:
core触发了一个事件,那么事件处理函数在哪里?事件是怎样绑定到一个handler函数的?
每个组件中的初始化函数_init_中会有listenTo函数或者addListener函数:
istenTo函数和addListener函数定义在pox/pox/lib/revent/revent.py中:
listenTo函数从注释上可以看出功能:将self上的所有的handler函数绑定到source产生的events上。
而addListener函数是将sink(监听者)的所有handler函数绑定到self上(ps:self是当前对象)。
具体怎么绑定可以看autoBindEvents函数:
现在,我们大致知道了事件会和handler函数绑定,下面我们来找找事件ComponentRegistered绑定了哪个handler函数:见pox/pox/lib/revent/revent.py
就这样,我们的l2_learning.py就注册到了core中.......