ngap_message_callback.hpp 44.8 KB
Newer Older
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
1 2 3 4 5
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this
7 8
 * file except in compliance with the License. You may obtain a copy of the
 * License at
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * 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.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

/*! \file ngap_message_callback.cpp
 \brief
 \author  Keliang DU, BUPT
 \date 2020
 \email: contact@openairinterface.org
 */

29 30 31
#ifndef _NGAP_MESSAGE_CALLBACK_H_
#define _NGAP_MESSAGE_CALLBACK_H_

32 33
#include "InitialContextSetupResponse.hpp"
#include "NGReset.hpp"
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
34
#include "NGResetAck.hpp"
35
#include "NGSetupRequest.hpp"
36
#include "PDUSessionResourceSetupUnsuccessfulTransfer.hpp"
37 38
#include "PduSessionResourceReleaseResponse.hpp"
#include "PduSessionResourceSetupResponse.hpp"
39
#include "PduSessionResourceModifyResponse.hpp"
40
#include "amf_app.hpp"
41 42
#include "amf_n1.hpp"
#include "amf_n11.hpp"
43
#include "itti.hpp"
44 45 46
#include "itti_msg_n11.hpp"
#include "itti_msg_n2.hpp"
#include "logger.hpp"
47
#include "nas_context.hpp"
48 49
#include "pdu_session_context.hpp"
#include "sctp_server.hpp"
dukl's avatar
dukl committed
50 51

using namespace sctp;
dukl's avatar
dukl committed
52
using namespace ngap;
53
using namespace amf_application;
dukl's avatar
dukl committed
54

55 56
extern itti_mw* itti_inst;
extern amf_n1* amf_n1_inst;
57
extern amf_app* amf_app_inst;
58

59 60 61
typedef int (*ngap_message_decoded_callback)(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p);
dukl's avatar
dukl committed
62

63 64
typedef void (*ngap_event_callback)(const sctp_assoc_id_t assoc_id);

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
65
//------------------------------------------------------------------------------
66 67 68
int ngap_amf_handle_ng_setup_request(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
69
  Logger::ngap().debug("Sending ITTI NG Setup Request message to TASK_AMF_N2");
dukl's avatar
dukl committed
70
  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
71
  NGSetupRequestMsg* ngSetupReq = new NGSetupRequestMsg();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
72
  if (!ngSetupReq->decodefrompdu(message_p)) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
73
    Logger::ngap().error("Decoding NGSetupRequest message error");
dukl's avatar
dukl committed
74 75
    return -1;
  }
76 77 78 79 80
  // after decoding, need free(message_p)
  itti_ng_setup_request* itti_msg =
      new itti_ng_setup_request(TASK_NGAP, TASK_AMF_N2);
  itti_msg->assoc_id   = assoc_id;
  itti_msg->stream     = stream;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
81
  itti_msg->ngSetupReq = ngSetupReq;
82 83
  std::shared_ptr<itti_ng_setup_request> i =
      std::shared_ptr<itti_ng_setup_request>(itti_msg);
dukl's avatar
dukl committed
84 85
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
86 87 88
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
89
  }
90
  return 0;
dukl's avatar
dukl committed
91
}
dukl's avatar
dukl committed
92

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
93
//------------------------------------------------------------------------------
94 95 96
int ngap_amf_handle_initial_ue_message(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
97
  Logger::ngap().debug("Sending ITTI Initial UE Message to TASK_AMF_N2");
dukl's avatar
dukl committed
98
  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
99 100
  // decode INITIAL_UE_MESSAGE
  InitialUEMessageMsg* initUeMsg = new InitialUEMessageMsg();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
101
  if (!initUeMsg->decodefrompdu(message_p)) {
102
    Logger::ngap().error("Decoding InitialUEMessage error");
dukl's avatar
dukl committed
103 104
    return -1;
  }
105 106 107 108
  itti_initial_ue_message* init_ue_msg =
      new itti_initial_ue_message(TASK_NGAP, TASK_AMF_N2);
  init_ue_msg->assoc_id  = assoc_id;
  init_ue_msg->stream    = stream;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
109
  init_ue_msg->initUeMsg = initUeMsg;
110 111
  std::shared_ptr<itti_initial_ue_message> i =
      std::shared_ptr<itti_initial_ue_message>(init_ue_msg);
dukl's avatar
dukl committed
112 113
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
114 115 116
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
117
  }
118
  return 0;
dukl's avatar
dukl committed
119
}
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
120 121

//------------------------------------------------------------------------------
122 123 124
int ngap_amf_handle_uplink_nas_transport(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
125 126
  Logger::ngap().debug(
      "Sending ITTI Uplink NAS Transport message to TASK_AMF_N2");
dukl's avatar
dukl committed
127
  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
128
  UplinkNASTransportMsg* uplinkNasT = new UplinkNASTransportMsg();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
129
  if (!uplinkNasT->decodefrompdu(message_p)) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
130
    Logger::ngap().error("Decoding UplinkNasTransport message error");
dukl's avatar
dukl committed
131 132
    return -1;
  }
133 134
  itti_ul_nas_transport* itti_ul_nas =
      new itti_ul_nas_transport(TASK_NGAP, TASK_AMF_N2);
dukl's avatar
dukl committed
135
  itti_ul_nas->assoc_id = assoc_id;
136 137 138 139
  itti_ul_nas->stream   = stream;
  itti_ul_nas->ulNas    = uplinkNasT;
  std::shared_ptr<itti_ul_nas_transport> i =
      std::shared_ptr<itti_ul_nas_transport>(itti_ul_nas);
dukl's avatar
dukl committed
140 141
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
142 143 144
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
145
  }
146
  return 0;
