Support STT tunneling protocol at kubevirt networking app

Change-Id: Icbef76dbfb842ce1cf6893bf18ee80c4b1b26006
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
index 2745e46..b133073 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtNetwork.java
@@ -35,6 +35,7 @@
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.FLAT;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GENEVE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GRE;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.STT;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 
@@ -157,7 +158,7 @@
 
     @Override
     public String tenantBridgeName() {
-        if (type == VXLAN || type == GRE || type == GENEVE) {
+        if (type == VXLAN || type == GRE || type == GENEVE || type == STT) {
             return TENANT_BRIDGE_PREFIX + segmentIdHex(segmentId);
         }
         return null;
@@ -165,7 +166,7 @@
 
     @Override
     public DeviceId tenantDeviceId(String hostname) {
-        if (type == VXLAN || type == GRE || type == GENEVE) {
+        if (type == VXLAN || type == GRE || type == GENEVE || type == STT) {
             String dpid = genDpidFromName(tenantBridgeName() + "-" + hostname);
             return DeviceId.deviceId(dpid);
         }
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java
index 493d80a..104ffc8 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtPort.java
@@ -118,7 +118,8 @@
         } else {
             return network.type() == KubevirtNetwork.Type.VXLAN ||
                     network.type() == KubevirtNetwork.Type.GRE ||
-                    network.type() == KubevirtNetwork.Type.GENEVE;
+                    network.type() == KubevirtNetwork.Type.GENEVE ||
+                    network.type() == KubevirtNetwork.Type.STT;
         }
     }
 
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
index 2db552e..852e669 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtNetwork.java
@@ -47,6 +47,11 @@
         GENEVE,
 
         /**
+         * STT typed virtual network.
+         */
+        STT,
+
+        /**
          * FLAT typed provider network.
          */
         FLAT,
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java
index e9ab1fe..2d5b87d 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java
@@ -72,6 +72,7 @@
 import static org.onosproject.kubevirtnetworking.api.Constants.TUNNEL_DEFAULT_TABLE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GENEVE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GRE;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.STT;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.buildGarpPacket;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.externalPatchPortNum;
@@ -164,7 +165,8 @@
         }
 
         KubevirtNetwork kubevirtNetwork = kubevirtNetworkService.network(kubevirtPort.networkId());
-        if (kubevirtNetwork.type() == VXLAN || kubevirtNetwork.type() == GENEVE || kubevirtNetwork.type() == GRE) {
+        if (kubevirtNetwork.type() == VXLAN || kubevirtNetwork.type() == GENEVE ||
+                kubevirtNetwork.type() == GRE || kubevirtNetwork.type() == STT) {
             setFloatingIpDownstreamRulesToGatewayTunBridge(floatingIp,
                     electedGw, kubevirtNetwork, kubevirtPort, install);
         }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLbHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLbHandler.java
index ba352eb..55b84f1 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLbHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtLbHandler.java
@@ -83,6 +83,7 @@
 import static org.onosproject.kubevirtnetworking.api.Constants.TUNNEL_DEFAULT_TABLE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GENEVE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GRE;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.STT;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.buildGarpPacket;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.externalPatchPortNum;
@@ -237,7 +238,7 @@
             setLbDownstreamRules(loadBalancer, router, gateway, true);
             setLbUpstreamRules(loadBalancer, router, gateway, true);
 
-            if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE) {
+            if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE || network.type() == STT) {
                 setLbDownStreamRulesForTunBridge(loadBalancer, gateway, true);
             }
         }
@@ -274,7 +275,8 @@
 
             setLbDownstreamRules(old, oldRouter, oldGateway, false);
             setLbUpstreamRules(old, oldRouter, oldGateway, false);
