$ $E2SIM_DIR/build/e2sim [SERVER IP] [PORT]
By default, SERVER IP = 127.0.0.1, PORT = 36421
+ The RIC (i.e., E2 Manager) will need to setup X2 or E2 connection to e2sim on
+ this SERVER IP and PORT
# DOCKER
- Note: The commands in this section must be run from $E2SIM_DIR
-
- * Build docker image
+ * Build docker image: run this command from $E2SIM_DIR
$ sudo docker build -f docker/Dockerfile -t [DOCKER_IMAGE]:[TAG] .
* Example how to run docker container
$ sudo docker run --rm --net host -it [DOCKER_IMAGE]:[TAG] sh -c "./build/e2sim [SERVER IP] [PORT]"
+ ex: sudo docker run --rm --net host -it e2sim:1.0.0 sh -c "./build/e2sim 127.0.0.1 36422"
# SUPPORTED MESSAGE FLOWS
+- RESOURCE STATUS REQUEST (RIC -> RAN) version 1.4.0 November 16, 2019
+- RESOURCE STATUS RESPONSE (RAN -> RIC)
+- RESOURCE STATUS UPDATE (RAN -> RIC)
-- RIC INDICATION (RAN -> RIC) version 1.3.0 September 13, 2019
+- RIC INDICATION (RAN -> RIC) version 1.3.0 September 13, 2019
SgNBAdditionRequest
-- RIC SUBSCRIPTION REQUEST (RIC -> RAN) version 1.2.0 May 24, 2019
+- RIC SUBSCRIPTION REQUEST (RIC -> RAN) version 1.2.0 May 24, 2019
- RIC SUBSCRIPTION RESPONSE (RAN -> RIC)
- RIC SUBSCRIPTION FAILURE (RAN -> RIC)
./tools/install_asn1c
2. Generate asn1c codes using e2ap, e2sm and x2ap specs
- Download the following files into tools/asn_defs
+ This requires the following files in tools/asn_defs
- e2ap-v031.asn
- e2sm-gNB-X2-release-1-v041.asn
- x2ap-no-desc-15-04.asn
# Change logs:
- 03/12/2019: currently supports sending and receiving X2 SETUP messages
+ 11/16/2019: - Switch back to using asn1c compiler
+ - add support to Resource Status Request, Response, and Update (over X2)
+ 05/24/2019: add support for RIC SUBSCRIPTION REQUEST, RESPONSE, and FAILURE
05/21/2019: add support for ENDC X2 SETUP
no longer use asn1c
all X2AP and E2AP messages are encapsulated into E2AP-PDU
- 05/24/2019: add support for RIC SUBSCRIPTION REQUEST, RESPONSE, and FAILURE
+ 03/12/2019: currently supports sending and receiving X2 SETUP messages
set -e
-E2SIM_VERSION='1.3.0'
+E2SIM_VERSION='1.4.0'
export E2SIM_DIR=$PWD
source $E2SIM_DIR/tools/build_helper.bash
DOCKER_IMAGE='e2sim'
net-tools \
nano \
vim \
+ tcpdump \
+ net-tools \
+ nmap \
&& apt-get clean
# Copy E2Sim sources into the container
#include <string>
#include <iostream>
+
#include "e2sim_defs.h"
#include "e2sim_sctp.hpp"
#include "e2ap_message_handler.hpp"
options_t ops = read_input_options(argc, argv);
+ //E2 Agent will automatically restart upon sctp disconnection
int server_fd = sctp_start_server(ops.server_ip, ops.server_port);
int client_fd = sctp_accept_connection(ops.server_ip, server_fd);
sctp_buffer_t data;
data.len = e2ap_asn1c_encode_pdu(pdu, &buf);
- memcpy(data.buffer, buf, data.len);
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));
sctp_send_data(client_fd, data);
}
#include "e2sim_defs.h"
#include <getopt.h>
+#include <sys/time.h>
+#include <time.h>
+
+char* time_stamp(void)
+{
+ timeval curTime;
+ gettimeofday(&curTime, NULL);
+ int milli = curTime.tv_usec / 1000;
+
+ char buffer [80];
+ strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", localtime(&curTime.tv_sec));
+
+ const int time_buffer_len = 84;
+ static char currentTime[time_buffer_len] = "";
+ snprintf(currentTime, time_buffer_len, "%s:%03d", buffer, milli);
+
+ return currentTime;
+}
options_t read_input_options_old(int argc, char* argv[])
{
#define X2AP_PPID (452984832) //27 = 1b, PPID = 1b000000(hex) -> 452984832(dec)
#define X2AP_SCTP_PORT 36421
#define RIC_SCTP_SRC_PORT 36422
-#define MAX_SCTP_BUFFER 1024
+#define MAX_SCTP_BUFFER 10000
#define WORKDIR_ENV "E2SIM_DIR" //environment variable
+char* time_stamp(void);
+
+// #define LOG_I(...) {printf("[%s]", time_stamp()); printf(__VA_ARGS__); printf("\n");}
+// #define LOG_E(...) {printf("[%s]", time_stamp()); printf(__VA_ARGS__); printf("\n");}
+// #define LOG_D(...) {printf("[%s]", time_stamp()); printf(__VA_ARGS__); printf("\n");}
+
#define LOG_I(...) {printf(__VA_ARGS__); printf("\n");}
#define LOG_E(...) {printf(__VA_ARGS__); printf("\n");}
#define LOG_D(...) {printf(__VA_ARGS__); printf("\n");}
options_t read_input_options(int argc, char *argv[]);
+#define min(a, b) ((a) < (b)) ? (a) : (b)
+
#endif
--- /dev/null
+<E2AP-PDU>
+ <unsuccessfulOutcome>
+ <procedureCode>9</procedureCode>
+ <criticality><reject/></criticality>
+ <value>
+ <ResourceStatusFailure>
+ <protocolIEs>
+ <ResourceStatusFailure-IEs>
+ <id>39</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>1</Measurement-ID>
+ </value>
+ </ResourceStatusFailure-IEs>
+ <ResourceStatusFailure-IEs>
+ <id>40</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>74</Measurement-ID>
+ </value>
+ </ResourceStatusFailure-IEs>
+ <ResourceStatusFailure-IEs>
+ <id>5</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <Cause>
+ <radioNetwork><unspecified/></radioNetwork>
+ </Cause>
+ </value>
+ </ResourceStatusFailure-IEs>
+ </protocolIEs>
+ </ResourceStatusFailure>
+ </value>
+ </unsuccessfulOutcome>
+</E2AP-PDU>
--- /dev/null
+<E2AP-PDU>
+ <initiatingMessage>
+ <procedureCode>9</procedureCode>
+ <criticality><reject/></criticality>
+ <value>
+ <ResourceStatusRequest>
+ <protocolIEs>
+ <ResourceStatusRequest-IEs>
+ <id>39</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>1</Measurement-ID>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>28</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Registration-Request><start/></Registration-Request>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>38</id>
+ <criticality><reject/></criticality>
+ <value>
+ <ReportCharacteristics>
+ 11111110000000000000000000000000
+ </ReportCharacteristics>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>29</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <CellToReport-List>
+ <ProtocolIE-Single-Container>
+ <id>31</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <CellToReport-Item>
+ <cell-ID>
+ <pLMN-Identity>13 30 23</pLMN-Identity>
+ <eUTRANcellIdentifier>
+ 0000001010110000001100001010
+ </eUTRANcellIdentifier>
+ </cell-ID>
+ </CellToReport-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ </CellToReport-List>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>30</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <ReportingPeriodicity><one-thousand-ms/></ReportingPeriodicity>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>64</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <PartialSuccessIndicator><partial-success-allowed/></PartialSuccessIndicator>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>109</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <ReportingPeriodicityRSRPMR><four-hundred-80-ms/></ReportingPeriodicityRSRPMR>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>145</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <ReportingPeriodicityCSIR><ms20/></ReportingPeriodicityCSIR>
+ </value>
+ </ResourceStatusRequest-IEs>
+ </protocolIEs>
+ </ResourceStatusRequest>
+ </value>
+ </initiatingMessage>
+</E2AP-PDU>
--- /dev/null
+<E2AP-PDU>
+ <initiatingMessage>
+ <procedureCode>9</procedureCode>
+ <criticality><reject/></criticality>
+ <value>
+ <ResourceStatusRequest>
+ <protocolIEs>
+ <ResourceStatusRequest-IEs>
+ <id>39</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>1</Measurement-ID>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>28</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Registration-Request><start/></Registration-Request>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>38</id>
+ <criticality><reject/></criticality>
+ <value>
+ <ReportCharacteristics>
+ 00000000000000000000000000000000
+ </ReportCharacteristics>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>29</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <CellToReport-List>
+ <ProtocolIE-Single-Container>
+ <id>31</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <CellToReport-Item>
+ <cell-ID>
+ <pLMN-Identity>02 07 9f</pLMN-Identity>
+ <eUTRANcellIdentifier>
+ 0010101100000000001100001010
+ </eUTRANcellIdentifier>
+ </cell-ID>
+ </CellToReport-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ </CellToReport-List>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>30</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <ReportingPeriodicity><one-thousand-ms/></ReportingPeriodicity>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>64</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <PartialSuccessIndicator><partial-success-allowed/></PartialSuccessIndicator>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>109</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <ReportingPeriodicityRSRPMR><four-hundred-80-ms/></ReportingPeriodicityRSRPMR>
+ </value>
+ </ResourceStatusRequest-IEs>
+ <ResourceStatusRequest-IEs>
+ <id>145</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <ReportingPeriodicityCSIR><ms20/></ReportingPeriodicityCSIR>
+ </value>
+ </ResourceStatusRequest-IEs>
+ </protocolIEs>
+ </ResourceStatusRequest>
+ </value>
+ </initiatingMessage>
+</E2AP-PDU>
--- /dev/null
+<E2AP-PDU>
+ <successfulOutcome>
+ <procedureCode>9</procedureCode>
+ <criticality><reject/></criticality>
+ <value>
+ <ResourceStatusResponse>
+ <protocolIEs>
+ <ResourceStatusResponse-IEs>
+ <id>39</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>1</Measurement-ID>
+ </value>
+ </ResourceStatusResponse-IEs>
+ <ResourceStatusResponse-IEs>
+ <id>40</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>75</Measurement-ID>
+ </value>
+ </ResourceStatusResponse-IEs>
+ <ResourceStatusResponse-IEs>
+ <id>65</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementInitiationResult-List>
+ <ProtocolIE-Single-Container>
+ <id>66</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementInitiationResult-Item>
+ <cell-ID>
+ <pLMN-Identity>13 30 23</pLMN-Identity>
+ <eUTRANcellIdentifier>
+ 0000001010110000001100001010
+ </eUTRANcellIdentifier>
+ </cell-ID>
+ <measurementFailureCause-List>
+ <ProtocolIE-Single-Container>
+ <id>67</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementFailureCause-Item>
+ <measurementFailedReportCharacteristics>
+ 00000010000000000000000000000000
+ </measurementFailedReportCharacteristics>
+ <cause>
+ <radioNetwork><measurement-temporarily-not-available/></radioNetwork>
+ </cause>
+ </MeasurementFailureCause-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ <ProtocolIE-Single-Container>
+ <id>67</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementFailureCause-Item>
+ <measurementFailedReportCharacteristics>
+ 00000100000000000000000000000000
+ </measurementFailedReportCharacteristics>
+ <cause>
+ <radioNetwork><measurement-temporarily-not-available/></radioNetwork>
+ </cause>
+ </MeasurementFailureCause-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ <ProtocolIE-Single-Container>
+ <id>67</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementFailureCause-Item>
+ <measurementFailedReportCharacteristics>
+ 00001000000000000000000000000000
+ </measurementFailedReportCharacteristics>
+ <cause>
+ <radioNetwork><measurement-temporarily-not-available/></radioNetwork>
+ </cause>
+ </MeasurementFailureCause-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ <ProtocolIE-Single-Container>
+ <id>67</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementFailureCause-Item>
+ <measurementFailedReportCharacteristics>
+ 00100000000000000000000000000000
+ </measurementFailedReportCharacteristics>
+ <cause>
+ <radioNetwork><measurement-temporarily-not-available/></radioNetwork>
+ </cause>
+ </MeasurementFailureCause-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ <ProtocolIE-Single-Container>
+ <id>67</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementFailureCause-Item>
+ <measurementFailedReportCharacteristics>
+ 01000000000000000000000000000000
+ </measurementFailedReportCharacteristics>
+ <cause>
+ <radioNetwork><measurement-temporarily-not-available/></radioNetwork>
+ </cause>
+ </MeasurementFailureCause-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ <ProtocolIE-Single-Container>
+ <id>67</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <MeasurementFailureCause-Item>
+ <measurementFailedReportCharacteristics>
+ 10000000000000000000000000000000
+ </measurementFailedReportCharacteristics>
+ <cause>
+ <radioNetwork><measurement-temporarily-not-available/></radioNetwork>
+ </cause>
+ </MeasurementFailureCause-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ </measurementFailureCause-List>
+ </MeasurementInitiationResult-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ </MeasurementInitiationResult-List>
+ </value>
+ </ResourceStatusResponse-IEs>
+ </protocolIEs>
+ </ResourceStatusResponse>
+ </value>
+ </successfulOutcome>
+</E2AP-PDU>
--- /dev/null
+<E2AP-PDU>
+ <initiatingMessage>
+ <procedureCode>10</procedureCode>
+ <criticality><ignore/></criticality>
+ <value>
+ <ResourceStatusUpdate>
+ <protocolIEs>
+ <ResourceStatusUpdate-IEs>
+ <id>39</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>1</Measurement-ID>
+ </value>
+ </ResourceStatusUpdate-IEs>
+ <ResourceStatusUpdate-IEs>
+ <id>40</id>
+ <criticality><reject/></criticality>
+ <value>
+ <Measurement-ID>75</Measurement-ID>
+ </value>
+ </ResourceStatusUpdate-IEs>
+ <ResourceStatusUpdate-IEs>
+ <id>32</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <CellMeasurementResult-List>
+ <ProtocolIE-Single-Container>
+ <id>33</id>
+ <criticality><ignore/></criticality>
+ <value>
+ <CellMeasurementResult-Item>
+ <cell-ID>
+ <pLMN-Identity>13 30 23</pLMN-Identity>
+ <eUTRANcellIdentifier>
+ 0000001010110000001100001010
+ </eUTRANcellIdentifier>
+ </cell-ID>
+ <iE-Extensions>
+ <CellMeasurementResult-Item-ExtIEs>
+ <id>42</id>
+ <criticality><ignore/></criticality>
+ <extensionValue>
+ <CompositeAvailableCapacityGroup>
+ <dL-CompositeAvailableCapacity>
+ <cellCapacityClassValue>100</cellCapacityClassValue>
+ <capacityValue>99</capacityValue>
+ </dL-CompositeAvailableCapacity>
+ <uL-CompositeAvailableCapacity>
+ <cellCapacityClassValue>100</cellCapacityClassValue>
+ <capacityValue>99</capacityValue>
+ </uL-CompositeAvailableCapacity>
+ </CompositeAvailableCapacityGroup>
+ </extensionValue>
+ </CellMeasurementResult-Item-ExtIEs>
+ </iE-Extensions>
+ </CellMeasurementResult-Item>
+ </value>
+ </ProtocolIE-Single-Container>
+ </CellMeasurementResult-List>
+ </value>
+ </ResourceStatusUpdate-IEs>
+ </protocolIEs>
+ </ResourceStatusUpdate>
+ </value>
+ </initiatingMessage>
+</E2AP-PDU>
<criticality><reject/></criticality>
<value>
<GlobalENB-ID>
- <pLMN-Identity>02 F8 39</pLMN-Identity>
+ <pLMN-Identity>13 30 23</pLMN-Identity>
<eNB-ID>
<macro-eNB-ID>
- 00000000111000110000
+ 00000010101100000011
</macro-eNB-ID>
</eNB-ID>
</GlobalENB-ID>
<ServedCells>
<SEQUENCE>
<servedCellInfo>
- <pCI>0</pCI>
+ <pCI>308</pCI>
<cellId>
- <pLMN-Identity>02 F8 39</pLMN-Identity>
+ <pLMN-Identity>13 30 23</pLMN-Identity>
<eUTRANcellIdentifier>
- 0000000011100011000000000000
+ 0000001010110000001100001010
</eUTRANcellIdentifier>
</cellId>
- <tAC>00 01</tAC>
+ <tAC>64 03</tAC>
<broadcastPLMNs>
- <PLMN-Identity>02 F8 39</PLMN-Identity>
+ <PLMN-Identity>13 30 23</PLMN-Identity>
</broadcastPLMNs>
<eUTRA-Mode-Info>
<fDD>
- <uL-EARFCN>21400</uL-EARFCN>
- <dL-EARFCN>3400</dL-EARFCN>
+ <uL-EARFCN>18650</uL-EARFCN>
+ <dL-EARFCN>650</dL-EARFCN>
<uL-Transmission-Bandwidth><bw50/></uL-Transmission-Bandwidth>
<dL-Transmission-Bandwidth><bw50/></dL-Transmission-Bandwidth>
</fDD>
</eUTRA-Mode-Info>
+ <iE-Extensions>
+ <ServedCell-Information-ExtIEs>
+ <id>41</id>
+ <criticality><ignore/></criticality>
+ <extensionValue>
+ <Number-of-Antennaports><an2/></Number-of-Antennaports>
+ </extensionValue>
+ </ServedCell-Information-ExtIEs>
+ <ServedCell-Information-ExtIEs>
+ <id>55</id>
+ <criticality><ignore/></criticality>
+ <extensionValue>
+ <PRACH-Configuration>
+ <rootSequenceIndex>344</rootSequenceIndex>
+ <zeroCorrelationIndex>12</zeroCorrelationIndex>
+ <highSpeedFlag><false/></highSpeedFlag>
+ <prach-FreqOffset>5</prach-FreqOffset>
+ </PRACH-Configuration>
+ </extensionValue>
+ </ServedCell-Information-ExtIEs>
+ <ServedCell-Information-ExtIEs>
+ <id>160</id>
+ <criticality><ignore/></criticality>
+ <extensionValue>
+ <FreqBandIndicatorPriority><not-broadcasted/></FreqBandIndicatorPriority>
+ </extensionValue>
+ </ServedCell-Information-ExtIEs>
+ </iE-Extensions>
</servedCellInfo>
</SEQUENCE>
</ServedCells>
<value>
<GUGroupIDList>
<GU-Group-ID>
- <pLMN-Identity>02 F8 39</pLMN-Identity>
- <mME-Group-ID>00 00</mME-Group-ID>
+ <pLMN-Identity>13 30 23</pLMN-Identity>
+ <mME-Group-ID>80 00</mME-Group-ID>
</GU-Group-ID>
</GUGroupIDList>
</value>
\r
case E2AP_PDU_PR_successfulOutcome: //successfulOutcome\r
LOG_I("[E2AP] Received X2-SETUP-RESPONSE");\r
+ e2ap_handle_X2SetupResponse(pdu, socket_fd);\r
break;\r
\r
case E2AP_PDU_PR_unsuccessfulOutcome:\r
}\r
break;\r
\r
+ case ProcedureCode_id_resourceStatusReportingInitiation: //9\r
+ switch(index)\r
+ {\r
+ case E2AP_PDU_PR_initiatingMessage: //initiatingMessage\r
+ LOG_I("[E2AP] Received RESOURCE-STATUS-REQUEST");\r
+ e2ap_handle_ResourceStatusRequest(pdu, socket_fd);\r
+ break;\r
+\r
+ case E2AP_PDU_PR_successfulOutcome: //successfulOutcome\r
+ LOG_I("[E2AP] Received RESOURCE-STATUS-RESPONSE");\r
+ break;\r
+\r
+ case E2AP_PDU_PR_unsuccessfulOutcome:\r
+ LOG_I("[E2AP] Received RESOURCE-STATUS-FAILURE");\r
+ break;\r
+\r
+ default:\r
+ LOG_E("[E2AP] Invalid message index=%d in E2AP-PDU %d", index,\r
+ (int)ProcedureCode_id_resourceStatusReportingInitiation);\r
+ break;\r
+ }\r
+ break;\r
+\r
+ case ProcedureCode_id_resourceStatusReporting: // 10\r
+ switch(index)\r
+ {\r
+ case E2AP_PDU_PR_initiatingMessage: //initiatingMessage\r
+ LOG_I("[E2AP] Received RESOURCE-STATUS-UPDATE");\r
+ break;\r
+\r
+ default:\r
+ LOG_E("[E2AP] Unable to process message index=%d in E2AP-PDU %d", index,\r
+ (int)ProcedureCode_id_resourceStatusReporting);\r
+ break;\r
+ }\r
+ break;\r
+\r
default:\r
LOG_E("[E2AP] No available handler for procedureCode=%d", procedureCode);\r
break;\r
sctp_buffer_t data;\r
\r
data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
- memcpy(data.buffer, buf, data.len);\r
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
\r
//send response data over sctp\r
if(sctp_send_data(socket_fd, data) > 0) {\r
}\r
}\r
\r
+void e2ap_handle_X2SetupResponse(E2AP_PDU_t* pdu, int &socket_fd)\r
+{\r
+ E2AP_PDU_t* req_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusRequest.xml");\r
+ // E2AP_PDU_t* req_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusRequest_bad.xml");\r
+\r
+ LOG_D("[E2AP] Created RESOURCE-STATUS-REQUEST");\r
+\r
+ e2ap_asn1c_print_pdu(req_pdu);\r
+\r
+ uint8_t *buf;\r
+ sctp_buffer_t data;\r
+\r
+ data.len = e2ap_asn1c_encode_pdu(req_pdu, &buf);\r
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
+\r
+ //send response data over sctp\r
+ if(sctp_send_data(socket_fd, data) > 0) {\r
+ LOG_I("[SCTP] Sent RESOURCE-STATUS-REQUEST");\r
+ } else {\r
+ LOG_E("[SCTP] Unable to send RESOURCE-STATUS-REQUEST to peer");\r
+ }\r
+\r
+}\r
+\r
/*\r
Simply send back ENDCX2SetupResponse\r
Todo: add more handling options (failure, duplicated request, etc.)\r
sctp_buffer_t data;\r
\r
data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
- memcpy(data.buffer, buf, data.len);\r
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
\r
//send response data over sctp\r
if(sctp_send_data(socket_fd, data) > 0) {\r
sctp_buffer_t data;\r
\r
data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
- memcpy(data.buffer, buf, data.len);\r
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
\r
//send response data over sctp\r
if(sctp_send_data(socket_fd, data) > 0) {\r
sctp_buffer_t data;\r
\r
data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
- memcpy(data.buffer, buf, data.len);\r
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
\r
//send response data over sctp\r
if(sctp_send_data(socket_fd, data) > 0) {\r
uint8_t *buf1, *buf2;\r
sctp_buffer_t data1, data2;\r
data1.len = e2ap_asn1c_encode_pdu(indication_type1, &buf1);\r
- memcpy(data1.buffer, buf1, data1.len);\r
+ memcpy(data1.buffer, buf1, min(data1.len, MAX_SCTP_BUFFER));\r
\r
data2.len = e2ap_asn1c_encode_pdu(indication_type2, &buf2);\r
- memcpy(data2.buffer, buf2, data2.len);\r
+ memcpy(data2.buffer, buf2, min(data2.len, MAX_SCTP_BUFFER));\r
\r
while(1){\r
sleep(1);\r
\r
}\r
\r
-// void e2ap_handle_RICSubscriptionRequest_old(e2ap_pdu_t* pdu, int &socket_fd)\r
-// {\r
-// RICsubscription_params_t params;\r
-// e2ap_parse_RICsubscriptionRequest(pdu, params);\r
-//\r
-// /* Example handling logic\r
-// - Accept if request id is even-numbered -> send back response\r
-// in this case, accept every other actions\r
-//\r
-// - Reject if request id is odd-numbered -> send back failure\r
-// */\r
-//\r
-// e2ap_pdu_t* res_pdu = new_e2ap_pdu();\r
-// bool is_failure = false;\r
-//\r
-// if(params.request_id % 2 == 0)\r
-// {\r
-// for(size_t i = 0; i < params.actionList.size(); i++)\r
-// {\r
-// if(i%2 == 0){\r
-// params.actionList[i].isAdmitted = true;\r
-// } else {\r
-// params.actionList[i].isAdmitted = false;\r
-// params.actionList[i].notAdmitted_cause = RICcause_radioNetwork;\r
-// params.actionList[i].notAdmitted_subCause = 5;\r
-// }\r
-// }\r
-//\r
-// e2ap_create_RICsubscriptionResponse(res_pdu, params);\r
-// LOG_I("[E2AP] Created RIC-SUBSCRIPTION-RESPONSE");\r
-// }\r
-// else\r
-// {\r
-// is_failure = true;\r
-//\r
-// for(size_t i = 0; i < params.actionList.size(); i++)\r
-// {\r
-// params.actionList[i].isAdmitted = false;\r
-// params.actionList[i].notAdmitted_cause = RICcause_radioNetwork;\r
-// params.actionList[i].notAdmitted_subCause = 5;\r
-// }\r
-//\r
-// e2ap_create_RICsubscriptionFailure(res_pdu, params);\r
-// LOG_I("[E2AP] Created RIC-SUBSCRIPTION-FAILURE");\r
-// }\r
-//\r
-// e2ap_print_pdu(res_pdu);\r
-//\r
-// //Encode into buffer\r
-// sctp_buffer_t data;\r
-// e2ap_encode_pdu(res_pdu, data.buffer, sizeof(data.buffer), data.len);\r
-//\r
-// //send response data over sctp\r
-// if(sctp_send_data(socket_fd, data) > 0)\r
-// {\r
-// if(is_failure) {\r
-// LOG_I("[SCTP] Sent RIC-SUBSCRIPTION-FAILURE");\r
-// }\r
-// else {\r
-// LOG_I("[SCTP] Sent RIC-SUBSCRIPTION-RESPONSE");\r
-// }\r
-// }\r
-// else\r
-// {\r
-// if(is_failure) {\r
-// LOG_I("[SCTP] Unable to send RIC-SUBSCRIPTION-FAILURE");\r
-// }\r
-// else {\r
-// LOG_E("[SCTP] Unable to send RIC-SUBSCRIPTION-RESPONSE");\r
-// }\r
-// }\r
-//\r
-// }\r
+void e2ap_handle_ResourceStatusRequest(E2AP_PDU_t* pdu, int &socket_fd)\r
+{\r
+ //send back ResourceStatusResponse, followed by resource status update\r
+ E2AP_PDU_t* res_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusResponse.xml");\r
+\r
+ LOG_D("[E2AP] Created RESOURCE-STATUS-RESPONSE");\r
+\r
+ e2ap_asn1c_print_pdu(res_pdu);\r
+\r
+ uint8_t *buf;\r
+ sctp_buffer_t data;\r
+\r
+ data.len = e2ap_asn1c_encode_pdu(res_pdu, &buf);\r
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));\r
+\r
+ //send response data over sctp\r
+ if(sctp_send_data(socket_fd, data) > 0) {\r
+ LOG_I("[SCTP] Sent RESOURCE-STATUS-RESPONSE");\r
+ } else {\r
+ LOG_E("[SCTP] Unable to send RESOURCE-STATUS-RESPONSE to peer");\r
+ }\r
+\r
+\r
+ //send ResourceStatusUpdate periodically\r
+ E2AP_PDU_t* update_pdu = e2ap_xml_to_pdu("E2AP_ResourceStatusUpdate.xml");\r
+\r
+ uint8_t *update_buf;\r
+ sctp_buffer_t update_data;\r
+\r
+ update_data.len = e2ap_asn1c_encode_pdu(update_pdu, &update_buf);\r
+ memcpy(update_data.buffer, update_buf, min(update_data.len, MAX_SCTP_BUFFER));\r
+\r
+ while(1) {\r
+ // e2ap_asn1c_print_pdu(update_pdu);\r
+\r
+ if(sctp_send_data(socket_fd, update_data) > 0) {\r
+ LOG_I("[SCTP] Sent RESOURCE-STATUS-UPDATE");\r
+ } else {\r
+ LOG_E("[SCTP] Unable to send RESOURCE-STATUS-UPDATE to peer");\r
+ }\r
+\r
+ sleep(1);\r
+\r
+ }\r
+}\r
\r
void e2ap_handle_RICSubscriptionRequest_securityDemo(E2AP_PDU_t* pdu, int &socket_fd);\r
\r
+void e2ap_handle_ResourceStatusRequest(E2AP_PDU_t* pdu, int &socket_fd);\r
+\r
#endif\r
exit(1);
}
+ //set send_buffer
+ // int sendbuff = 10000;
+ // socklen_t optlen = sizeof(sendbuff);
+ // if(getsockopt(server_fd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen) == -1) {
+ // perror("getsockopt send");
+ // exit(1);
+ // }
+ // else
+ // LOG_D("[SCTP] send buffer size = %d\n", sendbuff);
+
+
if(bind(server_fd, server_addr, addr_len) == -1) {
perror("bind");
exit(1);
exit(1);
}
+ // int sendbuff = 10000;
+ // socklen_t optlen = sizeof(sendbuff);
+ // if(getsockopt(client_fd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen) == -1) {
+ // perror("getsockopt send");
+ // exit(1);
+ // }
+ // else
+ // LOG_D("[SCTP] send buffer size = %d\n", sendbuff);
+
//--------------------------------
//Bind before connect
auto optval = 1;
sctp_buffer_t data;
data.len = e2ap_asn1c_encode_pdu(pdu, &buf);
- memcpy(data.buffer, buf, data.len);
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));
/* Test decoding */
E2AP_PDU_t* pdu1 = new E2AP_PDU_t();
sctp_buffer_t data;
data.len = e2ap_asn1c_encode_pdu(pdu, &buf);
- memcpy(data.buffer, buf, data.len);
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));
sctp_send_data(client_fd, data);
}
sctp_buffer_t data;
data.len = e2ap_asn1c_encode_pdu(pdu, &buf);
- memcpy(data.buffer, buf, data.len);
+ memcpy(data.buffer, buf, min(data.len, MAX_SCTP_BUFFER));
// sctp_send_data(client_fd, data);
sctp_send_data_X2AP(client_fd, data);
//Send X2 Setup Request
E2AP_PDU_t* pdu_setup = e2ap_xml_to_pdu("E2AP_X2SetupRequest.xml");
e2ap_asn1c_print_pdu(pdu_setup);
-
encode_and_send_sctp_data(pdu_setup, client_fd);
//wait to receive X2SetupResponse
- wait_for_sctp_data(client_fd);
+ while(1){
+ wait_for_sctp_data(client_fd);
+ }
}