dukl's avatar
dukl committed
147 148
}

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
149
//------------------------------------------------------------------------------
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
150 151
int ngap_amf_handle_initial_context_setup_response(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
152
    struct Ngap_NGAP_PDU* message_p) {
153
  Logger::ngap().debug("Handling Initial Context Setup Response");
154
  InitialContextSetupResponseMsg* initCtxResp =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
155
      new InitialContextSetupResponseMsg();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
156 157
  if (!initCtxResp->decodefrompdu(message_p)) {
    Logger::ngap().error("Decoding InitialContextSetupResponse message error");
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
158 159 160
    return -1;
  }
  std::vector<PDUSessionResourceSetupResponseItem_t> list;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
161
  if (!initCtxResp->getPduSessionResourceSetupResponseList(list)) {
162
    Logger::ngap().debug(
163 164
        "Decode PduSessionResourceSetupResponseList IE error or this IE is not "
        "available");
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
165 166
    return 0;
  }
167

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
168
  uint8_t transferIe[500];
169 170 171 172 173
  memcpy(
      transferIe, list[0].pduSessionResourceSetupResponseTransfer.buf,
      list[0].pduSessionResourceSetupResponseTransfer.size);
  bstring n2sm = blk2bstr(
      transferIe, list[0].pduSessionResourceSetupResponseTransfer.size);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
174

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
175 176
  Logger::ngap().debug(
      "Sending ITTI Initial Context Setup Response to TASK_AMF_N11");
177
  itti_nsmf_pdusession_update_sm_context* itti_msg =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
178
      new itti_nsmf_pdusession_update_sm_context(TASK_NGAP, TASK_AMF_N11);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
179
  itti_msg->pdu_session_id = list[0].pduSessionId;
180 181
  itti_msg->n2sm           = n2sm;
  itti_msg->is_n2sm_set    = true;
182
  itti_msg->n2sm_info_type = "PDU_RES_SETUP_RSP";
183 184 185
  itti_msg->amf_ue_ngap_id = initCtxResp->getAmfUeNgapId();
  itti_msg->ran_ue_ngap_id = initCtxResp->getRanUeNgapId();

186 187
  std::shared_ptr<itti_nsmf_pdusession_update_sm_context> i =
      std::shared_ptr<itti_nsmf_pdusession_update_sm_context>(itti_msg);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
188 189
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
190 191 192
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N11",
        i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
193
  }
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
194 195 196
  return 0;
}

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
197
//------------------------------------------------------------------------------
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
198 199
int ngap_amf_handle_initial_context_setup_failure(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
200
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
201
  Logger::ngap().debug(
202
      "Sending ITTI Initial Context Setup Failure to TASK_AMF_N2");
dukl's avatar
dukl committed
203 204
  return 0;
}
dukl's avatar
dukl committed
205

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
206
//------------------------------------------------------------------------------
207 208 209
int ngap_amf_handle_ue_radio_cap_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
210
  Logger::ngap().debug(
211
      "Sending ITTI UE Radio Capability Indication to TASK_AMF_N2");
212
  UeRadioCapabilityInfoIndicationMsg* ueRadioCap =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
213
      new UeRadioCapabilityInfoIndicationMsg();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
214 215
  if (!ueRadioCap->decodefrompdu(message_p)) {
    Logger::ngap().error("Decoding UEContextReleaseRequest message error");
dukl's avatar
dukl committed
216 217
    return -1;
  }
218
  itti_ue_radio_capability_indication* itti_msg =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
219
      new itti_ue_radio_capability_indication(TASK_NGAP, TASK_AMF_N2);
220 221
  itti_msg->assoc_id   = assoc_id;
  itti_msg->stream     = stream;
dukl's avatar
dukl committed
222
  itti_msg->ueRadioCap = ueRadioCap;
223 224
  std::shared_ptr<itti_ue_radio_capability_indication> i =
      std::shared_ptr<itti_ue_radio_capability_indication>(itti_msg);
dukl's avatar
dukl committed
225 226
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
227 228 229
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
230
  }
231
  return 0;
dukl's avatar
dukl committed
232
}
dukl's avatar
dukl committed
233

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
234
//------------------------------------------------------------------------------
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
235 236
int ngap_amf_handle_ue_context_release_request(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
237
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
238
  Logger::ngap().debug(
239
      "Sending ITTI UE Context Release Request to TASK_AMF_N2");
240
  UEContextReleaseRequestMsg* ueCtxRelReq = new UEContextReleaseRequestMsg();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
241 242
  if (!ueCtxRelReq->decodefrompdu(message_p)) {
    Logger::ngap().error("Decoding UEContextReleaseRequest message error");
dukl's avatar
dukl committed
243 244
    return -1;
  }
245
  itti_ue_context_release_request* itti_msg =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
246
      new itti_ue_context_release_request(TASK_NGAP, TASK_AMF_N2);
dukl's avatar
dukl committed
247
  itti_msg->assoc_id = assoc_id;
248
  itti_msg->stream   = stream;
dukl's avatar
dukl committed
249
  itti_msg->ueCtxRel = ueCtxRelReq;
250 251
  std::shared_ptr<itti_ue_context_release_request> i =
      std::shared_ptr<itti_ue_context_release_request>(itti_msg);
dukl's avatar
dukl committed
252 253
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
254 255 256
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
257
  }
258
  return 0;
dukl's avatar
dukl committed
259
}
dukl's avatar
dukl committed
260

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
261
//------------------------------------------------------------------------------
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
262 263
int ngap_amf_handle_ue_context_release_complete(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
264
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
265
  Logger::ngap().debug(
266
      "Sending ITTI UE Context Release Complete to TASK_AMF_N2");
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286

  UEContextReleaseCompleteMsg* ueCtxRelCmpl = new UEContextReleaseCompleteMsg();
  if (!ueCtxRelCmpl->decodefrompdu(message_p)) {
    Logger::ngap().error("Decoding UEContextReleaseComplete message error");
    return -1;
  }
  itti_ue_context_release_complete* itti_msg =
      new itti_ue_context_release_complete(TASK_NGAP, TASK_AMF_N2);
  itti_msg->assoc_id     = assoc_id;
  itti_msg->stream       = stream;
  itti_msg->ueCtxRelCmpl = ueCtxRelCmpl;
  std::shared_ptr<itti_ue_context_release_complete> i =
      std::shared_ptr<itti_ue_context_release_complete>(itti_msg);
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
  }
  return 0;
