在上一篇具体讲述POX有哪些组件,以及各个组件的功能,这篇文章主要理解POX的启动以及组件是如何启动的,以及组件与事件的关系:

由上图知,of_01 主要是运行一个线程,该线程不断与交换机进行TCP连接, 当某交换机送来一个协议消息时,of_01会触发该消息 所对应的事件。openflow则与所有的物理交换机相连,而控制器可以通过openflow控制所有的交换机,任意交换机传上来的消息都会触发openflow的事件,在设计自己的组件时,如果不需要监听特定的交换机,监听openflow肯定没错。

事件组成:

  • source:给组件提供可被监听的事件,通过raise函数触发事件给监听它的组件;
  • sink:监听source的组件。

启动pox.py:

Pox.py 里面大部分都是注释,真正只有以下几行代码:

调用pox.boot模块中的boot()函数。

这时就想了解boot函数的作用,下面是进入boot.py里查看的代码:

可以看出里面的内容包括:

第442~444行代码将pox和ext的两个文件夹的路径加入到了系统的path里;

还有启动了POX以及相关组件。

关键代码是第459行的_do_launch()函数启动了相关组件,其中_post_startup()由下图390~392行启动openflow.of_01,core.goUp则启动了core里面的登记Debug信息和事件机制。

在core.py的代码中,有core = POXCore()。代码中还有这个函数的定义class POXCore() (EventMixin)。可以看出,POXCore这个类是revent.py中class EventMixin的一个子类,是处理事件最高层的模块。另外,如果看后面的代码可以知道,POX的启动是由_do_Launch()函数完成的。

组件启动:

组件启动函数:pox.boot.do_launch

这些代码完成了模块的加载+初始化工作,其中:

第135~155行代码创建component_order的列表,用于存放组件的名称。然后再逐个启动,初始化;

第157~164行代码通过创建组件的函数名,并定义了组件的加载顺序;

第166~169行代码使用_do_import()函数将相关组件模块引入;

第171行代码检查了类中是否存在相应的launch函数。其中sys.modules 是一个字典,它包含了从Python 开始运行起,被导入的所有模块。用sys.modules[name]可以获取name模块的引用。由于类的实例会有一个__dict__的特性字典,其中是该类的所有特性。

如:

第172行从特性中初始化函数实例;

第189行代码就是执行初始化函数的语句。

pox的过程如下:

组件启动代码:

以l3_learning组件来举例:

我们观察到最后一行需要注册组件,这时就需要查看core.registerNew()这个函数:

可执行语句很少,基本上注释已经完全涵盖了这个函数的作用。主要是在pox注册一个新的线程,如果已存在名字则重载,返回新的实例。同时我们看到在这个函数里面使用到了register()函数,函数定义如下:

Register()实现了在初始化的时候,将相关组件加入到了pox.core.core之中。这时Core raise了一个ComponentRegistered事件,是以组件为参数注册事件。

注册阶段结束了?还没有,有一个问题还没有解决:组件的event_handler是如何与events绑定在一起的呢?

组件与事件的关系:(事件绑定)

上面可以看出:组件通过监听内核core来注册事件。

这时就需要listenTo()函数,经过查找在revent.py里面:

这时接着调用autoBindEvents()函数:

从注释中我们可以看出这个函数的作用:

无非就是讲handler端的sink和event的source连接起来,方式就是先在sink端将所有event的名字放在一个字典中,然后在sink中寻找带有“__handle__event”的函数,最后,如果两边有对应的event和handler,就建立连接。:

其中又调用了addListener()函数,这个函数的功能最重要:

建立一个与eventType对应的handlers,将带有handler和eid等信息的entry添加到handlers队列中,priority决定这个handlers在处理时的优先级,若无特殊优先级,则按正常顺序放在队尾。

下面还有一个问题:handler在哪?这个问题关系到事件如何被处理。其实,从autoBindEvent的函数定义可以看到,最后addListener函数的执行对象是source。也就是说,handler列表在发起事件的组件中可以看到。因而我们来看source类,即:

第83行代码中使用raiseEvent()函数,其中参数为组件注册。来看raiseEvent函数:

就这样事件就绑定完成了。

POX的过程图如下:

