implemented PATCH, HO, SCELLADD, XICIC
diff --git a/src/main/java/org.onosproject.xran/controller/XranController.java b/src/main/java/org.onosproject.xran/controller/XranController.java
index 42ca41e..02f8378 100644
--- a/src/main/java/org.onosproject.xran/controller/XranController.java
+++ b/src/main/java/org.onosproject.xran/controller/XranController.java
@@ -39,4 +39,8 @@
void removeListener(XranHostListener listener);
SynchronousQueue<String> sendModifiedRRMConf(RRMConfig rrmConfig, boolean xICIC);
+
+ SynchronousQueue<String> sendScellAdd(RnibLink link);
+
+ boolean sendScellDelete(RnibLink link);
}
diff --git a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
index a5e073a..1d9653d 100644
--- a/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
+++ b/src/main/java/org.onosproject.xran/controller/XranControllerImpl.java
@@ -107,8 +107,10 @@
private LinkMap linkMap;
/* MAPS */
private ConcurrentMap<String, ECGI> legitCells = new ConcurrentHashMap<>();
- private ConcurrentMap<CRNTI, SynchronousQueue<String>> hoQueue = new ConcurrentHashMap<CRNTI, SynchronousQueue<String>>();
- private ConcurrentMap<ECGI, SynchronousQueue<String>> RRMCellQueue = new ConcurrentHashMap<ECGI, SynchronousQueue<String>>();
+ private ConcurrentMap<CRNTI, SynchronousQueue<String>> hoQueue = new ConcurrentHashMap<>();
+ private ConcurrentMap<ECGI, SynchronousQueue<String>> RRMCellQueue = new ConcurrentHashMap<>();
+ private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellAddQueue = new ConcurrentHashMap<>();
+ private ConcurrentMap<CRNTI, SynchronousQueue<String>> scellDeleteQueue = new ConcurrentHashMap<>();
/* AGENTS */
private InternalXranDeviceAgent deviceAgent = new InternalXranDeviceAgent();
private InternalXranHostAgent hostAgent = new InternalXranHostAgent();
@@ -215,6 +217,70 @@
return queue;
}
+ @Override
+ public SynchronousQueue<String> sendScellAdd(RnibLink link) {
+ RnibCell secondaryCell = link.getLinkId().getCell(),
+ primaryCell = linkMap.getPrimaryCell(link.getLinkId().getUe());
+ ECGI primaryEcgi = primaryCell.getEcgi();
+ ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
+
+ CRNTI crnti = linkMap.getCrnti(link.getLinkId().getMmeues1apid());
+
+ CellConfigReport cellReport = secondaryCell.getConf();
+
+ if (cellReport != null) {
+ PCIARFCN pciarfcn = new PCIARFCN();
+ pciarfcn.setPci(cellReport.getPci());
+ pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
+
+ PropScell propScell = new PropScell();
+ propScell.setPciArfcn(pciarfcn);
+
+ XrancPdu pdu = ScellAdd.constructPacket(primaryEcgi, crnti, propScell);
+ try {
+ ctx.writeAndFlush(getSctpMessage(pdu));
+ SynchronousQueue<String> queue = new SynchronousQueue<>();
+ scellAddQueue.put(crnti, queue);
+
+ return queue;
+ } catch (IOException e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean sendScellDelete(RnibLink link) {
+ RnibCell secondaryCell = link.getLinkId().getCell(),
+ primaryCell = linkMap.getPrimaryCell(link.getLinkId().getUe());
+ ECGI primaryEcgi = primaryCell.getEcgi();
+ ChannelHandlerContext ctx = cellMap.getCtx(primaryEcgi);
+
+ CRNTI crnti = linkMap.getCrnti(link.getLinkId().getMmeues1apid());
+
+ CellConfigReport cellReport = secondaryCell.getConf();
+
+ if (cellReport != null) {
+ PCIARFCN pciarfcn = new PCIARFCN();
+ pciarfcn.setPci(cellReport.getPci());
+ pciarfcn.setEarfcnDl(cellReport.getEarfcnDl());
+
+ XrancPdu pdu = ScellDelete.constructPacket(primaryEcgi, crnti, pciarfcn);
+
+ try {
+ ctx.writeAndFlush(getSctpMessage(pdu));
+ link.setType(RnibLink.Type.NON_SERVING);
+ return true;
+ } catch (IOException e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+
private void restartTimer(RnibUe ue) {
Timer timer = new Timer();
ue.setTimer(timer);
@@ -319,7 +385,7 @@
case HOST_MOVED: {
RnibUe ue = ueMap.get(hostIdtoMME(event.subject().id()));
if (ue != null) {
- ECGI ecgi_primary = linkMap.getPrimaryCell(ue);
+ ECGI ecgi_primary = linkMap.getPrimaryCell(ue).getEcgi();
RnibCell primary = cellMap.get(ecgi_primary);
ue.setMeasConfig(null);
if (primary != null) {
@@ -797,7 +863,32 @@
ctx.writeAndFlush(getSctpMessage(xrancPdu));
break;
}
- // TODO: Case 26: ScellAdd 27: ScellAddStatus 28: ScellDelete
+ 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) {
+
+ 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.");
+ }
+ } catch (InterruptedException e) {
+ log.error(ExceptionUtils.getFullStackTrace(e));
+ e.printStackTrace();
+ } finally {
+ scellAddQueue.remove(scellAddStatus.getCrnti());
+ }
+ break;
+ }
+ // TODO: 28: ScellDelete
case 30: {
// Decode RRMConfig Status