dukl's avatar
dukl committed
287
}
dukl's avatar
dukl committed
288

289
//------------------------------------------------------------------------------
290 291
int ngap_amf_handle_pdu_session_resource_release_response(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
292
    struct Ngap_NGAP_PDU* message_p) {
293 294
  Logger::ngap().debug("Handle PDU Session Resource Setup Release Response");

295
  PduSessionResourceReleaseResponseMsg* pduresp =
296 297 298 299 300 301
      new PduSessionResourceReleaseResponseMsg();
  if (!pduresp->decodefrompdu(message_p)) {
    Logger::ngap().error(
        "Decoding PduSessionResourceReleaseResponseMsg message error");
    return -1;
  }
302
  // TODO: process User Location Information if this IE is available
303

304
  // Transfer pduSessionResourceReleaseResponseTransfer to SMF
305 306 307
  std::vector<PDUSessionResourceReleasedItem_t> list;
  if (!pduresp->getPduSessionResourceReleasedList(list)) {
    Logger::ngap().error(
308
        "Decoding PduSessionResourceReleaseResponseMsg "
309
        "getPduSessionResourceReleasedList IE error");
310 311
    return -1;
  }
312
  // TODO: add the full list
313
  uint8_t transferIe[500];
314 315 316
  memcpy(
      transferIe, list[0].pduSessionResourceReleaseResponseTransfer.buf,
      list[0].pduSessionResourceReleaseResponseTransfer.size);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
317 318
  bstring n2sm = blk2bstr(
      transferIe, list[0].pduSessionResourceReleaseResponseTransfer.size);
319
  Logger::ngap().debug(
320
      "Sending ITTI PDUSessionResourceReleaseResponse to TASK_AMF_N11");
321

322
  itti_nsmf_pdusession_update_sm_context* itti_msg =
323 324
      new itti_nsmf_pdusession_update_sm_context(TASK_NGAP, TASK_AMF_N11);
  itti_msg->pdu_session_id = list[0].pduSessionId;
325 326
  itti_msg->n2sm           = n2sm;
  itti_msg->is_n2sm_set    = true;
327
  itti_msg->n2sm_info_type = "PDU_RES_REL_RSP";
328 329
  itti_msg->amf_ue_ngap_id = pduresp->getAmfUeNgapId();
  itti_msg->ran_ue_ngap_id = pduresp->getRanUeNgapId();
330

331 332
  std::shared_ptr<itti_nsmf_pdusession_update_sm_context> i =
      std::shared_ptr<itti_nsmf_pdusession_update_sm_context>(itti_msg);
333 334
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
335 336 337
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N11",
        i->get_msg_name());
