[SDFAB-187] Add UpfProgrammable interface in ONOS core
Change-Id: Icef23a14015bb0ebe33ebe57eadecaaadc8eebd3
(cherry picked from commit 5e66f98ebb5541ba7c7fbe2b7b7cb5f7beb8d885)
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/upf/GtpTunnel.java b/core/api/src/main/java/org/onosproject/net/behaviour/upf/GtpTunnel.java
new file mode 100644
index 0000000..bc262c7
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/upf/GtpTunnel.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2021-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.net.behaviour.upf;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.util.ImmutableByteSequence;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * A structure representing a unidirectional GTP tunnel.
+ */
+public final class GtpTunnel {
+ private final Ip4Address src; // The source address of the unidirectional tunnel
+ private final Ip4Address dst; // The destination address of the unidirectional tunnel
+ private final ImmutableByteSequence teid; // Tunnel Endpoint Identifier
+ private final short srcPort; // Tunnel destination port, default 2152
+
+ private GtpTunnel(Ip4Address src, Ip4Address dst, ImmutableByteSequence teid,
+ Short srcPort) {
+ this.src = src;
+ this.dst = dst;
+ this.teid = teid;
+ this.srcPort = srcPort;
+ }
+
+ public static GtpTunnelBuilder builder() {
+ return new GtpTunnelBuilder();
+ }
+
+ @Override
+ public String toString() {
+ return String.format("GTP-Tunnel(%s -> %s, TEID:%s)",
+ src.toString(), dst.toString(), teid.toString());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ GtpTunnel that = (GtpTunnel) obj;
+
+ return (this.src.equals(that.src) &&
+ this.dst.equals(that.dst) &&
+ this.teid.equals(that.teid) &&
+ (this.srcPort == that.srcPort));
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(src, dst, teid, srcPort);
+ }
+
+ /**
+ * Get the source IP address of this unidirectional GTP tunnel.
+ *
+ * @return tunnel source IP
+ */
+ public Ip4Address src() {
+ return this.src;
+ }
+
+ /**
+ * Get the destination address of this unidirectional GTP tunnel.
+ *
+ * @return tunnel destination IP
+ */
+ public Ip4Address dst() {
+ return this.dst;
+ }
+
+ /**
+ * Get the ID of this unidirectional GTP tunnel.
+ *
+ * @return tunnel ID
+ */
+ public ImmutableByteSequence teid() {
+ return this.teid;
+ }
+
+
+ /**
+ * Get the source L4 port of this unidirectional GTP tunnel.
+ *
+ * @return tunnel source port
+ */
+ public Short srcPort() {
+ return this.srcPort;
+ }
+
+ public static class GtpTunnelBuilder {
+ private Ip4Address src;
+ private Ip4Address dst;
+ private ImmutableByteSequence teid;
+ private short srcPort = 2152; // Default value is equal to GTP tunnel dst port
+
+ public GtpTunnelBuilder() {
+ this.src = null;
+ this.dst = null;
+ this.teid = null;
+ }
+
+ /**
+ * Set the source IP address of the unidirectional GTP tunnel.
+ *
+ * @param src GTP tunnel source IP
+ * @return This builder object
+ */
+ public GtpTunnelBuilder setSrc(Ip4Address src) {
+ this.src = src;
+ return this;
+ }
+
+ /**
+ * Set the destination IP address of the unidirectional GTP tunnel.
+ *
+ * @param dst GTP tunnel destination IP
+ * @return This builder object
+ */
+ public GtpTunnelBuilder setDst(Ip4Address dst) {
+ this.dst = dst;
+ return this;
+ }
+
+ /**
+ * Set the identifier of this unidirectional GTP tunnel.
+ *
+ * @param teid tunnel ID
+ * @return This builder object
+ */
+ public GtpTunnelBuilder setTeid(ImmutableByteSequence teid) {
+ this.teid = teid;
+ return this;
+ }
+
+ /**
+ * Set the identifier of this unidirectional GTP tunnel.
+ *
+ * @param teid tunnel ID
+ * @return This builder object
+ */
+ public GtpTunnelBuilder setTeid(long teid) {
+ this.teid = ImmutableByteSequence.copyFrom(teid);
+ return this;
+ }
+
+ /**
+ * Set the source port of this unidirectional GTP tunnel.
+ *
+ * @param srcPort tunnel source port
+ * @return this builder object
+ */
+ public GtpTunnelBuilder setSrcPort(short srcPort) {
+ this.srcPort = srcPort;
+ return this;
+ }
+
+ public GtpTunnel build() {
+ checkNotNull(src, "Tunnel source address cannot be null");
+ checkNotNull(dst, "Tunnel destination address cannot be null");
+ checkNotNull(teid, "Tunnel TEID cannot be null");
+ return new GtpTunnel(this.src, this.dst, this.teid, srcPort);
+ }
+ }
+}