首先boot()调用of_01.launch()向core中注册了一个OpenFlow_01_Task的类的组件,并且把这个组件明明为"of_01"。
在这个类中有一个run方法会轮询所有socket,包括用来监听连接请求的listener和维持与OVS连接的socket,每一个和OpenFlow交换机的连接都会生成一个Connection类的实例,当收到OpenFlow消息之后,会调用Connection类中定义的read()方法来检查这个OpenFlow消息的头部是不是符合规范,包头部中的length是不是和包本身的长度相符,是何种类型的OpenFlow消息等,最终交给相应的handle函数来进行处理。
在read()方法中,会根据解析出的OpenFlow类型调用unpackers函数,实际上是调用了libopenflow_01.py中定义的每种OpenFlow消息的类中的unpack方法,生成一个赋过值的该类的实例。
值得注意的是可能会出现几个OpenFlow消息在一个TCP包中的情况,这里采用顺序解析的方式,每解析完一个OpenFlow消息,就会得到一个新的offset,从而解析下一个OpenFlow消息。
(原创博文,转载请声明出处)