338 339 340 341
  }
  return 0;
}

Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
342
//------------------------------------------------------------------------------
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
343 344
int ngap_amf_handle_pdu_session_resource_setup_response(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
345
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
346
  Logger::ngap().debug("Handle PDU Session Resource Setup Response");
347
  PduSessionResourceSetupResponseMsg* pduresp =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
348 349 350 351
      new PduSessionResourceSetupResponseMsg();
  if (!pduresp->decodefrompdu(message_p)) {
    Logger::ngap().error(
        "Decoding PduSessionResourceSetupResponseMsg message error");
dukl's avatar
dukl committed
352 353 354
    return -1;
  }
  std::vector<PDUSessionResourceSetupResponseItem_t> list;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
355 356
  if (!pduresp->getPduSessionResourceSetupResponseList(list)) {
    Logger::ngap().error(
357
        "Decoding PduSessionResourceSetupResponseMsg "
358
        "getPduSessionResourceSetupResponseList IE error");
359
    // return -1;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
360
  } else {
361
    // TODO: for multiple PDU Sessions
362
    uint8_t transferIe[500];
363 364 365
    memcpy(
        transferIe, list[0].pduSessionResourceSetupResponseTransfer.buf,
        list[0].pduSessionResourceSetupResponseTransfer.size);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
366 367
    bstring n2sm = blk2bstr(
        transferIe, list[0].pduSessionResourceSetupResponseTransfer.size);
368
    itti_nsmf_pdusession_update_sm_context* itti_msg =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
369
        new itti_nsmf_pdusession_update_sm_context(TASK_NGAP, TASK_AMF_N11);
370
    long amf_ue_ngap_id = pduresp->getAmfUeNgapId();
371 372 373 374 375
    if (!amf_n1_inst->is_amf_ue_id_2_nas_context(amf_ue_ngap_id)) {
      Logger::ngap().error(
          "No UE NAS context with amf_ue_ngap_id (0x%x)", amf_ue_ngap_id);
      return -1;
    }
376 377 378
    std::shared_ptr<nas_context> nct =
        amf_n1_inst->amf_ue_id_2_nas_context(amf_ue_ngap_id);
    itti_msg->supi           = "imsi-" + nct.get()->imsi;
379
    itti_msg->pdu_session_id = list[0].pduSessionId;
380 381
    itti_msg->n2sm           = n2sm;
    itti_msg->is_n2sm_set    = true;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
382
    itti_msg->n2sm_info_type = "PDU_RES_SETUP_RSP";
383 384 385
    itti_msg->amf_ue_ngap_id = pduresp->getAmfUeNgapId();
    itti_msg->ran_ue_ngap_id = pduresp->getRanUeNgapId();

386 387
    std::shared_ptr<itti_nsmf_pdusession_update_sm_context> i =
        std::shared_ptr<itti_nsmf_pdusession_update_sm_context>(itti_msg);
388
    int ret = itti_inst->send_msg(i);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
389 390 391 392
    if (0 != ret) {
      Logger::ngap().error(
          "Could not send ITTI message %s to task TASK_AMF_N11",
          i->get_msg_name());
393 394 395
    }
    return 0;
  }
396

397
  // TTN: Should be removed
398
  std::vector<PDUSessionResourceFailedToSetupItem_t> list_fail;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
399 400
  if (!pduresp->getPduSessionResourceFailedToSetupList(list_fail)) {
    Logger::ngap().error(
401 402
        "decoding PduSessionResourceSetupResponseMsg "
        "getPduSessionResourceFailedToSetupList IE  error");
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
403
  } else {
404
    PduSessionResourceSetupUnSuccessfulTransferIE* UnSuccessfultransfer =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
405
        new PduSessionResourceSetupUnSuccessfulTransferIE();
406
    uint8_t buffer[500];
407 408 409
    memcpy(
        buffer, list_fail[0].pduSessionResourceSetupUnsuccessfulTransfer.buf,
        list_fail[0].pduSessionResourceSetupUnsuccessfulTransfer.size);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
410 411 412
    UnSuccessfultransfer->decodefromIE(
        buffer, list_fail[0].pduSessionResourceSetupUnsuccessfulTransfer.size);
    Logger::ngap().debug(
413 414
        "UnSuccessfultransfer->getChoiceOfCause%d      "
        "UnSuccessfultransfer->getCause%d",
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
415 416
        UnSuccessfultransfer->getChoiceOfCause(),
        UnSuccessfultransfer->getCause());
417 418 419 420
    if ((UnSuccessfultransfer->getChoiceOfCause() ==
         Ngap_Cause_PR_radioNetwork) &&
        (UnSuccessfultransfer->getCause() ==
         Ngap_CauseRadioNetwork_multiple_PDU_session_ID_instances)) {
421
      /*Logger::ngap().debug("Sending itti pdu session resource release command
422 423
       to TASK_AMF_N2"); itti_pdu_session_resource_release_command * itti_msg =
       new itti_pdu_session_resource_release_command(TASK_NGAP, TASK_AMF_N2);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
424 425
       itti_msg->amf_ue_ngap_id = pduresp->getAmfUeNgapId();
       itti_msg->ran_ue_ngap_id = pduresp->getRanUeNgapId();
426 427 428 429
       std::shared_ptr<itti_pdu_session_resource_release_command> i =
       std::shared_ptr<itti_pdu_session_resource_release_command>(itti_msg); int
       ret = itti_inst->send_msg(i); if (0 != ret) { Logger::ngap().error("Could
       not send ITTI message %s to task TASK_AMF_N2", i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
430
       }*/
431
      long amf_ue_ngap_id = pduresp->getAmfUeNgapId();
432 433 434 435 436 437 438

      if (!amf_n1_inst->is_amf_ue_id_2_nas_context(amf_ue_ngap_id)) {
        Logger::ngap().error(
            "No UE NAS context with amf_ue_ngap_id (0x%x)", amf_ue_ngap_id);
        return -1;
      }

439
      std::shared_ptr<nas_context> nct =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
440
          amf_n1_inst->amf_ue_id_2_nas_context(amf_ue_ngap_id);
441 442
      string supi = "imsi-" + nct.get()->imsi;
      std::shared_ptr<pdu_session_context> psc;
443 444 445
      if (amf_app_inst->find_pdu_session_context(
              supi, list_fail[0].pduSessionId, psc)) {
        if (psc.get() == nullptr) {
446
          Logger::ngap().error("Cannot get pdu_session_context");
447
          return -1;
448 449 450
        }
      }
      psc.get()->isn2sm_avaliable = false;
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
451
      Logger::ngap().debug(
452
          "Receive pdu session resource setup response fail (multi pdu session "
453
          "id),set pdu session context isn2sm_avaliable = false");
454
      /*Logger::ngap().debug("Sending itti ue context release command to
455 456
       TASK_AMF_N2"); itti_ue_context_release_command * itti_msg = new
       itti_ue_context_release_command(TASK_AMF_N1, TASK_AMF_N2);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
457 458 459 460
       itti_msg->amf_ue_ngap_id = pduresp->getAmfUeNgapId();
       itti_msg->ran_ue_ngap_id = pduresp->getRanUeNgapId();
       itti_msg->cause.setChoiceOfCause(Ngap_Cause_PR_radioNetwork);
       itti_msg->cause.setValue(28);
461 462 463 464
       std::shared_ptr<itti_ue_context_release_command> i =
       std::shared_ptr<itti_ue_context_release_command>(itti_msg); int ret =
       itti_inst->send_msg(i); if (0 != ret) { Logger::ngap().error("Could not
       send ITTI message %s to task TASK_AMF_N2", i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
465
       }*/
466 467
      return 0;
    }
468
  }
469
  return 0;
470 471
}

472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
//------------------------------------------------------------------------------
int ngap_amf_handle_pdu_session_resource_modify_response(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
  Logger::ngap().debug("Handle PDU Session Resource Modify Response");

  std::unique_ptr<PduSessionResourceModifyResponseMsg> response_msg =
      std::make_unique<PduSessionResourceModifyResponseMsg>();

  if (!response_msg->decodefrompdu(message_p)) {
    Logger::ngap().error(
        "Decoding PduSessionResourceModifyResponseMsg message error");
    return -1;
  }

  // Transfer pduSessionResourceModifyResponseTransfer to SMF
  std::vector<PDUSessionResourceModifyResponseItem_t> list;
  if (!response_msg->getPduSessionResourceModifyResponseList(list)) {
    Logger::ngap().error(
        "Decoding PduSessionResourceModifyResponseMsg "
        "getPduSessionResourceModifyResponseList IE error");
    return -1;
  }

  for (auto response_item : list) {
    uint8_t buf[BUFFER_SIZE_512];
    memcpy(
        buf, response_item.pduSessionResourceModifyResponseTransfer.buf,
        response_item.pduSessionResourceModifyResponseTransfer.size);
    bstring n2sm = blk2bstr(
        buf, response_item.pduSessionResourceModifyResponseTransfer.size);
    Logger::ngap().debug(
        "Sending ITTI PDUSessionResourceModifyResponseTransfer to "
        "TASK_AMF_N11");

    std::shared_ptr<itti_nsmf_pdusession_update_sm_context> itti_msg =
        std::make_shared<itti_nsmf_pdusession_update_sm_context>(
            TASK_NGAP, TASK_AMF_N11);
    itti_msg->pdu_session_id = response_item.pduSessionId;
    itti_msg->n2sm           = n2sm;
    itti_msg->is_n2sm_set    = true;
513
    itti_msg->n2sm_info_type = "PDU_RES_MOD_RSP";
514 515 516 517 518 519 520 521 522 523 524
    itti_msg->amf_ue_ngap_id = response_msg->getAmfUeNgapId();
    itti_msg->ran_ue_ngap_id = response_msg->getRanUeNgapId();

    int ret = itti_inst->send_msg(itti_msg);
    if (0 != ret) {
      Logger::ngap().error(
          "Could not send ITTI message %s to task TASK_AMF_N11",
          itti_msg->get_msg_name());
    }
  }

525
  // TODO:for PDUSessionResourceFailedToModifyListModRes
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
526
  // TODO: process User Location Information if available
527 528 529
  return 0;
}

