initial commit
diff --git a/src/main/java/org.onosproject.xran/entities/RnibLink.java b/src/main/java/org.onosproject.xran/entities/RnibLink.java
new file mode 100644
index 0000000..eb61120
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/entities/RnibLink.java
@@ -0,0 +1,370 @@
+/*
+ * Copyright 2015-present Open Networking Laboratory
+ *
+ * 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.xran.entities;
+
+import org.onosproject.xran.codecs.api.*;
+import org.onosproject.xran.codecs.pdu.PDCPMeasReportPerUe;
+import org.onosproject.xran.codecs.pdu.RRMConfig;
+import org.onosproject.xran.identifiers.LinkId;
+import org.openmuc.jasn1.ber.types.BerInteger;
+
+import java.util.Timer;
+
+/**
+ * Created by dimitris on 7/22/17.
+ */
+public class RnibLink {
+    private LinkId linkId;
+    //    private String type;
+    private RRMConfig rrmParameters;
+
+    private TrafficSplitPercentage trafficPercent;
+    private ERABParams bearerParameters;
+
+    private LinkQuality quality;
+    private PDCPThroughput pdcpThroughput;
+    private PDCPPacketDelay pdcpPackDelay;
+    private ResourceUsage resourceUsage;
+    private Type type;
+    private Timer timer;
+
+    public RnibLink() {
+        trafficPercent = new TrafficSplitPercentage();
+        trafficPercent.setTrafficPercentDl(new BerInteger(100));
+        trafficPercent.setTrafficPercentUl(new BerInteger(100));
+
+        pdcpThroughput = new PDCPThroughput();
+        quality = new LinkQuality();
+        pdcpPackDelay = new PDCPPacketDelay();
+        resourceUsage = new ResourceUsage();
+        timer = new Timer();
+    }
+
+    public Timer getTimer() {
+        return timer;
+    }
+
+    public void setTimer(Timer timer) {
+        this.timer.cancel();
+        this.timer.purge();
+        this.timer = timer;
+    }
+
+    public LinkId getLinkId() {
+        return linkId;
+    }
+
+    public void setLinkId(LinkId linkId) {
+        this.linkId = linkId;
+    }
+
+    public void setLinkId(RnibCell cell, RnibUe ue) {
+        this.linkId = new LinkId(cell.getEcgi(), ue.getMmeS1apId());
+        trafficPercent.setEcgi(cell.getEcgi());
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public void setType(Type type) {
+        this.type = type;
+    }
+
+    public TrafficSplitPercentage getTrafficPercent() {
+        return trafficPercent;
+    }
+
+    public void setTrafficPercent(TrafficSplitPercentage trafficPercent) {
+        this.trafficPercent = trafficPercent;
+    }
+
+    public ERABParams getBearerParameters() {
+        return bearerParameters;
+    }
+
+    public void setBearerParameters(ERABParams bearerParameters) {
+        this.bearerParameters = bearerParameters;
+    }
+
+    public LinkQuality getQuality() {
+        return quality;
+    }
+
+    public void setQuality(LinkQuality quality) {
+        this.quality = quality;
+    }
+
+    public RRMConfig getRrmParameters() {
+        return rrmParameters;
+    }
+
+    public void setRrmParameters(RRMConfig rrmParameters) {
+        this.rrmParameters = rrmParameters;
+    }
+
+    public PDCPThroughput getPdcpThroughput() {
+        return pdcpThroughput;
+    }
+
+    public void setPdcpThroughput(PDCPThroughput pdcpThroughput) {
+        this.pdcpThroughput = pdcpThroughput;
+    }
+
+    public PDCPPacketDelay getPdcpPackDelay() {
+        return pdcpPackDelay;
+    }
+
+    public void setPdcpPackDelay(PDCPPacketDelay pdcpPackDelay) {
+        this.pdcpPackDelay = pdcpPackDelay;
+    }
+
+    public ResourceUsage getResourceUsage() {
+        return resourceUsage;
+    }
+
+    public void setResourceUsage(ResourceUsage resourceUsage) {
+        this.resourceUsage = resourceUsage;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("{\n")
+                .append(linkId != null ? "\"link-id\":" + linkId : "")
+                .append(type != null ? ",\n\"type\":" + type : "")
+                .append(rrmParameters != null ? ",\n\"rrm-params\":" + rrmParameters : "")
+                .append(trafficPercent != null ? ",\n\"traffic-percent\":" + trafficPercent : "")
+                .append(bearerParameters != null ? ",\n\"bearer-params\":" + bearerParameters : "")
+                .append(quality != null ? ",\n\"quality\":" + quality : "")
+                .append(pdcpThroughput != null ? ",\n\"pdcp-throughput\":" + pdcpThroughput : "")
+                .append(pdcpPackDelay != null ? ",\n\"pdcp-packet-delay\":" + pdcpPackDelay : "")
+                .append(resourceUsage != null ? ",\n\"resource-usage\":" + resourceUsage : "")
+                .append("\n}\n");
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        RnibLink link = (RnibLink) o;
+
+        return linkId.equals(link.linkId);
+    }
+
+    @Override
+    public int hashCode() {
+        return linkId.hashCode();
+    }
+
+    public enum Type {
+        SERVING_PRIMARY {
+            @Override
+            public String toString() {
+                return "\"serving/primary\"";
+            }
+        },
+        // TODO: Add CA/DC
+        SERVING_SECONDARY {
+            @Override
+            public String toString() {
+                return "\"serving/secondary\"";
+            }
+        },
+        NON_SERVING {
+            @Override
+            public String toString() {
+                return "\"non-serving\"";
+            }
+        }
+    }
+
+    public class PDCPThroughput {
+        private PDCPMeasReportPerUe.ThroughputDl dl;
+        private PDCPMeasReportPerUe.ThroughputUl ul;
+
+        public PDCPMeasReportPerUe.ThroughputDl getDl() {
+            return dl;
+        }
+
+        public void setDl(PDCPMeasReportPerUe.ThroughputDl dl) {
+            this.dl = dl;
+        }
+
+        public PDCPMeasReportPerUe.ThroughputUl getUl() {
+            return ul;
+        }
+
+        public void setUl(PDCPMeasReportPerUe.ThroughputUl ul) {
+            this.ul = ul;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("{\n")
+                    .append(dl != null ? "\"dl\":" + dl : "")
+                    .append(ul != null ? ",\n\"ul\":" + ul : "")
+                    .append("\n}\n");
+            return sb.toString();
+        }
+    }
+
+    public class PDCPPacketDelay {
+        PDCPMeasReportPerUe.PktDelayDl dl;
+        PDCPMeasReportPerUe.PktDelayUl ul;
+
+        public PDCPMeasReportPerUe.PktDelayDl getDl() {
+            return dl;
+        }
+
+        public void setDl(PDCPMeasReportPerUe.PktDelayDl dl) {
+            this.dl = dl;
+        }
+
+        public PDCPMeasReportPerUe.PktDelayUl getUl() {
+            return ul;
+        }
+
+        public void setUl(PDCPMeasReportPerUe.PktDelayUl ul) {
+            this.ul = ul;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("{\n")
+                    .append(dl != null ? "\"dl\":" + dl : "")
+                    .append(ul != null ? ",\n\"ul\":" + ul : "")
+                    .append("\n}\n");
+            return sb.toString();
+        }
+    }
+
+    public class ResourceUsage {
+        PRBUsage.PrbUsageDl dl;
+        PRBUsage.PrbUsageUl ul;
+
+        public PRBUsage.PrbUsageDl getDl() {
+            return dl;
+        }
+
+        public void setDl(PRBUsage.PrbUsageDl dl) {
+            this.dl = dl;
+        }
+
+        public PRBUsage.PrbUsageUl getUl() {
+            return ul;
+        }
+
+        public void setUl(PRBUsage.PrbUsageUl ul) {
+            this.ul = ul;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("{\n")
+                    .append(dl != null ? "\"dl\":" + dl : "")
+                    .append(ul != null ? ",\n\"ul\":" + ul : "")
+                    .append("\n}\n");
+            return sb.toString();
+        }
+    }
+
+    public class LinkQuality {
+        double rsrp;
+        double rsrq;
+        RadioRepPerServCell.CqiHist cqiHist;
+        double cqiMode;
+        double cqiMean;
+        SchedMeasRepPerServCell.McsDl mcs_dl;
+        SchedMeasRepPerServCell.McsUl mcs_ul;
+
+        public double getRsrp() {
+            return rsrp;
+        }
+
+        public void setRsrp(double rsrp) {
+            this.rsrp = rsrp;
+        }
+
+        public double getRsrq() {
+            return rsrq;
+        }
+
+        public void setRsrq(double rsrq) {
+            this.rsrq = rsrq;
+        }
+
+        public RadioRepPerServCell.CqiHist getCqiHist() {
+            return cqiHist;
+        }
+
+        public void setCqiHist(RadioRepPerServCell.CqiHist cqiHist) {
+            this.cqiHist = cqiHist;
+        }
+
+        public double getCqiMode() {
+            return cqiMode;
+        }
+
+        public void setCqiMode(double cqiMode) {
+            this.cqiMode = cqiMode;
+        }
+
+        public double getCqiMean() {
+            return cqiMean;
+        }
+
+        public void setCqiMean(double cqiMean) {
+            this.cqiMean = cqiMean;
+        }
+
+        public SchedMeasRepPerServCell.McsDl getMcs_dl() {
+            return mcs_dl;
+        }
+
+        public void setMcs_dl(SchedMeasRepPerServCell.McsDl mcs_dl) {
+            this.mcs_dl = mcs_dl;
+        }
+
+        public SchedMeasRepPerServCell.McsUl getMcs_ul() {
+            return mcs_ul;
+        }
+
+        public void setMcs_ul(SchedMeasRepPerServCell.McsUl mcs_ul) {
+            this.mcs_ul = mcs_ul;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("{\n")
+                    .append("\"rsrp\":" + rsrp)
+                    .append(",\n\"rsrq\":" + rsrq)
+                    .append(",\n\"cqiMode\":" + cqiMode)
+                    .append(",\n\"cqiMean\":" + cqiMean)
+                    .append(mcs_dl != null ? ",\n\"mcs-dl\":" + mcs_dl : "")
+                    .append(mcs_ul != null ? ",\n\"mcs-ul\":" + mcs_ul : "")
+                    .append("\n}\n");
+            return sb.toString();
+        }
+    }
+}