Ryu拓扑发现原理

Ryu拓扑发现的核心模块是ryu/topology目录下的switches.py,拓扑发现的利用是同目录下的dumper.py。在dumper.py中,会利用_CONTEXTS来实例化switches.py中的Switches类,然后将拓扑发现的相干信息通过日志方式(LOG.debug)显示。启动命令以下所示:
  ryu-manager --verbose --observe-links ryu.topology.dumper (pip安装的)或
  ryu-manager --verbose --observe-links ./ryu/topology/dumper.py(源码)
其中--verbose参数用于显示LOG.debug信息,--observe-links用于指明拓扑发现。
  接下来对拓扑发现的核心模块switches.py进行分析。
1. Port类:
存储端口相干信息,数据成员有:
self.dpid = dpid
self._ofproto = ofproto
self._config = ofpport.config
self._state = ofpport.state
self.port_no = ofpport.port_no
self.hw_addr = ofpport.hw_addr
self.name = ofpport.name
其中要特别注意的是dpid和port_no,即交换机ID和端口号,这两个信息在下发流表项时很重要。
2. Switch类:
存储交换机相干信息,数据成员有:
self.dp = dp
self.ports = []
其中dp是Datapath类的实例,该类定义在在ryu/controller/controller.py,主要属性有:
self.socket = socket
self.address = address
self.is_active = True
self.id = None  # datapath_id is unknown yet
self.ports = None
ports是1个由Port类实例组成的列表,存储该交换机的端口。
3. Link类:
保存的是源端口和目的端口(都是Port类实例),数据成员有:
self.src = src
self.dst = dst
4. PortState类
该类继承自dict,保存了从port_no(int型)到port(OFPPort类实例)的映照。该类主要用作self.port_state字典的值(键是dpid),用于存储dpid对应的交换机的所有端口情况。
OFPPort类定义在ryu/ofproto目录下对应的ofproto_v1_X_parser.py中(X代表版本号),继承自1个namedtuple,保存有port_no等信息。
5. PortData类
保存每一个端口与对应的LLDP报文数据,数据成员有:
self.is_down = is_down
self.lldp_data = lldp_data(这是LLDP报文的数据)
self.timestamp = None
self.sent = 0
每调用1次lldp_sent函数,便会把self.timestamp置为当前的时间(time.time()),并将self.sent加1;每调用1次lldp_received函数,便会把self.sent置为0。
6.PortDataState类
  继承自dict类,保存从Port类到PortData类的映照。该类保护了1个类似双向循环链表的数据结构,并重写了__iter__(),使得遍历该类的实例(self.ports)时,会依照该双向循环链表从哨兵节点(self._root)后1个节点开始遍历。
  包括1个add_port函数,传入port和lldp_data,port作键,构建的PortData类实例作为值。
  包括1个lldp_sent(self,port)函数,根据传入的port(Port类实例)取得对应的PortData类实例port_data,然后调用port_data.lldp_sent()(该函数会设置时间戳),再调用self._move_last_key(port),把该port移到类似双向循环链表的数据结构中哨兵节点的前面(相当于下次遍历的末尾);最后返回port_data。
7. LinkState类
继承自dict,保存从Link类到时间戳的映照。数据成员self._map字典用于存储Link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值