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

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

添加节点方法被添加主机 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

addPort 会同时创建源和目标节点上的端口号信息。
拓扑中所有的 port 都被 self.ports 结构维护,其中 ports[src][dst] 表示在 src 节点上的 port,该 port 所在 link 连接到 dst 节点。
添加一个 port 就是更新了这些信息。

  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

添加一条连接实际上就是添加对应的两个 port,并在图上添加上边。