-            if (oldNetwork.type() == VXLAN || oldNetwork.type() == GENEVE || oldNetwork.type() == GRE) {
+            if (oldNetwork.type() == VXLAN || oldNetwork.type() == GENEVE ||
+                    oldNetwork.type() == GRE || oldNetwork.type() == STT) {
                 setLbDownStreamRulesForTunBridge(loadBalancer, oldGateway, false);
             }
             setBucketsToGroup(old, oldGateway, false);
@@ -310,7 +312,8 @@
             setBucketsToGroup(loadBalancer, gateway, true);
             setLbDownstreamRules(loadBalancer, router, gateway, true);
             setLbUpstreamRules(loadBalancer, router, gateway, true);
-            if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE) {
+            if (network.type() == VXLAN || network.type() == GENEVE ||
+                    network.type() == GRE || network.type() == STT) {
                 setLbDownStreamRulesForTunBridge(loadBalancer, gateway, true);
             }
         }
@@ -350,7 +353,7 @@
             setBucketsToGroup(loadBalancer, gateway, false);
             setLbGroup(loadBalancer, gateway, false);
 
-            if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE) {
+            if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE || network.type() == STT) {
                 setLbDownStreamRulesForTunBridge(loadBalancer, gateway, false);
             }
         }
@@ -747,7 +750,8 @@
                 setLbUpstreamRules(loadBalancer, router, gatewayNode, true);
 
                 KubevirtNetwork network = networkService.network(loadBalancer.networkId());
-                if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE) {
+                if (network.type() == VXLAN || network.type() == GENEVE ||
+                        network.type() == GRE || network.type() == STT) {
                     setLbDownStreamRulesForTunBridge(loadBalancer, gatewayNode, true);
                 }
 
@@ -781,7 +785,8 @@
                 setLbGroup(loadBalancer, gatewayNode, false);
 
                 KubevirtNetwork network = networkService.network(loadBalancer.networkId());
-                if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE) {
+                if (network.type() == VXLAN || network.type() == GENEVE ||
+                        network.type() == GRE || network.type() == STT) {
                     setLbDownStreamRulesForTunBridge(loadBalancer, gatewayNode, false);
                 }
 
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
index 482676f..1ea11e5 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
@@ -469,6 +469,7 @@
             case VXLAN:
             case GRE:
             case GENEVE:
+            case STT:
                 setDefaultEgressRuleToGatewayNode(router, network,
                         electedGateway.intgBridge(), install);
                 kubevirtNodeService.completeNodes(WORKER).forEach(node -> {
@@ -1208,6 +1209,7 @@
                 case VXLAN:
                 case GRE:
                 case GENEVE:
+                case STT:
                     initIntegrationTunnelBridge(network);
                     break;
                 case FLAT:
@@ -1228,6 +1230,7 @@
                 case VXLAN:
                 case GRE:
                 case GENEVE:
+                case STT:
                     purgeIntegrationTunnelBridge(network);
                     break;
                 case FLAT:
@@ -1301,6 +1304,7 @@
                         case VXLAN:
                         case GRE:
                         case GENEVE:
+                        case STT:
                             if (network.segmentId() == null) {
                                 continue;
                             }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java
index 74d317d..3c29e30 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkManager.java
@@ -48,6 +48,7 @@
 import static org.onosproject.kubevirtnetworking.api.Constants.KUBEVIRT_NETWORKING_APP_ID;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GENEVE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GRE;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.STT;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -224,7 +225,8 @@
         return ImmutableSet.copyOf(networkStore.networks().stream()
                 .filter(n -> n.type() == VXLAN ||
                              n.type() == GRE ||
-                             n.type() == GENEVE)
+                             n.type() == GENEVE ||
+                             n.type() == STT)
                 .collect(Collectors.toSet()));
     }
 
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
index 7c21b3f..8cdf435 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtRoutingSnatHandler.java
@@ -79,6 +79,7 @@
 import static org.onosproject.kubevirtnetworking.api.Constants.TUNNEL_DEFAULT_TABLE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GENEVE;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.GRE;
+import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.STT;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VLAN;
 import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VXLAN;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.buildGarpPacket;
@@ -318,7 +319,7 @@
                 GW_DROP_TABLE,
                 install);
 
