Pox启动及事件产生、监听分析
1 ./pox/pox.py , Pox入口 ,调用 pox/boot.py.boot()
2 实例化core=pox.core.initialize(),即为实例化POXCore类(该类是所有组件的交接点,提供组件注册功能),监听core即可监听以下事件
2.1 声明事件
_eventMixin_events = set([
UpEvent,
DownEvent,
GoingUpEvent,
GoingDownEvent,
ComponentRegistered
])
3 _do__launch(argv)
3.1 分析传入参数
3.2 _pre_startup(), 调用pox.openflow.launch() 加载 openflow 组件,处理openflow连接
3.2.1 注册OpenFlowConnectionArbiter,为连接建立nexus关系
3.2.2 将OpenFlowNexus注册为openflow组件,申明了openflow事件,监听core.openflow 即可监听以下事件
_eventMixin_events = set([
ConnectionUp,
ConnectionDown,
FeaturesReceived,
PortStatus,
FlowRemoved,
PacketIn,
BarrierIn,
ErrorIn,
RawStatsReply,
SwitchDescReceived,
FlowStatsReceived,
AggregateFlowStatsReceived,
TableStatsReceived,
PortStatsReceived,
QueueStatsReceived,
FlowRemoved,
])
3.3 从参数中加载组件,调用各组件中的launch函数
4 _post_startup()
4.1 调用pox.openflow.of_01.launch(),注册openflow.of_01 组件
4.1.1 实例化日志接口 core.getLogger('libopenflow_01')
4.1.2 实例化OpenFlow_01_Task
4.1.2.1 监听pox.core.GoingUpEvent,处理函数为_handle_GoingUpEvent
4.1.3 在Core中注册of_01组件,组件任务为OpenFlow_01_Task
5 core.goUp(),执行POXCore.goUp()代码,
5.1 产生GoingUpEvent事件,执行of_01._handle_GoingUpEvent(),创建SOCK_STREAM监听TCP数据包
当有连接请求时,实例化of_01.Connection,声明事件
_eventMixin_events = set([
ConnectionUp,
ConnectionDown,
PortStatus,
FlowRemoved,
PacketIn,
ErrorIn,
BarrierIn,
RawStatsReply,
SwitchDescReceived,
FlowStatsReceived,
AggregateFlowStatsReceived,
TableStatsReceived,
PortStatsReceived,
QueueStatsReceived,
FlowRemoved,
])
5.2 产生UpEvent事件,执行
openflow以及 of_01.connection事件的产生:
of_01.Connection.read() 调用handlerMap类别的handle,raise全局事件触发其他监听组件
handlerMap = {
of.OFPT_HELLO : handle_HELLO,
of.OFPT_ECHO_REQUEST : handle_ECHO_REQUEST,
of.OFPT_ECHO_REPLY : handle_ECHO_REPLY,
of.OFPT_PACKET_IN : handle_PACKET_IN,
of.OFPT_FEATURES_REPLY : handle_FEATURES_REPLY,
of.OFPT_PORT_STATUS : handle_PORT_STATUS,
of.OFPT_ERROR : handle_ERROR_MSG,
of.OFPT_BARRIER_REPLY : handle_BARRIER,
of.OFPT_STATS_REPLY : handle_STATS_REPLY,
of.OFPT_FLOW_REMOVED : handle_FLOW_REMOVED,
of.OFPT_VENDOR : handle_VENDOR,
}
of_01.Connection._incoming_stats_reply()调用statsHandlerMap类别的handle,raise全局事件触发其他监听组件
statsHandlerMap = {
of.OFPST_DESC : handle_OFPST_DESC,
of.OFPST_FLOW : handle_OFPST_FLOW,
of.OFPST_AGGREGATE : handle_OFPST_AGGREGATE,
of.OFPST_TABLE : handle_OFPST_TABLE,
of.OFPST_PORT : handle_OFPST_PORT,
of.OFPST_QUEUE : handle_OFPST_QUEUE,
}
上述的of_01.Connection.read()和_incomming_stats_reply()zai产生事件时均raise两次,首先raise Openflow事件,再raise of_01事件(Thx Lidemin)。
具体raise的细节为:
con.ofnexus产生openflow事件。如
con.ofnexus.raiseEventNoErrors(PacketIn, con, msg)
通过
core.openflow.addListeners( self)
或者
core.openflow.addListenerByName("PacketIn", __handle__PacketIn)
将能监听到ofnexus产生的事件
con直接产生的of_01事件(即和connection有关事件),如
con.raiseEventNoErrors(PacketIn, con, msg)
监听该事件时必须指定connection,如
connection.addListeners(self)
强烈推荐lidemin “Pox的框架及启动过程分析“,分析的更到位!
Pox启动及事件产生、监听分析的更多相关文章
- 深入理解Spring的容器内事件发布监听机制
目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监 ...
- Spring Boot(六)自定义事件及监听
事件及监听并不是SpringBoot的新功能,Spring框架早已提供了完善的事件监听机制,在Spring框架中实现事件监听的流程如下: 自定义事件,继承org.springframework.con ...
- Spring笔记(7) - Spring的事件和监听机制
一.背景 事件机制作为一种编程机制,在很多开发语言中都提供了支持,同时许多开源框架的设计中都使用了事件机制,比如SpringFramework. 在 Java 语言中,Java 的事件机制参与者有3种 ...
- asp.net core启动源码以及监听,到处理请求响应的过程
摘要 asp.net core发布至今已经将近6年了,很多人对于这一块还是有些陌生,或者说没接触过:接触过的,对于asp.net core整个启动过程,监听过程,以及请求过程,响应过程也是一知半解,可 ...
- Spring Boot 事件和监听
Application Events and Listeners 1.自定义事件和监听 1.1.定义事件 package com.cjs.boot.event; import lombok.Data; ...
- uniapp仿h5+fire自定义事件触发监听
仿h5+fire自定义事件触发监听 uni-app调用 event.js 源码记录(点击查看) 1.js下载地址 [event.js](https://ext.dcloud.net.cn/plugin ...
- 最优-scroll事件的监听实现
1. 背景和目标 前端在监听scroll这类高频率触发事件时,常常需要一个监听函数来实现监听和回调处理.传统写法上利用setInterval或setTimeout来实现. 为了减小 CPU 开支,往往 ...
- 事件的监听是由awt完成的
学swing 之前先学awt ,因为awt 是Java实现图形界面的基础. 它能够完成编写界面的基本功能,最重要的是,事件的监听是由awt完成的. 而swing是在awt基础上提供的新的界面工具包,它 ...
- MVC框架入门准备(三)事件类 - 事件的监听和触发
在mvc框架中可以看到事件类,实现事件的监听和触发. 举例: <?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; ...
随机推荐
- Android(java)学习笔记92:泛型高级之通配符
package cn.itcast_07; import java.util.ArrayList; import java.util.Collection; /* * 泛型高级(通配符) * ?:任意 ...
- PHP读书笔记(3)-常量
什么是常量 什么是常量?常量可以理解为值不变的量 :或者是常量值被定义后,在脚本的其他任何地方都不可以被改变.手册上是这么定义PHP的常量:常量是一个简单值的标识符(名字).如同其名称所暗示的,在脚本 ...
- CF Exam (数学)
Exam time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...
- LeetCode 226
Invert Binary Tree Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 /** ...
- HDU 1003 - Max Sum(难度:*)
Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...
- hdu 4571 floyd+动态规划
思路: 我们先求一遍floyd,将各点的最短距离求出,然后将点按si的升序排序.dp[i][k]表示第i个点在第j时间所获得的最大效益,那么 dp[i][k]=max(dp[ i ][ k ] , ...
- 【转】web常见安全问题以及测试方法
web安全是我们测试组一直以来作为和性能测试并驾齐驱的两个重点.开发的过程中还需要着重注意,该转义的地方转义:该屏蔽的地方屏蔽,该过滤的地方过滤等等.年底又到了,势必又有大批的发号抽奖之类的活动开发. ...
- 你不知道的JSON的高效率用法
1.JSON JSON是JavaScript Object Notation的缩写,是JavaScript标准的一个子集.官方Android API已经内置支持读写JSON数据.这种格式非常适合表示不 ...
- UIPickerView常见属性、常见方法(包括代理方法和数据源方法)的一些说明
一.UIPickerView 1.UIPickerView的常见属性 // 数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id< ...
- mysql5.7版本免安装配置教程
自己花了两天时间才搞清楚,希望对新手有一定帮助,有问题可以联系哦! mysql分为安装版本msi,免安装要压缩版本ZIP,下载网址:http://dev.mysql.com/downloads 免安装 ...