[ONOS-7863] Initial support GENEVE tunnel at SONA
Change-Id: Ia85d32e8068c22d59082dceccc0d911f8acb5f02
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 3ac0c0d..0e09b03 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
@@ -86,6 +86,7 @@
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REQUEST_RULE;
import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.FLAT;
+import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.GENEVE;
import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.GRE;
import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.VLAN;
import static org.onosproject.openstacknetworking.api.OpenstackNetwork.Type.VXLAN;
@@ -316,7 +317,7 @@
if (netType == VLAN) {
sBuilder.matchVlanId(VlanId.vlanId(network.getProviderSegID()));
tBuilder.popVlan();
- } else if (netType == VXLAN || netType == GRE) {
+ } else if (netType == VXLAN || netType == GRE || netType == GENEVE) {
// do not remove fake gateway ARP rules, if there is another gateway
// which has the same subnet that to be removed
// this only occurs if we have duplicated subnets associated with
@@ -381,6 +382,7 @@
switch (netType) {
case VXLAN:
case GRE:
+ case GENEVE:
setRemoteArpRequestRuleForTunnel(port, install);
break;
case VLAN:
@@ -407,6 +409,9 @@
case GRE:
setArpReplyRuleForGre(port, install);
break;
+ case GENEVE:
+ setArpReplyRuleForGeneve(port, install);
+ break;
case VLAN:
setArpReplyRuleForVlan(port, install);
break;
@@ -500,6 +505,22 @@
}
/**
+ * Installs flow rules to match ARP reply packets only for GENEVE.
+ *
+ * @param port instance port
+ * @param install installation flag
+ */
+ private void setArpReplyRuleForGeneve(InstancePort port, boolean install) {
+
+ OpenstackNode localNode = osNodeService.node(port.deviceId());
+
+ TrafficSelector selector = getArpReplySelectorForGeneve(port);
+
+ setLocalArpReplyTreatmentForGeneve(selector, port, install);
+ setRemoteArpTreatmentForTunnel(selector, port, localNode, install);
+ }
+
+ /**
* Installs flow rules to match ARP reply packets only for VLAN.
*
* @param port instance port
@@ -524,6 +545,11 @@
}
// a helper method
+ private TrafficSelector getArpReplySelectorForGeneve(InstancePort port) {
+ return getArpReplySelectorForVnet(port, GENEVE);
+ }
+
+ // a helper method
private TrafficSelector getArpReplySelectorForVlan(InstancePort port) {
return getArpReplySelectorForVnet(port, VLAN);
}
@@ -562,6 +588,13 @@
}
// a helper method
+ private void setLocalArpReplyTreatmentForGeneve(TrafficSelector selector,
+ InstancePort port,
+ boolean install) {
+ setLocalArpReplyTreatmentForVnet(selector, port, GENEVE, install);
+ }
+
+ // a helper method
private void setLocalArpReplyTreatmentForVlan(TrafficSelector selector,
InstancePort port,
boolean install) {