mininet.topo.Topo
拓扑基类,默认的拓扑图被 multigraph 类维护,此外还包括节点、连接信息等。主要的方法就是添加节点、连接等。 Topo 中一个 node 实际上就是图结构中的一个节点,一个 port 是全局维护增长的源和目的 node 所对应的序号,而连接

init

1
def __init__(self, hopts=None, sopts=None, lopts=None):
2
"""Topo object:
3
hinfo: default host options
4
sopts: default switch options
5
lopts: default link options"""
6
self.g = MultiGraph()
7
self.node_info = {}
8
self.link_info = {} # (src, dst) tuples hash to EdgeInfo objects
9
self.hopts = {} if hopts is None else hopts
10
self.sopts = {} if sopts is None else sopts
11
self.lopts = {} if lopts is None else lopts
12
self.ports = {} # ports[src][dst] is port on src that connects to dst
Copied!

addNode

1
def addNode(self, name, **opts):
2
"""Add Node to graph.
3
name: name
4
opts: node options
5
returns: node name"""
6
self.g.add_node(name)
7
self.node_info[name] = opts
8
return name
Copied!
添加节点方法被添加主机 addHost、交换机 addSwitch、控制器 addController 等方法使用。
该方法在图上添加一个节点,然后添加对应的节点信息到拓扑的参数上。

addPort

1
def addPort(self, src, dst, sport=None, dport=None):
2
'''Generate port mapping for new edge.
3
@param src source switch name
4
@param dst destination switch name
5
'''
6
self.ports.setdefault(src, {})
7
self.ports.setdefault(dst, {})
8
# New port: number of outlinks + base
9
src_base = 1 if self.isSwitch(src) else 0
10
dst_base = 1 if self.isSwitch(dst) else 0
11
if sport is None:
12
sport = len(self.ports[src]) + src_base
13
if dport is None:
14
dport = len(self.ports[dst]) + dst_base
15
self.ports[src][dst] = sport
16
self.ports[dst][src] = dport
Copied!
addPort 会同时创建源和目标节点上的端口号信息。 拓扑中所有的 port 都被 self.ports 结构维护,其中 ports[src][dst] 表示在 src 节点上的 port,该 port 所在 link 连接到 dst 节点。 添加一个 port 就是更新了这些信息。

addLink

1
def addLink(self, node1, node2, port1=None, port2=None,
2
**opts):
3
"""node1, node2: nodes to link together
4
port1, port2: ports (optional)
5
opts: link options (optional)
6
returns: link info key"""
7
if not opts and self.lopts:
8
opts = self.lopts
9
self.addPort(node1, node2, port1, port2)
10
key = tuple(self.sorted([node1, node2]))
11
self.link_info[key] = opts
12
self.g.add_edge(*key)
13
return key
Copied!
添加一条连接实际上就是添加对应的两个 port,并在图上添加上边。
Copy link