You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.1 KiB
Python
105 lines
3.1 KiB
Python
2 years ago
|
import configparser
|
||
|
from mininet.net import Mininet
|
||
|
from mininet.topo import Topo
|
||
|
from mininet.node import Node
|
||
|
from mininet.cli import CLI
|
||
|
from mininet.link import TCLink
|
||
|
from mininet.log import setLogLevel
|
||
|
|
||
|
class MyRouter (Node):
|
||
|
def config(self, **params):
|
||
|
super(MyRouter, self).config(**params)
|
||
|
self.cmd('sysctl net.ipv4.ip_forward=1') #Enable forwarding on the router
|
||
|
def terminate(self):
|
||
|
self.cmd('sysctl net.ipv4.ip_forward=0') #Disable forwarding on the router
|
||
|
super(MyRouter, self).terminate
|
||
|
|
||
|
def build_topology(config_file):
|
||
|
topo = Topo()
|
||
|
|
||
|
with open(config_file, 'r') as file:
|
||
|
for line in file:
|
||
|
line = line.strip()
|
||
|
if line.startswith('#'): #Skip comment
|
||
|
continue
|
||
|
|
||
|
parts = line.split(" ") #Parse the topology file using spaces
|
||
|
if parts[0] == 'host': #Parse hosts
|
||
|
host_name = parts[1]
|
||
|
host_ip = parts[2]
|
||
|
host_nexthop = 'via ' + parts[3]
|
||
|
topo.addHost(host_name, ip=host_ip, defaultRoute=host_nexthop)
|
||
|
|
||
|
elif parts[0] == 'router': #Parse routers
|
||
|
router_name = parts[1]
|
||
|
router_ip = parts[2]
|
||
|
topo.addNode(router_name, cls=MyRouter, ip=router_ip)
|
||
|
|
||
|
elif parts[0] == 'switch': #Parse switches
|
||
|
switch_name = parts[1]
|
||
|
topo.addSwitch(switch_name)
|
||
|
|
||
|
elif parts[0] == 'linkSH': #Parse links switches to hosts
|
||
|
node1 = parts[1]
|
||
|
node2 = parts[2]
|
||
|
topo.addLink(node1, node2)
|
||
|
|
||
|
elif parts[0] == 'linkSS': #Parse links switches to switches
|
||
|
node1 = parts[1]
|
||
|
node2 = parts[2]
|
||
|
topo.addLink(node1, node2)
|
||
|
|
||
|
elif parts[0] == 'linkHR': #Parse links hosts to routers
|
||
|
node1 = parts[1]
|
||
|
node2 = parts[2]
|
||
|
intf_name2 = parts[3]
|
||
|
n2_ip = parts[4]
|
||
|
topo.addLink(node1, node2, intfName2=intf_name2, params2={'ip' : n2_ip})
|
||
|
|
||
|
elif parts[0] == 'linkRR': #Parse links routers to routers
|
||
|
node1 = parts[1]
|
||
|
node2 = parts[2]
|
||
|
intf_name1 = parts[3]
|
||
|
intf_name2 = parts[4]
|
||
|
ip1 = parts[5]
|
||
|
ip2 = parts[6]
|
||
|
topo.addLink(node1, node2, intfName1=intf_name1, intfName2=intf_name2, params1={'ip' : ip1}, params2={'ip' : ip2})
|
||
|
|
||
|
# elif parts[0] == 'route': #Parse routing tables
|
||
|
# name = parts[1]
|
||
|
# for node in topo.nodes():
|
||
|
# if node == name:
|
||
|
# (node).cmd('ip route add 0.0.0.0/0 via 10.0.0.1 dev r1-eth2')
|
||
|
# break
|
||
|
|
||
|
|
||
|
|
||
|
# (topo.getNodeByName('r1')).cmd('ip route add 0.0.0.0/0 via 10.0.0.1 dev r1-eth2')
|
||
|
return topo
|
||
|
|
||
|
def run_topology(config_file):
|
||
|
setLogLevel('info') #Different logging levels are 'info' 'warning' 'error' 'debug'
|
||
|
topo = build_topology(config_file)
|
||
|
net = Mininet(topo=topo, link=TCLink)
|
||
|
net.start() #Starting the network
|
||
|
|
||
|
with open(config_file, 'r') as file: #Search in the configuration file for routing table
|
||
|
for line in file:
|
||
|
line = line.strip()
|
||
|
if line.startswith('#'): #Skip comment
|
||
|
continue
|
||
|
|
||
|
parts = line.split(" ")
|
||
|
if parts[0] == 'route': #Parse routing tables
|
||
|
name = parts[1]
|
||
|
pck_src = parts[2]
|
||
|
pck_nexthop = parts[3]
|
||
|
interf = parts[4]
|
||
|
cmd = 'ip route add ' + pck_src + ' via ' + pck_nexthop + ' dev ' + interf
|
||
|
(net.getNodeByName(name)).cmd(cmd)
|
||
|
net.pingAll()
|
||
|
# CLI(net)
|
||
|
net.stop() #Stopping the network
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
run_topology('MininetTopo.conf')
|