-        if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE) {
+        if (network.type() == VXLAN || network.type() == GENEVE || network.type() == GRE || network.type() == STT) {
             setDownStreamRulesToGatewayTunBridge(network, gatewayNode, kubevirtPort, install);
         }
     }
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index 21353b9..82d3964 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -320,6 +320,8 @@
                 return node.grePort();
             case GENEVE:
                 return node.genevePort();
+            case STT:
+                return node.sttPort();
             default:
                 break;
         }
@@ -446,6 +448,8 @@
                 return node.grePort();
             case GENEVE:
                 return node.genevePort();
+            case STT:
+                return node.sttPort();
             case FLAT:
             case VLAN:
             default:
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
index 39ca033..3d2f14c 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
@@ -31,6 +31,7 @@
     public static final String VXLAN = "vxlan";
     public static final String GRE = "gre";
     public static final String GENEVE = "geneve";
+    public static final String STT = "stt";
 
     public static final String INTEGRATION_BRIDGE = "br-int";
     public static final String TUNNEL_BRIDGE = "br-tun";
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
index f647503..45c2e6c 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
@@ -35,6 +35,7 @@
 import static org.onosproject.kubevirtnode.api.Constants.GENEVE;
 import static org.onosproject.kubevirtnode.api.Constants.GRE;
 import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_TO_PHYSICAL_PREFIX;
+import static org.onosproject.kubevirtnode.api.Constants.STT;
 import static org.onosproject.kubevirtnode.api.Constants.VXLAN;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
 
@@ -222,6 +223,11 @@
     }
 
     @Override
+    public PortNumber sttPort() {
+        return tunnelPort(STT);
+    }
+
+    @Override
     public String gatewayBridgeName() {
         return gatewayBridgeName;
     }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