530
//------------------------------------------------------------------------------
531 532 533
int ngap_amf_handle_error_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
534
  Logger::ngap().debug("Sending ITTI NGAP Error Indication to TASK_AMF_N2");
535 536 537 538
  return 0;
}

//------------------------------------------------------------------------------
539 540 541
int ngap_amf_configuration_update(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
542
  Logger::ngap().debug("Sending ITTI AMF Configuration Update to TASK_AMF_N2");
543 544 545 546
  return 0;
}

//------------------------------------------------------------------------------
547 548 549
int amf_status_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
550
  Logger::ngap().debug("Sending ITTI AMF Status Indication to TASK_AMF_N2");
551 552 553 554
  return 0;
}

//------------------------------------------------------------------------------
555 556 557
int cell_traffic_trace(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
558
  Logger::ngap().debug("Sending ITTI Cell Traffic Trace to TASK_AMF_N2");
559 560 561 562
  return 0;
}

//------------------------------------------------------------------------------
563 564 565
int deactivate_trace(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
566
  Logger::ngap().debug("Sending ITTI Deactivate Trace to TASK_AMF_N2");
567 568 569 570
  return 0;
}

//------------------------------------------------------------------------------
571 572 573
int downlink_nas_transport(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
574
  Logger::ngap().debug("Sending ITTI Downlink NAS Transport to TASK_AMF_N2");
575 576 577 578
  return 0;
}

//------------------------------------------------------------------------------
579 580 581
int downlink_non_UEassociated_nrppa_transport(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
582
  Logger::ngap().debug(
583
      "Sending ITTI Downlink Non UEAssociated NRPPA Transport to TASK_AMF_N2");
584 585 586 587
  return 0;
}

//------------------------------------------------------------------------------
588 589 590
int downlink_ran_configuration_transfer(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
591
  Logger::ngap().debug(
592
      "Sending ITTI Downlink RAN Configuration Transfer to TASK_AMF_N2");
593 594 595 596
  return 0;
}

//------------------------------------------------------------------------------
597 598 599
int downlink_ran_status_transfer(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
600
  Logger::ngap().debug(
601
      "Sending ITTI Downlink RAN Status Transfer to TASK_AMF_N2");
602 603 604 605
  return 0;
}

//------------------------------------------------------------------------------
606 607 608
int downlink_ue_associated_nappa_transport(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
609
  Logger::ngap().debug(
610
      "Sending ITTI Downlink UE Associated NAPPA Transport to TASK_AMF_N2");
611 612 613 614
  return 0;
}

//------------------------------------------------------------------------------
615 616 617
int handover_cancel(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
618
  Logger::ngap().debug("Sending ITTI Handover Cancel to TASK_AMF_N2");
619 620 621 622
  return 0;
}

//------------------------------------------------------------------------------
623 624 625
int handover_preparation(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
626
  Logger::ngap().debug("Sending ITTI Handover Preparation to TASK_AMF_N2");
627
  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
628 629 630
  HandoverRequiredMsg* handover_required = new HandoverRequiredMsg();
  if (!handover_required->decodefrompdu(message_p)) {
    Logger::ngap().error("Decoding HandoverRequired message error");
631 632
    return -1;
  }
633 634
  itti_handover_required* itti_handover_requ =
      new itti_handover_required(TASK_NGAP, TASK_AMF_N2);
635 636 637
  itti_handover_requ->assoc_id    = assoc_id;
  itti_handover_requ->stream      = stream;
  itti_handover_requ->handoverReq = handover_required;
638 639
  std::shared_ptr<itti_handover_required> i =
      std::shared_ptr<itti_handover_required>(itti_handover_requ);
dukl's avatar
dukl committed
640
  int ret = itti_inst->send_msg(i);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
641
  if (0 != ret) {
642 643 644
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
645
  }
dukl's avatar
dukl committed
646 647
  return 0;
}
dukl's avatar
dukl committed
648

649
//------------------------------------------------------------------------------
650 651 652
int handover_notification(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
653
  Logger::ngap().debug("Sending ITTI Handover Notification to TASK_AMF_N2");
654
  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
655
  HandoverNotifyMsg* handoverNotify = new HandoverNotifyMsg();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
656
  if (!handoverNotify->decodefrompdu(message_p)) {
657
    Logger::ngap().error("Decoding HandoverNotify message error");
658 659
    return -1;
  }
660 661 662 663
  itti_handover_notify* itti_handover_NOTIFY =
      new itti_handover_notify(TASK_NGAP, TASK_AMF_N2);
  itti_handover_NOTIFY->assoc_id       = assoc_id;
  itti_handover_NOTIFY->stream         = stream;
664
  itti_handover_NOTIFY->handovernotify = handoverNotify;
665 666
  std::shared_ptr<itti_handover_notify> i =
      std::shared_ptr<itti_handover_notify>(itti_handover_NOTIFY);
667
  int ret = itti_inst->send_msg(i);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
668
  if (0 != ret) {
669 670 671
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
672 673 674 675 676
  }
  return 0;
}