额外的一个小case:在POX中添加新模块,将新模块存入ext文件夹,可以通过参数,直接调用。如:

copy一个模块(forwarding.l2_learning.py)到ext文件夹中,改名为ext/my_component.py,执行新模块为:./pox.py my_component.

以上的学习是在网上看北邮赵伟明的blog,加上自己的理解总结的,看完后发现制定POX控制器团队的优秀,还有就是自己暂时分析到这里,当然还有好多代码也没有看,需要今后边学边看,自己还需要很长的道路需要走,需要更加努力,这样才能在SDN的学习有更多自己的成果。

POX控制器的分析(二)相关推荐

  1. POX控制器的分析(一)

    最近刚刚对SDN产生了很大的兴趣,相对之前使用的POX控制器作出一个分析,了解控制器的机制,这样更好的理解SDN. 本文从https://openflow.stanford.edu/display/O ...

  2. Linux MMC子系统分析(二)——Host分析

    Linux MMC子系统分析(二)--Host分析 前言 通过前面对mmc子系统的模型分析,我们能够知道host是对应于硬件控制器的具体操作.本文将以sdhci-s3c.c为例对host进行简单的分析 ...

  3. 汽车电子电气架构设计中的控制器融合分析

    本文由叶日良,姜立标联合创作 摘要 随着汽车智能化.网联化的发展,整车电器功能愈加丰富,对电子电气架构的设计提出了更高的要求.文章综述了汽车电子电气架构的开发流程和发展趋势,并为架构设计中的控制器融合 ...

  4. linux arm 地址映射 ioremap_nocache 使用,ioremap_nocache 函数分析(二)

    ioremap_nocache函数分析(二) 非连续映射地址空间 static struct vm_struct *__get_vm_area_node(unsigned long size, uns ...

  5. 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )

    Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...

  6. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  7. 一些有用的javascript实例分析(二)

    一些有用的javascript实例分析(二) 原文:一些有用的javascript实例分析(二) 1 5 求出数组中所有数字的和 2 window.onload = function () 3 { 4 ...

  8. Android 系统(41)---Android7.0 PowerManagerService亮灭屏分析(二)

    Android7.0 PowerManagerService亮灭屏分析(二) 3029 在PowerManagerService中对各种状态进行判断后,将其数值封装进DisplayPowerReque ...

  9. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

最新文章

  1. 国内下载erlang链接
  2. Spring MVC学习总结(6)——一些Spring MVC的使用技巧
  3. bootstrapt学习指南_bootstrap-知识点梳理-学习入门篇
  4. CodeForces - 801C Voltage Keepsake 二分
  5. 全球AI人才只有2万多,仅3000人在求职 | 报告
  6. GDAL库三个读取Jpeg2000格式驱动测试
  7. 3.6 Spark安装与体验
  8. 【Xamarin.Android】探索android的底部导航视图
  9. 汽车电子:下一个苹果产业链
  10. python 东方财富接口_东方财富开放交易api,我只想要东方财富软件交易功能
  11. 黑域助手连接服务器才能用吗,黑域怎么免root使用?root使用教程
  12. 【安卓】设置界面为横屏的设置方法
  13. python中汉字如何转拼音?(PyPinyin 的基础用法)
  14. ios动态效果实现翻页_iOS实现翻页效果动画
  15. 如何写一篇五彩斑斓的博客.append(可爱)
  16. createBuilderConfig 0XFFFF异常
  17. python循环语句打印输出1-10_python_不用循环打印1-1000
  18. 在cmd中遍历局域网内的IP命令解析
  19. 【渝粤教育】电大中专学习指南作业 题库
  20. IPguard客户端安装步骤

热门文章

  1. 手写HashMap,快手面试官直呼内行
  2. Spring之DI注入方式
  3. 多测师_Python(re 模块)
  4. 2.8.5Django --3 WEB框架
  5. Linux下rar和unrar命令的安装使用
  6. 手机触屏事件(jquery)
  7. [Android]朝花夕拾之使用DexClassLoader动态加载广点通jar包
  8. XmlHttp.open函数
  9. 初探Java设计模式------观察者模式
  10. mysql查找名字含A的的姓名_mysql查询结果排序,name字段有中文名字,有英文名字,如何按a-z的顺序把名字排序...