You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.8 KiB
99 lines
2.8 KiB
from mininet.topo import Topo
|
|
from mininet.node import Node
|
|
from mininet.net import Mininet
|
|
from mininet.cli import CLI
|
|
from mininet.link import TCIntf
|
|
from enum import Enum
|
|
|
|
|
|
class NodeRoles(Enum):
|
|
ROUTER = 'Router'
|
|
SWITCH = 'Switch'
|
|
HOST = 'Host'
|
|
|
|
|
|
class Router(Node):
|
|
|
|
def config(self, **params):
|
|
super(Router, self).config(**params)
|
|
self.cmd('sysctl net.ipv4.ip_forward=1')
|
|
self.waitOutput()
|
|
|
|
def terminate(self):
|
|
self.cmd('sysctl net.ipv4.ip_forward=0')
|
|
self.waitOutput()
|
|
super(Router, self).terminate()
|
|
|
|
def print_routing_table(self):
|
|
print(self.name + ' - Routing Table')
|
|
print(self.cmd('ip route'))
|
|
|
|
|
|
class CustomTopo(Topo):
|
|
|
|
__LINK_BANDWIDTH = 1
|
|
|
|
def __init__(self):
|
|
Topo.__init__(self)
|
|
|
|
def build(self):
|
|
|
|
r1 = self.addNode('r1', cls=Router, ip=None,
|
|
role=NodeRoles.ROUTER.value)
|
|
|
|
s1 = self.addSwitch('s1', role=NodeRoles.SWITCH.value)
|
|
s2 = self.addSwitch('s2', role=NodeRoles.SWITCH.value)
|
|
|
|
h11 = self.addHost('h11', ip='10.0.1.11/24',
|
|
# inNamespace=False,
|
|
defaultRoute='via 10.0.1.254',
|
|
role=NodeRoles.HOST.value)
|
|
h12 = self.addHost('h12', ip='10.0.1.12/24',
|
|
defaultRoute='via 10.0.1.254',
|
|
role=NodeRoles.HOST.value)
|
|
|
|
h21 = self.addHost('h21', ip='10.0.2.21/24',
|
|
defaultRoute='via 10.0.2.254',
|
|
role=NodeRoles.HOST.value)
|
|
h22 = self.addHost('h22', ip='10.0.2.22/24',
|
|
defaultRoute='via 10.0.2.254',
|
|
role=NodeRoles.HOST.value)
|
|
|
|
for node1, node2 in [(h11, s1), (h12, s1), (h21, s2), (h22, s2)]:
|
|
self.addLink(node1, node2,
|
|
cls1=TCIntf, cls2=TCIntf,
|
|
intfName1=node1 + '-' + node2,
|
|
intfName2=node2 + '-' + node1,
|
|
params1={'bw': self.__LINK_BANDWIDTH},
|
|
params2={'bw': self.__LINK_BANDWIDTH})
|
|
|
|
self.addLink(r1, s1,
|
|
cls1=TCIntf, cls2=TCIntf,
|
|
intfName1=r1 + '-' + s1,
|
|
intfName2=s1 + '-' + r1,
|
|
params1={'ip': '10.0.1.254/24', 'bw': self.__LINK_BANDWIDTH},
|
|
params2={'bw': self.__LINK_BANDWIDTH})
|
|
|
|
self.addLink(r1, s2,
|
|
cls1=TCIntf, cls2=TCIntf,
|
|
intfName1=r1 + '-' + s2,
|
|
intfName2=s2 + '-' + r1,
|
|
params1={'ip': '10.0.2.254/24', 'bw': self.__LINK_BANDWIDTH},
|
|
params2={'bw': self.__LINK_BANDWIDTH})
|
|
|
|
|
|
def run():
|
|
topo = CustomTopo()
|
|
net = Mininet(topo=topo)
|
|
net.start()
|
|
|
|
for node in net.topo.nodes():
|
|
print(net[node].params['role'])
|
|
net['r1'].print_routing_table()
|
|
|
|
CLI(net)
|
|
net.stop()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
run()
|