//------------------------------------------------------------------------------
677 678 679
int handover_resource_allocation(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
680
  Logger::ngap().debug(
681
      "Sending ITTI Handover Resource Allocation to TASK_AMF_N2");
682
  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
683
  HandoverRequestAck* handoverRequestAck = new HandoverRequestAck();
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
684
  if (!handoverRequestAck->decodefrompdu(message_p)) {
685
    Logger::ngap().error("Decoding Handover Request Acknowledge message error");
686 687
    return -1;
  }
688
  itti_handover_request_Ack* itti_handover_requ_Ack =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
689
      new itti_handover_request_Ack(TASK_NGAP, TASK_AMF_N2);
690 691
  itti_handover_requ_Ack->assoc_id           = assoc_id;
  itti_handover_requ_Ack->stream             = stream;
692
  itti_handover_requ_Ack->handoverrequestAck = handoverRequestAck;
693 694
  std::shared_ptr<itti_handover_request_Ack> i =
      std::shared_ptr<itti_handover_request_Ack>(itti_handover_requ_Ack);
695
  int ret = itti_inst->send_msg(i);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
696
  if (0 != ret) {
697 698 699
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
700 701 702 703 704
  }
  return 0;
}

//------------------------------------------------------------------------------
705 706 707
int location_reporting_control(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
708
  Logger::ngap().debug(
709
      "Sending ITTI Location Reporting Control to TASK_AMF_N2");
710 711 712 713
  return 0;
}

//------------------------------------------------------------------------------
714 715 716
int location_reporting_failure_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
717
  Logger::ngap().debug(
718
      "Sending ITTI Location Reporting Failure Indication to TASK_AMF_N2");
719 720 721 722
  return 0;
}

//------------------------------------------------------------------------------
723 724 725
int location_report(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
726
  Logger::ngap().debug("Sending ITTI Location Report to TASK_AMF_N2");
727 728 729 730
  return 0;
}

//------------------------------------------------------------------------------
731 732 733
int nas_non_delivery_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
734
  Logger::ngap().debug(
735
      "Sending ITTI NAS Non Delivery Indication to TASK_AMF_N2");
736 737 738 739
  return 0;
}

//------------------------------------------------------------------------------
740 741 742
int ng_reset(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
  Logger::ngap().debug("Sending ITTI NG Reset to TASK_AMF_N2");

  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
  NGResetMsg* ngReset = new NGResetMsg();
  if (!ngReset->decodefrompdu(message_p)) {
    Logger::ngap().error("Decoding NGReset message error");
    return -1;
  }

  itti_ng_reset* itti_msg          = new itti_ng_reset(TASK_NGAP, TASK_AMF_N2);
  itti_msg->assoc_id               = assoc_id;
  itti_msg->stream                 = stream;
  itti_msg->ngReset                = ngReset;
  std::shared_ptr<itti_ng_reset> i = std::shared_ptr<itti_ng_reset>(itti_msg);
  int ret                          = itti_inst->send_msg(i);
  if (0 != ret) {
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
  }

764 765 766 767
  return 0;
}

//------------------------------------------------------------------------------
768 769 770
int overload_start(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
771
  Logger::ngap().debug("Sending ITTI Overload Start to TASK_AMF_N2");
772 773 774 775
  return 0;
}

//------------------------------------------------------------------------------
776 777 778
int overload_stop(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
779
  Logger::ngap().debug("Sending ITTI Overload Stop to TASK_AMF_N2");
780 781 782 783
  return 0;
}

//------------------------------------------------------------------------------
784 785 786
int paging(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
787
  Logger::ngap().debug("Sending ITTI Paging to TASK_AMF_N2");
788 789 790 791
  return 0;
}

//------------------------------------------------------------------------------
792 793 794
int ngap_amf_handle_path_switch_request(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
795
  Logger::ngap().debug("Sending ITTI Path Switch Request to TASK_AMF_N2");
796 797 798 799
  return 0;
}

//------------------------------------------------------------------------------
800 801 802
int pdu_session_resource_modify_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
803
  Logger::ngap().debug(
804
      "Sending ITTI PDU Session Resource Modify Indication to TASK_AMF_N2");
805 806 807 808
  return 0;
}

//------------------------------------------------------------------------------
809 810 811
int pdu_session_resource_notify(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
812
  Logger::ngap().debug(
813
      "Sending ITTI PDU Session Resource Notify to TASK_AMF_N2");
814 815 816 817
  return 0;
}

//------------------------------------------------------------------------------
818 819 820
int private_message(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
821
  Logger::ngap().debug("Sending ITTI Private Message to TASK_AMF_N2");
822 823 824 825
  return 0;
}

//------------------------------------------------------------------------------
826 827 828
int pws_cancel(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
829
  Logger::ngap().debug("Sending ITTI PWS Cancel to TASK_AMF_N2");
830 831 832 833
  return 0;
}

//------------------------------------------------------------------------------
834 835 836
int pws_failure_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
837
  Logger::ngap().debug("Sending ITTI PWS Failure Indication to TASK_AMF_N2");
838 839 840 841
  return 0;
}

//------------------------------------------------------------------------------
842 843 844
int pws_restart_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
845
  Logger::ngap().debug("Sending ITTI PWS Restart Indication to TASK_AMF_N2");
846 847 848 849
  return 0;
}

//------------------------------------------------------------------------------
850 851 852
int ran_configuration_update(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
853
  Logger::ngap().debug("Sending ITTI RAN Configuration Update to TASK_AMF_N2");
854 855 856 857
  return 0;
}

//------------------------------------------------------------------------------
858 859 860
int reroute_nas_request(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
861
  Logger::ngap().debug("Sending ITTI Reroute NAS Request to TASK_AMF_N2");
862 863 864 865
  return 0;
}

