# Leon Seng and Ahmet Sekercioglu (Last modified on 20200518) import os from mininet.cli import CLI from mininet.link import TCLink, Intf from mininet.log import setLogLevel, info from mininet.net import Mininet from mininet.node import Node, Controller, CPULimitedHost class LinuxRouter( Node ): # from the Mininet library "A Node with IP forwarding enabled." def config( self, **params ): super( LinuxRouter, self).config( **params ) # Enable forwarding on the router info ("enabling forwarding on ", self) self.cmd("sysctl net.ipv4.ip_forward=1") def terminate( self ): self.cmd("sysctl net.ipv4.ip_forward=0") super( LinuxRouter, self ).terminate() def FileTransferNetwork(): "Create an empty network and add nodes to it." net = Mininet(host=CPULimitedHost, link=TCLink, autoStaticArp=False) info("*** Adding controller\n") # turns OVS switch into an Ethernet bridge/learning bridge net.addController('c0') info("*** Adding hosts\n") router = net.addHost('router', cls=LinuxRouter) server = net.addHost('server', ip='172.16.1.2/24') client = net.addHost('client', ip='172.16.2.2/24', privateDirs=["/ftdownload"]) info("*** Creating links\n") # We add bidirectional links with bandwidth, delay and loss # characteristics, with a maximum queue size of 1000 packets. # bw is expressed as a number in Mbits/sec. # delay is expressed as a string with units in place # (e.g. '5ms', '100us', '1s') # loss is expressed as a percentage (between 0 and 100), and # max_queue_size is expressed in packets. net.addLink(server, router, bw=10, delay='5ms', loss=1, use_htb=True, intfName1="s-eth1", intfName2="r-eth1") net.addLink(client, router, bw=10, delay='5ms', loss=1, use_htb=True, intfName1="c-eth1", intfName2="r-eth2") info("*** Starting network\n") net.start() info("*** Configuring router interfaces\n") router.cmd("ip address add 172.16.1.1/24 dev r-eth1") router.cmd("ip address add 172.16.2.1/24 dev r-eth2") # You may like to stress test your program further by adding some # background traffic: # info("*** Setup iperf\n") # target_bw = "10M" # server.cmd(f"iperf --server --udp --bandwidth {target_bw} --interval 5 >> /tmp/iperf_server.log &") # router.cmd(f"iperf --client 172.16.1.2 --udp --bandwidth {target_bw} --dualtest --time 86400 --interval 5 >> /tmp/iperf_client.log &") info("*** Running CLI\n") CLI(net) info("*** Stopping network") net.stop() if __name__ == '__main__': os.system("sudo mn -c") setLogLevel("info") FileTransferNetwork()