Exemplo n.º 1
0
class MyRouter(P4RuntimeSwitch):
    def __init__(self, *opts, **kwargs):
        self.controller = None

        prog = kwargs.get('prog')
        if prog is None:
            raise Exception('Must specify p4 program')
        prog = P4Program(prog)

        if prog.version == 14:
            sw_path = 'simple_switch'
            enable_grpc = False
        elif prog.version == 16:
            sw_path = 'simple_switch_grpc'
            enable_grpc = True
        else:
            raise Exception('Switch does not support P4 version %s' %
                            prog.version)

        self.ctrl_args = dict()
        if 'ctrl_args' in kwargs:
            self.ctrl_args = kwargs['ctrl_args']
            del kwargs['ctrl_args']

        kwargs.update({
            'enable_grpc': enable_grpc,
            'cli_path': 'simple_switch_CLI',
            'sw_path': sw_path,
            'program': prog,
            'start_controller': True,
        })

        P4RuntimeSwitch.__init__(self, *opts, **kwargs)

    def initTable(self):
        bcast_mgid = 1
        ctrl_port = self.ctrl_args.get('ctrl_port', 1)
        # Broadcast to ports except for 0 (lo) and ctrl_port
        #bcast_ports = [p for p in self.intfs.keys() if p not in [0, ctrl_port]]
        bcast_ports = [4, 5]
        self.addMulticastGroup(mgid=bcast_mgid, ports=bcast_ports)
        self.insertTableEntry(
            table_name='MyIngress.fwd_l2',
            match_fields={'hdr.ethernet.dstAddr': ["ff:ff:ff:ff:ff:ff"]},
            action_name='MyIngress.set_mgid',
            action_params={'mgid': bcast_mgid})

    def start(self, controllers):
        super(MyRouter, self).start(controllers)
        self.initTable()
        self.controller = MacLearningController(self, **self.ctrl_args)
        self.controller.start()

    def stop(self):
        if self.controller is not None:
            self.controller.join()
        super(MyRouter, self).stop()
Exemplo n.º 2
0
 def start(self, controllers):
     super(MacLearningSwitch, self).start(controllers)
     self.initTable()
     self.controller = MacLearningController(self, **self.ctrl_args)
     self.controller.start()
Exemplo n.º 3
0
N = 3

topo = SingleSwitchTopo(N)
net = P4Mininet(program='l2switch.p4', topo=topo, auto_arp=False)
net.start()

# Add a mcast group for all ports (except for the CPU port)
bcast_mgid = 1
sw = net.get('s1')
sw.addMulticastGroup(mgid=bcast_mgid, ports=range(2, N + 1))

# Send MAC bcast packets to the bcast multicast group
sw.insertTableEntry(
    table_name='MyIngress.fwd_l2',
    match_fields={'hdr.ethernet.dstAddr': ["ff:ff:ff:ff:ff:ff"]},
    action_name='MyIngress.set_mgid',
    action_params={'mgid': bcast_mgid})

# Start the MAC learning controller
cpu = MacLearningController(sw)
cpu.start()

h2, h3 = net.get('h2'), net.get('h3')

print h2.cmd('arping -c1 10.0.0.3')

print h3.cmd('ping -c1 10.0.0.2')

# These table entries were added by the CPU:
sw.printTableEntries()
Exemplo n.º 4
0
#sw1.removeTableEntry(0)
#sw1.printTableEntries()

#print sw1.ReadTableEntries
#while True:
#	continue;
#sw.insertTableEntry(table_name='MyIngress.fwd_ip',
#	match_fields={'hdr.ipv4.dstAddr': ["224.0.0.5"]},
#	action_name='MyIngress.set_mgid',
#	action_params={'mgid': bcast_mgid})

# Start the MAC learning controller
areaId = 0
cpus = []
for routerId in range(0, N):
    cpu = MacLearningController(switches[routerId], areaId, routerId)
    cpu.start()
    cpus.append(cpu)

#print sw1.deleteTableEntry

#print topo.links();
#print h2.cmd('arping -c1 10.0.0.3')
time.sleep(80)
#print h2.cmd('arping -c1 10.0.7.0')
#print h2.cmd('ping -c1 10.0.7.0')
#print h4.cmd('arping -c1 10.0.1.2') #TODO: can uncomment this later
#print h2.cmd('ping -c1 10.0.1.2')
#print h2.cmd('ping -c1 10.0.0.7')
print host05.cmd('ping -c1 10.0.0.4')
print hosts[0].cmd('ping -c1 10.0.3.4')
Exemplo n.º 5
0
# Send MAC bcast packets to the bcast multicast group
sw.insertTableEntry(table_name='MyIngress.fwd_l2',
        match_fields={'hdr.ethernet.dstAddr': ["ff:ff:ff:ff:ff:ff"]},
        action_name='MyIngress.set_mgid',
        action_params={'mgid': bcast_mgid})