//------------------------------------------------------------------------------
866 867 868
int rrc_inactive_transition_report(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
869
  Logger::ngap().debug(
870
      "Sending ITTI RRC Inactive Transition Report to TASK_AMF_N2");
871 872 873 874
  return 0;
}

//------------------------------------------------------------------------------
875 876 877
int trace_failure_indication(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
878
  Logger::ngap().debug("Sending ITTI Trace Failure Indication to TASK_AMF_N2");
879 880 881 882
  return 0;
}

//------------------------------------------------------------------------------
883 884 885
int trace_start(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
886
  Logger::ngap().debug("Sending ITTI Trace Start to TASK_AMF_N2");
887 888 889 890
  return 0;
}

//------------------------------------------------------------------------------
891 892 893
int ue_context_modification(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
894
  Logger::ngap().debug("Sending ITTI UE Context Modification to TASK_AMF_N2");
895 896 897 898
  return 0;
}

//------------------------------------------------------------------------------
899 900 901
int ue_radio_capability_check(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
902
  Logger::ngap().debug("Sending ITTI UE Radio Capability Check to TASK_AMF_N2");
903 904 905 906
  return 0;
}

//------------------------------------------------------------------------------
907 908 909
int ue_tnla_binding_release(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
910
  Logger::ngap().debug("Sending ITTI UE TNLA Binding Release to TASK_AMF_N2");
911 912 913 914
  return 0;
}

//------------------------------------------------------------------------------
915 916 917
int uplink_non_ue_associated_nrppa_transport(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
918
  Logger::ngap().debug(
919
      "Sending ITTI Uplink Non UE Associated NRPPA Transport to TASK_AMF_N2");
920 921 922 923
  return 0;
}

//------------------------------------------------------------------------------
924 925 926
int uplink_ran_configuration_transfer(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
927
  Logger::ngap().debug(
928
      "Sending ITTI Uplink RAN Configuration Transfer to TASK_AMF_N2");
929 930 931 932
  return 0;
}

//------------------------------------------------------------------------------
933 934 935
int uplink_ran_status_transfer(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
936
  Logger::ngap().debug(
937 938
      "Sending ITTI Uplink RAN Status Transfer to TASK_AMF_N2");

939
  asn_fprint(stderr, &asn_DEF_Ngap_NGAP_PDU, message_p);
940
  UplinkRANStatusTransfer* Uplinkranstatustransfer =
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
941 942
      new UplinkRANStatusTransfer();
  if (!Uplinkranstatustransfer->defromPDU(message_p)) {
943
    Logger::ngap().error("Decoding Uplink RAN Status Transfer message error");
944 945
    return -1;
  }
946 947
  itti_uplink_ran_status_transfer* itti_uplinkran_sta_tran =
      new itti_uplink_ran_status_transfer(TASK_NGAP, TASK_AMF_N2);
948 949
  itti_uplinkran_sta_tran->assoc_id          = assoc_id;
  itti_uplinkran_sta_tran->stream            = stream;
950
  itti_uplinkran_sta_tran->uplinkrantransfer = Uplinkranstatustransfer;
951 952
  std::shared_ptr<itti_uplink_ran_status_transfer> i =
      std::shared_ptr<itti_uplink_ran_status_transfer>(itti_uplinkran_sta_tran);
953
  int ret = itti_inst->send_msg(i);
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
954
  if (0 != ret) {
955 956 957
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
958 959 960
  }
  return 0;
}
961 962

//------------------------------------------------------------------------------
963 964 965
int uplink_ue_associated_nrppa_transport(
    const sctp_assoc_id_t assoc_id, const sctp_stream_id_t stream,
    struct Ngap_NGAP_PDU* message_p) {
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
966
  Logger::ngap().debug(
967
      "Sending ITTI Uplink UE Associated NRPPA Transport to TASK_AMF_N2");
Tien-Thinh Nguyen's avatar
Tien-Thinh Nguyen committed
968 969 970 971
  return 0;
}