index 45cb87a..8c4844d 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
@@ -175,6 +175,13 @@
     PortNumber genevePort();
 
     /**
+     * Returns the STT tunnel port number.
+     *
+     * @return STT port number; null if the STT tunnel port does not exist
+     */
+    PortNumber sttPort();
+
+    /**
      * Returns the name of the gateway bridge.
      *
      * @return gateway bridge name
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtCheckNodeCommand.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtCheckNodeCommand.java
index 06297c2..3df42bb 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtCheckNodeCommand.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/cli/KubevirtCheckNodeCommand.java
@@ -30,6 +30,7 @@
 import static org.onosproject.kubevirtnode.api.Constants.GENEVE;
 import static org.onosproject.kubevirtnode.api.Constants.GRE;
 import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_BRIDGE;
+import static org.onosproject.kubevirtnode.api.Constants.STT;
 import static org.onosproject.kubevirtnode.api.Constants.TUNNEL_BRIDGE;
 import static org.onosproject.kubevirtnode.api.Constants.VXLAN;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
@@ -87,6 +88,7 @@
                 printPortState(deviceService, node.tunBridge(), VXLAN);
                 printPortState(deviceService, node.tunBridge(), GRE);
                 printPortState(deviceService, node.tunBridge(), GENEVE);
+                printPortState(deviceService, node.tunBridge(), STT);
             }
         }
     }
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
index 3408ed1..00aa0bf 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
@@ -82,6 +82,7 @@
 import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_TO_PHYSICAL_PREFIX;
 import static org.onosproject.kubevirtnode.api.Constants.INTEGRATION_TO_TUNNEL;
 import static org.onosproject.kubevirtnode.api.Constants.PHYSICAL_TO_INTEGRATION_SUFFIX;
+import static org.onosproject.kubevirtnode.api.Constants.STT;
 import static org.onosproject.kubevirtnode.api.Constants.TENANT_BRIDGE_PREFIX;
 import static org.onosproject.kubevirtnode.api.Constants.TUNNEL_BRIDGE;
 import static org.onosproject.kubevirtnode.api.Constants.TUNNEL_TO_INTEGRATION;
@@ -244,6 +245,10 @@
             if (node.dataIp() != null && !isIntfEnabled(node, GENEVE)) {
                 createGeneveTunnelInterface(node);
             }
+
+            if (node.dataIp() != null && !isIntfEnabled(node, STT)) {
+                createSttTunnelInterface(node);
+            }
         } catch (Exception e) {
             log.error("Exception occurred because of {}", e);
         }
@@ -362,6 +367,10 @@
         createTunnelInterface(node, GENEVE, GENEVE);
     }
 
+    private void createSttTunnelInterface(KubevirtNode node) {
+        createTunnelInterface(node, STT, STT);
+    }
+
     /**
      * Creates a tunnel interface in a given kubernetes node.
      *
@@ -396,7 +405,7 @@
      */
     private TunnelDescription buildTunnelDesc(String type, String intfName) {
         TunnelKey<String> key = new TunnelKey<>(FLOW_KEY);
-        if (VXLAN.equals(type) || GRE.equals(type) || GENEVE.equals(type)) {
+        if (VXLAN.equals(type) || GRE.equals(type) || GENEVE.equals(type) || STT.equals(type)) {
             TunnelDescription.Builder tdBuilder =
                     DefaultTunnelDescription.builder()
                             .deviceId(TUNNEL_BRIDGE)
@@ -414,6 +423,9 @@
                 case GENEVE:
                     tdBuilder.type(TunnelDescription.Type.GENEVE);
                     break;
+                case STT:
+                    tdBuilder.type(TunnelDescription.Type.STT);
+                    break;
                 default:
                     return null;
             }
@@ -557,6 +569,8 @@
             return false;
         }
 
+        // we make the STT tunnel port check optional
+
         for (KubevirtPhyInterface phyIntf : node.phyIntfs()) {
             if (phyIntf == null) {
                 log.warn("Physnet interface is invalid");
@@ -963,7 +977,8 @@
             if (node.state() == DEVICE_CREATED && (
                     Objects.equals(portName, VXLAN) ||
                             Objects.equals(portName, GRE) ||
-                            Objects.equals(portName, GENEVE))) {
+                            Objects.equals(portName, GENEVE) ||
+                            Objects.equals(portName, STT))) {
                 log.info("Interface {} added or updated to {}",
                         portName, device.id());
                 bootstrapNode(node);
@@ -985,7 +1000,8 @@
             if (node.state() == COMPLETE && (
                     Objects.equals(portName, VXLAN) ||
                             Objects.equals(portName, GRE) ||
-                            Objects.equals(portName, GENEVE))) {
+                            Objects.equals(portName, GENEVE) ||
+                            Objects.equals(portName, STT))) {
                 log.warn("Interface {} removed from {}", portName, device.id());
                 setState(node, INCOMPLETE);
             }
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/TunnelDescription.java b/core/api/src/main/java/org/onosproject/net/behaviour/TunnelDescription.java
index 4d9e41b..d53ab93 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/TunnelDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/TunnelDescription.java
@@ -54,6 +54,10 @@
          */
         GENEVE,
         /**
+         * Signifies that this is a L3 tunnel.
+         */
+        STT,
+        /**
          * Signifies that this is a L1 OTN tunnel.
          */
         ODUK,
diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbInterface.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbInterface.java
index 9a60372..eda5f60 100644
--- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbInterface.java
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbInterface.java
@@ -63,6 +63,10 @@
          */
         VXLAN,
         /**
+         * An Ethernet over draft-davie-stt-06 Stateless Transport Tunneling Protocol for Network Virtualization.
+         */
+        STT,
+        /**
          * A pair of virtual devices that act as a patch cable.
          */
         PATCH,