#sw.insertTableEntry(table_name='MyIngress.fwd_ip',
#	match_fields={'hdr.ipv4.dstAddr': ["224.0.0.5"]},
#	action_name='MyIngress.set_mgid',
#	action_params={'mgid': bcast_mgid})


# Start the MAC learning controller
areaId = 0
routerId = 0
cpu = MacLearningController(sw, areaId, routerId)
cpu.start()

h2, h3 = net.get('h2'), net.get('h3')

#print topo.links();
#print h2.cmd('arping -c1 10.0.0.3')

#print h3.cmd('ping -c1 10.0.0.2')
#p = PeriodicSenderThread(sw, None, 3)
#p.start()
time.sleep(10)
#p.join()

# These table entries were added by the CPU:
sw.printTableEntries()
Exemplo n.º 6
0
def inlineTest():
    opo = DoubleSwitchTopo(N)
    net = P4Mininet(program='switch.p4', topo=topo, auto_arp=False)
    # net = P4Mininet(program='switch.p4', topo=topo, auto_arp=False)
    net.start()

    # Add a mcast group for all ports (except for the CPU port)
    bcast_mgid = 1
    sw1 = net.get('s1a')
    sw2 = net.get('s2a')
    sw3 = net.get('s3a')
    sw1.addMulticastGroup(mgid=bcast_mgid, ports=range(2, N+1))
    sw2.addMulticastGroup(mgid=bcast_mgid, ports=range(2, N+1))
    sw3.addMulticastGroup(mgid=bcast_mgid, ports=range(2, N+1))


    # Send MAC bcast packets to the bcast multicast group
    sw1.insertTableEntry(table_name='MyIngress.fwd_l2',
                        match_fields={'hdr.ethernet.dstAddr': [
                            "ff:ff:ff:ff:ff:ff"]},
                        action_name='MyIngress.set_mgid',
                        action_params={'mgid': bcast_mgid})
    sw2.insertTableEntry(table_name='MyIngress.fwd_l2',
                        match_fields={'hdr.ethernet.dstAddr': [
                            "ff:ff:ff:ff:ff:ff"]},
                        action_name='MyIngress.set_mgid',
                        action_params={'mgid': bcast_mgid})
    sw3.insertTableEntry(table_name='MyIngress.fwd_l2',
                        match_fields={'hdr.ethernet.dstAddr': [
                            "ff:ff:ff:ff:ff:ff"]},
                        action_name='MyIngress.set_mgid',
                        action_params={'mgid': bcast_mgid})
    # Adding boradcast for PWOSPF
    sw1.insertTableEntry(table_name='MyIngress.ipv4_lpm',
                        match_fields={'hdr.ipv4.dstAddr': ["224.0.0.5", 32]},
                        action_name='MyIngress.set_mgid',
                        action_params={'mgid': bcast_mgid})

    sw2.insertTableEntry(table_name='MyIngress.ipv4_lpm',
                        match_fields={'hdr.ipv4.dstAddr': ["224.0.0.5", 32]},
                        action_name='MyIngress.set_mgid',
                        action_params={'mgid': bcast_mgid})
    sw3.insertTableEntry(table_name='MyIngress.ipv4_lpm',
                        match_fields={'hdr.ipv4.dstAddr': ["224.0.0.5", 32]},
                        action_name='MyIngress.set_mgid',
                        action_params={'mgid': bcast_mgid})

    # Start the MAC learning controller
    cpu1 = MacLearningController(sw1, "10.0.0.0", "192.168.0.0")
    cpu2 = MacLearningController(sw2, "10.0.1.0", "192.168.0.0")
    cpu3 = MacLearningController(sw3, "10.0.2.0", "192.168.0.0")
    cpu1.start()
    cpu2.start()
    cpu3.start()

    h2, h3, h4, h5 = net.get('h2'), net.get('h3'), net.get('h4'), net.get('h5')

    # time.sleep(1)
    print h2.cmd('arping -c1 10.0.0.3')
    print h3.cmd('arping -c1 10.0.1.2')

    time.sleep(5)
    # print h3.cmd('arping -c1 10.0.0.3')
    print h3.cmd('ping -c1 10.0.0.3')


    cpu1.join()
    cpu2.join()
    cpu3.join()


    # print h2.cmd('arping -c1 10.0.0.3')
    # print h2.cmd('arping -c1 10.0.0.3')
    # print h3.cmd('arping -c1 10.0.1.2')

    # print h3.cmd('ping -t 1 -c1 10.0.0.2')
    # print h2.cmd('ping -c1 10.0.0.3')

    # These table entries were added by the CPU:
    sw1.printTableEntries()
    sw2.printTableEntries()
    sw3.printTableEntries()
    print("Packet Counts")
    packet1, byte = sw1.readCounter("packet_counter", 0)
    packet2, byte = sw2.readCounter("packet_counter", 0)
    packet3, byte = sw3.readCounter("packet_counter", 0)
    print("IP = SW1: %d , SW2: %d , SW3: %d" % (packet1, packet2, packet3))
    packet1, byte = sw1.readCounter("packet_counter", 1)
    packet2, byte = sw2.readCounter("packet_counter", 1)
    packet3, byte = sw3.readCounter("packet_counter", 1)
    print("ARP = SW1: %d , SW2: %d , SW3: %d" % (packet1, packet2, packet3))
    packet1, byte = sw1.readCounter("packet_counter", 2)
    packet2, byte = sw2.readCounter("packet_counter", 2)
    packet3, byte = sw3.readCounter("packet_counter", 2)
    print("CPU = SW1: %d , SW2: %d , SW3: %d" % (packet1, packet2, packet3))