//------------------------------------------------------------------------------
972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
ngap_message_decoded_callback messages_callback[][3] = {
    {ngap_amf_configuration_update, ngap_amf_configuration_update,
     ngap_amf_configuration_update}, /*0 AMFConfigurationUpdate*/
    {amf_status_indication, amf_status_indication,
     amf_status_indication}, /*1 AMFStatusIndication*/
    {cell_traffic_trace, cell_traffic_trace,
     cell_traffic_trace}, /*2 CellTrafficTrace*/
    {deactivate_trace, deactivate_trace,
     deactivate_trace}, /*3 DeactivateTrace*/
    {downlink_nas_transport, downlink_nas_transport,
     downlink_nas_transport}, /*4 DownlinkNASTransport*/
    {downlink_non_UEassociated_nrppa_transport,
     downlink_non_UEassociated_nrppa_transport,
     downlink_non_UEassociated_nrppa_transport}, /*5
                                                    DownlinkNonUEAssociatedNRPPaTransport*/
    {downlink_ran_configuration_transfer, downlink_ran_configuration_transfer,
     downlink_ran_configuration_transfer}, /*6
                                              DownlinkRANConfigurationTransfer*/
    {downlink_ran_status_transfer, downlink_ran_status_transfer,
     downlink_ran_status_transfer}, /*7 DownlinkRANStatusTransfer*/
    {downlink_ue_associated_nappa_transport,
     downlink_ue_associated_nappa_transport,
     downlink_ue_associated_nappa_transport}, /*8
                                                 DownlinkUEAssociatedNRPPaTransport*/
    {ngap_amf_handle_error_indication, 0,
     0},  // 9 {ngap_amf_handle_error_indication,0,0}, /*ErrorIndication*/
    {handover_cancel, handover_cancel, handover_cancel}, /*10 HandoverCancel*/
    {handover_notification, handover_notification,
     handover_notification}, /*11 HandoverNotification*/
    {handover_preparation, handover_preparation,
     handover_preparation}, /*12 HandoverPreparation*/
    {handover_resource_allocation, handover_resource_allocation,
     handover_resource_allocation}, /*13 HandoverResourceAllocation*/
    {0, ngap_amf_handle_initial_context_setup_response,
     ngap_amf_handle_initial_context_setup_failure}, /*InitialContextSetup*/
    {ngap_amf_handle_initial_ue_message, 0,
     0},  // 15 {ngap_amf_handle_initial_ue_message,0,0}, /*InitialUEMessage*/
    {location_reporting_control, location_reporting_control,
     location_reporting_control}, /*16 LocationReportingControl*/
    {location_reporting_failure_indication,
     location_reporting_failure_indication,
     location_reporting_failure_indication},             /*17
                                                            LocationReportingFailureIndication*/
    {location_report, location_report, location_report}, /*18 LocationReport*/
    {nas_non_delivery_indication, nas_non_delivery_indication,
     nas_non_delivery_indication},            /*19 NASNonDeliveryIndication*/
    {ng_reset, ng_reset, ng_reset},           /*20 NGReset*/
    {ngap_amf_handle_ng_setup_request, 0, 0}, /*21 NGSetup*/
    {overload_start, overload_start, overload_start}, /*OverloadStart*/
    {overload_stop, overload_stop, overload_stop},    /*OverloadStop*/
    {paging, paging, paging},                         /*Paging*/
    {ngap_amf_handle_path_switch_request, ngap_amf_handle_path_switch_request,
1024
     ngap_amf_handle_path_switch_request}, /*PathSwitchRequest*/
1025 1026
    {0, ngap_amf_handle_pdu_session_resource_modify_response,
     0}, /*PDUSessionResourceModify*/
1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
    {pdu_session_resource_modify_indication,
     pdu_session_resource_modify_indication,
     pdu_session_resource_modify_indication}, /*PDUSessionResourceModifyIndication*/
    {0, ngap_amf_handle_pdu_session_resource_release_response,
     0}, /*PDUSessionResourceRelease*/
    {0, ngap_amf_handle_pdu_session_resource_setup_response,
     0}, /*PDUSessionResourceSetup*/
    {pdu_session_resource_notify, pdu_session_resource_notify,
     pdu_session_resource_notify}, /*PDUSessionResourceNotify*/
    {private_message, private_message, private_message}, /*PrivateMessage*/
    {pws_cancel, pws_cancel, pws_cancel},                /*PWSCancel*/
    {pws_failure_indication, pws_failure_indication,
     pws_failure_indication}, /*PWSFailureIndication*/
    {pws_restart_indication, pws_restart_indication,
     pws_restart_indication}, /*PWSRestartIndication*/
    {ran_configuration_update, ran_configuration_update,
     ran_configuration_update}, /*RANConfigurationUpdate*/
    {reroute_nas_request, reroute_nas_request,
     reroute_nas_request}, /*RerouteNASRequest*/
    {rrc_inactive_transition_report, rrc_inactive_transition_report,
     rrc_inactive_transition_report}, /*RRCInactiveTransitionReport*/
    {trace_failure_indication, trace_failure_indication,
     trace_failure_indication},              /*TraceFailureIndication*/
    {trace_start, trace_start, trace_start}, /*TraceStart*/
    {ue_context_modification, ue_context_modification,
     ue_context_modification}, /*UEContextModification*/
    {0, ngap_amf_handle_ue_context_release_complete, 0}, /*UEContextRelease*/
    {ngap_amf_handle_ue_context_release_request, 0,
     0}, /*UEContextReleaseRequest*/
    {ue_radio_capability_check, ue_radio_capability_check,
     ue_radio_capability_check}, /*UERadioCapabilityCheck*/
    {ngap_amf_handle_ue_radio_cap_indication, 0,
     0}, /*UERadioCapabilityInfoIndication*/
    {ue_tnla_binding_release, ue_tnla_binding_release,
     ue_tnla_binding_release}, /*UETNLABindingRelease*/
    {ngap_amf_handle_uplink_nas_transport, 0,
     0},  //{ngap_amf_handle_uplink_nas_transport,0,0}, /*UplinkNASTransport*/
    {uplink_non_ue_associated_nrppa_transport,
     uplink_non_ue_associated_nrppa_transport,
     uplink_non_ue_associated_nrppa_transport}, /*UplinkNonUEAssociatedNRPPaTransport*/
    {uplink_ran_configuration_transfer, uplink_ran_configuration_transfer,
     uplink_ran_configuration_transfer}, /*UplinkRANConfigurationTransfer*/
    {uplink_ran_status_transfer, uplink_ran_status_transfer,
     uplink_ran_status_transfer}, /*UplinkRANStatusTransfer*/
    {uplink_ue_associated_nrppa_transport, uplink_ue_associated_nrppa_transport,
     uplink_ue_associated_nrppa_transport}, /*UplinkUEAssociatedNRPPaTransport*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0},                              /*WriteReplaceWarning*/
    {0, 0, 0}                               /*WriteReplaceWarning*/

};
1084

1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107
//------------------------------------------------------------------------------
void ngap_sctp_shutdown(const sctp_assoc_id_t assoc_id) {
  Logger::ngap().debug("Sending ITTI SCTP Shutdown event to TASK_AMF_N2");

  itti_ng_shutdown* itti_msg = new itti_ng_shutdown(TASK_NGAP, TASK_AMF_N2);
  itti_msg->assoc_id         = assoc_id;
  std::shared_ptr<itti_ng_shutdown> i =
      std::shared_ptr<itti_ng_shutdown>(itti_msg);
  int ret = itti_inst->send_msg(i);
  if (0 != ret) {
    Logger::ngap().error(
        "Could not send ITTI message %s to task TASK_AMF_N2",
        i->get_msg_name());
  }
  return;
}

//------------------------------------------------------------------------------
ngap_event_callback events_callback[][1] = {
    {ngap_sctp_shutdown},
    {0} /*reserved*/
};

1108
#endif