Merge remote-tracking branch 'origin/master' into dev-karaf-4.2.1
Change-Id: If611105632e508cb17352c6f5b1cbcfd85f716d1
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
index 123cacc..ead7234 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
@@ -84,6 +84,7 @@
public static final int PRIORITY_ARP_CONTROL_RULE = 40000;
public static final int PRIORITY_ARP_REPLY_RULE = 40000;
public static final int PRIORITY_ARP_REQUEST_RULE = 40000;
+ public static final int PRIORITY_ARP_FLOOD_RULE = 39000;
public static final int PRIORITY_FORCED_ACL_RULE = 50000;
public static final int PRIORITY_ICMP_PROBE_RULE = 50000;
@@ -94,9 +95,10 @@
public static final int STAT_FLAT_OUTBOUND_TABLE = 10;
public static final int VTAP_FLAT_OUTBOUND_TABLE = 11;
public static final int VTAP_FLAT_OUTBOUND_MIRROR_TABLE = 12;
- public static final int DHCP_ARP_TABLE = 5;
+ public static final int DHCP_TABLE = 5;
public static final int FLAT_TABLE = 20;
public static final int VTAG_TABLE = 30;
+ public static final int ARP_TABLE = 35;
public static final int ACL_TABLE = 40;
public static final int CT_TABLE = 41;
public static final int JUMP_TABLE = 50;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java
index 845c258..0a527e0 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java
@@ -35,7 +35,7 @@
import java.util.Optional;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FORCED_ACL_RULE;
@@ -121,7 +121,7 @@
sBuilder.build(),
treatment,
PRIORITY_FORCED_ACL_RULE,
- DHCP_ARP_TABLE,
+ DHCP_TABLE,
true);
}
}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java
index 37a6b9c..70a2347 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java
@@ -35,7 +35,7 @@
import java.util.Optional;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FORCED_ACL_RULE;
@@ -118,7 +118,7 @@
sBuilder.build(),
treatment,
PRIORITY_FORCED_ACL_RULE,
- DHCP_ARP_TABLE,
+ DHCP_TABLE,
false);
}
}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
index 2ea7400..0dc4db7 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
@@ -198,11 +198,18 @@
protected void initializePipeline(DeviceId deviceId) {
// for inbound table transition
connectTables(deviceId, Constants.STAT_INBOUND_TABLE, Constants.VTAP_INBOUND_TABLE);
- connectTables(deviceId, Constants.VTAP_INBOUND_TABLE, Constants.DHCP_ARP_TABLE);
+ connectTables(deviceId, Constants.VTAP_INBOUND_TABLE, Constants.DHCP_TABLE);
- // for vTag and ACL table transition
- connectTables(deviceId, Constants.DHCP_ARP_TABLE, Constants.VTAG_TABLE);
- connectTables(deviceId, Constants.VTAG_TABLE, Constants.ACL_TABLE);
+ // for DHCP and vTag table transition
+ connectTables(deviceId, Constants.DHCP_TABLE, Constants.VTAG_TABLE);
+
+ // for vTag and ARP table transition
+ connectTables(deviceId, Constants.VTAG_TABLE, Constants.ARP_TABLE);
+
+ // for ARP and ACL table transition
+ connectTables(deviceId, Constants.ARP_TABLE, Constants.ACL_TABLE);
+
+ // for ACL and JUMP table transition
connectTables(deviceId, Constants.ACL_TABLE, Constants.JUMP_TABLE);
// for JUMP table transition
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
index 995bb21..dd476de 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
@@ -77,7 +77,7 @@
import java.util.Objects;
import java.util.Set;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_DHCP_RULE;
import static org.onosproject.openstacknetworking.impl.OpenstackMetadataProxyHandler.Http.Type.RESPONSE;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.hmacEncrypt;
@@ -572,7 +572,7 @@
selector,
treatment,
PRIORITY_DHCP_RULE,
- DHCP_ARP_TABLE,
+ DHCP_TABLE,
install);
}
}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index f1f1370..b2cb36e 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -788,9 +788,9 @@
break;
case OPENSTACK_INSTANCE_MIGRATION_ENDED:
- InstancePort revisedInstPort = swapStaleLocation(event.subject());
+ InstancePort oldInstPort = swapStaleLocation(event.subject());
- fip = associatedFloatingIp(revisedInstPort, ips);
+ fip = associatedFloatingIp(oldInstPort, ips);
if (fip == null) {
return;
@@ -805,7 +805,13 @@
throw new IllegalStateException(errorFormat);
}
- // If we only have one gateway, we simply do not remove any
+ eventExecutor.execute(() -> {
+ // We need to remove the old ComputeNodeToGateway rules from
+ // original compute node
+ setComputeNodeToGatewayHelper(oldInstPort, osNet, gateways, false);
+ });
+
+ // If we only have one gateway, we simply do not remove any
// flow rules from either gateway or compute node
if (gateways.size() == 1) {
return;
@@ -817,7 +823,7 @@
// it has been overwritten at port detention event
// if it is false, we will remove the rules
DeviceId newDeviceId = event.subject().deviceId();
- DeviceId oldDeviceId = revisedInstPort.deviceId();
+ DeviceId oldDeviceId = oldInstPort.deviceId();
OpenstackNode oldGateway = getGwByComputeDevId(gateways, oldDeviceId);
OpenstackNode newGateway = getGwByComputeDevId(gateways, newDeviceId);
@@ -827,15 +833,10 @@
}
eventExecutor.execute(() -> {
-
- // We need to remove the old ComputeNodeToGateway rules from
- // original compute node
- setComputeNodeToGatewayHelper(revisedInstPort, osNet, gateways, false);
-
// Since DownstreamExternal rules should only be placed in
// corresponding gateway node, we need to remove old rule from
// the corresponding gateway node
- setDownstreamExternalRulesHelper(fip, osNet, revisedInstPort,
+ setDownstreamExternalRulesHelper(fip, osNet, oldInstPort,
externalPeerRouter, gateways, false);
});
break;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
index c1ea3cd..c78134d 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
@@ -74,15 +74,15 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static org.onosproject.openstacknetworking.api.Constants.ARP_BROADCAST_MODE;
import static org.onosproject.openstacknetworking.api.Constants.ARP_PROXY_MODE;
+import static org.onosproject.openstacknetworking.api.Constants.ARP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_ARP_MODE_STR;
import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_CONTROL_RULE;
+import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_FLOOD_RULE;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_GATEWAY_RULE;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REPLY_RULE;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REQUEST_RULE;
-import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_SUBNET_RULE;
import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
@@ -323,7 +323,7 @@
selector,
treatment,
PRIORITY_ARP_GATEWAY_RULE,
- DHCP_ARP_TABLE,
+ ARP_TABLE,
install
)
);
@@ -334,7 +334,7 @@
selector,
treatment,
PRIORITY_ARP_GATEWAY_RULE,
- DHCP_ARP_TABLE,
+ ARP_TABLE,
install
);
}
@@ -395,10 +395,13 @@
OpenstackNode localNode = osNodeService.node(port.deviceId());
+ String segId = osNetworkService.segmentId(port.networkId());
+
TrafficSelector selector = DefaultTrafficSelector.builder()
.matchEthType(EthType.EtherType.ARP.ethType().toShort())
.matchArpOp(ARP.OP_REQUEST)
.matchArpTpa(port.ipAddress().getIp4Address())
+ .matchTunnelId(Long.valueOf(segId))
.build();
setRemoteArpTreatmentForVxlan(selector, port, localNode, install);
@@ -449,7 +452,7 @@
selector,
treatment,
PRIORITY_ARP_REPLY_RULE,
- DHCP_ARP_TABLE,
+ ARP_TABLE,
install
);
@@ -478,7 +481,7 @@
selector,
treatmentToRemote,
PRIORITY_ARP_REQUEST_RULE,
- DHCP_ARP_TABLE,
+ ARP_TABLE,
install
);
}
@@ -501,7 +504,7 @@
selector,
treatmentToRemote,
PRIORITY_ARP_REQUEST_RULE,
- DHCP_ARP_TABLE,
+ ARP_TABLE,
install);
}
}
@@ -674,7 +677,7 @@
selector,
treatment,
PRIORITY_ARP_CONTROL_RULE,
- DHCP_ARP_TABLE,
+ ARP_TABLE,
install
);
}
@@ -694,8 +697,8 @@
osNode.intgBridge(),
selector,
treatment,
- PRIORITY_ARP_SUBNET_RULE,
- DHCP_ARP_TABLE,
+ PRIORITY_ARP_FLOOD_RULE,
+ ARP_TABLE,
install
);
}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
index efd10d9..ca322ea 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
@@ -85,7 +85,7 @@
import static org.onlab.packet.DHCP.MsgType.DHCPACK;
import static org.onlab.packet.DHCP.MsgType.DHCPOFFER;
import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_DHCP_RULE;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
import static org.slf4j.LoggerFactory.getLogger;
@@ -577,7 +577,7 @@
selector,
treatment,
PRIORITY_DHCP_RULE,
- DHCP_ARP_TABLE,
+ DHCP_TABLE,
install);
}
}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
index 3ac981a..b348d49 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
@@ -24,6 +24,8 @@
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.onlab.packet.Ethernet;
import org.onlab.packet.VlanId;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.cfg.ConfigProperty;
import org.onosproject.cluster.ClusterService;
import org.onosproject.cluster.LeadershipService;
import org.onosproject.cluster.NodeId;
@@ -56,12 +58,15 @@
import org.slf4j.Logger;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ExecutorService;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.onlab.util.Tools.groupedThreads;
import static org.onosproject.openstacknetworking.api.Constants.ACL_TABLE;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.ARP_BROADCAST_MODE;
+import static org.onosproject.openstacknetworking.api.Constants.ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.FLAT_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.FORWARDING_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
@@ -74,6 +79,7 @@
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_TUNNEL_TAG_RULE;
import static org.onosproject.openstacknetworking.api.Constants.STAT_FLAT_OUTBOUND_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.VTAG_TABLE;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
@@ -89,6 +95,7 @@
private final Logger log = getLogger(getClass());
+ private static final String ARP_MODE = "arpMode";
private static final String ERR_SET_FLOWS_VNI = "Failed to set flows for %s: Failed to get VNI for %s";
@Reference(cardinality = ReferenceCardinality.MANDATORY)
@@ -107,6 +114,10 @@
protected ClusterService clusterService;
@Reference(cardinality = ReferenceCardinality.MANDATORY)
+ protected ComponentConfigService configService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY)
+
protected LeadershipService leadershipService;
@Reference(cardinality = ReferenceCardinality.MANDATORY)
@@ -162,12 +173,22 @@
NetworkType type = osNetworkService.network(instPort.networkId()).getNetworkType();
switch (type) {
case VXLAN:
- setTunnelTagFlowRules(instPort, install);
+ setTunnelTagIpFlowRules(instPort, install);
setForwardingRulesForVxlan(instPort, install);
+
+ if (ARP_BROADCAST_MODE.equals(getArpMode())) {
+ setTunnelTagArpFlowRules(instPort, install);
+ }
+
break;
case VLAN:
- setVlanTagFlowRules(instPort, install);
+ setVlanTagIpFlowRules(instPort, install);
setForwardingRulesForVlan(instPort, install);
+
+ if (ARP_BROADCAST_MODE.equals(getArpMode())) {
+ setVlanTagArpFlowRules(instPort, install);
+ }
+
break;
case FLAT:
setFlatJumpRules(instPort, install);
@@ -190,10 +211,20 @@
switch (type) {
case VXLAN:
- setTunnelTagFlowRules(instPort, false);
+ setTunnelTagIpFlowRules(instPort, false);
+
+ if (ARP_BROADCAST_MODE.equals(getArpMode())) {
+ setTunnelTagArpFlowRules(instPort, false);
+ }
+
break;
case VLAN:
- setVlanTagFlowRules(instPort, false);
+ setVlanTagIpFlowRules(instPort, false);
+
+ if (ARP_BROADCAST_MODE.equals(getArpMode())) {
+ setVlanTagArpFlowRules(instPort, false);
+ }
+
break;
case FLAT:
setFlatJumpRules(instPort, false);
@@ -219,7 +250,7 @@
selector.build(),
treatment.build(),
PRIORITY_FLAT_JUMP_UPSTREAM_RULE,
- DHCP_ARP_TABLE,
+ DHCP_TABLE,
install);
Network network = osNetworkService.network(port.networkId());
@@ -247,7 +278,7 @@
selector.build(),
treatment.build(),
PRIORITY_FLAT_JUMP_DOWNSTREAM_RULE,
- DHCP_ARP_TABLE,
+ DHCP_TABLE,
install);
selector = DefaultTrafficSelector.builder();
@@ -261,7 +292,7 @@
selector.build(),
treatment.build(),
PRIORITY_FLAT_JUMP_DOWNSTREAM_RULE,
- DHCP_ARP_TABLE,
+ DHCP_TABLE,
install);
}
@@ -446,18 +477,27 @@
});
}
+ private void setTunnelTagArpFlowRules(InstancePort instPort, boolean install) {
+ setTunnelTagFlowRules(instPort, Ethernet.TYPE_ARP, install);
+ }
+
+ private void setTunnelTagIpFlowRules(InstancePort instPort, boolean install) {
+ setTunnelTagFlowRules(instPort, Ethernet.TYPE_IPV4, install);
+ }
+
/**
* Configures the flow rule which is for using VXLAN to tag the packet
* based on the in_port number of a virtual instance.
- * Note that this rule will be inserted in VNI table (table 0).
+ * Note that this rule will be inserted in vTag table.
*
* @param instPort instance port object
* @param install install flag, add the rule if true, remove it otherwise
*/
- private void setTunnelTagFlowRules(InstancePort instPort, boolean install) {
+ private void setTunnelTagFlowRules(InstancePort instPort,
+ short ethType,
+ boolean install) {
TrafficSelector selector = DefaultTrafficSelector.builder()
- // TODO: need to handle IPv6 in near future
- .matchEthType(Ethernet.TYPE_IPV4)
+ .matchEthType(ethType)
.matchInPort(instPort.portNumber())
.build();
@@ -469,9 +509,9 @@
TrafficTreatment.Builder tb = DefaultTrafficTreatment.builder()
.setTunnelId(getVni(instPort))
- .transition(ACL_TABLE);
+ .transition(ARP_TABLE);
- if (securityGroupService.isSecurityGroupEnabled()) {
+ if (securityGroupService.isSecurityGroupEnabled() && ethType == Ethernet.TYPE_IPV4) {
tb.extension(ctTreatment, instPort.deviceId());
}
@@ -485,18 +525,27 @@
install);
}
+ private void setVlanTagIpFlowRules(InstancePort instPort, boolean install) {
+ setVlanTagFlowRules(instPort, Ethernet.TYPE_IPV4, install);
+ }
+
+ private void setVlanTagArpFlowRules(InstancePort instPort, boolean install) {
+ setVlanTagFlowRules(instPort, Ethernet.TYPE_ARP, install);
+ }
+
/**
* Configures the flow rule which is for using VLAN to tag the packet
* based on the in_port number of a virtual instance.
- * Note that this rule will be inserted in VNI table (table 0).
+ * Note that this rule will be inserted in vTag table.
*
* @param instPort instance port object
* @param install install flag, add the rule if true, remove it otherwise
*/
- private void setVlanTagFlowRules(InstancePort instPort, boolean install) {
+ private void setVlanTagFlowRules(InstancePort instPort,
+ short ethType,
+ boolean install) {
TrafficSelector selector = DefaultTrafficSelector.builder()
- // TODO: need to handle IPv6 in near future
- .matchEthType(Ethernet.TYPE_IPV4)
+ .matchEthType(ethType)
.matchInPort(instPort.portNumber())
.build();
@@ -637,6 +686,11 @@
return Long.valueOf(osNet.getProviderSegID());
}
+ private String getArpMode() {
+ Set<ConfigProperty> properties = configService.getProperties(OpenstackSwitchingArpHandler.class.getName());
+ return getPropertyValue(properties, ARP_MODE);
+ }
+
/**
* An internal instance port listener which listens the port events generated
* from VM. The corresponding L2 forwarding rules will be generated and
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManagerTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManagerTest.java
index e3e449b..d1410b2 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManagerTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManagerTest.java
@@ -45,7 +45,8 @@
import static org.junit.Assert.assertEquals;
import static org.onosproject.openstacknetworking.api.Constants.ACL_TABLE;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.FLAT_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.FORWARDING_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.JUMP_TABLE;
@@ -187,13 +188,14 @@
fros = Sets.newConcurrentHashSet();
target.initializePipeline(DEVICE_ID);
- assertEquals("Flow Rule size was not match", 11, fros.size());
+ assertEquals("Flow Rule size was not match", 12, fros.size());
Map<Integer, Integer> fromToTableMap = Maps.newConcurrentMap();
fromToTableMap.put(STAT_INBOUND_TABLE, VTAP_INBOUND_TABLE);
- fromToTableMap.put(VTAP_INBOUND_TABLE, DHCP_ARP_TABLE);
- fromToTableMap.put(DHCP_ARP_TABLE, VTAG_TABLE);
- fromToTableMap.put(VTAG_TABLE, ACL_TABLE);
+ fromToTableMap.put(VTAP_INBOUND_TABLE, DHCP_TABLE);
+ fromToTableMap.put(DHCP_TABLE, VTAG_TABLE);
+ fromToTableMap.put(VTAG_TABLE, ARP_TABLE);
+ fromToTableMap.put(ARP_TABLE, ACL_TABLE);
fromToTableMap.put(ACL_TABLE, JUMP_TABLE);
fromToTableMap.put(STAT_OUTBOUND_TABLE, VTAP_OUTBOUND_TABLE);
fromToTableMap.put(VTAP_OUTBOUND_TABLE, FORWARDING_TABLE);
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
index 92a1020..a4400f7 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
@@ -28,6 +28,7 @@
import java.util.Comparator;
import java.util.List;
+import static org.onosproject.openstacknode.util.OpenstackNodeUtil.getGwByComputeNode;
import static org.onosproject.openstacknode.util.OpenstackNodeUtil.prettyJson;
/**
@@ -38,7 +39,7 @@
description = "Lists all nodes registered in OpenStack node service")
public class OpenstackNodeListCommand extends AbstractShellCommand {
- private static final String FORMAT = "%-20s%-15s%-24s%-24s%-20s%-20s%-15s%s";
+ private static final String FORMAT = "%-20s%-15s%-24s%-24s%-20s%-20s%-15s%-15s%-15s";
@Override
protected void doExecute() {
@@ -50,7 +51,7 @@
print("%s", json(osNodes));
} else {
print(FORMAT, "Hostname", "Type", "Integration Bridge",
- "Management IP", "Data IP", "VLAN Intf", "Uplink Port", "State");
+ "Management IP", "Data IP", "VLAN Intf", "Uplink Port", "State", "SelectedGw");
for (OpenstackNode osNode : osNodes) {
print(FORMAT,
osNode.hostname(),
@@ -60,7 +61,8 @@
osNode.dataIp() != null ? osNode.dataIp() : "",
osNode.vlanIntf() != null ? osNode.vlanIntf() : "",
osNode.uplinkPort() != null ? osNode.uplinkPort() : "",
- osNode.state());
+ osNode.state(),
+ getGwByComputeNode(osNodeService.completeNodes(OpenstackNode.NodeType.GATEWAY), osNode));
}
print("Total %s nodes", osNodeService.nodes().size());
}
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
index 9a242bb..f3645d7 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
@@ -546,6 +546,12 @@
}
private void processOpenstackNodeRemoved(OpenstackNode osNode) {
+ OvsdbClientService client = getOvsdbClient(osNode, ovsdbPort, ovsdbController);
+ if (client == null) {
+ log.info("Failed to get ovsdb client");
+ return;
+ }
+
//delete physical interfaces from the node
removePhysicalInterface(osNode);
@@ -560,6 +566,17 @@
}
});
}
+
+ //delete tunnel bridge from the node
+ if (hasDpdkTunnelBridge(osNode)) {
+ client.dropBridge(TUNNEL_BRIDGE);
+ }
+
+ //delete integration bridge from the node
+ client.dropBridge(INTEGRATION_BRIDGE);
+
+ //disconnect ovsdb
+ client.disconnect();
}
/**
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java
index f19b8d5..b520b17 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/util/OpenstackNodeUtil.java
@@ -48,7 +48,11 @@
import java.io.IOException;
import java.security.cert.X509Certificate;
import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
import static org.onlab.util.Tools.get;
@@ -69,6 +73,7 @@
private static final String ZERO = "0";
private static final String DPDK_DEVARGS = "dpdk-devargs";
+ private static final String NOT_AVAILABLE = "N/A";
/**
* Prevents object installation from external.
@@ -290,6 +295,56 @@
}
/**
+ * Obtains the gateway node by openstack node. Note that the gateway
+ * node is determined by device's device identifier.
+ *
+ * @param gws a collection of gateway nodes
+ * @param openstackNode device identifier
+ * @return the hostname of selected gateway node
+ */
+ public static String getGwByComputeNode(Set<OpenstackNode> gws, OpenstackNode openstackNode) {
+ int numOfGw = gws.size();
+
+ if (numOfGw == 0) {
+ return NOT_AVAILABLE;
+ }
+
+ if (!openstackNode.type().equals(OpenstackNode.NodeType.COMPUTE)) {
+ return NOT_AVAILABLE;
+ }
+
+ int gwIndex = Math.abs(openstackNode.intgBridge().hashCode()) % numOfGw;
+
+ return getGwByIndex(gws, gwIndex).hostname();
+ }
+
+ /**
+ * Obtains gateway instance by giving index number.
+ *
+ * @param gws a collection of gateway nodes
+ * @param index index number
+ * @return gateway instance
+ */
+ private static OpenstackNode getGwByIndex(Set<OpenstackNode> gws, int index) {
+ Map<String, OpenstackNode> hashMap = new HashMap<>();
+ gws.forEach(gw -> hashMap.put(gw.hostname(), gw));
+ TreeMap<String, OpenstackNode> treeMap = new TreeMap<>(hashMap);
+ Iterator<String> iteratorKey = treeMap.keySet().iterator();
+
+ int intIndex = 0;
+ OpenstackNode gw = null;
+ while (iteratorKey.hasNext()) {
+ String key = iteratorKey.next();
+
+ if (intIndex == index) {
+ gw = treeMap.get(key);
+ }
+ intIndex++;
+ }
+ return gw;
+ }
+
+ /**
* Builds up and a complete endpoint URL from gateway node.
*
* @param node gateway node
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
index d9a2ae3..a2c1a0a 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
@@ -108,7 +108,7 @@
import static org.onosproject.net.AnnotationKeys.PORT_NAME;
import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_RESUBMIT_TABLE;
import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
-import static org.onosproject.openstacknetworking.api.Constants.DHCP_ARP_TABLE;
+import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.FLAT_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.FORWARDING_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.VTAP_FLAT_OUTBOUND_GROUP_TABLE;
@@ -185,7 +185,7 @@
private static final int PRIORITY_VTAP_OUTPUT_RULE = 1000;
private static final int PRIORITY_VTAP_OUTPUT_DROP = 0;
- private static final int INBOUND_NEXT_TABLE = DHCP_ARP_TABLE;
+ private static final int INBOUND_NEXT_TABLE = DHCP_TABLE;
private static final int FLAT_OUTBOUND_NEXT_TABLE = FLAT_TABLE;
private static final int OUTBOUND_NEXT_TABLE = FORWARDING_TABLE;
diff --git a/apps/openstackvtap/app/src/main/resources/app/view/openstackvtap/openstackvtap.js b/apps/openstackvtap/app/src/main/resources/app/view/openstackvtap/openstackvtap.js
index 9b20eb0..d38c849 100644
--- a/apps/openstackvtap/app/src/main/resources/app/view/openstackvtap/openstackvtap.js
+++ b/apps/openstackvtap/app/src/main/resources/app/view/openstackvtap/openstackvtap.js
@@ -219,68 +219,6 @@
return div;
}
- function addInput(tbody, type, id, label, value) {
- var tr = tbody.append('tr'),
- lab;
- if (typeof label === 'string') {
- lab = label.replace(/_/g, ' ');
- } else {
- lab = label;
- }
-
- tr.append('td').attr('class', 'label').text(lab + ' :');
-
- if (type == 'radio') {
- var td = tr.append('td');
- for(var index in value) {
- if(index == 0) {
- td.append('input').classed( type + '-input', true)
- .attr('type', type)
- .attr('value', value[index])
- .attr('name', label)
- .attr('id', id)
- .attr('checked', 'true');
- } else {
- td.append('input').classed( type + '-input', true)
- .attr('type', type)
- .attr('name', label)
- .attr('id', id)
- .attr('value', value[index]);
- }
- td.append('span').text(value[index]);
- }
- } else {
- tr.append('td').append('input').classed(type + '-input', true).attr('type', type)
- .attr('id', id).attr('value', value);
- }
- }
-
- function addButton(tr, callback, value) {
- tr.append('td').append('input').classed('button-input', true).attr('type', 'button')
- .attr('value', value).on('click', callback);
- }
-
- function makeButton(callback, text, keyName) {
- var cb = fs.isF(callback),
- key = fs.isS(keyName);
-
- function invoke() {
- cb && cb();
- }
-
- return createDiv('vtap-button')
- .text(text)
- .on('click', invoke);
- }
-
- function createDiv(cls) {
- var div = d3.select(document.createElement('div'));
- if (cls) {
- div.classed(cls, true);
- }
- return div;
- }
-
function displayVtap() {
$log.debug("sendEvent openstackVtapIsActivatedRequest: ", selectedItem);
wss.sendEvent(osvIsActReq, selectedItem);
diff --git a/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PortStatisticsDiscoveryImpl.java b/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PortStatisticsDiscoveryImpl.java
index 2afbce0..8043ae7 100644
--- a/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PortStatisticsDiscoveryImpl.java
+++ b/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PortStatisticsDiscoveryImpl.java
@@ -26,7 +26,7 @@
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.onosproject.net.pi.model.PiCounterId;
import org.onosproject.net.pi.model.PiPipeconf;
-import org.onosproject.net.pi.runtime.PiCounterCellData;
+import org.onosproject.net.pi.runtime.PiCounterCell;
import org.onosproject.net.pi.runtime.PiCounterCellId;
import org.onosproject.net.pi.service.PiPipeconfService;
import org.onosproject.p4runtime.api.P4RuntimeClient;
@@ -95,7 +95,7 @@
});
// Query the device.
- Collection<PiCounterCellData> counterEntryResponse;
+ Collection<PiCounterCell> counterEntryResponse;
try {
counterEntryResponse = client.readCounterCells(counterCellIds, pipeconf).get();
} catch (InterruptedException | ExecutionException e) {
@@ -105,24 +105,24 @@
}
// Process response.
- counterEntryResponse.forEach(counterData -> {
- if (counterData.cellId().counterType() != INDIRECT) {
- log.warn("Invalid counter data type {}, skipping", counterData.cellId().counterType());
+ counterEntryResponse.forEach(counterCell -> {
+ if (counterCell.cellId().counterType() != INDIRECT) {
+ log.warn("Invalid counter data type {}, skipping", counterCell.cellId().counterType());
return;
}
- if (!portStatBuilders.containsKey(counterData.cellId().index())) {
- log.warn("Unrecognized counter index {}, skipping", counterData);
+ if (!portStatBuilders.containsKey(counterCell.cellId().index())) {
+ log.warn("Unrecognized counter index {}, skipping", counterCell);
return;
}
- DefaultPortStatistics.Builder statsBuilder = portStatBuilders.get(counterData.cellId().index());
- if (counterData.cellId().counterId().equals(INGRESS_COUNTER_ID)) {
- statsBuilder.setPacketsReceived(counterData.packets());
- statsBuilder.setBytesReceived(counterData.bytes());
- } else if (counterData.cellId().counterId().equals(EGRESS_COUNTER_ID)) {
- statsBuilder.setPacketsSent(counterData.packets());
- statsBuilder.setBytesSent(counterData.bytes());
+ DefaultPortStatistics.Builder statsBuilder = portStatBuilders.get(counterCell.cellId().index());
+ if (counterCell.cellId().counterId().equals(INGRESS_COUNTER_ID)) {
+ statsBuilder.setPacketsReceived(counterCell.data().packets());
+ statsBuilder.setBytesReceived(counterCell.data().bytes());
+ } else if (counterCell.cellId().counterId().equals(EGRESS_COUNTER_ID)) {
+ statsBuilder.setPacketsSent(counterCell.data().packets());
+ statsBuilder.setBytesSent(counterCell.data().bytes());
} else {
- log.warn("Unrecognized counter ID {}, skipping", counterData);
+ log.warn("Unrecognized counter ID {}, skipping", counterCell);
}
});