Exemplo n.º 7
0
def finalTest():
    MAX_PORT = 10
    total_sim_time = 20

    topo = FiveSwitchTopo()
    net = P4Mininet(program='switch.p4', topo=topo, auto_arp=False)
    net.start()

    bcast_mgid = 1
    switches = []
    cpus = []
    hosts = []
    for i in range(5):
        print("SWITCH %d" % (i+1))
        switches.append(net.get("s%da" % (i+1)))
        cpus.append(MacLearningController(switches[i],"10.0.%d.0" % (i), "192.168.0.0", "%02d:00:00:00:00:00" % (i+1)))
        
        switches[i].addMulticastGroup(mgid=bcast_mgid, ports=range(2, MAX_PORT+1))
        switches[i].insertTableEntry(table_name='MyIngress.fwd_l2', match_fields={'hdr.ethernet.dstAddr': [
                                     "ff:ff:ff:ff:ff:ff"]}, action_name='MyIngress.set_mgid', action_params={'mgid': bcast_mgid})
        switches[i].insertTableEntry(table_name='MyIngress.ipv4_lpm', match_fields={'hdr.ipv4.dstAddr': [
                                     "224.0.0.5", 32]}, action_name='MyIngress.set_mgid', action_params={'mgid': bcast_mgid})
        
        cpus[i].start()
        print("STARTED SWITCH %d" % (i+1))

    print("STARTED CPUS")
    for i in range(10):
        hosts.append(net.get('h%d' % (i + 1)))
    print("GOT HOSTS")
    for i in range(5):
        print (hosts[i*2]).cmd("arping -c1 10.0.%d.%d" % (i,((i+1)*2)))
    print("ARPPED")
    time.sleep(total_sim_time)
    print("PINGS SHOULD SUCCEED")
    print (hosts[0]).cmd("ping -c1 10.0.1.3")
    print (hosts[0]).cmd("ping -c1 10.0.2.5")
    print (hosts[0]).cmd("ping -c1 10.0.3.7")
    print (hosts[0]).cmd("ping -c1 10.0.4.9")
    print (hosts[4]).cmd("ping -c1 10.0.0.1")
    print("PINGS SHOULD FAIL")
    print (hosts[0]).cmd("ping -c1 10.0.1.2")
    print (hosts[0]).cmd("ping -c1 10.0.5.3")
    print (hosts[0]).cmd('ping -t 1 -c1 10.0.0.2')
    cpu_temp = cpus.pop(0)

    cpu_temp.join()
    print("TESTING ROUTER FAILURE")
    time.sleep(30)

    print("FINISHED SLEEPING")
    for i in cpus:
        i.join()

    for i in switches:
        i.printTableEntries()

    print("Packet Counts For Switches")
    count = 0
    for i in switches:
        print("Switch %d" % (count + 1))
        packet1, byte = i.readCounter("packet_counter", 0)
        packet2, byte = i.readCounter("packet_counter", 1)
        packet3, byte = i.readCounter("packet_counter", 2)

        print("IP = %d , ARP =  %d , CPU = %d" % (packet1, packet2, packet3))
        count += 1
Exemplo n.º 8
0
    match_fields={'hdr.ethernet.dstAddr': ["ff:ff:ff:ff:ff:ff"]},
    action_name='MyIngress.set_mgid',
    action_params={'mgid': bcast_mgid})

#print sw1.ReadTableEntries
#while True:
#	continue;
#sw.insertTableEntry(table_name='MyIngress.fwd_ip',
#	match_fields={'hdr.ipv4.dstAddr': ["224.0.0.5"]},
#	action_name='MyIngress.set_mgid',
#	action_params={'mgid': bcast_mgid})

# Start the MAC learning controller
areaId = 0
routerId = 0
cpu1 = MacLearningController(sw1, areaId, routerId)
cpu1.start()

routerId2 = 1
cpu2 = MacLearningController(sw2, areaId, routerId2)
cpu2.start()

h2, h4, h5 = net.get('h2'), net.get('h4'), net.get('h5')
#print sw1.deleteTableEntry

#print topo.links();
#print h2.cmd('arping -c1 10.0.0.3')
time.sleep(80)
#print h2.cmd('arping -c1 10.0.7.0')
#print h2.cmd('ping -c1 10.0.7.0')
#print h4.cmd('arping -c1 10.0.1.2') #TODO: can uncomment this later