2 * Copyright 2019 AT&T Intellectual Property
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 * platform project (RICP).
28 #include <InitiatingMessage.h>
29 #include <ProtocolIE-ID.h>
30 #include <resource_status_request_wrapper.h>
32 #define pLMN_Identity_size 3
33 #define eUTRANcellIdentifier_size 28
35 static void assignPLMN_Identity (PLMN_Identity_t *pLMN_Identity, uint8_t const* pLMNId);
36 static void assignEUTRANcellIdentifier (EUTRANCellIdentifier_t *eUTRANCellIdentifier, uint8_t const* eUTRANCellId);
38 * Build and pack resource status request.
39 * Abort the process on allocation failure.
40 * packed_buf_size - in: size of packed_buf; out: number of chars used.
44 build_pack_resource_status_request(
45 uint8_t const* pLMN_Identity,
46 uint8_t const* eUTRANCellIdentifier,
47 Measurement_ID_t measurement_ID, Measurement_ID_t measurement_ID2,
48 Registration_Request_t registration_Request /*Registration_Request_start,Registration_Request_stop,Registration_Request_partial_stop, Registration_Request_add*/,
49 uint32_t reportCharacteristics,
50 ReportingPeriodicity_t reportingPeriodicity /*ReportingPeriodicity_one_thousand_ms, ReportingPeriodicity_two_thousand_ms, ReportingPeriodicity_five_thousand_ms,ReportingPeriodicity_ten_thousand_ms*/,
51 PartialSuccessIndicator_t partialSuccessIndicator /*PartialSuccessIndicator_partial_success_allowed*/,
52 ReportingPeriodicityRSRPMR_t reportingPeriodicityRSRPMR /*ReportingPeriodicityRSRPMR_one_hundred_20_ms, ReportingPeriodicityRSRPMR_two_hundred_40_ms, ReportingPeriodicityRSRPMR_four_hundred_80_ms,ReportingPeriodicityRSRPMR_six_hundred_40_ms*/,
53 ReportingPeriodicityCSIR_t reportingPeriodicityCSIR /*ReportingPeriodicityCSIR_ms5, ReportingPeriodicityCSIR_ms10,ReportingPeriodicityCSIR_ms20,ReportingPeriodicityCSIR_ms40,ReportingPeriodicityCSIR_ms80*/,
54 size_t* packed_buf_size, unsigned char* packed_buf,size_t err_buf_size, char* err_buf
57 return build_pack_resource_status_request_aux(
60 measurement_ID, measurement_ID2,
62 reportCharacteristics,
64 partialSuccessIndicator,
65 reportingPeriodicityRSRPMR,
66 reportingPeriodicityCSIR,
67 packed_buf_size, packed_buf,err_buf_size,err_buf,ATS_ALIGNED_BASIC_PER);
72 build_pack_resource_status_request_aux(
73 uint8_t const* pLMN_Identity,
74 uint8_t const* eUTRANCellIdentifier,
75 Measurement_ID_t measurement_ID, Measurement_ID_t measurement_ID2,
76 Registration_Request_t registration_Request /*Registration_Request_start,Registration_Request_stop,Registration_Request_partial_stop, Registration_Request_add*/,
77 uint32_t reportCharacteristics,
78 ReportingPeriodicity_t reportingPeriodicity /*ReportingPeriodicity_one_thousand_ms, ReportingPeriodicity_two_thousand_ms, ReportingPeriodicity_five_thousand_ms,ReportingPeriodicity_ten_thousand_ms*/,
79 PartialSuccessIndicator_t partialSuccessIndicator /*PartialSuccessIndicator_partial_success_allowed*/,
80 ReportingPeriodicityRSRPMR_t reportingPeriodicityRSRPMR /*ReportingPeriodicityRSRPMR_one_hundred_20_ms, ReportingPeriodicityRSRPMR_two_hundred_40_ms, ReportingPeriodicityRSRPMR_four_hundred_80_ms,ReportingPeriodicityRSRPMR_six_hundred_40_ms*/,
81 ReportingPeriodicityCSIR_t reportingPeriodicityCSIR /* ReportingPeriodicityCSIR_ms5, ReportingPeriodicityCSIR_ms10,ReportingPeriodicityCSIR_ms20,ReportingPeriodicityCSIR_ms40,ReportingPeriodicityCSIR_ms80*/,
82 size_t* packed_buf_size, unsigned char* packed_buf,size_t err_buf_size, char* err_buf,enum asn_transfer_syntax syntax
86 E2AP_PDU_t *pdu = calloc(1, sizeof(E2AP_PDU_t));
87 InitiatingMessage_t *initiatingMessage = calloc(1, sizeof(InitiatingMessage_t));
88 ResourceStatusRequest_t *request;
91 assert(initiatingMessage != 0);
94 pdu->present = E2AP_PDU_PR_initiatingMessage;
95 pdu->choice.initiatingMessage = initiatingMessage;
97 initiatingMessage->procedureCode = ProcedureCode_id_resourceStatusReportingInitiation;
98 initiatingMessage->criticality = Criticality_reject;
99 initiatingMessage->value.present = InitiatingMessage__value_PR_ResourceStatusRequest;
100 request = &initiatingMessage->value.choice.ResourceStatusRequest;
102 ResourceStatusRequest_IEs_t *measurementID_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
103 assert(measurementID_ie != 0);
104 ASN_SEQUENCE_ADD(&request->protocolIEs, measurementID_ie);
106 measurementID_ie->id = ProtocolIE_ID_id_ENB1_Measurement_ID;
107 measurementID_ie->criticality = Criticality_reject;
108 measurementID_ie->value.present = ResourceStatusRequest_IEs__value_PR_Measurement_ID;
109 measurementID_ie->value.choice.Measurement_ID = measurement_ID;
112 if (registration_Request == Registration_Request_stop
113 || registration_Request == Registration_Request_partial_stop
114 || registration_Request == Registration_Request_add) {
115 ResourceStatusRequest_IEs_t *measurementID2_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
116 assert(measurementID2_ie != 0);
117 ASN_SEQUENCE_ADD(&request->protocolIEs, measurementID2_ie);
119 measurementID2_ie->id = ProtocolIE_ID_id_ENB2_Measurement_ID;
120 measurementID2_ie->criticality = Criticality_reject;
121 measurementID2_ie->value.present = ResourceStatusRequest_IEs__value_PR_Measurement_ID;
122 measurementID2_ie->value.choice.Measurement_ID = measurement_ID2;
125 ResourceStatusRequest_IEs_t *registration_Request_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
126 assert(registration_Request_ie != 0);
127 ASN_SEQUENCE_ADD(&request->protocolIEs, registration_Request_ie);
129 registration_Request_ie->id = ProtocolIE_ID_id_Registration_Request;
130 registration_Request_ie->criticality = Criticality_reject;
131 registration_Request_ie->value.present = ResourceStatusRequest_IEs__value_PR_Registration_Request;
132 registration_Request_ie->value.choice.Registration_Request = registration_Request;
134 if (reportCharacteristics){
135 ResourceStatusRequest_IEs_t *reportCharacteristics_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
136 assert(reportCharacteristics_ie != 0);
137 ASN_SEQUENCE_ADD(&request->protocolIEs, reportCharacteristics_ie);
139 reportCharacteristics_ie->id = ProtocolIE_ID_id_ReportCharacteristics;
140 reportCharacteristics_ie->criticality = Criticality_reject;
141 reportCharacteristics_ie->value.present = ResourceStatusRequest_IEs__value_PR_ReportCharacteristics;
142 reportCharacteristics_ie->value.choice.ReportCharacteristics.size = sizeof(uint32_t);
143 reportCharacteristics_ie->value.choice.ReportCharacteristics.bits_unused = 0;
144 reportCharacteristics_ie->value.choice.ReportCharacteristics.buf = calloc(1, reportCharacteristics_ie->value.choice.ReportCharacteristics.size);
146 assert(reportCharacteristics_ie->value.choice.ReportCharacteristics.buf != 0);
147 memcpy(reportCharacteristics_ie->value.choice.ReportCharacteristics.buf, &reportCharacteristics, reportCharacteristics_ie->value.choice.ReportCharacteristics.size);
150 ResourceStatusRequest_IEs_t *cellToReport_List_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
151 assert(cellToReport_List_ie != 0);
152 ASN_SEQUENCE_ADD(&request->protocolIEs, cellToReport_List_ie);
154 cellToReport_List_ie->id = ProtocolIE_ID_id_CellToReport;
155 cellToReport_List_ie->criticality = Criticality_ignore;
156 cellToReport_List_ie->value.present = ResourceStatusRequest_IEs__value_PR_CellToReport_List;
158 CellToReport_ItemIEs_t *item = calloc(1, sizeof(CellToReport_ItemIEs_t));
160 ASN_SEQUENCE_ADD(&cellToReport_List_ie->value.choice.CellToReport_List, item);
162 item->id = ProtocolIE_ID_id_CellToReport_Item;
163 item->criticality = Criticality_ignore;
164 item->value.present = CellToReport_ItemIEs__value_PR_CellToReport_Item;
165 assignPLMN_Identity(&item->value.choice.CellToReport_Item.cell_ID.pLMN_Identity, pLMN_Identity);
166 assignEUTRANcellIdentifier(&item->value.choice.CellToReport_Item.cell_ID.eUTRANcellIdentifier,eUTRANCellIdentifier);
168 if (reportingPeriodicity >= 0){
169 ResourceStatusRequest_IEs_t *reportingPeriodicity_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
170 assert(reportingPeriodicity_ie != 0);
171 ASN_SEQUENCE_ADD(&request->protocolIEs, reportingPeriodicity_ie);
173 reportingPeriodicity_ie->id = ProtocolIE_ID_id_ReportingPeriodicity;
174 reportingPeriodicity_ie->criticality = Criticality_ignore;
175 reportingPeriodicity_ie->value.present = ResourceStatusRequest_IEs__value_PR_ReportingPeriodicity;
176 reportingPeriodicity_ie->value.choice.ReportingPeriodicity = reportingPeriodicity;
179 if (partialSuccessIndicator >= 0){
180 ResourceStatusRequest_IEs_t *partialSuccessIndicator_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
181 assert(partialSuccessIndicator_ie != 0);
182 ASN_SEQUENCE_ADD(&request->protocolIEs, partialSuccessIndicator_ie);
184 partialSuccessIndicator_ie->id = ProtocolIE_ID_id_PartialSuccessIndicator;
185 partialSuccessIndicator_ie->criticality = Criticality_ignore;
186 partialSuccessIndicator_ie->value.present = ResourceStatusRequest_IEs__value_PR_PartialSuccessIndicator;
187 partialSuccessIndicator_ie->value.choice.PartialSuccessIndicator = partialSuccessIndicator;
190 if (reportingPeriodicityRSRPMR >= 0){
191 ResourceStatusRequest_IEs_t *reportingPeriodicityRSRPMR_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
192 assert(reportingPeriodicityRSRPMR_ie != 0);
193 ASN_SEQUENCE_ADD(&request->protocolIEs, reportingPeriodicityRSRPMR_ie);
195 reportingPeriodicityRSRPMR_ie->id = ProtocolIE_ID_id_ReportingPeriodicityRSRPMR;
196 reportingPeriodicityRSRPMR_ie->criticality = Criticality_ignore;
197 reportingPeriodicityRSRPMR_ie->value.present = ResourceStatusRequest_IEs__value_PR_ReportingPeriodicityRSRPMR;
198 reportingPeriodicityRSRPMR_ie->value.choice.ReportingPeriodicityRSRPMR = reportingPeriodicityRSRPMR;
201 if (reportingPeriodicityCSIR >= 0){
202 ResourceStatusRequest_IEs_t *reportingPeriodicityCSIR_ie = calloc(1, sizeof(ResourceStatusRequest_IEs_t));
203 assert(reportingPeriodicityCSIR_ie != 0);
204 ASN_SEQUENCE_ADD(&request->protocolIEs, reportingPeriodicityCSIR_ie);
206 reportingPeriodicityCSIR_ie->id = ProtocolIE_ID_id_ReportingPeriodicityCSIR;
207 reportingPeriodicityCSIR_ie->criticality = Criticality_ignore;
208 reportingPeriodicityCSIR_ie->value.present = ResourceStatusRequest_IEs__value_PR_ReportingPeriodicityCSIR;
209 reportingPeriodicityCSIR_ie->value.choice.ReportingPeriodicityCSIR = reportingPeriodicityCSIR;
212 rc = pack_pdu_aux(pdu, packed_buf_size, packed_buf,err_buf_size, err_buf,syntax);
214 ASN_STRUCT_FREE(asn_DEF_E2AP_PDU, pdu);
218 static void assignPLMN_Identity (PLMN_Identity_t *pLMN_Identity, uint8_t const* pLMNId)
220 pLMN_Identity->size = pLMN_Identity_size;
221 pLMN_Identity->buf = calloc(1,pLMN_Identity->size);
222 assert(pLMN_Identity->buf != 0);
223 memcpy(pLMN_Identity->buf, pLMNId, pLMN_Identity->size);
226 // Assume that eUTRANCellId value is already pushed to the left
227 static void assignEUTRANcellIdentifier (EUTRANCellIdentifier_t *eUTRANCellIdentifier, uint8_t const* eUTRANCellId)
229 size_t size_in_bytes = (eUTRANcellIdentifier_size / 8) + ((eUTRANcellIdentifier_size % 8) > 0);
230 int unused_bits = 8 - (eUTRANcellIdentifier_size % 8);
232 eUTRANCellIdentifier->size = size_in_bytes;
233 eUTRANCellIdentifier->bits_unused = unused_bits;
234 eUTRANCellIdentifier->buf = calloc(1, eUTRANCellIdentifier->size);
235 assert(eUTRANCellIdentifier->buf != 0);
236 memcpy(eUTRANCellIdentifier->buf, eUTRANCellId, size_in_bytes);