2024年2月19日发(作者:哀安翔)
poxcontroller学习笔记(四)OpenFlowEvents主要是与OpenFlowswitch交互的事件。POX组件和OpenFlow交换机通信使用的是_01。默认时,of_01在core上注册一个名为openflow的OpenFlow“nexus”组件。of_01在POX中是和OpenFlow协同工作的主要接口。每当交换机连接到POX时,也会有一个相关的Connection对象。Connection和nexus有很多重叠的部分。如果你的应用对于所有交换机的事件感兴趣,那么最好侦听nexus,它会为所有交换机分发事件。如果只对单个交换机,可以侦听指定的connection。对于一个connection对象有以下三种引用方法:1.在nexus上侦听ConnectionUp事件2.使用nexus的getConnection()方法,可以通过交换机的DPID找到一个连接。3.枚举所有nexus的连接通过它的连接属性(eg:tions)OpenFlow事件多数OpenFlow相关事件会直接给收到的交换机消息回复。OpenFlow事件有以下三种属性:connection:类型为Connection,相关交换机的Connectiondpid:相关交换机的DatapathID,格式为dpid_to_strofp:类型为ofp_header,导致事件发生的OpenFlow消息对象。自己定义一个模块,用来监听交换机连接,放在ext目录下。1#!/usr/bin/portdpid_to_str45log=ger()6
7classMyComponent(object):891011121314def_handle_ConnectionDown(self,event):("Switch16shutdown.",dpid_to_str())1718deflaunch():erNew(MyComponent)在控制器这端运行pox,远程运行ovs,开启和pox的连接,然后再断开连接,运行结果如下:root@ubuntu:/kvm/yedc/pox_test$./ection_watchpyPOX0.1.0(betta)/Copyright2011-2013JamesMcCauley,:core:POX0.1.0(betta)re,Thisprogramisfree%shasdef_handle_ConnectionUp(self,event):("Switchup.",dpid_to_str())%shascomedef__init__(self):teners(self)'help(e)'>INFO:_01:[24-be-05-24-f4-0a1]connected
INFO:connection_watch::_01:[24-be-05-24-f4-0a1]closedINFO:connection_watch:Switch24-be-05-24-f4-0ahasshutdown.可以看到显示的INFO信息,表明交换机和POX的连接建立和断开。tionUp:3个属性:connection:Connection类型,这个对象用来与交换机通信。例如,你可以使用它发送OpenFlow命令,或者监听Connection对象发布的事件。dpid:类型为integer/long,交换机的DPID。ofp:类型为ofp_switch_features,包含有交换机信息,如支持的action类型,port信息等。当OpenFlow控制器与OpenFlow交换机建立连接时,分发事件。tionDown:同理,当OpenFlow控制器与OpenFlow交换机断开连接时,分发事件。在Event类的定义时,不需要ofp属性(和ConnectionUp的区别)实现代码:1#!/usr/bin/portdpid_to_import*56log=ger()78classConnectionUp(Event):910def__init__(self,connection,ofp):Event.__init__(self)
tion===ofp1415classConnectionDown(Event):16def__init__(self,connection,ofp):17Event.__init__(self)tion==2021classMyComponent(object):22def__init__(self):teners(self)2425#处理连接开启事件26def_handle_ConnectionUp(self,event):27ConnectionUp(tion,)("Switch%shasup.",dpid_to_str())2930#处理连接关闭事件31def_handle_ConnectionDown(self,event):32ConnectionDown(tion,)("Switch%scomehas
34shutdown.",dpid_to_str())3536deflaunch():erNew(MyComponent)运行步骤同上,看到如下显示:POX>WARNING:_01:class'In'raisedondummyOpenFlownexusINFO:_01:[24-be-05-24-f4-0a1]connectedINFO:connection_watch::_01:[24-be-05-24-f4-0a1]closedINFO:connection_watch:atus:处理OpenFlow交换机端口状态改变事件1#!/usr/bin/portdpid_to_import*56log=ger()78classPortStatus(Event):91011def__init__(self,connection,ofp):Event.__init__(self)tion=connection
==ed===_===_d===_=_no19classMyComponent(object):26272829303132deflaunch():erNew(MyComponent)在ovs上使用ovs-vsctldel-port和ovs-vsctladd-port的命令将桥接在ovselse:action="modified"print"Port%sonSwitch%shasbeen%s."%(,,action)def_handle_PortStatus(self,event)::action="added"d:action="removed"def__init__(self):teners(self)
上的端口删除,添加,显示如下信息:POX>INFO:_01:[24-be-05-24-f4-0a1]moved这个就是在流表项从流表中删除的时候分发的事件,有可能是超时,有可能是直接删除导致。idleTimeout(bool)–TrueifexpiredbecauseofidlenesshardTimeout(bool)–Trueifexpiredbecauseofhardtimeouttimeout(bool)–Trueifeitheroftheaboveistruedeleted(bool)–Trueifdeletedexplicitly1classFlowRemoved(Event):2345678910111213def__init__(self,connection,ofp):Event.__init__(self)tion===meout=meout=d=t===_IDLE_TIMEOUT:t=meout=True
==_HARD_TIMEOUT:t=meout===_DELETE:d=True看到这里,感觉对OpenFlow的消息很不熟悉,这些事件的定义在源代码中都可以找到。(主要还是要对整个过程要清晰)In1classPacketIn(Event):23456789def__init__(self,connection,ofp):Event.__init__(self)tion===_=lf._parsed==rt(int):数据包入口的端口号data(bytes):原始的数据包数据parsed(packetsubclasses):’s解析版本ofp(ofp_packet_in):触发OpenFlowmessageconnection:产生事件的交换机连接n错误事件1classErrorIn(Event):2def__init__(self,connection,ofp):
3456Event.__init__(self)tion===rIn边界事件1classBarrierIn(Event):234567def__init__(self,connection,ofp):Event.__init__(self)tion====总结:后面的几个事件还没太仔细看,这些事件的定义在源代码中都可以找得到,在这里写出来,是为了加深对整个处理过程的理解。对于OpenFlow“nexus”不太明白。上面的这些事件在pox/openflow/__init__.py中有定义,这些类都继承了Event类,因此有的代码中没有声明这些类,pox默认也会找到这些事件。Postedin云计算/虚拟化andtaggedpoxonAugust27,comment
2024年2月19日发(作者:哀安翔)
poxcontroller学习笔记(四)OpenFlowEvents主要是与OpenFlowswitch交互的事件。POX组件和OpenFlow交换机通信使用的是_01。默认时,of_01在core上注册一个名为openflow的OpenFlow“nexus”组件。of_01在POX中是和OpenFlow协同工作的主要接口。每当交换机连接到POX时,也会有一个相关的Connection对象。Connection和nexus有很多重叠的部分。如果你的应用对于所有交换机的事件感兴趣,那么最好侦听nexus,它会为所有交换机分发事件。如果只对单个交换机,可以侦听指定的connection。对于一个connection对象有以下三种引用方法:1.在nexus上侦听ConnectionUp事件2.使用nexus的getConnection()方法,可以通过交换机的DPID找到一个连接。3.枚举所有nexus的连接通过它的连接属性(eg:tions)OpenFlow事件多数OpenFlow相关事件会直接给收到的交换机消息回复。OpenFlow事件有以下三种属性:connection:类型为Connection,相关交换机的Connectiondpid:相关交换机的DatapathID,格式为dpid_to_strofp:类型为ofp_header,导致事件发生的OpenFlow消息对象。自己定义一个模块,用来监听交换机连接,放在ext目录下。1#!/usr/bin/portdpid_to_str45log=ger()6
7classMyComponent(object):891011121314def_handle_ConnectionDown(self,event):("Switch16shutdown.",dpid_to_str())1718deflaunch():erNew(MyComponent)在控制器这端运行pox,远程运行ovs,开启和pox的连接,然后再断开连接,运行结果如下:root@ubuntu:/kvm/yedc/pox_test$./ection_watchpyPOX0.1.0(betta)/Copyright2011-2013JamesMcCauley,:core:POX0.1.0(betta)re,Thisprogramisfree%shasdef_handle_ConnectionUp(self,event):("Switchup.",dpid_to_str())%shascomedef__init__(self):teners(self)'help(e)'>INFO:_01:[24-be-05-24-f4-0a1]connected
INFO:connection_watch::_01:[24-be-05-24-f4-0a1]closedINFO:connection_watch:Switch24-be-05-24-f4-0ahasshutdown.可以看到显示的INFO信息,表明交换机和POX的连接建立和断开。tionUp:3个属性:connection:Connection类型,这个对象用来与交换机通信。例如,你可以使用它发送OpenFlow命令,或者监听Connection对象发布的事件。dpid:类型为integer/long,交换机的DPID。ofp:类型为ofp_switch_features,包含有交换机信息,如支持的action类型,port信息等。当OpenFlow控制器与OpenFlow交换机建立连接时,分发事件。tionDown:同理,当OpenFlow控制器与OpenFlow交换机断开连接时,分发事件。在Event类的定义时,不需要ofp属性(和ConnectionUp的区别)实现代码:1#!/usr/bin/portdpid_to_import*56log=ger()78classConnectionUp(Event):910def__init__(self,connection,ofp):Event.__init__(self)
tion===ofp1415classConnectionDown(Event):16def__init__(self,connection,ofp):17Event.__init__(self)tion==2021classMyComponent(object):22def__init__(self):teners(self)2425#处理连接开启事件26def_handle_ConnectionUp(self,event):27ConnectionUp(tion,)("Switch%shasup.",dpid_to_str())2930#处理连接关闭事件31def_handle_ConnectionDown(self,event):32ConnectionDown(tion,)("Switch%scomehas
34shutdown.",dpid_to_str())3536deflaunch():erNew(MyComponent)运行步骤同上,看到如下显示:POX>WARNING:_01:class'In'raisedondummyOpenFlownexusINFO:_01:[24-be-05-24-f4-0a1]connectedINFO:connection_watch::_01:[24-be-05-24-f4-0a1]closedINFO:connection_watch:atus:处理OpenFlow交换机端口状态改变事件1#!/usr/bin/portdpid_to_import*56log=ger()78classPortStatus(Event):91011def__init__(self,connection,ofp):Event.__init__(self)tion=connection
==ed===_===_d===_=_no19classMyComponent(object):26272829303132deflaunch():erNew(MyComponent)在ovs上使用ovs-vsctldel-port和ovs-vsctladd-port的命令将桥接在ovselse:action="modified"print"Port%sonSwitch%shasbeen%s."%(,,action)def_handle_PortStatus(self,event)::action="added"d:action="removed"def__init__(self):teners(self)
上的端口删除,添加,显示如下信息:POX>INFO:_01:[24-be-05-24-f4-0a1]moved这个就是在流表项从流表中删除的时候分发的事件,有可能是超时,有可能是直接删除导致。idleTimeout(bool)–TrueifexpiredbecauseofidlenesshardTimeout(bool)–Trueifexpiredbecauseofhardtimeouttimeout(bool)–Trueifeitheroftheaboveistruedeleted(bool)–Trueifdeletedexplicitly1classFlowRemoved(Event):2345678910111213def__init__(self,connection,ofp):Event.__init__(self)tion===meout=meout=d=t===_IDLE_TIMEOUT:t=meout=True
==_HARD_TIMEOUT:t=meout===_DELETE:d=True看到这里,感觉对OpenFlow的消息很不熟悉,这些事件的定义在源代码中都可以找到。(主要还是要对整个过程要清晰)In1classPacketIn(Event):23456789def__init__(self,connection,ofp):Event.__init__(self)tion===_=lf._parsed==rt(int):数据包入口的端口号data(bytes):原始的数据包数据parsed(packetsubclasses):’s解析版本ofp(ofp_packet_in):触发OpenFlowmessageconnection:产生事件的交换机连接n错误事件1classErrorIn(Event):2def__init__(self,connection,ofp):
3456Event.__init__(self)tion===rIn边界事件1classBarrierIn(Event):234567def__init__(self,connection,ofp):Event.__init__(self)tion====总结:后面的几个事件还没太仔细看,这些事件的定义在源代码中都可以找得到,在这里写出来,是为了加深对整个处理过程的理解。对于OpenFlow“nexus”不太明白。上面的这些事件在pox/openflow/__init__.py中有定义,这些类都继承了Event类,因此有的代码中没有声明这些类,pox默认也会找到这些事件。Postedin云计算/虚拟化andtaggedpoxonAugust27,comment