Exemple #1
0
def of_demo_26():
    f = "cfg.yml"
    d = {}
    if(load_dict_from_file(f, d) is False):
        print("Config file '%s' read error: " % f)
        exit()

    try:
        ctrlIpAddr = d['ctrlIpAddr']
        ctrlPortNum = d['ctrlPortNum']
        ctrlUname = d['ctrlUname']
        ctrlPswd = d['ctrlPswd']
        nodeName = d['nodeName']
        rundelay = d['rundelay']
    except:
        print ("Failed to get Controller device attributes")
        exit(0)

    print ("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
    print ("<<< Demo 26 Start")
    print ("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")

    ctrl = Controller(ctrlIpAddr, ctrlPortNum, ctrlUname, ctrlPswd)
    ofswitch = OFSwitch(ctrl, nodeName)

    print ("<<< 'Controller': %s, 'OpenFlow' switch: '%s'" %
           (ctrlIpAddr, nodeName))

    flow_table_id = 0
    flow_id_base = 12
    flow_id = flow_id_base
    flowEntries = []

    # Sample flow entry
    flow_entry = FlowEntry()
    flow_entry.set_flow_cookie(6001)
    flow_entry.set_flow_table_id(flow_table_id)
    flow_entry.set_flow_id(flow_id)
    flow_id += 1
    flow_entry.set_flow_idle_timeout(12000)
    flow_entry.set_flow_hard_timeout(12000)
    flow_entry.set_flow_priority(1000)

    instruction = Instruction(instruction_order=0)
    action = DropAction(order=0)
    instruction.add_apply_action(action)
    flow_entry.add_instruction(instruction)

    match = Match()
    match.set_eth_type(ETH_TYPE_ARP)
    match.set_eth_src("00:11:22:33:44:55")
    match.set_eth_dst("aa:bb:cc:dd:ee:ff")
    flow_entry.add_match(match)

    flowEntries.append(flow_entry)

    # Sample flow entry
    flow_entry = FlowEntry()
    flow_entry.set_flow_cookie(7001)
    flow_entry.set_flow_table_id(flow_table_id)
    flow_entry.set_flow_id(flow_id)
    flow_id += 1
    flow_entry.set_flow_idle_timeout(2400)
    flow_entry.set_flow_hard_timeout(2400)
    flow_entry.set_flow_priority(2000)

    instruction = Instruction(instruction_order=0)
    action = OutputAction(order=0, port="CONTROLLER", max_len=60)
    instruction.add_apply_action(action)
    flow_entry.add_instruction(instruction)

    match = Match()
    match.set_eth_type(ETH_TYPE_IPv4)
    match.set_ipv4_src("1.2.3.4/32")
    match.set_ipv4_dst("192.168.1.11/32")
    flow_entry.add_match(match)

    flowEntries.append(flow_entry)

    # Sample flow entry
    flow_entry = FlowEntry()
    flow_entry.set_flow_cookie(800)
    flow_entry.set_flow_table_id(flow_table_id)
    flow_entry.set_flow_id(flow_id)
    flow_id += 1
    flow_entry.set_flow_hard_timeout(1800)
    flow_entry.set_flow_idle_timeout(1800)
    flow_entry.set_flow_priority(3000)

    instruction = Instruction(instruction_order=0)
    action = OutputAction(order=0, port=5)
    instruction.add_apply_action(action)
    action = OutputAction(order=1, port=6)
    instruction.add_apply_action(action)
    action = OutputAction(order=2, port=7)
    instruction.add_apply_action(action)

    flow_entry.add_instruction(instruction)

    match = Match()
    match.set_in_port(1)

    flow_entry.add_match(match)

    flowEntries.append(flow_entry)

    # Sample flow entry
    flow_entry = FlowEntry()
    flow_entry.set_flow_cookie(1234)
    flow_entry.set_flow_table_id(flow_table_id)
    flow_entry.set_flow_id(flow_id)
    flow_id += 1
    flow_entry.set_flow_hard_timeout(0)
    flow_entry.set_flow_idle_timeout(0)
    flow_entry.set_flow_priority(4000)

    instruction = Instruction(instruction_order=0)

    action = PushVlanHeaderAction(order=0)
    action.set_eth_type(ETH_TYPE_QINQ)
    instruction.add_apply_action(action)

    action = SetFieldAction(order=1)
    action.set_vlan_id(100)
    instruction.add_apply_action(action)

    action = PushVlanHeaderAction(order=2)
    action.set_eth_type(ETH_TYPE_DOT1Q)
    instruction.add_apply_action(action)

    action = SetFieldAction(order=3)
    action.set_vlan_id(998)
    instruction.add_apply_action(action)

    action = OutputAction(order=4, port=111)
    instruction.add_apply_action(action)

    flow_entry.add_instruction(instruction)

    match = Match()
    match.set_eth_type(ETH_TYPE_ARP)
    match.set_vlan_id(998)
    match.set_in_port(in_port=110)

    flow_entry.add_match(match)

    flowEntries.append(flow_entry)

    # Sample flow entry
    flow_entry = FlowEntry()
    flow_entry.set_flow_cookie(1234)
    flow_entry.set_flow_table_id(flow_table_id)
    flow_entry.set_flow_id(flow_id)
    flow_id += 1
    flow_entry.set_flow_hard_timeout(0)
    flow_entry.set_flow_idle_timeout(0)
    flow_entry.set_flow_priority(4000)

    instruction = Instruction(instruction_order=0)

    action = PushVlanHeaderAction(order=0)
    action.set_eth_type(ETH_TYPE_QINQ)
    instruction.add_apply_action(action)

    action = SetFieldAction(order=1)
    action.set_vlan_id(100)
    instruction.add_apply_action(action)

    action = PushVlanHeaderAction(order=2)
    action.set_eth_type(ETH_TYPE_DOT1Q)
    instruction.add_apply_action(action)

    action = SetFieldAction(order=3)
    action.set_vlan_id(998)
    instruction.add_apply_action(action)

    action = OutputAction(order=4, port=111)
    instruction.add_apply_action(action)

    flow_entry.add_instruction(instruction)

    match = Match()
    match.set_eth_type(ETH_TYPE_IPv4)
    match.set_vlan_id(998)
    match.set_in_port(in_port=110)

    flow_entry.add_match(match)

    flowEntries.append(flow_entry)

    # Sample flow entry
    flow_entry = FlowEntry()
    flow_entry.set_flow_cookie(1234)
    flow_entry.set_flow_table_id(flow_table_id)
    flow_entry.set_flow_id(flow_id)
    flow_id += 1
    flow_entry.set_flow_hard_timeout(0)
    flow_entry.set_flow_idle_timeout(0)
    flow_entry.set_flow_priority(4000)

    instruction = Instruction(instruction_order=0)

    action = PopVlanHeaderAction(order=0)
    instruction.add_apply_action(action)

    action = OutputAction(order=1, port=110)
    instruction.add_apply_action(action)

    flow_entry.add_instruction(instruction)

    match = Match()
    match.set_eth_type(ETH_TYPE_ARP)
    match.set_vlan_id(100)
    match.set_in_port(111)

    flow_entry.add_match(match)

    flowEntries.append(flow_entry)

    # Sample flow entry
    flow_entry = FlowEntry()
    flow_entry.set_flow_cookie(1234)
    flow_entry.set_flow_table_id(flow_table_id)
    flow_entry.set_flow_id(flow_id)
    flow_id += 1
    flow_entry.set_flow_hard_timeout(0)
    flow_entry.set_flow_idle_timeout(0)
    flow_entry.set_flow_priority(4000)

    instruction = Instruction(instruction_order=0)

    action = PopVlanHeaderAction(order=0)
    instruction.add_apply_action(action)

    action = OutputAction(order=1, port=110)
    instruction.add_apply_action(action)

    flow_entry.add_instruction(instruction)

    match = Match()
    match.set_eth_type(ETH_TYPE_IPv4)
    match.set_vlan_id(100)
    match.set_in_port(111)

    flow_entry.add_match(match)

    flowEntries.append(flow_entry)

    print ("\n")
    print ("<<< Remove configured flows from the Controller")
    ofswitch.delete_flows(flow_table_id)

    print ("\n")
    print ("<<< Set OpenFlow flows on the Controller")

    print ("\n")
    print ("<<< Flows to be configured:")

    flowEntries = sorted(flowEntries, key=lambda fe: fe.get_flow_priority())
    for fe in flowEntries:
        print (" %s" % fe.to_ofp_oxm_syntax())

    time.sleep(rundelay)
    success = True
    for fe in flowEntries:
        result = ofswitch.add_modify_flow(fe)
        status = result.get_status()
        if(status.eq(STATUS.OK)):
            pass
        else:
            success = False
            print ("\n")
            print ("!!!Demo terminated, failed to add flow:\n '%s'" %
                   fe.to_ofp_oxm_syntax())
            print (" Failure reason: %s" % status.detailed())

    if success:
        print "\n"
        print ("<<< Flows successfully added to the Controller")
    else:
        print "\n"
        print ("<<< Removing all flows from the Controller")
        ofswitch.delete_flows(flow_table_id)
        exit(0)

    print ("\n")
    print ("<<< Get configured flows from the Controller")
    time.sleep(rundelay)

    print ("\n")
    print ("<<< Configured flows:")
    result = ofswitch.get_configured_FlowEntries(flow_table_id=0)
    status = result.get_status()
    if(status.eq(STATUS.OK)):
        data = result.get_data()
        flowEntries = sorted(data, key=lambda fe: fe.get_flow_priority())
        for fe in flowEntries:
            print " %s" % fe.to_ofp_oxm_syntax()
    else:
        print ("\n")
        print ("!!!Demo terminated, reason: %s" % status.brief().lower())
        exit(0)

    print ("\n")
    print ("<<< Get configured flows by IDs from the Controller:")
    time.sleep(rundelay)
    for i in range(flow_id_base, flow_id):
        result = ofswitch.get_configured_FlowEntry(flow_table_id, i)
        status = result.get_status()
        if(status.eq(STATUS.OK)):
            print (" -- Flow id '%s'" % i)
            fe = result.get_data()
            print " %s" % fe.to_ofp_oxm_syntax()
        else:
            print ("\n")
            print ("!!!Demo terminated, reason: %s" % status.brief().lower())
            print ("<<< Removing all flows from the Controller")
            ofswitch.delete_flows(flow_table_id)
            exit(0)

    time.sleep(rundelay)

    print ("\n")
    print ("<<< Remove configured flows from the Controller")
    ofswitch.delete_flows(flow_table_id)

    time.sleep(rundelay)

    print ("\n")
    print ("<<< Get configured flows from the Controller")
    result = ofswitch.get_configured_FlowEntries(flow_table_id=0)
    status = result.get_status()
    if(status.eq(STATUS.DATA_NOT_FOUND)):
        print ("\n")
        print "<<< No configured flows"
    else:
        print ("\n")
        print ("!!!Demo terminated, reason: %s" % status.detailed())
        exit(0)

    print ("\n")
    print (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
    print (">>> Demo End")
    print (">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")