X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openstack%2Fnet-virt-providers%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fovsdb%2Fopenstack%2Fnetvirt%2Fproviders%2Fopenflow13%2FOF13Provider.java;h=bab343933daad6a5ba30af2d5a787fb019b60e9c;hb=f656ba1eed004c230b08d81dcb65819e923acd1d;hp=b46bf3c58f7a356b5fc228eabe441aae54c94861;hpb=56d377ec3dc294965137dd428fd104dcb2da97ed;p=netvirt.git diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java index b46bf3c58f..bab343933d 100644 --- a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java +++ b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/openflow13/OF13Provider.java @@ -9,7 +9,6 @@ */ package org.opendaylight.ovsdb.openstack.netvirt.providers.openflow13; -import java.math.BigInteger; import java.net.InetAddress; import java.util.List; import java.util.Map; @@ -26,33 +25,33 @@ import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork; import org.opendaylight.controller.networkconfig.neutron.NeutronSecurityGroup; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.utils.HexEncode; -import org.opendaylight.controller.sal.utils.Status; -import org.opendaylight.controller.sal.utils.StatusCode; import org.opendaylight.ovsdb.lib.notation.Row; import org.opendaylight.ovsdb.lib.notation.UUID; import org.opendaylight.ovsdb.openstack.netvirt.NetworkHandler; import org.opendaylight.ovsdb.openstack.netvirt.api.BridgeConfigurationManager; +import org.opendaylight.ovsdb.openstack.netvirt.api.ClassifierProvider; +import org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService; import org.opendaylight.ovsdb.openstack.netvirt.api.Constants; import org.opendaylight.ovsdb.openstack.netvirt.api.EgressAclProvider; import org.opendaylight.ovsdb.openstack.netvirt.api.IngressAclProvider; +import org.opendaylight.ovsdb.openstack.netvirt.api.L2ForwardingProvider; import org.opendaylight.ovsdb.openstack.netvirt.api.NetworkingProvider; import org.opendaylight.ovsdb.openstack.netvirt.api.SecurityServicesManager; import org.opendaylight.ovsdb.openstack.netvirt.api.TenantNetworkManager; import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService; import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService; +import org.opendaylight.ovsdb.plugin.api.Status; +import org.opendaylight.ovsdb.plugin.api.StatusCode; import org.opendaylight.ovsdb.plugin.api.StatusWithUuid; import org.opendaylight.ovsdb.schema.openvswitch.Bridge; import org.opendaylight.ovsdb.schema.openvswitch.Interface; import org.opendaylight.ovsdb.schema.openvswitch.Port; import org.opendaylight.ovsdb.utils.mdsal.openflow.InstructionUtils; -import org.opendaylight.ovsdb.utils.mdsal.openflow.MatchUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; @@ -65,7 +64,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase; @@ -90,8 +88,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -114,7 +110,7 @@ public class OF13Provider implements NetworkingProvider { private static final String OPENFLOW = "openflow:"; private static Long groupId = 1L; - private volatile org.opendaylight.ovsdb.openstack.netvirt.api.ConfigurationService configurationService; + private volatile ConfigurationService configurationService; private volatile BridgeConfigurationManager bridgeConfigurationManager; private volatile TenantNetworkManager tenantNetworkManager; private volatile OvsdbConfigurationService ovsdbConfigurationService; @@ -123,6 +119,8 @@ public class OF13Provider implements NetworkingProvider { private volatile SecurityServicesManager securityServicesManager; private volatile IngressAclProvider ingressAclProvider; private volatile EgressAclProvider egressAclProvider; + private volatile ClassifierProvider classifierProvider; + private volatile L2ForwardingProvider l2ForwardingProvider; public static final String NAME = "OF13Provider"; @@ -303,14 +301,14 @@ public class OF13Provider implements NetworkingProvider { String portUUID = this.getPortUuid(node, portName, bridgeUUID); Status status = new Status(StatusCode.SUCCESS); if (portUUID != null) { - status = ovsdbConfigurationService - .deleteRow(node, ovsdbConfigurationService.getTableName(node, Port.class), portUUID); - if (!status.isSuccess()) { - logger.error("Failed to delete port {} in {} status : {}", portName, bridgeUUID, - status); - return status; - } - logger.debug("Port {} delete status : {}", portName, status); + status = ovsdbConfigurationService + .deleteRow(node, ovsdbConfigurationService.getTableName(node, Port.class), portUUID); + if (!status.isSuccess()) { + logger.error("Failed to delete port {} in {} status : {}", portName, bridgeUUID, + status); + return status; + } + logger.debug("Port {} delete status : {}", portName, status); } return status; } catch (Exception e) { @@ -331,14 +329,14 @@ public class OF13Provider implements NetworkingProvider { } private void programLocalBridgeRules(Node node, Long dpid, String segmentationId, String attachedMac, long localPort) { - /* + /* * Table(0) Rule #3 * ---------------- * Match: VM sMac and Local Ingress Port * Action:Action: Set Tunnel ID and GOTO Local Table (5) */ - handleLocalInPort(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_1_ISOLATE_TENANT, segmentationId, localPort, attachedMac, true); + handleLocalInPort(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_1_ISOLATE_TENANT, segmentationId, localPort, attachedMac, true); /* * Table(0) Rule #4 @@ -347,51 +345,52 @@ public class OF13Provider implements NetworkingProvider { * Action: Drop w/ a low priority */ - handleDropSrcIface(dpid, localPort, true); - - /* - * Table(2) Rule #1 - * ---------------- - * Match: Match TunID and Destination DL/dMAC Addr - * Action: Output Port - * table=2,tun_id=0x5,dl_dst=00:00:00:00:00:01 actions=output:2 - */ - - handleLocalUcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, attachedMac, true); - - /* - * Table(2) Rule #2 - * ---------------- - * Match: Tunnel ID and dMAC (::::FF:FF) - * table=2,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ - * actions=output:2,3,4,5 - */ - - handleLocalBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, true); - - /* - * TODO : Optimize the following 2 writes to be restricted only for the very first port known in a segment. - */ - /* - * Table(1) Rule #3 - * ---------------- - * Match: Any remaining Ingress Local VM Packets - * Action: Drop w/ a low priority - * ------------------------------------------- - * table=1,priority=8192,tun_id=0x5 actions=goto_table:2 - */ - - handleTunnelMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, true); - - /* - * Table(2) Rule #3 - * ---------------- - * Match: Any Remaining Flows w/a TunID - * Action: Drop w/ a low priority - * table=2,priority=8192,tun_id=0x5 actions=drop - */ - - handleLocalTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, true); + handleDropSrcIface(dpid, localPort, true); + + /* + * Table(2) Rule #1 + * ---------------- + * Match: Match TunID and Destination DL/dMAC Addr + * Action: Output Port + * table=2,tun_id=0x5,dl_dst=00:00:00:00:00:01 actions=output:2 + */ + + handleLocalUcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, attachedMac, true); + + /* + * Table(2) Rule #2 + * ---------------- + * Match: Tunnel ID and dMAC (::::FF:FF) + * table=2,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:2,3,4,5 + */ + + handleLocalBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, true); + handleTunnelFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, true); + + /* + * TODO : Optimize the following 2 writes to be restricted only for the very first port known in a segment. + */ + /* + * Table(1) Rule #3 + * ---------------- + * Match: Any remaining Ingress Local VM Packets + * Action: Drop w/ a low priority + * ------------------------------------------- + * table=1,priority=8192,tun_id=0x5 actions=goto_table:2 + */ + + handleTunnelMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, true); + + /* + * Table(2) Rule #3 + * ---------------- + * Match: Any Remaining Flows w/a TunID + * Action: Drop w/ a low priority + * table=2,priority=8192,tun_id=0x5 actions=drop + */ + + handleLocalTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, true); } private void removeLocalBridgeRules(Node node, Long dpid, String segmentationId, String attachedMac, long localPort) { @@ -402,7 +401,7 @@ public class OF13Provider implements NetworkingProvider { * Action:Action: Set Tunnel ID and GOTO Local Table (5) */ - handleLocalInPort(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_1_ISOLATE_TENANT, segmentationId, localPort, attachedMac, false); + handleLocalInPort(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_1_ISOLATE_TENANT, segmentationId, localPort, attachedMac, false); /* * Table(0) Rule #4 @@ -411,27 +410,28 @@ public class OF13Provider implements NetworkingProvider { * Action: Drop w/ a low priority */ - handleDropSrcIface(dpid, localPort, false); + handleDropSrcIface(dpid, localPort, false); - /* - * Table(2) Rule #1 - * ---------------- - * Match: Match TunID and Destination DL/dMAC Addr - * Action: Output Port - * table=2,tun_id=0x5,dl_dst=00:00:00:00:00:01 actions=output:2 - */ + /* + * Table(2) Rule #1 + * ---------------- + * Match: Match TunID and Destination DL/dMAC Addr + * Action: Output Port + * table=2,tun_id=0x5,dl_dst=00:00:00:00:00:01 actions=output:2 + */ - handleLocalUcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, attachedMac, false); + handleLocalUcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, attachedMac, false); - /* - * Table(2) Rule #2 - * ---------------- - * Match: Tunnel ID and dMAC (::::FF:FF) - * table=2,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ - * actions=output:2,3,4,5 - */ + /* + * Table(2) Rule #2 + * ---------------- + * Match: Tunnel ID and dMAC (::::FF:FF) + * table=2,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:2,3,4,5 + */ - handleLocalBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, false); + handleLocalBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, false); + handleTunnelFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, false); } private void programLocalIngressTunnelBridgeRules(Node node, Long dpid, String segmentationId, String attachedMac, long tunnelOFPort, long localPort) { @@ -442,19 +442,19 @@ public class OF13Provider implements NetworkingProvider { * Action: GOTO Local Table (20) */ - handleTunnelIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, segmentationId, tunnelOFPort, true); + handleTunnelIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, segmentationId, tunnelOFPort, true); - /* - * Table(1) Rule #2 - * ---------------- - * Match: Match Tunnel ID and L2 ::::FF:FF Flooding - * Action: Flood to selected destination TEPs - * ------------------------------------------- - * table=1,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ - * actions=output:10,output:11,goto_table:2 - */ + /* + * Table(1) Rule #2 + * ---------------- + * Match: Match Tunnel ID and L2 ::::FF:FF Flooding + * Action: Flood to selected destination TEPs + * ------------------------------------------- + * table=1,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:10,output:11,goto_table:2 + */ - handleTunnelFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, tunnelOFPort, true); + handleTunnelFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, tunnelOFPort, true); } @@ -521,15 +521,15 @@ public class OF13Provider implements NetworkingProvider { handleTunnelIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, segmentationId, tunnelOFPort, false); - /* - * Table(1) Rule #2 - * ---------------- - * Match: Match Tunnel ID and L2 ::::FF:FF Flooding - * Action: Flood to selected destination TEPs - * ------------------------------------------- - * table=1,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ - * actions=output:10,output:11,goto_table:2 - */ + /* + * Table(1) Rule #2 + * ---------------- + * Match: Match Tunnel ID and L2 ::::FF:FF Flooding + * Action: Flood to selected destination TEPs + * ------------------------------------------- + * table=1,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:10,output:11,goto_table:2 + */ handleTunnelFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, tunnelOFPort, false); } @@ -538,6 +538,7 @@ public class OF13Provider implements NetworkingProvider { /* * Table(0) Rule #1 * ---------------- + * Tag traffic coming from the local port and vm srcmac * Match: VM sMac and Local Ingress Port * Action: Set VLAN ID and GOTO Local Table 1 */ @@ -549,6 +550,7 @@ public class OF13Provider implements NetworkingProvider { /* * Table(0) Rule #3 * ---------------- + * Drop all other traffic coming from the local port * Match: Drop any remaining Ingress Local VM Packets * Action: Drop w/ a low priority */ @@ -558,6 +560,7 @@ public class OF13Provider implements NetworkingProvider { /* * Table(2) Rule #1 * ---------------- + * Forward unicast traffic destined to the local port after stripping tag * Match: Match VLAN ID and Destination DL/dMAC Addr * Action: strip vlan, output to local port * Example: table=2,vlan_id=0x5,dl_dst=00:00:00:00:00:01 actions= strip vlan, output:2 @@ -575,24 +578,25 @@ public class OF13Provider implements NetworkingProvider { * actions= strip_vlan, output:2,3,4,5 */ - handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, - localPort, true); + //handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, + // localPort, ethPort, true); + //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, + // segmentationId, localPort, ethport, true); - /* - * Table(2) Rule #3 - * ---------------- - * Match: Any Remaining Flows w/a VLAN ID - * Action: Drop w/ a low priority - * Example: table=2,priority=8192,vlan_id=0x5 actions=drop - */ + /* + * Table(2) Rule #3 + * ---------------- + * Match: Any Remaining Flows w/a VLAN ID + * Action: Drop w/ a low priority + * Example: table=2,priority=8192,vlan_id=0x5 actions=drop + */ - handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, - true); - } + //handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, + // true); + } private void removeLocalVlanRules(Node node, Long dpid, - String segmentationId, String attachedMac, - long localPort) { + String segmentationId, String attachedMac, long localPort) { /* * Table(0) Rule #1 * ---------------- @@ -633,20 +637,94 @@ public class OF13Provider implements NetworkingProvider { * actions= strip_vlan, output:2,3,4,5 */ - handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, - localPort, false); - } + //handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, + // localPort, ethPort, false); + //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, + // segmentationId, localPort, false); + + } + + private void programLocalIngressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac, + long localPort, long ethPort) { + /* + * Table(0) Rule #2 + * ---------------- + * Match: Ingress port = physical interface, Vlan ID + * Action: GOTO Local Table 2 + */ + + handleVlanIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, + segmentationId, ethPort, true); + + /* + * Table(1) Rule #2 + * ---------------- + * Match: Match VLAN ID and L2 ::::FF:FF Flooding + * Action: Flood to local and remote VLAN members + * ------------------------------------------- + * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:10 (eth port),goto_table:2 + * table=110, priority=16384,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4 + */ + + handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, ethPort, true); + + /* + * Table(1) Rule #2 + * ---------------- + * Match: Match VLAN ID and L2 ::::FF:FF Flooding + * Action: Flood to local and remote VLAN members + * ------------------------------------------- + * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:10 (eth port),goto_table:2 + */ + + //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, + // segmentationId, ethPort, true); + } + + private void programRemoteEgressVlanRules(Node node, Long dpid, String segmentationId, + String attachedMac, long ethPort) { + /* + * Table(1) Rule #1 + * ---------------- + * Match: Destination MAC is local VM MAC and vlan id + * Action: go to table 2 + * ------------------------------------------- + * Example: table=1,vlan_id=0x5,dl_dst=00:00:00:00:00:08 \ + * actions=goto_table:2 + */ + + //handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, + // segmentationId, ethPort, attachedMac, true); + + /* + * Table(1) Rule #3 + * ---------------- + * Match: VLAN ID + * Action: Go to table 2 + * ------------------------------------------- + * Example: table=1,priority=8192,vlan_id=0x5 actions=output:1,goto_table:2 + * table=110,priority=8192,dl_vlan=2001 actions=output:2 + */ + + handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, ethPort, true); + } - private void programLocalIngressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac, long ethPort) { - /* - * Table(0) Rule #2 - * ---------------- - * Match: Ingress port = physical interface, Vlan ID - * Action: GOTO Local Table 2 - */ + private void removeRemoteEgressVlanRules(Node node, Long dpid, String segmentationId, + String attachedMac, long localPort, long ethPort) { + /* + * Table(1) Rule #1 + * ---------------- + * Match: Destination MAC is local VM MAC and vlan id + * Action: go to table 2 + * ------------------------------------------- + * Example: table=1,vlan_id=0x5,dl_dst=00:00:00:00:00:08 \ + * actions=goto_table:2 + */ - handleVlanIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, true); + //handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, + // segmentationId, ethPort, attachedMac, false); /* * Table(1) Rule #2 @@ -656,65 +734,22 @@ public class OF13Provider implements NetworkingProvider { * ------------------------------------------- * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ * actions=output:10 (eth port),goto_table:2 + * table=110, priority=16384,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4 + */ + + handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, ethPort, false); + } + + private void removePerVlanRules(Node node, Long dpid, String segmentationId, long localPort, long ethPort) { + /* + * Table(2) Rule #3 + * ---------------- + * Match: Any Remaining Flows w/a VLAN ID + * Action: Drop w/ a low priority + * Example: table=2,priority=8192,vlan_id=0x5 actions=drop */ - handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, true); - } - - private void programRemoteEgressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac, long ethPort) { - /* - * Table(1) Rule #1 - * ---------------- - * Match: Destination MAC is local VM MAC and vlan id - * Action: go to table 2 - * ------------------------------------------- - * Example: table=1,vlan_id=0x5,dl_dst=00:00:00:00:00:08 \ - * actions=goto_table:2 - */ - - handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, attachedMac, true); - - /* - * Table(1) Rule #3 - * ---------------- - * Match: VLAN ID - * Action: Go to table 2 - * ------------------------------------------- - * Example: table=1,priority=8192,vlan_id=0x5 actions=output:1,goto_table:2 - */ - - handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, true); - } - - private void removeRemoteEgressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac, long ethPort) { - /* - * Table(1) Rule #1 - * ---------------- - * Match: Destination MAC is local VM MAC and vlan id - * Action: go to table 2 - * ------------------------------------------- - * Example: table=1,vlan_id=0x5,dl_dst=00:00:00:00:00:08 \ - * actions=goto_table:2 - */ - - handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, attachedMac, false); - } - - private void removePerVlanRules(Node node, Long dpid, String segmentationId, long ethPort) { - /* - * Table(2) Rule #3 - * ---------------- - * Match: Any Remaining Flows w/a VLAN ID - * Action: Drop w/ a low priority - * Example: table=2,priority=8192,vlan_id=0x5 actions=drop - */ - - handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, - false); + //handleLocalVlanTableMiss(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, false); /* * Table(0) Rule #2 @@ -723,34 +758,47 @@ public class OF13Provider implements NetworkingProvider { * Action: GOTO Local Table 2 */ - handleVlanIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, false); - - /* - * Table(1) Rule #2 - * ---------------- - * Match: Match VLAN ID and L2 ::::FF:FF Flooding - * Action: Flood to local and remote VLAN members - * ------------------------------------------- - * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ - * actions=output:10 (eth port),goto_table:2 - */ - - handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, false); - - /* - * Table(1) Rule #3 - * ---------------- - * Match: VLAN ID - * Action: Go to table 2 - * ------------------------------------------- - * Example: table=1,priority=8192,vlan_id=0x5 actions=output:1,goto_table:2 - */ - - handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, - segmentationId, ethPort, false); - } + handleVlanIn(dpid, TABLE_0_DEFAULT_INGRESS, TABLE_2_LOCAL_FORWARD, segmentationId, ethPort, false); + + /* + * Table(1) Rule #2 + * ---------------- + * Match: Match VLAN ID and L2 ::::FF:FF Flooding + * Action: Flood to local and remote VLAN members + * ------------------------------------------- + * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:10 (eth port),goto_table:2 + * table=110, priority=16384,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4 + */ + + //handleLocalVlanBcastOut(dpid, TABLE_2_LOCAL_FORWARD, segmentationId, localPort, ethPort, false); + + /* + * Table(1) Rule #2 + * ---------------- + * Match: Match VLAN ID and L2 ::::FF:FF Flooding + * Action: Flood to local and remote VLAN members + * ------------------------------------------- + * Example: table=1,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:10 (eth port),goto_table:2 + */ + + //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, + // segmentationId, ethPort, false); + + /* + * Table(1) Rule #3 + * ---------------- + * Match: VLAN ID + * Action: Go to table 2 + * ------------------------------------------- + * Example: table=1,priority=8192,vlan_id=0x5 actions=output:1,goto_table:2 + * table=110,priority=8192,dl_vlan=2001 actions=output:2 + */ + + handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, ethPort, false); + } + private Long getDpid (Node node, String bridgeUuid) { Preconditions.checkNotNull(ovsdbConfigurationService); try { @@ -841,10 +889,10 @@ public class OF13Provider implements NetworkingProvider { ingressAclProvider.programPortSecurityACL(node, dpid, segmentationId, attachedMac, localPort, securityGroupInPort); egressAclProvider.programPortSecurityACL(node, dpid, segmentationId, attachedMac, localPort, - securityGroupInPort); + securityGroupInPort); } - else if (networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || - networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)) { + if (networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || + networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)) { logger.debug("Program local bridge rules for interface {}", intf.getName()); programLocalBridgeRules(node, dpid, segmentationId, attachedMac, localPort); } @@ -885,7 +933,7 @@ public class OF13Provider implements NetworkingProvider { logger.debug("Remove local vlan rules for interface {}", intf.getName()); removeLocalVlanRules(node, dpid, segmentationId, attachedMac, localPort); } else if (networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) || - networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)) { + networkType.equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)) { logger.debug("Remove local bridge rules for interface {}", intf.getName()); removeLocalBridgeRules(node, dpid, segmentationId, attachedMac, localPort); } @@ -1049,6 +1097,7 @@ public class OF13Provider implements NetworkingProvider { logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node); return; } + long localPort = (Long)of_ports.toArray()[0]; Map externalIds = intf.getExternalIdsColumn().getData(); if (externalIds == null) { @@ -1074,7 +1123,7 @@ public class OF13Provider implements NetworkingProvider { if (of_ports == null || of_ports.size() <= 0) { // Wait for the OVSDB update to sync up the Local cache. Thread.sleep(500); - timeout--; + timeout--; } } @@ -1089,9 +1138,9 @@ public class OF13Provider implements NetworkingProvider { throw new Exception("port number < 0"); } logger.debug("Identified eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node); - + // TODO: add logic to only add rule on remote nodes programRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, ethOFPort); - programLocalIngressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, ethOFPort); + programLocalIngressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, localPort, ethOFPort); return; } } @@ -1102,7 +1151,7 @@ public class OF13Provider implements NetworkingProvider { } private void removeVlanRules (NeutronNetwork network, Node node, - Interface intf, boolean isLastInstanceOnNode) { + Interface intf, boolean isLastInstanceOnNode) { Preconditions.checkNotNull(ovsdbConfigurationService); logger.debug("Remove vlan rules for interface {}", intf.getName()); @@ -1119,6 +1168,7 @@ public class OF13Provider implements NetworkingProvider { logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node); return; } + long localPort = (Long)of_ports.toArray()[0]; Map externalIds = intf.getExternalIdsColumn().getData(); if (externalIds == null) { @@ -1137,7 +1187,7 @@ public class OF13Provider implements NetworkingProvider { for (Row row : intfs.values()) { Interface ethIntf = ovsdbConfigurationService.getTypedRow(node, Interface.class, row); if (ethIntf.getName().equalsIgnoreCase(bridgeConfigurationManager.getPhysicalInterfaceName(node, - network.getProviderPhysicalNetwork()))) { + network.getProviderPhysicalNetwork()))) { of_ports = ethIntf.getOpenFlowPortColumn().getData(); if (of_ports == null || of_ports.size() <= 0) { logger.error("Could NOT Identify eth port {} on {}", ethIntf.getName(), node); @@ -1151,9 +1201,9 @@ public class OF13Provider implements NetworkingProvider { } logger.debug("Identified eth port {} -> OF ({}) on {}", ethIntf.getName(), ethOFPort, node); - removeRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, ethOFPort); + removeRemoteEgressVlanRules(node, dpid, network.getProviderSegmentationID(), attachedMac, localPort, ethOFPort); if (isLastInstanceOnNode) { - removePerVlanRules(node, dpid, network.getProviderSegmentationID(), ethOFPort); + removePerVlanRules(node, dpid, network.getProviderSegmentationID(), localPort, ethOFPort); } return; } @@ -1174,17 +1224,24 @@ public class OF13Provider implements NetworkingProvider { if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VLAN)) { this.programVlanRules(network, srcNode, intf); } else if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) - || network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)){ + || network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)){ for (Node dstNode : nodes) { InetAddress src = configurationService.getTunnelEndPoint(srcNode); InetAddress dst = configurationService.getTunnelEndPoint(dstNode); - Status status = addTunnelPort(srcNode, network.getProviderNetworkType(), src, dst); - if (status.isSuccess()) { - this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), dst, srcNode, intf, true); - } - addTunnelPort(dstNode, network.getProviderNetworkType(), dst, src); - if (status.isSuccess()) { - this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), src, dstNode, intf, false); + if ((src != null) && (dst != null)) { + Status status = addTunnelPort(srcNode, network.getProviderNetworkType(), src, dst); + if (status.isSuccess()) { + this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), dst, srcNode, intf, true); + } + addTunnelPort(dstNode, network.getProviderNetworkType(), dst, src); + if (status.isSuccess()) { + this.programTunnelRules(network.getProviderNetworkType(), network.getProviderSegmentationID(), src, dstNode, intf, false); + } + } else { + logger.warn("Tunnel end-point configuration missing. Please configure it in OpenVSwitch Table. " + + "Check source {} or destination {}", + src != null ? src.getHostAddress() : "null", + dst != null ? dst.getHostAddress() : "null"); } } } @@ -1229,7 +1286,7 @@ public class OF13Provider implements NetworkingProvider { logger.info("Delete intf " + intf.getName() + " isLastInstanceOnNode " + isLastInstanceOnNode); List phyIfName = bridgeConfigurationManager.getAllPhysicalInterfaceNames(srcNode); if (intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN) - || intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE)) { + || intf.getTypeColumn().getData().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE)) { /* Delete tunnel port */ try { Map options = intf.getOptionsColumn().getData(); @@ -1248,19 +1305,26 @@ public class OF13Provider implements NetworkingProvider { if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VLAN)) { this.removeVlanRules(network, srcNode, - intf, isLastInstanceOnNode); + intf, isLastInstanceOnNode); } else if (network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_GRE) - || network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)) { + || network.getProviderNetworkType().equalsIgnoreCase(NetworkHandler.NETWORK_TYPE_VXLAN)) { for (Node dstNode : nodes) { InetAddress src = configurationService.getTunnelEndPoint(srcNode); InetAddress dst = configurationService.getTunnelEndPoint(dstNode); - logger.info("Remove tunnel rules for interface " + intf.getName() + " on srcNode " + srcNode.getNodeIDString()); - this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(), - dst, srcNode, intf, true, isLastInstanceOnNode); - logger.info("Remove tunnel rules for interface " + intf.getName() + " on dstNode " + dstNode.getNodeIDString()); - this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(), - src, dstNode, intf, false, isLastInstanceOnNode); + if ((src != null) && (dst != null)) { + logger.info("Remove tunnel rules for interface " + intf.getName() + " on srcNode " + srcNode.getNodeIDString()); + this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(), + dst, srcNode, intf, true, isLastInstanceOnNode); + logger.info("Remove tunnel rules for interface " + intf.getName() + " on dstNode " + dstNode.getNodeIDString()); + this.removeTunnelRules(tunnelType, network.getProviderSegmentationID(), + src, dstNode, intf, false, isLastInstanceOnNode); + } else { + logger.warn("Tunnel end-point configuration missing. Please configure it in OpenVSwitch Table. ", + "Check source {} or destination {}", + src != null ? src.getHostAddress() : "null", + dst != null ? dst.getHostAddress() : "null"); + } } } } @@ -1294,68 +1358,29 @@ public class OF13Provider implements NetworkingProvider { * Action: Packet_In to Controller Reserved Port */ - writeLLDPRule(dpid); - if (bridgeName.equals(configurationService.getExternalBridgeName())) { - writeNormalRule(dpid); - } + writeLLDPRule(dpid); + if (bridgeName.equals(configurationService.getExternalBridgeName())) { + writeNormalRule(dpid); + } } /* - * Create an LLDP Flow Rule to encapsulate into - * a packet_in that is sent to the controller - * for topology handling. - * Match: Ethertype 0x88CCL - * Action: Punt to Controller in a Packet_In msg - */ + * Create an LLDP Flow Rule to encapsulate into + * a packet_in that is sent to the controller + * for topology handling. + * Match: Ethertype 0x88CCL + * Action: Punt to Controller in a Packet_In msg + */ private void writeLLDPRule(Long dpidLong) { - - String nodeName = OPENFLOW + dpidLong; - EtherType etherType = new EtherType(0x88CCL); - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create Match(es) and Set them in the FlowBuilder Object - flowBuilder.setMatch(MatchUtils.createEtherTypeMatch(matchBuilder, etherType).build()); - - // Create the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createSendToControllerInstructions(ib); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - String flowId = "LLDP"; - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setBarrier(true); - flowBuilder.setTableId((short) 0); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - writeFlow(flowBuilder, nodeBuilder); + classifierProvider.programLLDPPuntRule(dpidLong); } /* - * Create a NORMAL Table Miss Flow Rule - * Match: any - * Action: forward to NORMAL pipeline - */ + * Create a NORMAL Table Miss Flow Rule + * Match: any + * Action: forward to NORMAL pipeline + */ private void writeNormalRule(Long dpidLong) { @@ -1373,7 +1398,7 @@ public class OF13Provider implements NetworkingProvider { List instructions = Lists.newArrayList(); // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createNormalInstructions(ib); + InstructionUtils.createNormalInstructions(nodeName, ib); ib.setOrder(0); ib.setKey(new InstructionKey(0)); instructions.add(ib.build()); @@ -1406,58 +1431,9 @@ public class OF13Provider implements NetworkingProvider { */ private void handleTunnelIn(Long dpidLong, Short writeTable, - Short goToTableId, String segmentationId, - Long ofPort, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - BigInteger tunnelId = new BigInteger(segmentationId); - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create Match(es) and Set them in the FlowBuilder Object - flowBuilder.setMatch(MatchUtils.createTunnelIDMatch(matchBuilder, tunnelId).build()); - flowBuilder.setMatch(MatchUtils.createInPortMatch(matchBuilder, dpidLong, ofPort).build()); - - if (write) { - // Create the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createGotoTableInstructions(ib, goToTableId); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } - - String flowId = "TunnelIn_"+segmentationId+"_"+ofPort; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - if (write) { - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } + Short goToTableId, String segmentationId, + Long ofPort, boolean write) { + classifierProvider.programTunnelIn(dpidLong, segmentationId, ofPort, write); } /* @@ -1468,314 +1444,63 @@ public class OF13Provider implements NetworkingProvider { */ private void handleVlanIn(Long dpidLong, Short writeTable, Short goToTableId, - String segmentationId, Long ethPort, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); + String segmentationId, Long ethPort, boolean write) { + classifierProvider.programVlanIn(dpidLong, segmentationId, ethPort, write); + } - // Create Match(es) and Set them in the FlowBuilder Object - flowBuilder.setMatch( - MatchUtils.createVlanIdMatch(matchBuilder, new VlanId(Integer.valueOf(segmentationId))) - .build()) - .setMatch(MatchUtils.createInPortMatch(matchBuilder, dpidLong, ethPort) - .build()); + /* + * (Table:0) Egress VM Traffic Towards TEP + * Match: Destination Ethernet Addr and OpenFlow InPort + * Instruction: Set TunnelID and GOTO Table Tunnel Table (n) + * table=0,in_port=2,dl_src=00:00:00:00:00:01 \ + * actions=set_field:5->tun_id,goto_table=1" + */ - if (write) { - // Create the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); + private void handleLocalInPort(Long dpidLong, Short writeTable, Short goToTableId, + String segmentationId, Long inPort, String attachedMac, + boolean write) { + classifierProvider.programLocalInPort(dpidLong, segmentationId, inPort, attachedMac, write); + } - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); + /* + * (Table:0) Egress VM Traffic Towards TEP + * Match: Source Ethernet Addr and OpenFlow InPort + * Instruction: Set VLANID and GOTO Table Egress (n) + * table=0,in_port=2,dl_src=00:00:00:00:00:01 \ + * actions=push_vlan, set_field:5->vlan_id,goto_table=1" + */ - // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createGotoTableInstructions(ib, goToTableId); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); + private void handleLocalInPortSetVlan(Long dpidLong, Short writeTable, + Short goToTableId, String segmentationId, + Long inPort, String attachedMac, + boolean write) { + classifierProvider.programLocalInPortSetVlan(dpidLong, segmentationId, inPort, attachedMac, write); + } - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); + /* + * (Table:0) Drop frames source from a VM that do not + * match the associated MAC address of the local VM. + * Match: Low priority anything not matching the VM SMAC + * Instruction: Drop + * table=0,priority=16384,in_port=1 actions=drop" + */ - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } - - String flowId = "VlanIn_"+segmentationId+"_"+ethPort; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - if (write) { - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } - } - - /* - * (Table:0) Egress VM Traffic Towards TEP - * Match: Destination Ethernet Addr and OpenFlow InPort - * Instruction: Set TunnelID and GOTO Table Tunnel Table (n) - * table=0,in_port=2,dl_src=00:00:00:00:00:01 \ - * actions=set_field:5->tun_id,goto_table=1" - */ - - private void handleLocalInPort(Long dpidLong, Short writeTable, Short goToTableId, - String segmentationId, Long inPort, String attachedMac, - boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch(MatchUtils.createEthSrcMatch(matchBuilder, new MacAddress(attachedMac)).build()); - // TODO Broken In_Port Match - flowBuilder.setMatch(MatchUtils.createInPortMatch(matchBuilder, dpidLong, inPort).build()); - - String flowId = "LocalMac_"+segmentationId+"_"+inPort+"_"+attachedMac; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - if (write) { - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // GOTO Instructions Need to be added first to the List - InstructionUtils.createGotoTableInstructions(ib, goToTableId); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - // TODO Broken SetTunID - InstructionUtils.createSetTunnelIdInstructions(ib, new BigInteger(segmentationId)); - ib.setOrder(1); - ib.setKey(new InstructionKey(1)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } - } - - /* - * (Table:0) Egress VM Traffic Towards TEP - * Match: Source Ethernet Addr and OpenFlow InPort - * Instruction: Set VLANID and GOTO Table Egress (n) - * table=0,in_port=2,dl_src=00:00:00:00:00:01 \ - * actions=push_vlan, set_field:5->vlan_id,goto_table=1" - */ - - private void handleLocalInPortSetVlan(Long dpidLong, Short writeTable, - Short goToTableId, String segmentationId, - Long inPort, String attachedMac, - boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch(MatchUtils.createEthSrcMatch(matchBuilder, new MacAddress(attachedMac)).build()); - flowBuilder.setMatch(MatchUtils.createInPortMatch(matchBuilder, dpidLong, inPort).build()); - - String flowId = "LocalMac_"+segmentationId+"_"+inPort+"_"+attachedMac; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - if (write) { - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // GOTO Instructions Need to be added first to the List - InstructionUtils.createGotoTableInstructions(ib, goToTableId); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - // Set VLAN ID Instruction - InstructionUtils.createSetVlanInstructions(ib, new VlanId(Integer.valueOf(segmentationId))); - ib.setOrder(1); - ib.setKey(new InstructionKey(1)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } - } + private void handleDropSrcIface(Long dpidLong, Long inPort, boolean write) { + classifierProvider.programDropSrcIface(dpidLong, inPort, write); + } /* - * (Table:0) Drop frames source from a VM that do not - * match the associated MAC address of the local VM. - * Match: Low priority anything not matching the VM SMAC - * Instruction: Drop - * table=0,priority=16384,in_port=1 actions=drop" + * (Table:1) Egress Tunnel Traffic + * Match: Destination Ethernet Addr and Local InPort + * Instruction: Set TunnelID and GOTO Table Tunnel Table (n) + * table=1,tun_id=0x5,dl_dst=00:00:00:00:00:08 \ + * actions=output:10,goto_table:2" */ - - private void handleDropSrcIface(Long dpidLong, Long inPort, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch(MatchUtils.createInPortMatch(matchBuilder, dpidLong, inPort).build()); - - if (write) { - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createDropInstructions(ib); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } - - String flowId = "DropFilter_"+inPort; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(TABLE_0_DEFAULT_INGRESS); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setPriority(8192); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - if (write) { - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } - } - - /* - * (Table:1) Egress Tunnel Traffic - * Match: Destination Ethernet Addr and Local InPort - * Instruction: Set TunnelID and GOTO Table Tunnel Table (n) - * table=1,tun_id=0x5,dl_dst=00:00:00:00:00:08 \ - * actions=output:10,goto_table:2" - */ private void handleTunnelOut(Long dpidLong, Short writeTable, - Short goToTableId, String segmentationId, - Long OFPortOut, String attachedMac, - boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch(MatchUtils.createTunnelIDMatch(matchBuilder, new BigInteger(segmentationId)).build()); - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress(attachedMac), null).build()); - - String flowId = "TunnelOut_"+segmentationId+"_"+OFPortOut+"_"+attachedMac; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - if (write) { - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // GOTO Instructions - InstructionUtils.createGotoTableInstructions(ib, goToTableId); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - // Set the Output Port/Iface - InstructionUtils.createOutputPortInstructions(ib, dpidLong, OFPortOut); - ib.setOrder(1); - ib.setKey(new InstructionKey(1)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } + Short goToTableId, String segmentationId, + Long OFPortOut, String attachedMac, + boolean write) { + l2ForwardingProvider.programTunnelOut(dpidLong, segmentationId, OFPortOut, attachedMac, write); } /* @@ -1786,150 +1511,24 @@ public class OF13Provider implements NetworkingProvider { * actions= goto_table:2" */ - private void handleVlanOut(Long dpidLong, Short writeTable, - Short goToTableId, String segmentationId, - Long ethPort, String attachedMac, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch( - MatchUtils.createVlanIdMatch(matchBuilder, new VlanId(Integer.valueOf(segmentationId))).build()); - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress(attachedMac), null).build()); - - String flowId = "VlanOut_"+segmentationId+"_"+ethPort+"_"+attachedMac; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - if (write) { - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // GOTO Instructions - InstructionUtils.createGotoTableInstructions(ib, goToTableId); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } - } - - /* - * (Table:1) Egress Tunnel Traffic - * Match: Destination Ethernet Addr and Local InPort - * Instruction: Set TunnelID and GOTO Table Tunnel Table (n) - * table=1,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ - * actions=output:10,output:11,goto_table:2 - */ - - private void handleTunnelFloodOut(Long dpidLong, Short writeTable, - Short localTable, String segmentationId, - Long OFPortOut, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - // Match TunnelID - flowBuilder.setMatch(MatchUtils.createTunnelIDMatch(matchBuilder, new BigInteger(segmentationId)).build()); - // Match DMAC - - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress("01:00:00:00:00:00"), - new MacAddress("01:00:00:00:00:00")).build()); - - String flowId = "TunnelFloodOut_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setBarrier(true); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(16384); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - Flow flow = this.getFlow(flowBuilder, nodeBuilder); - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - List instructions = Lists.newArrayList(); - List existingInstructions = null; - if (flow != null) { - Instructions ins = flow.getInstructions(); - if (ins != null) { - existingInstructions = ins.getInstruction(); - } - } - - if (write) { - // GOTO Instruction - InstructionUtils.createGotoTableInstructions(ib, localTable); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - // Set the Output Port/Iface - //createOutputGroupInstructions(nodeBuilder, ib, dpidLong, OFPortOut, existingInstructions); - createOutputPortInstructions(ib, dpidLong, OFPortOut, existingInstructions); - ib.setOrder(1); - ib.setKey(new InstructionKey(1)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - /* remove port from action list */ - boolean flowRemove = InstructionUtils.removeOutputPortFromInstructions(ib, dpidLong, - OFPortOut, existingInstructions); - if (flowRemove) { - /* if all port are removed, remove the flow too. */ - removeFlow(flowBuilder, nodeBuilder); - } else { - /* Install instruction with new output port list*/ - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); + private void handleVlanOut(Long dpidLong, Short writeTable, + Short goToTableId, String segmentationId, + Long ethPort, String attachedMac, boolean write) { + l2ForwardingProvider.programVlanOut(dpidLong, segmentationId, ethPort, attachedMac, write); + } - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); + /* + * (Table:1) Egress Tunnel Traffic + * Match: Destination Ethernet Addr and Local InPort + * Instruction: Set TunnelID and GOTO Table Tunnel Table (n) + * table=1,priority=16384,tun_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ + * actions=output:10,output:11,goto_table:2 + */ - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } - } + private void handleTunnelFloodOut(Long dpidLong, Short writeTable, + Short localTable, String segmentationId, + Long OFPortOut, boolean write) { + l2ForwardingProvider.programTunnelFloodOut(dpidLong, segmentationId, OFPortOut, write); } /* @@ -1940,126 +1539,23 @@ public class OF13Provider implements NetworkingProvider { * actions=output:eth1,goto_table:2 */ - private void handleVlanFloodOut(Long dpidLong, Short writeTable, - Short localTable, String segmentationId, - Long ethPort, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - // Match Vlan ID - flowBuilder.setMatch( - MatchUtils.createVlanIdMatch(matchBuilder, new VlanId(Integer.valueOf(segmentationId))).build()); - // Match DMAC - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress("01:00:00:00:00:00"), - new MacAddress("01:00:00:00:00:00")).build()); - - String flowId = "VlanFloodOut_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setBarrier(true); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(16384); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - //ToDo: Is there something to be done with result of the call to getFlow? - - Flow flow = this.getFlow(flowBuilder, nodeBuilder); - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - List instructions = Lists.newArrayList(); - - if (write) { - // GOTO Instruction - InstructionUtils.createGotoTableInstructions(ib, localTable); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - // Set the Output Port/Iface - InstructionUtils.createOutputPortInstructions(ib, dpidLong, ethPort); - ib.setOrder(1); - ib.setKey(new InstructionKey(1)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } - } - - /* - * (Table:1) Table Drain w/ Catch All - * Match: Tunnel ID - * Action: GOTO Local Table (10) - * table=2,priority=8192,tun_id=0x5 actions=drop - */ - - private void handleTunnelMiss(Long dpidLong, Short writeTable, - Short goToTableId, String segmentationId, - boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create Match(es) and Set them in the FlowBuilder Object - flowBuilder.setMatch(MatchUtils.createTunnelIDMatch(matchBuilder, new BigInteger(segmentationId)).build()); - - if (write) { - // Create the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createGotoTableInstructions(ib, goToTableId); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); + private void handleVlanFloodOut(Long dpidLong, Short writeTable, + Short localTable, String segmentationId, + Long localPort, Long ethPort, boolean write) { + //l2ForwardingProvider.programVlanFloodOut(dpidLong, segmentationId, localPort, ethPort, write); + } - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } + /* + * (Table:1) Table Drain w/ Catch All + * Match: Tunnel ID + * Action: GOTO Local Table (10) + * table=2,priority=8192,tun_id=0x5 actions=drop + */ - String flowId = "TunnelMiss_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(8192); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - if (write) { - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } + private void handleTunnelMiss(Long dpidLong, Short writeTable, + Short goToTableId, String segmentationId, + boolean write) { + l2ForwardingProvider.programTunnelMiss(dpidLong, segmentationId, write); } @@ -2068,66 +1564,14 @@ public class OF13Provider implements NetworkingProvider { * Match: Vlan ID * Action: Output port eth interface * table=1,priority=8192,vlan_id=0x5 actions= output port:eth1 + * table=110,priority=8192,dl_vlan=2001 actions=output:2 */ - private void handleVlanMiss(Long dpidLong, Short writeTable, - Short goToTableId, String segmentationId, - Long ethPort, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create Match(es) and Set them in the FlowBuilder Object - flowBuilder.setMatch( - MatchUtils.createVlanIdMatch(matchBuilder, new VlanId(Integer.valueOf(segmentationId))).build()); - - if (write) { - // Create the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Call the InstructionBuilder Methods Containing Actions - //createGotoTableInstructions(ib, goToTableId); - //ib.setOrder(0); - //ib.setKey(new InstructionKey(0)); - //instructions.add(ib.build()); - // Set the Output Port/Iface - InstructionUtils.createOutputPortInstructions(ib, dpidLong, ethPort); - ib.setOrder(0); - ib.setKey(new InstructionKey(1)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } - - String flowId = "VlanMiss_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(8192); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - if (write) { - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } - } + private void handleVlanMiss(Long dpidLong, Short writeTable, + Short goToTableId, String segmentationId, + Long ethPort, boolean write) { + l2ForwardingProvider.programVlanMiss(dpidLong, segmentationId, ethPort, write); + } /* * (Table:1) Local Broadcast Flood @@ -2137,54 +1581,9 @@ public class OF13Provider implements NetworkingProvider { */ private void handleLocalUcastOut(Long dpidLong, Short writeTable, - String segmentationId, Long localPort, - String attachedMac, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch(MatchUtils.createTunnelIDMatch(matchBuilder, new BigInteger(segmentationId)).build()); - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress(attachedMac), null).build()); - - String flowId = "UcastOut_"+segmentationId+"_"+localPort+"_"+attachedMac; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - if (write) { - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Set the Output Port/Iface - InstructionUtils.createOutputPortInstructions(ib, dpidLong, localPort); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } + String segmentationId, Long localPort, + String attachedMac, boolean write) { + l2ForwardingProvider.programLocalUcastOut(dpidLong, segmentationId, localPort, attachedMac, write); } /* @@ -2195,63 +1594,9 @@ public class OF13Provider implements NetworkingProvider { */ private void handleLocalVlanUcastOut(Long dpidLong, Short writeTable, - String segmentationId, Long localPort, - String attachedMac, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch( - MatchUtils.createVlanIdMatch(matchBuilder, new VlanId(Integer.valueOf(segmentationId))).build()); - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress(attachedMac), null).build()); - - String flowId = "VlanUcastOut_"+segmentationId+"_"+localPort+"_"+attachedMac; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - - if (write) { - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - List instructions_tmp = Lists.newArrayList(); - - /* Strip vlan and store to tmp instruction space*/ - InstructionUtils.createPopVlanInstructions(ib); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions_tmp.add(ib.build()); - - // Set the Output Port/Iface - ib = new InstructionBuilder(); - InstructionUtils.addOutputPortInstructions(ib, dpidLong, localPort, instructions_tmp); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } + String segmentationId, Long localPort, + String attachedMac, boolean write) { + l2ForwardingProvider.programLocalVlanUcastOut(dpidLong, segmentationId, localPort, attachedMac, write); } /* @@ -2262,80 +1607,9 @@ public class OF13Provider implements NetworkingProvider { */ private void handleLocalBcastOut(Long dpidLong, Short writeTable, - String segmentationId, Long localPort, - boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch(MatchUtils.createTunnelIDMatch(matchBuilder, new BigInteger(segmentationId)).build()); - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress("01:00:00:00:00:00"), - new MacAddress("01:00:00:00:00:00")).build()); - - String flowId = "BcastOut_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(16384); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - Flow flow = this.getFlow(flowBuilder, nodeBuilder); - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - List instructions = Lists.newArrayList(); - List existingInstructions = null; - if (flow != null) { - Instructions ins = flow.getInstructions(); - if (ins != null) { - existingInstructions = ins.getInstruction(); - } - } - - if (write) { - // Create output port list - createOutputPortInstructions(ib, dpidLong, localPort, existingInstructions); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - boolean flowRemove = InstructionUtils.removeOutputPortFromInstructions(ib, dpidLong, localPort, - existingInstructions); - if (flowRemove) { - /* if all ports are removed, remove flow */ - removeFlow(flowBuilder, nodeBuilder); - } else { - /* Install instruction with new output port list*/ - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } - } + String segmentationId, Long localPort, + boolean write) { + l2ForwardingProvider.programLocalBcastOut(dpidLong, segmentationId, localPort, write); } /* @@ -2343,113 +1617,12 @@ public class OF13Provider implements NetworkingProvider { * Match: vlan ID and dMAC (::::FF:FF) * table=2,priority=16384,vlan_id=0x5,dl_dst=ff:ff:ff:ff:ff:ff \ * actions=strip_vlan, output:2,3,4,5 + * table=110,dl_vlan=2001,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=output:2,pop_vlan,output:1,output:3,output:4 */ - private void handleLocalVlanBcastOut(Long dpidLong, Short writeTable, - String segmentationId, Long localPort, - boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create the OF Match using MatchBuilder - flowBuilder.setMatch( - MatchUtils.createVlanIdMatch(matchBuilder, new VlanId(Integer.valueOf(segmentationId))).build()); - flowBuilder.setMatch(MatchUtils.createDestEthMatch(matchBuilder, new MacAddress("01:00:00:00:00:00"), - new MacAddress("01:00:00:00:00:00")).build()); - - String flowId = "VlanBcastOut_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(16384); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - Flow flow = this.getFlow(flowBuilder, nodeBuilder); - // Instantiate the Builders for the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - List instructions = Lists.newArrayList(); - List existingInstructions = null; - boolean add_pop_vlan = true; - if (flow != null) { - Instructions ins = flow.getInstructions(); - if (ins != null) { - existingInstructions = ins.getInstruction(); - } - } - - if (write) { - if (existingInstructions != null) { - /* Check if pop vlan is already the first action in action list */ - List existingActions; - for (Instruction in : existingInstructions) { - if (in.getInstruction() instanceof ApplyActionsCase) { - existingActions = (((ApplyActionsCase) - in.getInstruction()).getApplyActions().getAction()); - if (existingActions.get(0).getAction() instanceof PopVlanActionCase) { - add_pop_vlan = false; - break; - } - } - } - } else { - existingInstructions = Lists.newArrayList(); - } - - if (add_pop_vlan) { - /* pop vlan */ - InstructionUtils.createPopVlanInstructions(ib); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - existingInstructions.add(ib.build()); - ib = new InstructionBuilder(); - } - - // Create port list - //createOutputGroupInstructions(nodeBuilder, ib, dpidLong, localPort, existingInstructions); - createOutputPortInstructions(ib, dpidLong, localPort, existingInstructions); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - - writeFlow(flowBuilder, nodeBuilder); - } else { - //boolean flowRemove = removeOutputPortFromGroup(nodeBuilder, ib, dpidLong, - // localPort, existingInstructions); - boolean flowRemove = InstructionUtils.removeOutputPortFromInstructions(ib, dpidLong, - localPort, existingInstructions); - if (flowRemove) { - /* if all ports are removed, remove flow */ - removeFlow(flowBuilder, nodeBuilder); - } else { - /* Install instruction with new output port list*/ - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - writeFlow(flowBuilder, nodeBuilder); - } - } + private void handleLocalVlanBcastOut(Long dpidLong, Short writeTable, String segmentationId, + Long localPort, Long ethPort, boolean write) { + l2ForwardingProvider.programLocalVlanBcastOut(dpidLong, segmentationId, localPort, ethPort, write); } /* @@ -2460,55 +1633,8 @@ public class OF13Provider implements NetworkingProvider { */ private void handleLocalTableMiss(Long dpidLong, Short writeTable, - String segmentationId, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create Match(es) and Set them in the FlowBuilder Object - flowBuilder.setMatch(MatchUtils.createTunnelIDMatch(matchBuilder, new BigInteger(segmentationId)).build()); - - if (write) { - // Create the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createDropInstructions(ib); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } - - String flowId = "LocalTableMiss_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(8192); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - if (write) { - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } + String segmentationId, boolean write) { + l2ForwardingProvider.programLocalTableMiss(dpidLong, segmentationId, write); } /* @@ -2519,56 +1645,8 @@ public class OF13Provider implements NetworkingProvider { */ private void handleLocalVlanTableMiss(Long dpidLong, Short writeTable, - String segmentationId, boolean write) { - - String nodeName = OPENFLOW + dpidLong; - - MatchBuilder matchBuilder = new MatchBuilder(); - NodeBuilder nodeBuilder = createNodeBuilder(nodeName); - FlowBuilder flowBuilder = new FlowBuilder(); - - // Create Match(es) and Set them in the FlowBuilder Object - flowBuilder.setMatch( - MatchUtils.createVlanIdMatch(matchBuilder, new VlanId(Integer.valueOf(segmentationId))).build()); - - if (write) { - // Create the OF Actions and Instructions - InstructionBuilder ib = new InstructionBuilder(); - InstructionsBuilder isb = new InstructionsBuilder(); - - // Instructions List Stores Individual Instructions - List instructions = Lists.newArrayList(); - - // Call the InstructionBuilder Methods Containing Actions - InstructionUtils.createDropInstructions(ib); - ib.setOrder(0); - ib.setKey(new InstructionKey(0)); - instructions.add(ib.build()); - - // Add InstructionBuilder to the Instruction(s)Builder List - isb.setInstruction(instructions); - - // Add InstructionsBuilder to FlowBuilder - flowBuilder.setInstructions(isb.build()); - } - - String flowId = "LocalTableMiss_"+segmentationId; - // Add Flow Attributes - flowBuilder.setId(new FlowId(flowId)); - FlowKey key = new FlowKey(new FlowId(flowId)); - flowBuilder.setStrict(true); - flowBuilder.setBarrier(false); - flowBuilder.setTableId(writeTable); - flowBuilder.setKey(key); - flowBuilder.setPriority(8192); - flowBuilder.setFlowName(flowId); - flowBuilder.setHardTimeout(0); - flowBuilder.setIdleTimeout(0); - if (write) { - writeFlow(flowBuilder, nodeBuilder); - } else { - removeFlow(flowBuilder, nodeBuilder); - } + String segmentationId, boolean write) { + l2ForwardingProvider.programLocalVlanTableMiss(dpidLong, segmentationId, write); } private Group getGroup(GroupBuilder groupBuilder, NodeBuilder nodeBuilder) { @@ -2586,7 +1664,7 @@ public class OF13Provider implements NetworkingProvider { InstanceIdentifier path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Group.class, - new GroupKey(groupBuilder.getGroupId())).build(); + new GroupKey(groupBuilder.getGroupId())).build(); ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction(); try { Optional data = readTx.read(LogicalDatastoreType.CONFIGURATION, path1).get(); @@ -2617,7 +1695,7 @@ public class OF13Provider implements NetworkingProvider { ReadWriteTransaction modification = dataBroker.newReadWriteTransaction(); InstanceIdentifier path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Group.class, - new GroupKey(groupBuilder.getGroupId())).build(); + new GroupKey(groupBuilder.getGroupId())).build(); modification.put(LogicalDatastoreType.CONFIGURATION, path1, groupBuilder.build(), true /*createMissingParents*/); CheckedFuture commitFuture = modification.submit(); @@ -2645,7 +1723,7 @@ public class OF13Provider implements NetworkingProvider { WriteTransaction modification = dataBroker.newWriteOnlyTransaction(); InstanceIdentifier path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Group.class, - new GroupKey(groupBuilder.getGroupId())).build(); + new GroupKey(groupBuilder.getGroupId())).build(); modification.delete(LogicalDatastoreType.CONFIGURATION, path1); CheckedFuture commitFuture = modification.submit(); @@ -2671,7 +1749,7 @@ public class OF13Provider implements NetworkingProvider { InstanceIdentifier path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Table.class, - new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build(); + new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build(); ReadOnlyTransaction readTx = dataBroker.newReadOnlyTransaction(); try { @@ -2703,7 +1781,7 @@ public class OF13Provider implements NetworkingProvider { ReadWriteTransaction modification = dataBroker.newReadWriteTransaction(); InstanceIdentifier path1 = InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory .rev130819.nodes.Node.class, nodeBuilder.getKey()).augmentation(FlowCapableNode.class).child(Table.class, - new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build(); + new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build(); //modification.put(LogicalDatastoreType.OPERATIONAL, path1, flowBuilder.build()); modification.put(LogicalDatastoreType.CONFIGURATION, path1, flowBuilder.build(), true /*createMissingParents*/); @@ -2734,9 +1812,9 @@ public class OF13Provider implements NetworkingProvider { WriteTransaction modification = dataBroker.newWriteOnlyTransaction(); InstanceIdentifier path1 = InstanceIdentifier.builder(Nodes.class) .child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory - .rev130819.nodes.Node.class, nodeBuilder.getKey()) - .augmentation(FlowCapableNode.class).child(Table.class, - new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build(); + .rev130819.nodes.Node.class, nodeBuilder.getKey()) + .augmentation(FlowCapableNode.class).child(Table.class, + new TableKey(flowBuilder.getTableId())).child(Flow.class, flowBuilder.getKey()).build(); //modification.delete(LogicalDatastoreType.OPERATIONAL, nodeBuilderToInstanceId(nodeBuilder)); //modification.delete(LogicalDatastoreType.OPERATIONAL, path1); //modification.delete(LogicalDatastoreType.CONFIGURATION, nodeBuilderToInstanceId(nodeBuilder)); @@ -2751,62 +1829,6 @@ public class OF13Provider implements NetworkingProvider { } } - /** - * Create Output Port Group Instruction - * - * @param ib Map InstructionBuilder without any instructions - * @param dpidLong Long the datapath ID of a switch/node - * @param port Long representing a port on a switch/node - * @return ib InstructionBuilder Map with instructions - */ - protected InstructionBuilder createOutputPortInstructions(InstructionBuilder ib, - Long dpidLong, Long port , - List instructions) { - NodeConnectorId ncid = new NodeConnectorId(OPENFLOW + dpidLong + ":" + port); - logger.debug("createOutputPortInstructions() Node Connector ID is - Type=openflow: DPID={} port={} existingInstructions={}", dpidLong, port, instructions); - - List actionList = Lists.newArrayList(); - ActionBuilder ab = new ActionBuilder(); - - List existingActions; - if (instructions != null) { - for (Instruction in : instructions) { - if (in.getInstruction() instanceof ApplyActionsCase) { - existingActions = (((ApplyActionsCase) in.getInstruction()).getApplyActions().getAction()); - actionList.addAll(existingActions); - } - } - } - /* Create output action for this port*/ - OutputActionBuilder oab = new OutputActionBuilder(); - oab.setOutputNodeConnector(ncid); - ab.setAction(new OutputActionCaseBuilder().setOutputAction(oab.build()).build()); - boolean addNew = true; - - /* Find the group action and get the group */ - for (Action action : actionList) { - if (action.getAction() instanceof OutputActionCase) { - OutputActionCase opAction = (OutputActionCase)action.getAction(); - /* If output port action already in the action list of one of the buckets, skip */ - if (opAction.getOutputAction().getOutputNodeConnector().equals(new Uri(ncid))) { - addNew = false; - break; - } - } - } - if (addNew) { - ab.setOrder(actionList.size()); - ab.setKey(new ActionKey(actionList.size())); - actionList.add(ab.build()); - } - // Create an Apply Action - ApplyActionsBuilder aab = new ApplyActionsBuilder(); - aab.setAction(actionList); - ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build()); - logger.debug("createOutputPortInstructions() : applyAction {}", aab.build()); - return ib; - } - /** * Create Output Port Group Instruction * @@ -2816,9 +1838,9 @@ public class OF13Provider implements NetworkingProvider { * @return ib InstructionBuilder Map with instructions */ protected InstructionBuilder createOutputGroupInstructions(NodeBuilder nodeBuilder, - InstructionBuilder ib, - Long dpidLong, Long port , - List instructions) { + InstructionBuilder ib, + Long dpidLong, Long port , + List instructions) { NodeConnectorId ncid = new NodeConnectorId(OPENFLOW + dpidLong + ":" + port); logger.debug("createOutputGroupInstructions() Node Connector ID is - Type=openflow: DPID={} port={} existingInstructions={}", dpidLong, port, instructions); @@ -2973,7 +1995,7 @@ public class OF13Provider implements NetworkingProvider { * @return ib InstructionBuilder Map with instructions */ protected boolean removeOutputPortFromGroup(NodeBuilder nodeBuilder, InstructionBuilder ib, - Long dpidLong, Long port , List instructions) { + Long dpidLong, Long port , List instructions) { NodeConnectorId ncid = new NodeConnectorId(OPENFLOW + dpidLong + ":" + port); logger.debug("removeOutputPortFromGroup() Node Connector ID is - Type=openflow: DPID={} port={} existingInstructions={}", dpidLong, port, instructions); @@ -3114,7 +2136,7 @@ public class OF13Provider implements NetworkingProvider { } private InstanceIdentifier nodeBuilderToInstanceId(NodeBuilder - node) { + node) { return InstanceIdentifier.builder(Nodes.class).child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node.class, node.getKey()).toInstance(); }