introduced xran UE context ID
diff --git a/src/main/java/org.onosproject.xran/XranStore.java b/src/main/java/org.onosproject.xran/XranStore.java
index 257e908..00984b9 100644
--- a/src/main/java/org.onosproject.xran/XranStore.java
+++ b/src/main/java/org.onosproject.xran/XranStore.java
@@ -43,11 +43,11 @@
List<RnibLink> getLinksByCellId(String eciHex);
- List<RnibLink> getLinksByUeId(long euId);
+ List<RnibLink> getLinksByUeId(long ueId);
- RnibLink getLinkBetweenCellIdUeId(String cellId, long euId);
+ RnibLink getLinkBetweenCellIdUeId(String cellId, long ueId);
- RnibLink getLink(ECGI ecgi, MMEUES1APID mme);
+ RnibLink getLink(ECGI ecgi, Long ueId);
void modifyLinkRrmConf(RnibLink link, JsonNode rrmConf);
@@ -95,9 +95,7 @@
RnibUe getUe(long euId);
- RnibUe getUe(MMEUES1APID mme);
-
void storeUe(RnibUe ue);
- boolean removeUe(MMEUES1APID mme);
+ boolean removeUe(long ueId);
}
diff --git a/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java b/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
index 2a82205..764f55c 100644
--- a/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
+++ b/src/main/java/org.onosproject.xran/controller/XranChannelHandler.java
@@ -23,23 +23,17 @@
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.sctp.SctpMessage;
import org.apache.commons.lang.exception.ExceptionUtils;
-import org.onosproject.net.DeviceId;
-import org.onosproject.xran.codecs.pdu.XrancPdu;
import org.onosproject.xran.codecs.ber.BerByteArrayOutputStream;
+import org.onosproject.xran.codecs.pdu.XrancPdu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.xml.bind.DatatypeConverter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
-import java.net.URI;
import java.net.URISyntaxException;
-import java.nio.charset.Charset;
-
-import static org.onosproject.net.DeviceId.deviceId;
/**
* Created by dimitris on 7/20/17.
@@ -89,7 +83,7 @@
}
@Override
- public void channelRead(ChannelHandlerContext ctx, Object msg) throws IOException {
+ public void channelRead(ChannelHandlerContext ctx, Object msg) throws IOException, InterruptedException {
SctpMessage sctpMessage = (SctpMessage) msg;
ByteBuf byteBuf = sctpMessage.content();
diff --git a/src/main/java/org.onosproject.xran/controller/XranController.java b/src/main/java/org.onosproject.xran/controller/XranController.java
index 02f8378..0ab91ef 100644
--- a/src/main/java/org.onosproject.xran/controller/XranController.java
+++ b/src/main/java/org.onosproject.xran/controller/XranController.java
@@ -28,7 +28,7 @@
*/
public interface XranController {
- SynchronousQueue<String> sendHORequest(RnibLink newLink, RnibLink oldLink);
+ SynchronousQueue<String> sendHORequest(RnibLink newLink, RnibLink oldLink) throws InterruptedException;
void addListener(XranDeviceListener listener);
@@ -43,4 +43,8 @@
SynchronousQueue<String> sendScellAdd(RnibLink link);
boolean sendScellDelete(RnibLink link);
+
+ int getNorthbound_timeout();
+
+ void setNorthbound_timeout(int northbound_timeout);
}
diff --git a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
index 9497bf4..99e79a7 100644
--- a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
+++ b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
@@ -38,7 +38,9 @@
import org.onosproject.xran.entities.RnibCell;
import org.onosproject.xran.entities.RnibLink;
import org.onosproject.xran.entities.RnibUe;
+import org.onosproject.xran.identifiers.EcgiCrntiPair;
import org.onosproject.xran.identifiers.LinkId;
+import org.onosproject.xran.identifiers.contextUpdateHandler;
import org.onosproject.xran.impl.XranConfig;
import org.onosproject.xran.providers.XranDeviceListener;
import org.onosproject.xran.providers.XranHostListener;
@@ -50,17 +52,14 @@
import java.io.IOException;
import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.*;
import java.util.stream.Collectors;
import static org.onosproject.net.DeviceId.deviceId;
import static org.onosproject.xran.controller.XranChannelHandler.getSctpMessage;
import static org.onosproject.xran.entities.RnibCell.decodeDeviceId;
import static org.onosproject.xran.entities.RnibCell.uri;
-import static org.onosproject.xran.entities.RnibUe.hostIdtoMME;
+import static org.onosproject.xran.entities.RnibUe.hostIdtoUEId;
/**
* Created by dimitris on 7/20/17.
@@ -80,7 +79,7 @@
private final Controller controller = new Controller();
private XranConfig xranConfig;
private ApplicationId appId;
- public int northbound_timeout;
+ private int northbound_timeout;
/* Services */
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private DeviceService deviceService;
@@ -108,9 +107,12 @@
private LinkMap linkMap;
/* MAPS */
private ConcurrentMap<String, ECGI> legitCells = new ConcurrentHashMap<>();
- private ConcurrentMap<ECGI, SynchronousQueue<String>> hoQueue = new ConcurrentHashMap<>();
- private ConcurrentMap<ECGI, SynchronousQueue<String>> RRMCellQueue = new ConcurrentHashMap<>();
- private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellAddQueue = new ConcurrentHashMap<>();
+ private ConcurrentMap<ECGI, SynchronousQueue<String>> hoMap = new ConcurrentHashMap<>();
+ private ConcurrentMap<ECGI, SynchronousQueue<String>> RRMCellMap = new ConcurrentHashMap<>();
+ private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellAddMap = new ConcurrentHashMap<>();
+ private ConcurrentMap<EcgiCrntiPair, contextUpdateHandler> contextUpdateMap = new ConcurrentHashMap<>();
+ /* QUEUE */
+ private BlockingQueue<Long> ueIdQueue = new LinkedBlockingQueue<>();
/* AGENTS */
private InternalXranDeviceAgent deviceAgent = new InternalXranDeviceAgent();
private InternalXranHostAgent hostAgent = new InternalXranHostAgent();
@@ -155,24 +157,28 @@
}
@Override
- public SynchronousQueue<String> sendHORequest(RnibLink link_t, RnibLink link_s) {
+ public SynchronousQueue<String> sendHORequest(RnibLink link_t, RnibLink link_s) throws InterruptedException {
ECGI ecgi_t = link_t.getLinkId().getEcgi(),
ecgi_s = link_s.getLinkId().getEcgi();
- CRNTI crnti = linkMap.getCrnti(link_t.getLinkId().getMmeues1apid());
+ CRNTI crnti = linkMap.getCrnti(link_t.getLinkId().getUeId());
ChannelHandlerContext ctx_t = cellMap.getCtx(ecgi_t),
ctx_s = cellMap.getCtx(ecgi_s);
+
+ SynchronousQueue<String> queue = new SynchronousQueue<>();
try {
XrancPdu xrancPdu = HORequest.constructPacket(crnti, ecgi_s, ecgi_t);
+
+ hoMap.put(ecgi_s, queue);
+
ctx_t.writeAndFlush(getSctpMessage(xrancPdu));
ctx_s.writeAndFlush(getSctpMessage(xrancPdu));
} catch (IOException e) {
e.printStackTrace();
}
- SynchronousQueue<String> queue = new SynchronousQueue<>();
- hoQueue.put(ecgi_s, queue);
+ ueIdQueue.put(link_t.getLinkId().getUeId());
return queue;
}
@@ -198,11 +204,21 @@
}
@Override
+ public int getNorthbound_timeout() {
+ return northbound_timeout;
+ }
+
+ @Override
+ public void setNorthbound_timeout(int northbound_timeout) {
+ this.northbound_timeout = northbound_timeout;
+ }
+
+ @Override
public SynchronousQueue<String> sendModifiedRRMConf(RRMConfig rrmConfig, boolean xICIC) {
ECGI ecgi = rrmConfig.getEcgi();
ChannelHandlerContext ctx = cellMap.getCtx(ecgi);
try {
- XrancPdu pdu = null;
+ XrancPdu pdu;
if (xICIC) {
CellConfigReport cellConfigReport = cellMap.get(ecgi).getConf();
@@ -214,7 +230,7 @@
pdu = RRMConfig.constructPacket(rrmConfig);
ctx.writeAndFlush(getSctpMessage(pdu));
SynchronousQueue<String> queue = new SynchronousQueue<>();
- RRMCellQueue.put(ecgi, queue);
+ RRMCellMap.put(ecgi, queue);
return queue;
}
} catch (IOException e) {
@@ -231,7 +247,7 @@
ECGI primaryEcgi = primaryCell.getEcgi();
ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
- CRNTI crnti = linkMap.getCrnti(link.getLinkId().getMmeues1apid());
+ CRNTI crnti = linkMap.getCrnti(link.getLinkId().getUeId());
CellConfigReport cellReport = secondaryCell.getConf();
@@ -247,7 +263,7 @@
try {
ctx.writeAndFlush(getSctpMessage(pdu));
SynchronousQueue<String> queue = new SynchronousQueue<>();
- scellAddQueue.put(crnti, queue);
+ scellAddMap.put(crnti, queue);
return queue;
} catch (IOException e) {
@@ -265,7 +281,7 @@
ECGI primaryEcgi = primaryCell.getEcgi();
ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
- CRNTI crnti = linkMap.getCrnti(link.getLinkId().getMmeues1apid());
+ CRNTI crnti = linkMap.getCrnti(link.getLinkId().getUeId());
CellConfigReport cellReport = secondaryCell.getConf();
@@ -296,7 +312,7 @@
public void run() {
if (ue.getState() == RnibUe.State.IDLE) {
hostAgent.removeConnectedHost(ue);
- log.info("UE is removed after 10 seconds of IDLE");
+ log.info("UE is removed after {} ms of IDLE", xranConfig.getIdleUeRemoval());
} else {
log.info("UE not removed cause its ACTIVE");
}
@@ -312,7 +328,7 @@
public void run() {
LinkId linkId = link.getLinkId();
xranStore.removeLink(linkId);
- log.info("Link is removed after not receiving Meas Reports for 10 seconds");
+ log.info("Link is removed after not receiving Meas Reports for {} ms", xranConfig.getNoMeasLinkRemoval());
}
}, xranConfig.getNoMeasLinkRemoval());
@@ -363,7 +379,7 @@
});
XrancPdu xrancPdu = RXSigMeasConfig.constructPacket(
primary_ecgi,
- ue.getRanId(),
+ ue.getCrnti(),
measCells,
xranConfig.getRxSignalInterval()
);
@@ -415,7 +431,7 @@
switch (event.type()) {
case HOST_ADDED:
case HOST_MOVED: {
- RnibUe ue = ueMap.get(hostIdtoMME(event.subject().id()));
+ RnibUe ue = ueMap.get(hostIdtoUEId(event.subject().id()));
if (ue != null) {
ECGI ecgi_primary = linkMap.getPrimaryCell(ue).getEcgi();
RnibCell primary = cellMap.get(ecgi_primary);
@@ -431,7 +447,7 @@
ChannelHandlerContext ctx = cellMap.getCtx(primary.getEcgi());
XrancPdu xrancPdu = UECapabilityEnquiry.constructPacket(
primary.getEcgi(),
- ue.getRanId());
+ ue.getCrnti());
ctx.writeAndFlush(getSctpMessage(xrancPdu));
} catch (IOException e) {
log.warn(ExceptionUtils.getFullStackTrace(e));
@@ -461,7 +477,7 @@
});
XrancPdu xrancPdu = RXSigMeasConfig.constructPacket(
primary.getEcgi(),
- ue.getRanId(),
+ ue.getCrnti(),
measCells,
xranConfig.getRxSignalInterval()
);
@@ -535,13 +551,15 @@
@Override
public boolean addConnectedHost(RnibUe ue, RnibCell cell, ChannelHandlerContext ctx) {
- if (ueMap.get(ue.getMmeS1apId()) != null) {
+ if (ue.getId() != null && ueMap.get(ue.getId()) != null) {
linkMap.putPrimaryLink(cell, ue);
- Set<ECGI> ecgiSet = xranStore.getLinksByUeId(ue.getMmeS1apId().longValue())
+ Set<ECGI> ecgiSet = Sets.newConcurrentHashSet();
+
+ ecgiSet.add(xranStore.getLinksByUeId(ue.getId())
.stream()
- .map(l -> l.getLinkId().getEcgi())
- .collect(Collectors.toSet());
+ .filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
+ .findFirst().get().getLinkId().getEcgi());
for (XranHostListener l : xranHostListeners) {
l.hostAdded(ue, ecgiSet);
@@ -563,9 +581,9 @@
@Override
public boolean removeConnectedHost(RnibUe ue) {
- List<RnibLink> links = xranStore.getLinksByUeId(ue.getMmeS1apId().longValue());
+ List<RnibLink> links = xranStore.getLinksByUeId(ue.getId());
links.forEach(rnibLink -> xranStore.removeLink(rnibLink.getLinkId()));
- if (ueMap.remove(ue.getMmeS1apId())) {
+ if (ueMap.remove(ue.getId())) {
for (XranHostListener l : xranHostListeners) {
l.hostRemoved(ue.getHostId());
}
@@ -577,7 +595,7 @@
public class InternalXranPacketAgent implements XranPacketProcessor {
@Override
- public void handlePacket(XrancPdu recv_pdu, ChannelHandlerContext ctx) throws IOException {
+ public void handlePacket(XrancPdu recv_pdu, ChannelHandlerContext ctx) throws IOException, InterruptedException {
XrancPdu send_pdu;
int apiID = recv_pdu.getHdr().getApiId().intValue();
@@ -621,23 +639,46 @@
ue.setState(RnibUe.State.IDLE);
}
}
+
+ if (ueAdmissionStatus.getAdmEstStatus().value.intValue() == 0) {
+ EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair.valueOf(ueAdmissionStatus.getEcgi(), ueAdmissionStatus.getCrnti());
+ contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
+ if (v == null) {
+ v = new contextUpdateHandler();
+ }
+ if (v.setAdmissionStatus(ueAdmissionStatus)) {
+ handleContextUpdate(v.getContextUpdate(), ctx, false);
+ }
+ return v;
+ });
+ }
break;
}
case 5: {
- // Decode UE Admission Context Update.
+ // Decode UE Context Update.
UEContextUpdate ueContextUpdate = recv_pdu.getBody().getUEContextUpdate();
+ EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair.valueOf(ueContextUpdate.getEcgi(), ueContextUpdate.getCrnti());
- RnibUe ue = ueMap.get(ueContextUpdate.getMMEUES1APID());
- RnibCell cell = xranStore.getCell(ueContextUpdate.getEcgi());
- if (ue == null) {
- ue = new RnibUe();
- }
-
- ue.setMmeS1apId(ueContextUpdate.getMMEUES1APID());
- ue.setEnbS1apId(ueContextUpdate.getENBUES1APID());
- ue.setRanId(ueContextUpdate.getCrnti());
-
- hostAgent.addConnectedHost(ue, cell, ctx);
+ contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
+ if (v == null) {
+ v = new contextUpdateHandler();
+ }
+ if (v.setContextUpdate(ueContextUpdate)) {
+ HOComplete hoComplete = v.getHoComplete();
+ handleContextUpdate(ueContextUpdate, ctx, hoComplete != null);
+ if (hoComplete != null) {
+ try {
+ hoMap.get(hoComplete.getEcgiS()).put("Hand Over Completed");
+ } catch (InterruptedException e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ e.printStackTrace();
+ } finally {
+ hoMap.remove(hoComplete.getEcgiS());
+ }
+ }
+ }
+ return v;
+ });
break;
}
@@ -647,7 +688,7 @@
RnibUe ue = ueMap.get(ueReconfigInd.getEcgi(), ueReconfigInd.getCrntiOld());
if (ue != null) {
- ue.setRanId(ueReconfigInd.getCrntiNew());
+ ue.setCrnti(ueReconfigInd.getCrntiNew());
} else {
log.warn("Could not find UE with this CRNTI: {}", ueReconfigInd.getCrntiOld());
}
@@ -718,13 +759,14 @@
HOFailure hoFailure = recv_pdu.getBody().getHOFailure();
try {
- hoQueue.get(hoFailure.getEcgi())
+ hoMap.get(hoFailure.getEcgi())
.put("Hand Over Failed with cause: " + hoFailure.getCause());
} catch (InterruptedException e) {
log.error(ExceptionUtils.getFullStackTrace(e));
e.printStackTrace();
} finally {
- hoQueue.remove(hoFailure.getEcgi());
+ hoMap.remove(hoFailure.getEcgi());
+ ueIdQueue.take();
}
break;
@@ -732,15 +774,26 @@
case 14: {
HOComplete hoComplete = recv_pdu.getBody().getHOComplete();
- try {
- hoQueue.get(hoComplete.getEcgiS())
- .put("Hand Over Completed");
- } catch (InterruptedException e) {
- log.error(ExceptionUtils.getFullStackTrace(e));
- e.printStackTrace();
- } finally {
- hoQueue.remove(hoComplete.getEcgiS());
- }
+ EcgiCrntiPair ecgiCrntiPair = EcgiCrntiPair.valueOf(hoComplete.getEcgiT(), hoComplete.getCrntiNew());
+ contextUpdateMap.compute(ecgiCrntiPair, (k, v) -> {
+ if (v == null) {
+ v = new contextUpdateHandler();
+ }
+ if (v.setHoComplete(hoComplete)) {
+ handleContextUpdate(v.getContextUpdate(), ctx, true);
+
+ try {
+ hoMap.get(hoComplete.getEcgiS()).put("Hand Over Completed");
+ } catch (InterruptedException e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ e.printStackTrace();
+ } finally {
+ hoMap.remove(hoComplete.getEcgiS());
+ }
+ }
+ return v;
+ });
+
break;
}
@@ -749,73 +802,83 @@
RXSigMeasReport rxSigMeasReport = recv_pdu.getBody().getRXSigMeasReport();
List<RXSigReport> rxSigReportList = rxSigMeasReport.getCellMeasReports().getRXSigReport();
- if (!rxSigReportList.isEmpty()) {
- rxSigReportList.forEach(rxSigReport -> {
- RnibCell cell = cellMap.get(rxSigReport.getPciArfcn());
- if (cell != null) {
- ECGI ecgi = cell.getEcgi();
- RnibLink link = linkMap.get(ecgi, rxSigMeasReport.getCrnti());
- if (link == null) {
- log.warn("Could not find link between: {}-{} | Creating non-serving link..", ecgi, rxSigMeasReport.getCrnti());
- link = linkMap.putNonServingLink(cell, rxSigMeasReport.getCrnti());
- }
+ RnibUe ue = ueMap.get(rxSigMeasReport.getEcgi(), rxSigMeasReport.getCrnti());
+ if (ue != null) {
+ Long ueId = ue.getId();
- if (link != null) {
- if (link.getType().equals(RnibLink.Type.NON_SERVING)) {
- restartTimer(link);
+ if (!rxSigReportList.isEmpty()) {
+ rxSigReportList.forEach(rxSigReport -> {
+ RnibCell cell = cellMap.get(rxSigReport.getPciArfcn());
+ if (cell != null) {
+ ECGI ecgi = cell.getEcgi();
+
+ RnibLink link = linkMap.get(ecgi, ueId);
+ if (link == null) {
+ log.warn("Could not find link between: {}-{} | Creating non-serving link..", ecgi, ueId);
+ link = linkMap.putNonServingLink(cell, ueId);
}
- RSRQRange rsrq = rxSigReport.getRsrq();
- RSRPRange rsrp = rxSigReport.getRsrp();
+ if (link != null) {
+ if (link.getType().equals(RnibLink.Type.NON_SERVING)) {
+ restartTimer(link);
+ }
- RnibLink.LinkQuality quality = link.getQuality();
- quality.setRX(new RnibLink.LinkQuality.RX(
- rsrp.value.intValue() - 140,
- (rsrq.value.intValue() * 0.5) - 19.5
- ));
+ RSRQRange rsrq = rxSigReport.getRsrq();
+ RSRPRange rsrp = rxSigReport.getRsrp();
+
+ RnibLink.LinkQuality quality = link.getQuality();
+ quality.setRX(new RnibLink.LinkQuality.RX(
+ rsrp.value.intValue() - 140,
+ (rsrq.value.intValue() * 0.5) - 19.5
+ ));
+ }
+ } else {
+ log.warn("case 16: Could not find cell with PCI-ARFCN: {}", rxSigReport.getPciArfcn());
}
- } else {
- log.warn("case 16: Could not find cell with PCI-ARFCN: {}", rxSigReport.getPciArfcn());
- }
- });
+ });
+ }
}
break;
}
case 18: {
RadioMeasReportPerUE radioMeasReportPerUE = recv_pdu.getBody().getRadioMeasReportPerUE();
- List<RadioRepPerServCell> servCells = radioMeasReportPerUE.getRadioReportServCells().getRadioRepPerServCell();
+ RnibUe ue = ueMap.get(radioMeasReportPerUE.getEcgi(), radioMeasReportPerUE.getCrnti());
+ if (ue != null) {
+ Long ueId = ue.getId();
+ List<RadioRepPerServCell> servCells = radioMeasReportPerUE.getRadioReportServCells().getRadioRepPerServCell();
- servCells.forEach(servCell -> {
- RnibCell cell = cellMap.get(servCell.getPciArfcn());
- if (cell != null) {
- RnibLink link = linkMap.get(cell.getEcgi(), radioMeasReportPerUE.getCrnti());
- if (link != null) {
- RadioRepPerServCell.CqiHist cqiHist = servCell.getCqiHist();
- RnibLink.LinkQuality quality = link.getQuality();
+ servCells.forEach(servCell -> {
+ RnibCell cell = cellMap.get(servCell.getPciArfcn());
+ if (cell != null) {
+ RnibLink link = linkMap.get(cell.getEcgi(), ueId);
+ if (link != null) {
+ RadioRepPerServCell.CqiHist cqiHist = servCell.getCqiHist();
+ RnibLink.LinkQuality quality = link.getQuality();
- final double[] values = {0, 0, 0};
- final int[] i = {1};
- cqiHist.getBerInteger().forEach(value -> {
- values[0] = Math.max(values[0], value.intValue());
- values[1] += i[0] * value.intValue();
- values[2] += value.intValue();
- i[0]++;
- });
+ final double[] values = {0, 0, 0};
+ final int[] i = {1};
+ cqiHist.getBerInteger().forEach(value -> {
+ values[0] = Math.max(values[0], value.intValue());
+ values[1] += i[0] * value.intValue();
+ values[2] += value.intValue();
+ i[0]++;
+ });
- quality.setCQI(new RnibLink.LinkQuality.CQI(
- cqiHist,
- values[0],
- values[1] / values[0]
- ));
+ quality.setCQI(new RnibLink.LinkQuality.CQI(
+ cqiHist,
+ values[0],
+ values[1] / values[0]
+ ));
+ } else {
+ log.warn("Could not find link between: {}-{}", cell.getEcgi(), ueId);
+ }
} else {
- log.warn("Could not find link between: {}-{}", cell.getEcgi(), radioMeasReportPerUE.getCrnti());
+ log.warn("case 18: Could not find cell with PCI-ARFCN: {}", servCell.getPciArfcn());
}
- } else {
- log.warn("case 18: Could not find cell with PCI-ARFCN: {}", servCell.getPciArfcn());
- }
- });
+ });
+ }
break;
}
case 19: {
@@ -824,31 +887,36 @@
}
case 20: {
SchedMeasReportPerUE schedMeasReportPerUE = recv_pdu.getBody().getSchedMeasReportPerUE();
- List<SchedMeasRepPerServCell> servCells = schedMeasReportPerUE.getSchedReportServCells()
- .getSchedMeasRepPerServCell();
- servCells.forEach(servCell -> {
- RnibCell cell = cellMap.get(servCell.getPciArfcn());
- if (cell != null) {
- RnibLink link = linkMap.get(cell.getEcgi(), schedMeasReportPerUE.getCrnti());
- if (link != null) {
- link.getQuality().setMCS(new RnibLink.LinkQuality.MCS(
- servCell.getMcsDl(),
- servCell.getMcsUl()
- ));
+ RnibUe ue = ueMap.get(schedMeasReportPerUE.getEcgi(), schedMeasReportPerUE.getCrnti());
+ if (ue != null) {
+ Long ueId = ue.getId();
- link.setResourceUsage(new RnibLink.ResourceUsage(
- servCell.getPrbUsage().getPrbUsageDl(),
- servCell.getPrbUsage().getPrbUsageUl()
- ));
+ List<SchedMeasRepPerServCell> servCells = schedMeasReportPerUE.getSchedReportServCells()
+ .getSchedMeasRepPerServCell();
+
+ servCells.forEach(servCell -> {
+ RnibCell cell = cellMap.get(servCell.getPciArfcn());
+ if (cell != null) {
+ RnibLink link = linkMap.get(cell.getEcgi(), ueId);
+ if (link != null) {
+ link.getQuality().setMCS(new RnibLink.LinkQuality.MCS(
+ servCell.getMcsDl(),
+ servCell.getMcsUl()
+ ));
+
+ link.setResourceUsage(new RnibLink.ResourceUsage(
+ servCell.getPrbUsage().getPrbUsageDl(),
+ servCell.getPrbUsage().getPrbUsageUl()
+ ));
+ } else {
+ log.warn("Could not find link between: {}-{}", cell.getEcgi(), ueId);
+ }
} else {
- log.warn("Could not find link between: {}-{}", cell.getEcgi(),
- schedMeasReportPerUE.getCrnti());
+ log.warn("case 20: Could not find cell with PCI-ARFCN: {}", servCell.getPciArfcn());
}
- } else {
- log.warn("case 20: Could not find cell with PCI-ARFCN: {}", servCell.getPciArfcn());
- }
- });
+ });
+ }
break;
}
case 21: {
@@ -869,20 +937,23 @@
case 22: {
PDCPMeasReportPerUe pdcpMeasReportPerUe = recv_pdu.getBody().getPDCPMeasReportPerUe();
- RnibLink link = linkMap.get(pdcpMeasReportPerUe.getEcgi(), pdcpMeasReportPerUe.getCrnti());
- if (link != null) {
- link.setPdcpThroughput(new RnibLink.PDCPThroughput(
- pdcpMeasReportPerUe.getThroughputDl(),
- pdcpMeasReportPerUe.getThroughputUl()
- ));
+ RnibUe ue = ueMap.get(pdcpMeasReportPerUe.getEcgi(), pdcpMeasReportPerUe.getCrnti());
+ if (ue != null) {
+ Long ueId = ue.getId();
+ RnibLink link = linkMap.get(pdcpMeasReportPerUe.getEcgi(), ueId);
+ if (link != null) {
+ link.setPdcpThroughput(new RnibLink.PDCPThroughput(
+ pdcpMeasReportPerUe.getThroughputDl(),
+ pdcpMeasReportPerUe.getThroughputUl()
+ ));
- link.setPdcpPackDelay(new RnibLink.PDCPPacketDelay(
- pdcpMeasReportPerUe.getPktDelayDl(),
- pdcpMeasReportPerUe.getPktDelayUl()
- ));
- } else {
- log.warn("Could not find link between: {}-{}", pdcpMeasReportPerUe.getEcgi(),
- pdcpMeasReportPerUe.getCrnti());
+ link.setPdcpPackDelay(new RnibLink.PDCPPacketDelay(
+ pdcpMeasReportPerUe.getPktDelayDl(),
+ pdcpMeasReportPerUe.getPktDelayUl()
+ ));
+ } else {
+ log.warn("Could not find link between: {}-{}", pdcpMeasReportPerUe.getEcgi(), ueId);
+ }
}
break;
}
@@ -909,41 +980,44 @@
case 27: {
//Decode ScellAddStatus
ScellAddStatus scellAddStatus = recv_pdu.getBody().getScellAddStatus();
- try {
- scellAddQueue.get(scellAddStatus.getCrnti()).put("Scell's status: " + scellAddStatus.getStatus());
- if (scellAddStatus.getStatus().getBerEnum().get(0).value.intValue() == 0) {
+ RnibUe ue = ueMap.get(scellAddStatus.getEcgi(), scellAddStatus.getCrnti());
+ if (ue != null) {
+ Long ueId = ue.getId();
+ try {
+ scellAddMap.get(scellAddStatus.getCrnti()).put("Scell's status: " + scellAddStatus.getStatus());
+ if (scellAddStatus.getStatus().getBerEnum().get(0).value.intValue() == 0) {
- scellAddStatus.getScellsInd().getPCIARFCN().forEach(
- pciarfcn -> {
- RnibCell cell = cellMap.get(pciarfcn);
- RnibLink link = linkMap.get(cell.getEcgi(), scellAddStatus.getCrnti());
- link.setType(RnibLink.Type.SERVING_SECONDARY_CA);
- }
- );
- } else {
- log.error("Scell addition failed.");
+ scellAddStatus.getScellsInd().getPCIARFCN().forEach(
+ pciarfcn -> {
+ RnibCell cell = cellMap.get(pciarfcn);
+ RnibLink link = linkMap.get(cell.getEcgi(), ueId);
+ link.setType(RnibLink.Type.SERVING_SECONDARY_CA);
+ }
+ );
+ } else {
+ log.error("Scell addition failed.");
+ }
+ } catch (InterruptedException e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ e.printStackTrace();
+ } finally {
+ scellAddMap.remove(scellAddStatus.getCrnti());
}
- } catch (InterruptedException e) {
- log.error(ExceptionUtils.getFullStackTrace(e));
- e.printStackTrace();
- } finally {
- scellAddQueue.remove(scellAddStatus.getCrnti());
}
break;
}
// TODO: 28: ScellDelete
-
case 30: {
// Decode RRMConfig Status
RRMConfigStatus rrmConfigStatus = recv_pdu.getBody().getRRMConfigStatus();
try {
- RRMCellQueue.get(rrmConfigStatus.getEcgi())
+ RRMCellMap.get(rrmConfigStatus.getEcgi())
.put("RRM Config's status: " + rrmConfigStatus.getStatus());
} catch (InterruptedException e) {
log.error(ExceptionUtils.getFullStackTrace(e));
e.printStackTrace();
} finally {
- RRMCellQueue.remove(rrmConfigStatus.getEcgi());
+ RRMCellMap.remove(rrmConfigStatus.getEcgi());
}
break;
}
@@ -951,21 +1025,25 @@
case 34: {
TrafficSplitConfig trafficSplitConfig = recv_pdu.getBody().getTrafficSplitConfig();
- List<TrafficSplitPercentage> splitPercentages = trafficSplitConfig.getTrafficSplitPercent().getTrafficSplitPercentage();
+ RnibUe ue = ueMap.get(trafficSplitConfig.getEcgi(), trafficSplitConfig.getCrnti());
+ if (ue != null) {
+ Long ueId = ue.getId();
+ List<TrafficSplitPercentage> splitPercentages = trafficSplitConfig.getTrafficSplitPercent().getTrafficSplitPercentage();
- splitPercentages.forEach(trafficSplitPercentage -> {
- RnibCell cell = cellMap.get(trafficSplitPercentage.getEcgi());
- if (cell != null) {
- RnibLink link = linkMap.get(cell.getEcgi(), trafficSplitConfig.getCrnti());
- if (link != null) {
- link.setTrafficPercent(trafficSplitPercentage);
+ splitPercentages.forEach(trafficSplitPercentage -> {
+ RnibCell cell = cellMap.get(trafficSplitPercentage.getEcgi());
+ if (cell != null) {
+ RnibLink link = linkMap.get(cell.getEcgi(), ueId);
+ if (link != null) {
+ link.setTrafficPercent(trafficSplitPercentage);
+ } else {
+ log.warn("Could not find link between: {}-{}", cell.getEcgi(), ueId);
+ }
} else {
- log.warn("Could not find link between: {}-{}", cell.getEcgi(), trafficSplitConfig.getCrnti());
+ log.warn("Could not find cell with ECGI: {}", trafficSplitConfig.getEcgi());
}
- } else {
- log.warn("Could not find cell with ECGI: {}", trafficSplitConfig.getEcgi());
- }
- });
+ });
+ }
break;
}
default: {
@@ -975,6 +1053,29 @@
}
}
+
+ private void handleContextUpdate(UEContextUpdate contextUpdate, ChannelHandlerContext ctx, boolean handoff) {
+ RnibUe ue;
+ RnibCell cell = xranStore.getCell(contextUpdate.getEcgi());
+
+ if (handoff) {
+ try {
+ ue = ueMap.get(ueIdQueue.take());
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ ue = new RnibUe();
+ }
+ } else {
+ ue = new RnibUe();
+ }
+
+ ue.setMmeS1apId(contextUpdate.getMMEUES1APID());
+ ue.setEnbS1apId(contextUpdate.getENBUES1APID());
+ ue.setCrnti(contextUpdate.getCrnti());
+
+ hostAgent.addConnectedHost(ue, cell, ctx);
+ }
}
class InternalNetworkConfigListener implements NetworkConfigListener {
diff --git a/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java b/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
index c2e1bbc..73cb587 100644
--- a/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
+++ b/src/main/java/org.onosproject.xran/controller/XranPacketProcessor.java
@@ -23,5 +23,5 @@
import java.io.IOException;
public interface XranPacketProcessor {
- void handlePacket(XrancPdu pdu, ChannelHandlerContext ctx) throws IOException;
+ void handlePacket(XrancPdu pdu, ChannelHandlerContext ctx) throws IOException, InterruptedException;
}
diff --git a/src/main/java/org.onosproject.xran/entities/RnibCell.java b/src/main/java/org.onosproject.xran/entities/RnibCell.java
index 3179357..ac29eba 100644
--- a/src/main/java/org.onosproject.xran/entities/RnibCell.java
+++ b/src/main/java/org.onosproject.xran/entities/RnibCell.java
@@ -18,9 +18,7 @@
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.collect.Lists;
import org.onosproject.net.DeviceId;
-import org.onosproject.store.Timestamp;
import org.onosproject.store.service.WallClockTimestamp;
import org.onosproject.xran.codecs.api.ECGI;
import org.onosproject.xran.codecs.api.PRBUsage;
@@ -159,7 +157,7 @@
public void modifyRrmConfig(JsonNode rrmConfigNode, List<RnibUe> ueList) throws Exception {
RRMConfig.Crnti crnti = new RRMConfig.Crnti();
- ueList.forEach(ue -> crnti.addCRNTI(ue.getRanId()));
+ ueList.forEach(ue -> crnti.addCRNTI(ue.getCrnti()));
{
JsonNode p_a = rrmConfigNode.path("p_a");
diff --git a/src/main/java/org.onosproject.xran/entities/RnibLink.java b/src/main/java/org.onosproject.xran/entities/RnibLink.java
index 7d2b374..13a0d93 100644
--- a/src/main/java/org.onosproject.xran/entities/RnibLink.java
+++ b/src/main/java/org.onosproject.xran/entities/RnibLink.java
@@ -92,7 +92,7 @@
rrmParameters = new RRMConfig();
RRMConfig.Crnti crnti = new RRMConfig.Crnti();
- crnti.addCRNTI(linkId.getUe().getRanId());
+ crnti.addCRNTI(linkId.getUe().getCrnti());
rrmParameters.setCrnti(crnti);
rrmParameters.setEcgi(linkId.getEcgi());
}
diff --git a/src/main/java/org.onosproject.xran/entities/RnibUe.java b/src/main/java/org.onosproject.xran/entities/RnibUe.java
index fb5bb71..3afcb04 100644
--- a/src/main/java/org.onosproject.xran/entities/RnibUe.java
+++ b/src/main/java/org.onosproject.xran/entities/RnibUe.java
@@ -30,8 +30,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.net.URI;
-import java.net.URISyntaxException;
+import java.util.Objects;
import java.util.Timer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -42,6 +41,7 @@
* Created by dimitris on 7/22/17.
*/
@JsonPropertyOrder({
+ "ID",
"IMSI",
"ENBUES1APID",
"MMEUES1APID",
@@ -58,6 +58,8 @@
private static final Logger log =
LoggerFactory.getLogger(RnibUe.class);
+ @JsonProperty("ID")
+ private Long id;
@JsonProperty("IMSI")
private String imsi;
@JsonProperty("ENBUES1APID")
@@ -65,7 +67,7 @@
@JsonProperty("MMEUES1APID")
private MMEUES1APID mmeS1apId;
@JsonProperty("CRNTI")
- private CRNTI ranId;
+ private CRNTI crnti;
@JsonProperty("State")
private State state;
@JsonProperty("Capability")
@@ -80,23 +82,11 @@
timer = new Timer();
}
- public static URI uri(RnibUe ue) {
- MMEUES1APID mmeS1apId = ue.getMmeS1apId();
- if (mmeS1apId != null) {
- try {
- return new URI(SCHEME, mmeS1apId.toString(), null);
- } catch (URISyntaxException e) {
- return null;
- }
- }
- return null;
- }
-
- public static MMEUES1APID hostIdtoMME(HostId hostId) {
+ public static Long hostIdtoUEId(HostId hostId) {
String mac = hostId.mac().toString();
mac = mac.replace(":", "");
long l = Long.parseLong(mac, 16);
- return new MMEUES1APID(l);
+ return l;
}
@JsonIgnore
@@ -132,13 +122,13 @@
}
@JsonProperty("CRNTI")
- public CRNTI getRanId() {
- return ranId;
+ public CRNTI getCrnti() {
+ return crnti;
}
@JsonProperty("CRNTI")
- public void setRanId(CRNTI ranId) {
- this.ranId = ranId;
+ public void setCrnti(CRNTI crnti) {
+ this.crnti = crnti;
}
@JsonProperty("IMSI")
@@ -154,7 +144,7 @@
@JsonIgnore
public HostId getHostId() {
try {
- String text = this.mmeS1apId.value.toString(16),
+ String text = Long.toHexString(this.id),
res = "";
int charsLeft = 12 - text.length();
if (charsLeft > 0) {
@@ -220,17 +210,25 @@
this.state = state;
}
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
@Override
public String toString() {
return "RnibUe{" +
- "imsi='" + imsi + '\'' +
+ "id=" + id +
+ ", imsi='" + imsi + '\'' +
", enbS1apId=" + enbS1apId +
", mmeS1apId=" + mmeS1apId +
- ", ranId=" + ranId +
+ ", crnti=" + crnti +
", state=" + state +
", capability=" + capability +
", measConfig=" + measConfig +
- ", timer=" + timer +
'}';
}
@@ -238,17 +236,13 @@
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
-
RnibUe rnibUe = (RnibUe) o;
-
- return mmeS1apId.equals(rnibUe.mmeS1apId) && ranId.equals(rnibUe.ranId);
+ return Objects.equals(id, rnibUe.id);
}
@Override
public int hashCode() {
- int result = mmeS1apId.hashCode();
- result = 31 * result + ranId.hashCode();
- return result;
+ return Objects.hash(id);
}
public enum State {
diff --git a/src/main/java/org.onosproject.xran/identifiers/EcgiCrntiPair.java b/src/main/java/org.onosproject.xran/identifiers/EcgiCrntiPair.java
new file mode 100644
index 0000000..6347788
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/identifiers/EcgiCrntiPair.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2015-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.xran.identifiers;
+
+import com.google.common.base.Objects;
+import javafx.util.Pair;
+import org.onosproject.xran.codecs.api.CRNTI;
+import org.onosproject.xran.codecs.api.ECGI;
+
+public class EcgiCrntiPair extends Pair<ECGI, CRNTI> {
+
+ /**
+ * Creates a new pair
+ *
+ * @param key The key for this pair
+ * @param value The value to use for this pair
+ */
+ public EcgiCrntiPair(ECGI key, CRNTI value) {
+ super(key, value);
+ }
+
+ public static EcgiCrntiPair valueOf(ECGI key, CRNTI value) {
+ return new EcgiCrntiPair(key, value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(getKey(), getValue());
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof EcgiCrntiPair) {
+ return ((EcgiCrntiPair) o).getKey().equals(getKey()) &&
+ ((EcgiCrntiPair) o).getValue().equals(getValue());
+ }
+ return super.equals(o);
+ }
+}
diff --git a/src/main/java/org.onosproject.xran/identifiers/LinkId.java b/src/main/java/org.onosproject.xran/identifiers/LinkId.java
index 8b7dabb..e2b489a 100644
--- a/src/main/java/org.onosproject.xran/identifiers/LinkId.java
+++ b/src/main/java/org.onosproject.xran/identifiers/LinkId.java
@@ -21,13 +21,12 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.MMEUES1APID;
import org.onosproject.xran.entities.RnibCell;
import org.onosproject.xran.entities.RnibUe;
@JsonPropertyOrder({
"ECGI",
- "MMEUES1APID"
+ "UEID"
})
@JsonIgnoreProperties(ignoreUnknown = true)
public class LinkId {
@@ -45,12 +44,12 @@
return new LinkId(cell, ue);
}
- public static LinkId valueOf(ECGI ecgi, MMEUES1APID mmeues1APID) {
+ public static LinkId valueOf(ECGI ecgi, Long UeId) {
RnibCell cell = new RnibCell();
RnibUe ue = new RnibUe();
cell.setEcgi(ecgi);
- ue.setMmeS1apId(mmeues1APID);
+ ue.setId(UeId);
return new LinkId(cell, ue);
}
@@ -64,14 +63,14 @@
cell.setEcgi(sourceId);
}
- @JsonProperty("MMEUES1APID")
- public MMEUES1APID getMmeues1apid() {
- return ue.getMmeS1apId();
+ @JsonProperty("UEID")
+ public Long getUeId() {
+ return ue.getId();
}
- @JsonProperty("MMEUES1APID")
- public void setMmeues1apid(MMEUES1APID destinationId) {
- ue.setMmeS1apId(destinationId);
+ @JsonProperty("UEID")
+ public void setUeId(Long destinationId) {
+ ue.setId(destinationId);
}
@JsonIgnore
@@ -100,14 +99,14 @@
o != null &&
o instanceof LinkId &&
cell.getEcgi().equals(((LinkId) o).cell.getEcgi()) &&
- ue.getMmeS1apId().equals(((LinkId) o).ue.getMmeS1apId());
+ ue.getId().equals(((LinkId) o).ue.getId());
}
@Override
public int hashCode() {
int result = cell.getEcgi().hashCode();
- result = 31 * result + ue.getMmeS1apId().hashCode();
+ result = 31 * result + ue.getId().hashCode();
return result;
}
diff --git a/src/main/java/org.onosproject.xran/identifiers/contextUpdateHandler.java b/src/main/java/org.onosproject.xran/identifiers/contextUpdateHandler.java
new file mode 100644
index 0000000..82fdaed
--- /dev/null
+++ b/src/main/java/org.onosproject.xran/identifiers/contextUpdateHandler.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015-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.xran.identifiers;
+
+import org.onosproject.xran.codecs.pdu.HOComplete;
+import org.onosproject.xran.codecs.pdu.UEAdmissionStatus;
+import org.onosproject.xran.codecs.pdu.UEContextUpdate;
+
+public class contextUpdateHandler {
+ private UEContextUpdate contextUpdate;
+ private UEAdmissionStatus admissionStatus;
+ private HOComplete hoComplete;
+
+ public UEContextUpdate getContextUpdate() {
+ return contextUpdate;
+ }
+
+ public boolean setContextUpdate(UEContextUpdate contextUpdate) {
+ this.contextUpdate = contextUpdate;
+
+ return admissionStatus != null || hoComplete != null;
+
+ }
+
+ public UEAdmissionStatus getAdmissionStatus() {
+ return admissionStatus;
+ }
+
+ public boolean setAdmissionStatus(UEAdmissionStatus admissionStatus) {
+ this.admissionStatus = admissionStatus;
+
+ return contextUpdate != null;
+ }
+
+ public HOComplete getHoComplete() {
+ return hoComplete;
+ }
+
+ public boolean setHoComplete(HOComplete hoComplete) {
+ this.hoComplete = hoComplete;
+
+ return contextUpdate != null;
+ }
+
+ @Override
+ public String toString() {
+ return "contextUpdateHandler{" +
+ "contextUpdate=" + (contextUpdate != null) +
+ ", admissionStatus=" + (admissionStatus != null) +
+ ", hoComplete=" + (hoComplete != null) +
+ '}';
+ }
+}
diff --git a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java b/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
index 9dab964..19e50ab 100644
--- a/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
+++ b/src/main/java/org.onosproject.xran/impl/DefaultXranStore.java
@@ -22,11 +22,11 @@
import org.apache.felix.scr.annotations.*;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
+import org.onosproject.core.IdGenerator;
import org.onosproject.store.AbstractStore;
import org.onosproject.xran.XranStore;
import org.onosproject.xran.codecs.api.ECGI;
import org.onosproject.xran.codecs.api.EUTRANCellIdentifier;
-import org.onosproject.xran.codecs.api.MMEUES1APID;
import org.onosproject.xran.controller.XranController;
import org.onosproject.xran.entities.RnibCell;
import org.onosproject.xran.entities.RnibLink;
@@ -57,18 +57,23 @@
protected CoreService coreService;
private ConcurrentMap<LinkId, RnibLink> linkMap = new ConcurrentHashMap<>();
private ConcurrentMap<ECGI, RnibCell> cellMap = new ConcurrentHashMap<>();
- private ConcurrentMap<MMEUES1APID, RnibUe> ueMap = new ConcurrentHashMap<>();
+ private ConcurrentMap<Long, RnibUe> ueMap = new ConcurrentHashMap<>();
private ConcurrentMap<Object, RnibSlice> sliceMap = new ConcurrentHashMap<>();
private XranController controller;
+ private IdGenerator ueIdGenerator;
+
@Activate
public void activate() {
ApplicationId appId = coreService.getAppId(XRAN_APP_ID);
+
+ ueIdGenerator = coreService.getIdGenerator("xran-ue-id");
+
log.info("XRAN Default Store Started");
}
@Deactivate
- public void deactive() {
+ public void deactivate() {
log.info("XRAN Default Store Stopped");
}
@@ -110,12 +115,11 @@
@Override
public List<RnibLink> getLinksByUeId(long euId) {
List<RnibLink> list = Lists.newArrayList();
- MMEUES1APID mme = new MMEUES1APID(euId);
list.addAll(
linkMap.keySet()
.stream()
- .filter(k -> k.getMmeues1apid().equals(mme))
+ .filter(k -> k.getUeId().equals(euId))
.map(v -> linkMap.get(v))
.collect(Collectors.toList()));
@@ -126,12 +130,11 @@
@Override
public RnibLink getLinkBetweenCellIdUeId(String eciHex, long euId) {
EUTRANCellIdentifier eci = hexToECI(eciHex);
- MMEUES1APID mme = new MMEUES1APID(euId);
Optional<LinkId> first = linkMap.keySet()
.stream()
.filter(linkId -> linkId.getEcgi().getEUTRANcellIdentifier().equals(eci))
- .filter(linkId -> linkId.getMmeues1apid().equals(mme))
+ .filter(linkId -> linkId.getUeId().equals(euId))
.findFirst();
return first.map(linkId -> linkMap.get(linkId)).orElse(null);
@@ -144,7 +147,7 @@
// if we add a primary link then change the primary to non serving
if (link.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
RnibUe ue = link.getLinkId().getUe();
- getLinksByUeId(ue.getMmeS1apId().longValue())
+ getLinksByUeId(ue.getId())
.forEach(l -> {
if (l.getType().equals(RnibLink.Type.SERVING_PRIMARY)) {
l.setType(RnibLink.Type.NON_SERVING);
@@ -162,9 +165,9 @@
}
@Override
- public RnibLink getLink(ECGI ecgi, MMEUES1APID mme) {
+ public RnibLink getLink(ECGI ecgi, Long ueId) {
- LinkId linkId = LinkId.valueOf(ecgi, mme);
+ LinkId linkId = LinkId.valueOf(ecgi, ueId);
return linkMap.get(linkId);
}
@@ -267,25 +270,19 @@
@Override
public void storeUe(RnibUe ue) {
- if (ue.getMmeS1apId() != null) {
- ueMap.putIfAbsent(ue.getMmeS1apId(), ue);
- }
+ long newId = ueIdGenerator.getNewId();
+ ue.setId(newId);
+ ueMap.put(newId, ue);
}
@Override
- public boolean removeUe(MMEUES1APID mme) {
- return ueMap.remove(mme) != null;
+ public boolean removeUe(long ueId) {
+ return ueMap.remove(ueId) != null;
}
@Override
- public RnibUe getUe(long euId) {
- MMEUES1APID mme = new MMEUES1APID(euId);
- return ueMap.get(mme);
- }
-
- @Override
- public RnibUe getUe(MMEUES1APID mme) {
- return ueMap.get(mme);
+ public RnibUe getUe(long ueId) {
+ return ueMap.get(ueId);
}
private EUTRANCellIdentifier hexToECI(String eciHex) {
diff --git a/src/main/java/org.onosproject.xran/providers/UeProvider.java b/src/main/java/org.onosproject.xran/providers/UeProvider.java
index 2205c60..435c78a 100644
--- a/src/main/java/org.onosproject.xran/providers/UeProvider.java
+++ b/src/main/java/org.onosproject.xran/providers/UeProvider.java
@@ -97,7 +97,7 @@
ecgiSet.forEach(ecgi -> hostLocations.add(new HostLocation(deviceId(uri(ecgi)), PortNumber.portNumber(0), 0)));
SparseAnnotations annotations = DefaultAnnotations.builder()
- .set(AnnotationKeys.NAME, "UE " + ue.getMmeS1apId())
+ .set(AnnotationKeys.NAME, "UE " + ue.getId())
.build();
DefaultHostDescription desc = new DefaultHostDescription(
diff --git a/src/main/java/org.onosproject.xran/rest/CellWebResource.java b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
index 566e8b9..86438d5 100644
--- a/src/main/java/org.onosproject.xran/rest/CellWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/CellWebResource.java
@@ -120,7 +120,7 @@
queue[0] = get(XranController.class).sendModifiedRRMConf(cell.getRrmConfig(),
cell.getVersion() <= 3);
- String poll = queue[0].poll(get(XranControllerImpl.class).northbound_timeout, TimeUnit.MILLISECONDS);
+ String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
if (poll != null) {
return ResponseHelper.getResponse(
diff --git a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
index 0213beb..20780b3 100644
--- a/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
+++ b/src/main/java/org.onosproject.xran/rest/LinkWebResource.java
@@ -215,7 +215,7 @@
);
}
- if (get(XranStore.class).getLink(cell.getEcgi(), ue.getMmeS1apId()) != null) {
+ if (get(XranStore.class).getLink(cell.getEcgi(), ue.getId()) != null) {
return ResponseHelper.getResponse(
mapper(),
ResponseHelper.statusCode.BAD_REQUEST,
@@ -284,14 +284,14 @@
case SERVING_SECONDARY_CA:
case SERVING_SECONDARY_DC:
case NON_SERVING: {
- List<RnibLink> linksByUeId = get(XranStore.class).getLinksByUeId(link.getLinkId().getMmeues1apid().longValue());
+ List<RnibLink> linksByUeId = get(XranStore.class).getLinksByUeId(link.getLinkId().getUeId());
Optional<RnibLink> primary = linksByUeId.stream()
.filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
.findFirst();
if (primary.isPresent()) {
queue[0] = get(XranController.class).sendHORequest(link, primary.get());
- String poll = queue[0].poll(get(XranControllerImpl.class).northbound_timeout, TimeUnit.MILLISECONDS);
+ String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
if (poll != null) {
return ResponseHelper.getResponse(
@@ -365,7 +365,7 @@
case SERVING_SECONDARY_DC:
case NON_SERVING:
queue[0] = get(XranController.class).sendScellAdd(link);
- String poll = queue[0].poll(get(XranControllerImpl.class).northbound_timeout, TimeUnit.MILLISECONDS);
+ String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
if (poll != null) {
return ResponseHelper.getResponse(
mapper(),
@@ -434,7 +434,7 @@
"xICIC was sent successfully"
);
} else {
- String poll = queue[0].poll(get(XranControllerImpl.class).northbound_timeout, TimeUnit.MILLISECONDS);
+ String poll = queue[0].poll(get(XranController.class).getNorthbound_timeout(), TimeUnit.MILLISECONDS);
if (poll != null) {
return ResponseHelper.getResponse(
diff --git a/src/main/java/org.onosproject.xran/rest/ResponseHelper.java b/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
index 826adc1..5e2f1dd 100644
--- a/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
+++ b/src/main/java/org.onosproject.xran/rest/ResponseHelper.java
@@ -29,7 +29,16 @@
ObjectNode rootNode = mapper.createObjectNode();
switch (status) {
- case OK:
+ case OK: {
+ ArrayNode data = rootNode.putArray("data");
+ ObjectNode addObject = data.addObject();
+ addObject.put("status", status.status);
+ addObject.put("title", title);
+ addObject.put("detail", detail);
+ return Response.status(status.status)
+ .entity(rootNode.toString())
+ .build();
+ }
case BAD_REQUEST:
case NOT_IMPLEMENTED:
case REQUEST_TIMEOUT:
diff --git a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
index 5e62271..ed7b4f1 100644
--- a/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
+++ b/src/main/java/org.onosproject.xran/wrapper/LinkMap.java
@@ -19,7 +19,6 @@
import org.onosproject.xran.XranStore;
import org.onosproject.xran.codecs.api.CRNTI;
import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.MMEUES1APID;
import org.onosproject.xran.entities.RnibCell;
import org.onosproject.xran.entities.RnibLink;
import org.onosproject.xran.entities.RnibUe;
@@ -63,7 +62,20 @@
return link;
}
- public RnibLink get(ECGI src, MMEUES1APID dst) {
+ public RnibLink putNonServingLink(RnibCell cell, Long ueId) {
+ RnibLink link = null;
+ RnibUe ue = ueMap.get(ueId);
+
+ if (ue != null) {
+ link = new RnibLink(cell, ue);
+ xranStore.storeLink(link);
+ } else {
+ log.error("Could not find mapping for CRNTI to UE. Aborting creation of non-serving link");
+ }
+ return link;
+ }
+
+ public RnibLink get(ECGI src, Long dst) {
if (src != null && dst != null) {
return xranStore.getLink(src, dst);
}
@@ -74,17 +86,17 @@
RnibUe ue = ueMap.get(src, dst);
if (ue != null) {
- return xranStore.getLink(src, ue.getMmeS1apId());
+ return xranStore.getLink(src, ue.getId());
}
return null;
}
- public CRNTI getCrnti(MMEUES1APID mme) {
- return ueMap.getCrntUe().inverse().get(mme).getValue();
+ public CRNTI getCrnti(Long ueId) {
+ return ueMap.getCrntUe().inverse().get(ueId).getValue();
}
public RnibCell getPrimaryCell(RnibUe ue) {
- List<RnibLink> linksByUeId = xranStore.getLinksByUeId(ue.getMmeS1apId().longValue());
+ List<RnibLink> linksByUeId = xranStore.getLinksByUeId(ue.getId());
Optional<RnibLink> primary = linksByUeId.stream()
.filter(l -> l.getType().equals(RnibLink.Type.SERVING_PRIMARY))
.findFirst();
diff --git a/src/main/java/org.onosproject.xran/wrapper/UeMap.java b/src/main/java/org.onosproject.xran/wrapper/UeMap.java
index 1938a79..8b2110d 100644
--- a/src/main/java/org.onosproject.xran/wrapper/UeMap.java
+++ b/src/main/java/org.onosproject.xran/wrapper/UeMap.java
@@ -16,25 +16,18 @@
package org.onosproject.xran.wrapper;
-import com.google.common.base.Objects;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
-import io.netty.channel.ChannelHandlerContext;
-import javafx.util.Pair;
-import org.onosproject.net.HostId;
import org.onosproject.xran.XranStore;
import org.onosproject.xran.codecs.api.CRNTI;
import org.onosproject.xran.codecs.api.ECGI;
-import org.onosproject.xran.codecs.api.ENBUES1APID;
import org.onosproject.xran.codecs.api.MMEUES1APID;
import org.onosproject.xran.entities.RnibCell;
import org.onosproject.xran.entities.RnibUe;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
+import org.onosproject.xran.identifiers.EcgiCrntiPair;
public class UeMap {
- private BiMap<EcgiCrntiPair, MMEUES1APID> crntUe = HashBiMap.create();
+ private BiMap<EcgiCrntiPair, Long> crntUe = HashBiMap.create();
private XranStore xranStore;
@@ -42,75 +35,44 @@
this.xranStore = xranStore;
}
- public BiMap<EcgiCrntiPair, MMEUES1APID> getCrntUe() {
+ public BiMap<EcgiCrntiPair, Long> getCrntUe() {
return crntUe;
}
public void putCrnti(RnibCell cell, RnibUe ue) {
- CRNTI ranId = ue.getRanId();
+ CRNTI ranId = ue.getCrnti();
ECGI ecgi = cell.getEcgi();
if (ranId != null && ecgi != null) {
- crntUe.put(EcgiCrntiPair.valueOf(cell.getEcgi(),ue.getRanId()), ue.getMmeS1apId());
+ EcgiCrntiPair oldPair = crntUe.inverse().get(ue.getId()),
+ newPair = EcgiCrntiPair.valueOf(cell.getEcgi(), ue.getCrnti());
+ if (oldPair == null) {
+ crntUe.put(newPair, ue.getId());
+ } else {
+ crntUe.inverse().remove(ue.getId());
+ crntUe.put(newPair, ue.getId());
+ }
}
}
public void put(RnibCell cell, RnibUe ue) {
-
- MMEUES1APID mmeS1apId = ue.getMmeS1apId();
- if (mmeS1apId != null) {
- xranStore.storeUe(ue);
- putCrnti(cell, ue);
- }
+ xranStore.storeUe(ue);
+ putCrnti(cell, ue);
}
public RnibUe get(ECGI ecgi, CRNTI crnti) {
- MMEUES1APID mme = crntUe.get(EcgiCrntiPair.valueOf(ecgi, crnti));
- if (mme != null) {
- return xranStore.getUe(mme);
+ Long aLong = crntUe.get(EcgiCrntiPair.valueOf(ecgi, crnti));
+ if (aLong != null) {
+ return xranStore.getUe(aLong);
}
return null;
}
- public RnibUe get(MMEUES1APID mme) {
- if (mme != null) {
- return xranStore.getUe(mme);
- }
- return null;
+ public RnibUe get(Long ueId) {
+ return xranStore.getUe(ueId);
}
- public boolean remove(MMEUES1APID id) {
- crntUe.inverse().remove(id);
- return xranStore.removeUe(id);
- }
-
- public static class EcgiCrntiPair extends Pair<ECGI, CRNTI> {
-
- /**
- * Creates a new pair
- *
- * @param key The key for this pair
- * @param value The value to use for this pair
- */
- public EcgiCrntiPair(ECGI key, CRNTI value) {
- super(key, value);
- }
-
- public static EcgiCrntiPair valueOf(ECGI key, CRNTI value) {
- return new EcgiCrntiPair(key, value);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(getKey(), getValue());
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof EcgiCrntiPair) {
- return ((EcgiCrntiPair) o).getKey().equals(getKey()) &&
- ((EcgiCrntiPair) o).getValue().equals(getValue());
- }
- return super.equals(o);
- }
+ public boolean remove(Long ueId) {
+ crntUe.inverse().remove(ueId);
+ return xranStore.removeUe(ueId);
}
}
diff --git a/xran-cfg.json b/xran-cfg.json
index b1787a7..03fa720 100644
--- a/xran-cfg.json
+++ b/xran-cfg.json
@@ -6,12 +6,12 @@
{
"plmn_id": "000001",
"eci": "00000010",
- "ip_addr": "1.1.1.1"
+ "ip_addr": "10.10.10.1"
},
{
"plmn_id": "000002",
"eci": "00000020",
- "ip_addr": "1.1.1.2"
+ "ip_addr": "172.16.27.100"
},
{
"plmn_id": "000003",
@@ -19,7 +19,7 @@
"ip_addr": "1.1.1.3"
}
],
- "l2_meas_report_interval_ms": 30000,
+ "l2_meas_report_interval_ms": 5000,
"rx_signal_meas_report_interval_ms": 7000,
"xranc_cellconfigrequest_interval_seconds": 10,
"xranc_port": 7891,