这是来自https://github.com/osrg/ryu/blob/master/ryu/topology/switches.py#L429
的类切换的代码类Switch中我特别感兴趣的成员变量如下。
self.dps = {} # datapath_id => Datapath class
self.port_state = {} # datapath_id => ports
self.ports = PortDataState() # Port class -> PortData class
self.links = LinkState() # Link class -> timestamp
self.is_active = True
这些是RYU用于缓存拓扑详细信息的成员变量。我试图找出如何使用以下变量表示拓扑。
1)dps是一个将datapath_id映射到datapath类的字典?
- Can someone explain to me what is a datapath_id and a datapath class?
2)port_state是一个将数据路径id映射到端口
的字典- As per my understanding on a switch without a VLAN all the ports will belong to the same datapath id? In case of a switch with VLAN ports on the switch can have multiple datapath id's. Is my understanding correct?
3)ports又是一个将Port类映射到PortData类的字典?
- what does this mean?
4)链接又是一个字典,它将Link类映射到时间戳
- again what does this mean?
我试图了解RYU控制器如何使用上述结构存储拓扑信息。非常感谢您理解或解释的任何帮助。
答案 0 :(得分:1)
通常,每个OpenFlow交换机连接到特定端口上的控制器,每个交换机和控制器之间的这种连接被视为一个单独的数据路径'它通常称为DPID(DataPath ID)。
因此,链路被视为属于2个DPID的端口之间的连接 DPID 1(PORT1)< - > (PORT2)DPID2是SW1 P1和SW2 P1之间的链接。
我使用的是POX控制器,因此在Ryu中并不是很多,但我认为你现在可以理解它了。
答案 1 :(得分:0)
以下是我对答案的看法:
为每个datapth id保存一个datapath类。例如switches.py中的475行:
self.dps[dp.id] = dp
这种方式使用一个数据路径id,可以轻松找到整个类。
PortState
在第161行被定义为PortState(dict)
,这意味着它是一本字典。 dict的密钥为int port_no
且值为OFPPort port
因此self.port_state
为每个数据路径ID保存端口。例如,对于self.port_state[1]
,它将包含数据路径标识为1的端口。
PortDataState
在第206行定义为PortDataState(dict)
,这意味着它是一本字典。就字典而言,它是某种双重链表。
看起来这更像是一个端口列表作为一个键,然后它们作为一个值的状态。
LinkState会跟踪链接。
对于src
和dst
之间的链接,它会创建一个Link对象。并保存了dst
和src
之间的映射(这是使用self._map结构完成的)。此外,对于每个创建的Link对象,它会记录时间(我不知道为什么会这样做)
请查看switches.py
这是topo discovery in Ryu的好教程。