import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
-import org.opendaylight.controller.networkconfig.neutron.NeutronSecurityGroup;
+import org.opendaylight.neutron.spi.NeutronNetwork;
+import org.opendaylight.neutron.spi.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.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;
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;
*/
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.
*/
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) {
/*
* 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
*/
/*
* 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
*/
/*
* 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
* 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
* 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
* ----------------
* 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 ethPort) {
+ private void programLocalIngressVlanRules(Node node, Long dpid, String segmentationId, String attachedMac,
+ long localPort, long ethPort) {
/*
* Table(0) Rule #2
* ----------------
* -------------------------------------------
* 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
*/
- handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
- segmentationId, ethPort, true);
+ 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) {
+ private void programRemoteEgressVlanRules(Node node, Long dpid, String segmentationId,
+ String attachedMac, long ethPort) {
/*
* Table(1) Rule #1
* ----------------
* actions=goto_table:2
*/
- handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
- segmentationId, ethPort, attachedMac, true);
+ //handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+ // segmentationId, ethPort, attachedMac, true);
/*
* Table(1) Rule #3
* 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);
+ 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) {
+ private void removeRemoteEgressVlanRules(Node node, Long dpid, String segmentationId,
+ String attachedMac, long localPort, long ethPort) {
/*
* Table(1) Rule #1
* ----------------
* actions=goto_table:2
*/
- handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
- segmentationId, ethPort, attachedMac, false);
+ //handleVlanOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+ // segmentationId, ethPort, attachedMac, 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);
}
- private void removePerVlanRules(Node node, Long dpid, String segmentationId, long ethPort) {
+ private void removePerVlanRules(Node node, Long dpid, String segmentationId, long localPort, long ethPort) {
/*
* Table(2) Rule #3
* ----------------
* 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
* Action: GOTO Local Table 2
*/
- handleVlanIn(dpid, TABLE_0_DEFAULT_INGRESS, 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
* actions=output:10 (eth port),goto_table:2
*/
- handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
- segmentationId, ethPort, false);
+ //handleVlanFloodOut(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD,
+ // segmentationId, ethPort, false);
/*
* Table(1) Rule #3
* 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);
+ handleVlanMiss(dpid, TABLE_1_ISOLATE_TENANT, TABLE_2_LOCAL_FORWARD, segmentationId, ethPort, false);
}
+
private Long getDpid (Node node, String bridgeUuid) {
Preconditions.checkNotNull(ovsdbConfigurationService);
try {
logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node);
return;
}
+ long localPort = (Long)of_ports.toArray()[0];
Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
if (externalIds == null) {
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;
}
}
logger.error("Could NOT Identify OF value for port {} on {}", intf.getName(), node);
return;
}
+ long localPort = (Long)of_ports.toArray()[0];
Map<String, String> externalIds = intf.getExternalIdsColumn().getData();
if (externalIds == null) {
}
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;
}
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");
}
}
}
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");
+ }
}
}
}
List<Instruction> 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());
private void handleVlanFloodOut(Long dpidLong, Short writeTable,
Short localTable, String segmentationId,
- Long ethPort, boolean write) {
- l2ForwardingProvider.programVlanFloodOut(dpidLong, segmentationId, ethPort, write);
+ Long localPort, Long ethPort, boolean write) {
+ //l2ForwardingProvider.programVlanFloodOut(dpidLong, segmentationId, localPort, ethPort, write);
}
/*
* 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,
* 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) {
- l2ForwardingProvider.programLocalVlanBcastOut(dpidLong, segmentationId, localPort, write);
+ private void handleLocalVlanBcastOut(Long dpidLong, Short writeTable, String segmentationId,
+ Long localPort, Long ethPort, boolean write) {
+ l2ForwardingProvider.programLocalVlanBcastOut(dpidLong, segmentationId, localPort, ethPort, write);
}
/*