ngap_gNB_nas_procedures.c 103 KB
Newer Older
zhenghuangkun's avatar
zhenghuangkun committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
/*
 * 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
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.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_gNB_nas_procedures.c
 * \brief NGAP eNb NAS procedure handler
 * \author  S. Roux and Navid Nikaein
 * \date 2010 - 2015
 * \email: navid.nikaein@eurecom.fr
 * \version 1.0
 * @ingroup _ngap
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#include "assertions.h"
#include "conversions.h"

#include "intertask_interface.h"

#include "ngap_common.h"
#include "ngap_gNB_defs.h"

#include "ngap_gNB_itti_messaging.h"

#include "ngap_gNB_encoder.h"
#include "ngap_gNB_nnsf.h"
#include "ngap_gNB_ue_context.h"
#include "ngap_gNB_nas_procedures.h"
#include "ngap_gNB_management_procedures.h"
#include "msc.h"

//------------------------------------------------------------------------------
int ngap_gNB_handle_nas_first_req(
    instance_t instance, ngap_nas_first_req_t *ngap_nas_first_req_p)
//------------------------------------------------------------------------------
{
    ngap_gNB_instance_t          *instance_p = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
57
    struct ngap_gNB_amf_data_s   *amf_desc_p = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
58 59 60 61
    struct ngap_gNB_ue_context_s *ue_desc_p  = NULL;
    NGAP_NGAP_PDU_t               pdu;
    NGAP_InitialUEMessage_t      *out;
    NGAP_InitialUEMessage_IEs_t  *ie;
zhenghuangkun's avatar
zhenghuangkun committed
62
    NGAP_UserLocationInformationNR_t *userinfo_nr_p = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
63 64 65 66 67 68 69 70
    uint8_t  *buffer = NULL;
    uint32_t  length = 0;
    DevAssert(ngap_nas_first_req_p != NULL);
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    instance_p = ngap_gNB_get_instance(instance);
    DevAssert(instance_p != NULL);
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
zhenghuangkun's avatar
zhenghuangkun committed
71
    pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_InitialUEMessage;
zhenghuangkun's avatar
zhenghuangkun committed
72 73 74 75
    pdu.choice.initiatingMessage.criticality = NGAP_Criticality_ignore;
    pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_InitialUEMessage;
    out = &pdu.choice.initiatingMessage.value.choice.InitialUEMessage;

zhenghuangkun's avatar
zhenghuangkun committed
76
    /* Select the AMF corresponding to the provided GUAMI. */
zhenghuangkun's avatar
zhenghuangkun committed
77
    if (ngap_nas_first_req_p->ue_identity.presenceMask & NGAP_UE_IDENTITIES_guami) {
zhenghuangkun's avatar
zhenghuangkun committed
78
        amf_desc_p = ngap_gNB_nnsf_select_amf_by_guami(
zhenghuangkun's avatar
zhenghuangkun committed
79 80
                         instance_p,
                         ngap_nas_first_req_p->establishment_cause,
zhenghuangkun's avatar
zhenghuangkun committed
81
                         ngap_nas_first_req_p->ue_identity.guami);
zhenghuangkun's avatar
zhenghuangkun committed
82

zhenghuangkun's avatar
zhenghuangkun committed
83
        if (amf_desc_p) {
zhenghuangkun's avatar
zhenghuangkun committed
84
            NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through GUAMI MCC %d MNC %d AMFRI %d AMFSI %d AMFPT %d\n",
zhenghuangkun's avatar
zhenghuangkun committed
85
                      instance,
zhenghuangkun's avatar
zhenghuangkun committed
86 87 88 89
                      amf_desc_p->amf_name,
                      amf_desc_p->assoc_id,
                      ngap_nas_first_req_p->ue_identity.guami.mcc,
                      ngap_nas_first_req_p->ue_identity.guami.mnc,
zhenghuangkun's avatar
zhenghuangkun committed
90 91 92
                      ngap_nas_first_req_p->ue_identity.guami.amf_region_id,
                      ngap_nas_first_req_p->ue_identity.guami.amf_set_id,
                      ngap_nas_first_req_p->ue_identity.guami.amf_pointer);
zhenghuangkun's avatar
zhenghuangkun committed
93 94 95
        }
    }

zhenghuangkun's avatar
zhenghuangkun committed
96 97
    if (amf_desc_p == NULL) {
        /* Select the AMF corresponding to the provided s-TMSI. */
zhenghuangkun's avatar
zhenghuangkun committed
98 99
        if (ngap_nas_first_req_p->ue_identity.presenceMask & NGAP_UE_IDENTITIES_FiveG_s_tmsi) {
            amf_desc_p = ngap_gNB_nnsf_select_amf_by_amf_setid(
zhenghuangkun's avatar
zhenghuangkun committed
100 101 102
                             instance_p,
                             ngap_nas_first_req_p->establishment_cause,
                             ngap_nas_first_req_p->selected_plmn_identity,
zhenghuangkun's avatar
zhenghuangkun committed
103
                             ngap_nas_first_req_p->ue_identity.s_tmsi.amf_set_id);
zhenghuangkun's avatar
zhenghuangkun committed
104

zhenghuangkun's avatar
zhenghuangkun committed
105
            if (amf_desc_p) {
zhenghuangkun's avatar
zhenghuangkun committed
106
                NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through S-TMSI AMFSI %d and selected PLMN Identity index %d MCC %d MNC %d\n",
zhenghuangkun's avatar
zhenghuangkun committed
107
                          instance,
zhenghuangkun's avatar
zhenghuangkun committed
108 109
                          amf_desc_p->amf_name,
                          amf_desc_p->assoc_id,
zhenghuangkun's avatar
zhenghuangkun committed
110
                          ngap_nas_first_req_p->ue_identity.s_tmsi.amf_set_id,
zhenghuangkun's avatar
zhenghuangkun committed
111 112 113 114 115 116 117
                          ngap_nas_first_req_p->selected_plmn_identity,
                          instance_p->mcc[ngap_nas_first_req_p->selected_plmn_identity],
                          instance_p->mnc[ngap_nas_first_req_p->selected_plmn_identity]);
            }
        }
    }

zhenghuangkun's avatar
zhenghuangkun committed
118 119
    if (amf_desc_p == NULL) {
        /* Select AMF based on the selected PLMN identity, received through RRC
zhenghuangkun's avatar
zhenghuangkun committed
120
         * Connection Setup Complete */
zhenghuangkun's avatar
zhenghuangkun committed
121
        amf_desc_p = ngap_gNB_nnsf_select_amf_by_plmn_id(
zhenghuangkun's avatar
zhenghuangkun committed
122 123 124 125
                         instance_p,
                         ngap_nas_first_req_p->establishment_cause,
                         ngap_nas_first_req_p->selected_plmn_identity);

zhenghuangkun's avatar
zhenghuangkun committed
126 127
        if (amf_desc_p) {
            NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through selected PLMN Identity index %d MCC %d MNC %d\n",
zhenghuangkun's avatar
zhenghuangkun committed
128
                      instance,
zhenghuangkun's avatar
zhenghuangkun committed
129 130
                      amf_desc_p->amf_name,
                      amf_desc_p->assoc_id,
zhenghuangkun's avatar
zhenghuangkun committed
131 132 133 134 135 136
                      ngap_nas_first_req_p->selected_plmn_identity,
                      instance_p->mcc[ngap_nas_first_req_p->selected_plmn_identity],
                      instance_p->mnc[ngap_nas_first_req_p->selected_plmn_identity]);
        }
    }

zhenghuangkun's avatar
zhenghuangkun committed
137
    if (amf_desc_p == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
138
        /*
zhenghuangkun's avatar
zhenghuangkun committed
139 140
         * If no AMF corresponds to the GUAMI, the s-TMSI, or the selected PLMN
         * identity, selects the AMF with the highest capacity.
zhenghuangkun's avatar
zhenghuangkun committed
141
         */
zhenghuangkun's avatar
zhenghuangkun committed
142
        amf_desc_p = ngap_gNB_nnsf_select_amf(
zhenghuangkun's avatar
zhenghuangkun committed
143 144 145
                         instance_p,
                         ngap_nas_first_req_p->establishment_cause);

zhenghuangkun's avatar
zhenghuangkun committed
146 147
        if (amf_desc_p) {
            NGAP_INFO("[gNB %d] Chose AMF '%s' (assoc_id %d) through highest relative capacity\n",
zhenghuangkun's avatar
zhenghuangkun committed
148
                      instance,
zhenghuangkun's avatar
zhenghuangkun committed
149 150
                      amf_desc_p->amf_name,
                      amf_desc_p->assoc_id);
zhenghuangkun's avatar
zhenghuangkun committed
151 152 153
        }
    }

zhenghuangkun's avatar
zhenghuangkun committed
154
    if (amf_desc_p == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
155
        /*
zhenghuangkun's avatar
zhenghuangkun committed
156
         * In case gNB has no AMF associated, the gNB should inform RRC and discard
zhenghuangkun's avatar
zhenghuangkun committed
157 158
         * this request.
         */
zhenghuangkun's avatar
zhenghuangkun committed
159
        NGAP_WARN("No AMF is associated to the gNB\n");
zhenghuangkun's avatar
zhenghuangkun committed
160 161 162 163 164 165 166 167 168
        // TODO: Inform RRC
        return -1;
    }

    /* The gNB should allocate a unique gNB UE NGAP ID for this UE. The value
     * will be used for the duration of the connectivity.
     */
    ue_desc_p = ngap_gNB_allocate_new_UE_context();
    DevAssert(ue_desc_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
169 170
    /* Keep a reference to the selected AMF */
    ue_desc_p->amf_ref       = amf_desc_p;
zhenghuangkun's avatar
zhenghuangkun committed
171 172 173 174 175 176 177
    ue_desc_p->ue_initial_id = ngap_nas_first_req_p->ue_initial_id;
    ue_desc_p->gNB_instance  = instance_p;
    ue_desc_p->selected_plmn_identity = ngap_nas_first_req_p->selected_plmn_identity;

    do {
        struct ngap_gNB_ue_context_s *collision_p;
        /* Peek a random value for the gNB_ue_ngap_id */
zhenghuangkun's avatar
zhenghuangkun committed
178
        ue_desc_p->gNB_ue_ngap_id = (random() + random()) & 0xffffffff;
zhenghuangkun's avatar
zhenghuangkun committed
179 180 181

        if ((collision_p = RB_INSERT(ngap_ue_map, &instance_p->ngap_ue_head, ue_desc_p))
                == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
182
            NGAP_DEBUG("Found usable gNB_ue_ngap_id: 0x%08x %u(10)\n",
zhenghuangkun's avatar
zhenghuangkun committed
183 184 185 186 187 188 189 190 191
                       ue_desc_p->gNB_ue_ngap_id,
                       ue_desc_p->gNB_ue_ngap_id);
            /* Break the loop as the id is not already used by another UE */
            break;
        }
    } while(1);

    /* mandatory */
    ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
192
    ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
193
    ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
194 195
    ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_RAN_UE_NGAP_ID;
    ie->value.choice.RAN_UE_NGAP_ID = ue_desc_p->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU;
    ie->criticality = NGAP_Criticality_reject;
    ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_NAS_PDU;
#if 1
    ie->value.choice.NAS_PDU.buf = ngap_nas_first_req_p->nas_pdu.buffer;
#else
    ie->value.choice.NAS_PDU.buf = malloc(ngap_nas_first_req_p->nas_pdu.length);
    memcpy(ie->value.choice.NAS_PDU.buf,
           ngap_nas_first_req_p->nas_pdu.buffer,
           ngap_nas_first_req_p->nas_pdu.length);
#endif
    ie->value.choice.NAS_PDU.size = ngap_nas_first_req_p->nas_pdu.length;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
zhenghuangkun's avatar
zhenghuangkun committed
212
    
zhenghuangkun's avatar
zhenghuangkun committed
213 214
    /* mandatory */
    ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
215
    ie->id = NGAP_ProtocolIE_ID_id_UserLocationInformation;
zhenghuangkun's avatar
zhenghuangkun committed
216
    ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
217 218 219 220 221 222 223
    ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_UserLocationInformation;

    ie->value.choice.UserLocationInformation.present = NGAP_UserLocationInformation_PR_userLocationInformationNR;

    userinfo_nr_p = &ie->value.choice.UserLocationInformation.choice.userLocationInformationNR;

    /* Set nRCellIdentity. default userLocationInformationNR */
zhenghuangkun's avatar
zhenghuangkun committed
224
    MACRO_GNB_ID_TO_CELL_IDENTITY(instance_p->gNB_id,
zhenghuangkun's avatar
zhenghuangkun committed
225 226
                                      0, // Cell ID
                                      &userinfo_nr_p->nR_CGI.nRCellIdentity);
zhenghuangkun's avatar
zhenghuangkun committed
227 228 229
    MCC_MNC_TO_TBCD(instance_p->mcc[ue_desc_p->selected_plmn_identity],
                    instance_p->mnc[ue_desc_p->selected_plmn_identity],
                    instance_p->mnc_digit_length[ue_desc_p->selected_plmn_identity],
zhenghuangkun's avatar
zhenghuangkun committed
230 231 232 233 234 235 236 237 238
                    &userinfo_nr_p->nR_CGI.pLMNIdentity);

    /* Set TAI */
    INT24_TO_OCTET_STRING(instance_p->tac, &userinfo_nr_p->tAI.tAC);
    MCC_MNC_TO_PLMNID(instance_p->mcc[ue_desc_p->selected_plmn_identity],
                      instance_p->mnc[ue_desc_p->selected_plmn_identity],
                      instance_p->mnc_digit_length[ue_desc_p->selected_plmn_identity],
                      &userinfo_nr_p->tAI.pLMNIdentity);

zhenghuangkun's avatar
zhenghuangkun committed
239
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
zhenghuangkun's avatar
zhenghuangkun committed
240 241


zhenghuangkun's avatar
zhenghuangkun committed
242
    /* Set the establishment cause according to those provided by RRC */
zhenghuangkun's avatar
zhenghuangkun committed
243 244 245
    DevCheck(ngap_nas_first_req_p->establishment_cause < NGAP_RRC_CAUSE_LAST,
             ngap_nas_first_req_p->establishment_cause, NGAP_RRC_CAUSE_LAST, 0);
    
zhenghuangkun's avatar
zhenghuangkun committed
246 247
    /* mandatory */
    ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
248
    ie->id = NGAP_ProtocolIE_ID_id_RRCEstablishmentCause;
zhenghuangkun's avatar
zhenghuangkun committed
249
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
250 251
    ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_RRCEstablishmentCause;
    ie->value.choice.RRCEstablishmentCause = ngap_nas_first_req_p->establishment_cause;
zhenghuangkun's avatar
zhenghuangkun committed
252 253 254
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
255 256
    if (ngap_nas_first_req_p->ue_identity.presenceMask & NGAP_UE_IDENTITIES_FiveG_s_tmsi) {
        NGAP_DEBUG("FIVEG_S_TMSI_PRESENT\n");
zhenghuangkun's avatar
zhenghuangkun committed
257
        ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
258
        ie->id = NGAP_ProtocolIE_ID_id_FiveG_S_TMSI;
zhenghuangkun's avatar
zhenghuangkun committed
259
        ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
260 261 262 263 264
        ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_FiveG_S_TMSI;
        AMF_SETID_TO_BIT_STRING(ngap_nas_first_req_p->ue_identity.s_tmsi.amf_set_id,
                                 &ie->value.choice.FiveG_S_TMSI.aMFSetID);
        AMF_SETID_TO_BIT_STRING(ngap_nas_first_req_p->ue_identity.s_tmsi.amf_pointer,
                                 &ie->value.choice.FiveG_S_TMSI.aMFPointer);
zhenghuangkun's avatar
zhenghuangkun committed
265
        M_TMSI_TO_OCTET_STRING(ngap_nas_first_req_p->ue_identity.s_tmsi.m_tmsi,
zhenghuangkun's avatar
zhenghuangkun committed
266
                                 &ie->value.choice.FiveG_S_TMSI.fiveG_TMSI);
zhenghuangkun's avatar
zhenghuangkun committed
267 268 269 270 271
        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }


    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
272 273 274 275 276 277
    ie = (NGAP_InitialUEMessage_IEs_t *)calloc(1, sizeof(NGAP_InitialUEMessage_IEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_UEContextRequest;
    ie->criticality = NGAP_Criticality_ignore;
    ie->value.present = NGAP_InitialUEMessage_IEs__value_PR_UEContextRequest;
    ie->value.choice.UEContextRequest = NGAP_UEContextRequest_requested;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
zhenghuangkun's avatar
zhenghuangkun committed
278 279 280 281 282 283 284 285 286 287


    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        /* Failed to encode message */
        DevMessage("Failed to encode initial UE message\n");
    }

    /* Update the current NGAP UE state */
    ue_desc_p->ue_state = NGAP_UE_WAITING_CSR;
    /* Assign a stream for this UE :
zhenghuangkun's avatar
zhenghuangkun committed
288
     * From 3GPP 38.412 7)Transport layers:
zhenghuangkun's avatar
zhenghuangkun committed
289
     *  Within the SCTP association established between one AMF and gNB pair:
zhenghuangkun's avatar
zhenghuangkun committed
290 291 292 293 294 295 296 297 298
     *  - a single pair of stream identifiers shall be reserved for the sole use
     *      of NGAP elementary procedures that utilize non UE-associated signalling.
     *  - At least one pair of stream identifiers shall be reserved for the sole use
     *      of NGAP elementary procedures that utilize UE-associated signallings.
     *      However a few pairs (i.e. more than one) should be reserved.
     *  - A single UE-associated signalling shall use one SCTP stream and
     *      the stream should not be changed during the communication of the
     *      UE-associated signalling.
     */
zhenghuangkun's avatar
zhenghuangkun committed
299
    amf_desc_p->nextstream = (amf_desc_p->nextstream + 1) % amf_desc_p->out_streams;
zhenghuangkun's avatar
zhenghuangkun committed
300

zhenghuangkun's avatar
zhenghuangkun committed
301 302
    if ((amf_desc_p->nextstream == 0) && (amf_desc_p->out_streams > 1)) {
        amf_desc_p->nextstream += 1;
zhenghuangkun's avatar
zhenghuangkun committed
303 304
    }

zhenghuangkun's avatar
zhenghuangkun committed
305
    ue_desc_p->tx_stream = amf_desc_p->nextstream;
zhenghuangkun's avatar
zhenghuangkun committed
306 307
    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
308
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
309 310 311 312 313 314
        (const char *)NULL,
        0,
        MSC_AS_TIME_FMT" initialUEMessage initiatingMessage gNB_ue_ngap_id %u",
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
        ue_desc_p->gNB_ue_ngap_id);
    /* Send encoded message over sctp */
zhenghuangkun's avatar
zhenghuangkun committed
315
    ngap_gNB_itti_send_sctp_data_req(instance_p->instance, amf_desc_p->assoc_id,
zhenghuangkun's avatar
zhenghuangkun committed
316
                                     buffer, length, ue_desc_p->tx_stream);
317

zhenghuangkun's avatar
zhenghuangkun committed
318 319 320 321 322 323 324 325 326
    return 0;
}

//------------------------------------------------------------------------------
int ngap_gNB_handle_nas_downlink(uint32_t         assoc_id,
                                 uint32_t         stream,
                                 NGAP_NGAP_PDU_t *pdu)
//------------------------------------------------------------------------------
{
327

zhenghuangkun's avatar
zhenghuangkun committed
328
    ngap_gNB_amf_data_t             *amf_desc_p        = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
329 330 331 332
    ngap_gNB_ue_context_t           *ue_desc_p         = NULL;
    ngap_gNB_instance_t             *ngap_gNB_instance = NULL;
    NGAP_DownlinkNASTransport_t     *container;
    NGAP_DownlinkNASTransport_IEs_t *ie;
333 334
    NGAP_RAN_UE_NGAP_ID_t            gnb_ue_ngap_id;
    uint64_t                         amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
335 336 337 338 339 340 341 342 343
    DevAssert(pdu != NULL);

    /* UE-related procedure -> stream != 0 */
    if (stream == 0) {
        NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream == 0\n",
                   assoc_id);
        return -1;
    }

zhenghuangkun's avatar
zhenghuangkun committed
344
    if ((amf_desc_p = ngap_gNB_get_AMF(NULL, assoc_id, 0)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
345
        NGAP_ERROR(
zhenghuangkun's avatar
zhenghuangkun committed
346
            "[SCTP %d] Received NAS downlink message for non existing AMF context\n",
zhenghuangkun's avatar
zhenghuangkun committed
347 348 349 350
            assoc_id);
        return -1;
    }

zhenghuangkun's avatar
zhenghuangkun committed
351
    ngap_gNB_instance = amf_desc_p->ngap_gNB_instance;
zhenghuangkun's avatar
zhenghuangkun committed
352 353 354
    /* Prepare the NGAP message to encode */
    container = &pdu->choice.initiatingMessage.value.choice.DownlinkNASTransport;
    NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNASTransport_IEs_t, ie, container,
zhenghuangkun's avatar
zhenghuangkun committed
355
                               NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID, true);
356 357
    asn_INTEGER2ulong(&(ie->value.choice.AMF_UE_NGAP_ID), &amf_ue_ngap_id);

zhenghuangkun's avatar
zhenghuangkun committed
358 359

    NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNASTransport_IEs_t, ie, container,
360 361
                               NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID, true);
    gnb_ue_ngap_id = ie->value.choice.RAN_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
362 363

    if ((ue_desc_p = ngap_gNB_get_ue_context(ngap_gNB_instance,
364
                     gnb_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
365 366
        MSC_LOG_RX_DISCARDED_MESSAGE(
            MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
367
            MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
368 369
            NULL,
            0,
zhenghuangkun's avatar
zhenghuangkun committed
370
            MSC_AS_TIME_FMT" downlinkNASTransport  gNB_ue_ngap_id %u amf_ue_ngap_id %u",
371
            gnb_ue_ngap_id,
zhenghuangkun's avatar
zhenghuangkun committed
372
            amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
373 374
        NGAP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context gNB_UE_NGAP_ID: 0x%lx\n",
                   assoc_id,
375
                   gnb_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
376 377 378 379 380 381 382 383 384 385 386
        return -1;
    }

    if (0 == ue_desc_p->rx_stream) {
        ue_desc_p->rx_stream = stream;
    } else if (stream != ue_desc_p->rx_stream) {
        NGAP_ERROR("[SCTP %d] Received UE-related procedure on stream %u, expecting %u\n",
                   assoc_id, stream, ue_desc_p->rx_stream);
        return -1;
    }

zhenghuangkun's avatar
zhenghuangkun committed
387
    /* Is it the first outcome of the AMF for this UE ? If so store the amf
zhenghuangkun's avatar
zhenghuangkun committed
388 389
     * UE ngap id.
     */
zhenghuangkun's avatar
zhenghuangkun committed
390 391
    if (ue_desc_p->amf_ue_ngap_id == 0) {
        ue_desc_p->amf_ue_ngap_id = amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
392
    } else {
zhenghuangkun's avatar
zhenghuangkun committed
393 394
        /* We already have a amf ue ngap id check the received is the same */
        if (ue_desc_p->amf_ue_ngap_id != amf_ue_ngap_id) {
395
            NGAP_ERROR("[SCTP %d] Mismatch in AMF UE NGAP ID (0x%lx != 0x%"PRIx64"\n",
zhenghuangkun's avatar
zhenghuangkun committed
396
                       assoc_id,
zhenghuangkun's avatar
zhenghuangkun committed
397
                       amf_ue_ngap_id,
398
                       (uint64_t)ue_desc_p->amf_ue_ngap_id
zhenghuangkun's avatar
zhenghuangkun committed
399 400 401 402 403 404 405
                      );
            return -1;
        }
    }

    MSC_LOG_RX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
406
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
407 408
        NULL,
        0,
zhenghuangkun's avatar
zhenghuangkun committed
409
        MSC_AS_TIME_FMT" downlinkNASTransport  gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
410
        assoc_id,
zhenghuangkun's avatar
zhenghuangkun committed
411
        amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
412 413 414

    NGAP_FIND_PROTOCOLIE_BY_ID(NGAP_DownlinkNASTransport_IEs_t, ie, container,
                               NGAP_ProtocolIE_ID_id_NAS_PDU, true);
415
    /* Forward the NAS PDU to NR-RRC */
zhenghuangkun's avatar
zhenghuangkun committed
416 417 418 419 420
    ngap_gNB_itti_send_nas_downlink_ind(ngap_gNB_instance->instance,
                                        ue_desc_p->ue_initial_id,
                                        ue_desc_p->gNB_ue_ngap_id,
                                        ie->value.choice.NAS_PDU.buf,
                                        ie->value.choice.NAS_PDU.size);
421

zhenghuangkun's avatar
zhenghuangkun committed
422 423 424 425 426 427 428 429 430 431 432 433
    return 0;
}

//------------------------------------------------------------------------------
int ngap_gNB_nas_uplink(instance_t instance, ngap_uplink_nas_t *ngap_uplink_nas_p)
//------------------------------------------------------------------------------
{
    struct ngap_gNB_ue_context_s  *ue_context_p;
    ngap_gNB_instance_t           *ngap_gNB_instance_p;
    NGAP_NGAP_PDU_t                pdu;
    NGAP_UplinkNASTransport_t     *out;
    NGAP_UplinkNASTransport_IEs_t *ie;
434
    NGAP_UserLocationInformationNR_t *userinfo_nr_p = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
435 436 437 438 439 440 441 442 443
    uint8_t  *buffer;
    uint32_t  length;
    DevAssert(ngap_uplink_nas_p != NULL);
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p, ngap_uplink_nas_p->gNB_ue_ngap_id)) == NULL) {
        /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
444
        NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %08x\n",
zhenghuangkun's avatar
zhenghuangkun committed
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
                  ngap_uplink_nas_p->gNB_ue_ngap_id);
        return -1;
    }

    /* Uplink NAS transport can occur either during an ngap connected state
     * or during initial attach (for example: NAS authentication).
     */
    if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
            ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
        NGAP_WARN("You are attempting to send NAS data over non-connected "
                  "gNB ue ngap id: %u, current state: %d\n",
                  ngap_uplink_nas_p->gNB_ue_ngap_id, ue_context_p->ue_state);
        return -1;
    }

    /* Prepare the NGAP message to encode */
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
463
    pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_UplinkNASTransport;
zhenghuangkun's avatar
zhenghuangkun committed
464 465 466 467 468
    pdu.choice.initiatingMessage.criticality = NGAP_Criticality_ignore;
    pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_UplinkNASTransport;
    out = &pdu.choice.initiatingMessage.value.choice.UplinkNASTransport;
    /* mandatory */
    ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
469
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
470
    ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
471
    ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_AMF_UE_NGAP_ID;
472 473
    //ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
    asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
474 475 476
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
477
    ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
478
    ie->criticality = NGAP_Criticality_reject;
479 480
    ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_RAN_UE_NGAP_ID;
    ie->value.choice.RAN_UE_NGAP_ID = ue_context_p->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
481 482 483 484 485 486 487 488 489 490 491
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU;
    ie->criticality = NGAP_Criticality_reject;
    ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_NAS_PDU;
    ie->value.choice.NAS_PDU.buf = ngap_uplink_nas_p->nas_pdu.buffer;
    ie->value.choice.NAS_PDU.size = ngap_uplink_nas_p->nas_pdu.length;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_UplinkNASTransport_IEs_t *)calloc(1, sizeof(NGAP_UplinkNASTransport_IEs_t));
492
    ie->id = NGAP_ProtocolIE_ID_id_UserLocationInformation;
zhenghuangkun's avatar
zhenghuangkun committed
493
    ie->criticality = NGAP_Criticality_ignore;
494 495 496 497 498 499
    ie->value.present = NGAP_UplinkNASTransport_IEs__value_PR_UserLocationInformation;

    ie->value.choice.UserLocationInformation.present = NGAP_UserLocationInformation_PR_userLocationInformationNR;
    userinfo_nr_p = &ie->value.choice.UserLocationInformation.choice.userLocationInformationNR;

    /* Set nRCellIdentity. default userLocationInformationNR */
zhenghuangkun's avatar
zhenghuangkun committed
500
    MACRO_GNB_ID_TO_CELL_IDENTITY(ngap_gNB_instance_p->gNB_id,
501 502 503 504 505 506 507 508 509 510 511 512 513 514
                                      0, // Cell ID
                                      &userinfo_nr_p->nR_CGI.nRCellIdentity);
    MCC_MNC_TO_TBCD(ngap_gNB_instance_p->mcc[ue_context_p->selected_plmn_identity],
                    ngap_gNB_instance_p->mnc[ue_context_p->selected_plmn_identity],
                    ngap_gNB_instance_p->mnc_digit_length[ue_context_p->selected_plmn_identity],
                    &userinfo_nr_p->nR_CGI.pLMNIdentity);

    /* Set TAI */
    INT24_TO_OCTET_STRING(ngap_gNB_instance_p->tac, &userinfo_nr_p->tAI.tAC);
    MCC_MNC_TO_PLMNID(ngap_gNB_instance_p->mcc[ue_context_p->selected_plmn_identity],
                      ngap_gNB_instance_p->mnc[ue_context_p->selected_plmn_identity],
                      ngap_gNB_instance_p->mnc_digit_length[ue_context_p->selected_plmn_identity],
                      &userinfo_nr_p->tAI.pLMNIdentity);

zhenghuangkun's avatar
zhenghuangkun committed
515

516
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
zhenghuangkun's avatar
zhenghuangkun committed
517 518 519 520 521 522 523 524 525

    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        NGAP_ERROR("Failed to encode uplink NAS transport\n");
        /* Encode procedure has failed... */
        return -1;
    }

    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
526
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
527 528
        (const char *)NULL,
        0,
zhenghuangkun's avatar
zhenghuangkun committed
529
        MSC_AS_TIME_FMT" uplinkNASTransport initiatingMessage gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
530 531
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
        ue_context_p->gNB_ue_ngap_id,
zhenghuangkun's avatar
zhenghuangkun committed
532
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
533 534
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
535
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
536
                                     length, ue_context_p->tx_stream);
537

zhenghuangkun's avatar
zhenghuangkun committed
538 539 540 541 542 543 544 545 546
    return 0;
}


//------------------------------------------------------------------------------
int ngap_gNB_nas_non_delivery_ind(instance_t instance,
                                  ngap_nas_non_delivery_ind_t *ngap_nas_non_delivery_ind)
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
547
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
    struct ngap_gNB_ue_context_s        *ue_context_p;
    ngap_gNB_instance_t                 *ngap_gNB_instance_p;
    NGAP_NGAP_PDU_t                      pdu;
    NGAP_NASNonDeliveryIndication_t     *out;
    NGAP_NASNonDeliveryIndication_IEs_t *ie;
    uint8_t  *buffer;
    uint32_t  length;
    DevAssert(ngap_nas_non_delivery_ind != NULL);
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p, ngap_nas_non_delivery_ind->gNB_ue_ngap_id)) == NULL) {
        /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
        NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %06x\n",
                  ngap_nas_non_delivery_ind->gNB_ue_ngap_id);
        MSC_LOG_EVENT(
            MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
566
            MSC_AS_TIME_FMT" Sent of NAS_NON_DELIVERY_IND to AMF failed, no context for gNB_ue_ngap_id %06x",
zhenghuangkun's avatar
zhenghuangkun committed
567 568 569 570 571 572 573 574 575 576 577 578 579
            ngap_nas_non_delivery_ind->gNB_ue_ngap_id);
        return -1;
    }

    /* Prepare the NGAP message to encode */
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
    pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_NASNonDeliveryIndication;
    pdu.choice.initiatingMessage.criticality = NGAP_Criticality_ignore;
    pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_NASNonDeliveryIndication;
    out = &pdu.choice.initiatingMessage.value.choice.NASNonDeliveryIndication;
    /* mandatory */
    ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
580
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
581
    ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
582 583
    ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_AMF_UE_NGAP_ID;
    ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
    ie->criticality = NGAP_Criticality_reject;
    ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_GNB_UE_NGAP_ID;
    ie->value.choice.GNB_UE_NGAP_ID = ue_context_p->gNB_ue_ngap_id;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_NAS_PDU;
    ie->criticality = NGAP_Criticality_ignore;
    ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_NAS_PDU;
    ie->value.choice.NAS_PDU.buf = ngap_nas_non_delivery_ind->nas_pdu.buffer;
    ie->value.choice.NAS_PDU.size = ngap_nas_non_delivery_ind->nas_pdu.length;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_NASNonDeliveryIndication_IEs_t *)calloc(1, sizeof(NGAP_NASNonDeliveryIndication_IEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_Cause;
    ie->criticality = NGAP_Criticality_ignore;
    /* Send a dummy cause */
    ie->value.present = NGAP_NASNonDeliveryIndication_IEs__value_PR_Cause;
    ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork;
    ie->value.choice.Cause.choice.radioNetwork = NGAP_CauseRadioNetwork_radio_connection_with_ue_lost;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        NGAP_ERROR("Failed to encode NAS NON delivery indication\n");
        /* Encode procedure has failed... */
        MSC_LOG_EVENT(
            MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
615
            MSC_AS_TIME_FMT" Sent of NAS_NON_DELIVERY_IND to AMF failed (encoding)");
zhenghuangkun's avatar
zhenghuangkun committed
616 617 618 619 620
        return -1;
    }

    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
621
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
622 623
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
624
        MSC_AS_TIME_FMT" NASNonDeliveryIndication initiatingMessage gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
625 626
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
        ue_context_p->gNB_ue_ngap_id,
zhenghuangkun's avatar
zhenghuangkun committed
627
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
628 629
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
630
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
631
                                     length, ue_context_p->tx_stream);
heshanyun's avatar
heshanyun committed
632
#endif
zhenghuangkun's avatar
zhenghuangkun committed
633 634 635 636 637 638 639 640
    return 0;
}

//------------------------------------------------------------------------------
int ngap_gNB_initial_ctxt_resp(
    instance_t instance, ngap_initial_context_setup_resp_t *initial_ctxt_resp_p)
//------------------------------------------------------------------------------
{
641

zhenghuangkun's avatar
zhenghuangkun committed
642 643 644 645 646 647 648 649
    ngap_gNB_instance_t                   *ngap_gNB_instance_p = NULL;
    struct ngap_gNB_ue_context_s          *ue_context_p        = NULL;
    NGAP_NGAP_PDU_t                        pdu;
    NGAP_InitialContextSetupResponse_t    *out;
    NGAP_InitialContextSetupResponseIEs_t *ie;
    uint8_t  *buffer = NULL;
    uint32_t length;
    int      i;
650 651 652
    asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };

    
zhenghuangkun's avatar
zhenghuangkun committed
653 654 655 656 657 658 659 660
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
    DevAssert(initial_ctxt_resp_p != NULL);
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
                        initial_ctxt_resp_p->gNB_ue_ngap_id)) == NULL) {
        /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
661
        NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%08x\n",
zhenghuangkun's avatar
zhenghuangkun committed
662 663 664 665 666 667 668 669 670 671
                  initial_ctxt_resp_p->gNB_ue_ngap_id);
        return -1;
    }

    /* Uplink NAS transport can occur either during an ngap connected state
     * or during initial attach (for example: NAS authentication).
     */
    if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
            ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
        NGAP_WARN("You are attempting to send NAS data over non-connected "
672
                  "gNB ue ngap id: %08x, current state: %d\n",
zhenghuangkun's avatar
zhenghuangkun committed
673 674 675 676 677 678 679 680 681 682 683 684 685
                  initial_ctxt_resp_p->gNB_ue_ngap_id, ue_context_p->ue_state);
        return -1;
    }

    /* Prepare the NGAP message to encode */
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
    pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_InitialContextSetup;
    pdu.choice.successfulOutcome.criticality = NGAP_Criticality_reject;
    pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_InitialContextSetupResponse;
    out = &pdu.choice.successfulOutcome.value.choice.InitialContextSetupResponse;
    /* mandatory */
    ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
686
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
687
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
688
    ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_AMF_UE_NGAP_ID;
689 690
    //ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
    asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
691 692 693
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
694
    ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
695
    ie->criticality = NGAP_Criticality_ignore;
696 697
    ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_RAN_UE_NGAP_ID;
    ie->value.choice.RAN_UE_NGAP_ID = initial_ctxt_resp_p->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
698
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
699
    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
700
    ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
701
    ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListCxtRes;
zhenghuangkun's avatar
zhenghuangkun committed
702
    ie->criticality = NGAP_Criticality_ignore;
703
    ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_PDUSessionResourceSetupListCxtRes;
zhenghuangkun's avatar
zhenghuangkun committed
704

zhenghuangkun's avatar
zhenghuangkun committed
705
    for (i = 0; i < initial_ctxt_resp_p->nb_of_pdusessions; i++) {
706 707 708
        NGAP_PDUSessionResourceSetupItemCxtRes_t *item;
        NGAP_PDUSessionResourceSetupResponseTransfer_t     *pdusessionTransfer_p = NULL;
      
zhenghuangkun's avatar
zhenghuangkun committed
709
        /* mandatory */
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
        item = (NGAP_PDUSessionResourceSetupItemCxtRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupItemCxtRes_t));

        /* pDUSessionID */
        item->pDUSessionID = initial_ctxt_resp_p->pdusessions[i].pdusession_id;

        /* dLQosFlowPerTNLInformation */
        pdusessionTransfer_p = (NGAP_PDUSessionResourceSetupResponseTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseTransfer_t));

        pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
         
        GTP_TEID_TO_ASN1(initial_ctxt_resp_p->pdusessions[i].gtp_teid, &pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.gTP_TEID);

        pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf = malloc(initial_ctxt_resp_p->pdusessions[i].gNB_addr.length);

        memcpy(pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf,
zhenghuangkun's avatar
zhenghuangkun committed
725 726
               initial_ctxt_resp_p->pdusessions[i].gNB_addr.buffer,
               initial_ctxt_resp_p->pdusessions[i].gNB_addr.length);
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
        pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.size = initial_ctxt_resp_p->pdusessions[i].gNB_addr.length;
        pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.bits_unused = 0;

        NGAP_DEBUG("initial_ctxt_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld \n",
                   item->pDUSessionID,
                   pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[0],
                   pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[1],
                   pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[2],
                   pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[3],
                   pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.size);

        /* associatedQosFlowList. number of 1? */
        for(int j=0; j < initial_ctxt_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
          NGAP_AssociatedQosFlowItem_t *ass_qos_item_p;
          ass_qos_item_p = (NGAP_AssociatedQosFlowItem_t *)calloc(1, sizeof(NGAP_AssociatedQosFlowItem_t));

          /* qosFlowIdentifier */
          ass_qos_item_p->qosFlowIdentifier = initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qci;

          /* qosFlowMappingIndication */
          if(initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind != QOSFLOW_MAPPING_INDICATION_NON) {
            ass_qos_item_p->qosFlowMappingIndication = malloc(sizeof(*ass_qos_item_p->qosFlowMappingIndication));
            *ass_qos_item_p->qosFlowMappingIndication = initial_ctxt_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind;
          }
          ASN_SEQUENCE_ADD(&pdusessionTransfer_p->dLQosFlowPerTNLInformation.associatedQosFlowList.list, ass_qos_item_p);
        }
                   
        memset(&res, 0, sizeof(res));
        res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
        item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
        item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;

        ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
        
        ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceSetupListCxtRes.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
762 763 764 765 766
    }

    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
767
    if (initial_ctxt_resp_p->nb_of_pdusessions_failed) {
zhenghuangkun's avatar
zhenghuangkun committed
768
        ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
769
        ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceFailedToSetupListCxtRes;
zhenghuangkun's avatar
zhenghuangkun committed
770
        ie->criticality = NGAP_Criticality_ignore;
771
        ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_PDUSessionResourceFailedToSetupListCxtRes;
zhenghuangkun's avatar
zhenghuangkun committed
772

zhenghuangkun's avatar
zhenghuangkun committed
773
        for (i = 0; i < initial_ctxt_resp_p->nb_of_pdusessions_failed; i++) {
774 775 776
            NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t *item;
            NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = NULL;
        
zhenghuangkun's avatar
zhenghuangkun committed
777
            /* mandatory */
778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
            item = (NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t));
            /* pDUSessionID */
            item->pDUSessionID = initial_ctxt_resp_p->pdusessions_failed[i].pdusession_id;

            /* cause */
            pdusessionUnTransfer_p = (NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t));
            pdusessionUnTransfer_p->cause.present = initial_ctxt_resp_p->pdusessions_failed[i].cause;
            switch(pdusessionUnTransfer_p->cause.present) {
              case NGAP_Cause_PR_radioNetwork:
                  pdusessionUnTransfer_p->cause.choice.radioNetwork = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_transport:
                  pdusessionUnTransfer_p->cause.choice.transport = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_nas:
                  pdusessionUnTransfer_p->cause.choice.nas = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_protocol:
                  pdusessionUnTransfer_p->cause.choice.protocol = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_misc:
                  pdusessionUnTransfer_p->cause.choice.misc = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_NOTHING:
              default:
                  break;
zhenghuangkun's avatar
zhenghuangkun committed
809 810
            }

811 812 813 814 815 816 817 818 819 820
            NGAP_DEBUG("initial context setup response: failed pdusession ID %ld\n", item->pDUSessionID);

            memset(&res, 0, sizeof(res));
            res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
            item->pDUSessionResourceSetupUnsuccessfulTransfer.buf = res.buffer;
            item->pDUSessionResourceSetupUnsuccessfulTransfer.size = res.result.encoded;

            ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
        
            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceFailedToSetupListCxtRes.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836
        }

        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    /* optional */
    if (0) {
        ie = (NGAP_InitialContextSetupResponseIEs_t *)calloc(1, sizeof(NGAP_InitialContextSetupResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
        ie->criticality = NGAP_Criticality_ignore;
        ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_CriticalityDiagnostics;
        // ie->value.choice.CriticalityDiagnostics =;
        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
837
        NGAP_ERROR("Failed to encode InitialContextSetupResponse\n");
zhenghuangkun's avatar
zhenghuangkun committed
838 839 840 841 842 843
        /* Encode procedure has failed... */
        return -1;
    }

    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
844
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
845 846
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
847
        MSC_AS_TIME_FMT" InitialContextSetup successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
848 849
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
        initial_ctxt_resp_p->gNB_ue_ngap_id,
zhenghuangkun's avatar
zhenghuangkun committed
850
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
851 852
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
853
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
854
                                     length, ue_context_p->tx_stream);
855

zhenghuangkun's avatar
zhenghuangkun committed
856 857 858 859 860 861 862 863 864 865 866
    return 0;
}

//------------------------------------------------------------------------------
int ngap_gNB_ue_capabilities(instance_t instance,
                             ngap_ue_cap_info_ind_t *ue_cap_info_ind_p)
//------------------------------------------------------------------------------
{
    ngap_gNB_instance_t          *ngap_gNB_instance_p;
    struct ngap_gNB_ue_context_s *ue_context_p;
    NGAP_NGAP_PDU_t                       pdu;
867 868
    NGAP_UERadioCapabilityInfoIndication_t    *out;
    NGAP_UERadioCapabilityInfoIndicationIEs_t *ie;
zhenghuangkun's avatar
zhenghuangkun committed
869 870 871 872 873 874 875 876 877 878 879 880 881 882 883
    uint8_t  *buffer;
    uint32_t length;
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
    DevAssert(ue_cap_info_ind_p != NULL);
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
                        ue_cap_info_ind_p->gNB_ue_ngap_id)) == NULL) {
        /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
        NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %u\n",
                  ue_cap_info_ind_p->gNB_ue_ngap_id);
        return -1;
    }

884
    /* UE radio capabilities message can occur either during an ngap connected state
zhenghuangkun's avatar
zhenghuangkun committed
885 886 887 888 889 890 891 892 893 894 895 896 897
     * or during initial attach (for example: NAS authentication).
     */
    if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
            ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
        NGAP_WARN("You are attempting to send NAS data over non-connected "
                  "gNB ue ngap id: %u, current state: %d\n",
                  ue_cap_info_ind_p->gNB_ue_ngap_id, ue_context_p->ue_state);
        return -1;
    }

    /* Prepare the NGAP message to encode */
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
898
    pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_UERadioCapabilityInfoIndication;
zhenghuangkun's avatar
zhenghuangkun committed
899
    pdu.choice.initiatingMessage.criticality = NGAP_Criticality_ignore;
900 901
    pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_UERadioCapabilityInfoIndication;
    out = &pdu.choice.initiatingMessage.value.choice.UERadioCapabilityInfoIndication;
zhenghuangkun's avatar
zhenghuangkun committed
902
    /* mandatory */
903
    ie = (NGAP_UERadioCapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UERadioCapabilityInfoIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
904
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
905
    ie->criticality = NGAP_Criticality_reject;
906 907 908
    ie->value.present = NGAP_UERadioCapabilityInfoIndicationIEs__value_PR_AMF_UE_NGAP_ID;
    //ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
    asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
909 910
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
911 912
    ie = (NGAP_UERadioCapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UERadioCapabilityInfoIndicationIEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
913
    ie->criticality = NGAP_Criticality_reject;
914 915
    ie->value.present = NGAP_UERadioCapabilityInfoIndicationIEs__value_PR_RAN_UE_NGAP_ID;
    ie->value.choice.RAN_UE_NGAP_ID = ue_cap_info_ind_p->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
916 917
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
918
    ie = (NGAP_UERadioCapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UERadioCapabilityInfoIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
919 920
    ie->id = NGAP_ProtocolIE_ID_id_UERadioCapability;
    ie->criticality = NGAP_Criticality_reject;
921
    ie->value.present = NGAP_UERadioCapabilityInfoIndicationIEs__value_PR_UERadioCapability;
zhenghuangkun's avatar
zhenghuangkun committed
922 923 924 925
    ie->value.choice.UERadioCapability.buf = ue_cap_info_ind_p->ue_radio_cap.buffer;
    ie->value.choice.UERadioCapability.size = ue_cap_info_ind_p->ue_radio_cap.length;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* optional */
926
    //NGAP_UERadioCapabilityForPaging TBD
zhenghuangkun's avatar
zhenghuangkun committed
927 928
    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        /* Encode procedure has failed... */
929
        NGAP_ERROR("Failed to encode UE radio capabilities indication\n");
zhenghuangkun's avatar
zhenghuangkun committed
930 931 932 933 934
        return -1;
    }

    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
935
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
936 937
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
938
        MSC_AS_TIME_FMT" UECapabilityInfoIndication initiatingMessage gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
939 940
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
        ue_cap_info_ind_p->gNB_ue_ngap_id,
zhenghuangkun's avatar
zhenghuangkun committed
941
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
942 943
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
944
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
945 946 947 948 949
                                     length, ue_context_p->tx_stream);
    return 0;
}

//------------------------------------------------------------------------------
zhenghuangkun's avatar
zhenghuangkun committed
950 951
int ngap_gNB_pdusession_setup_resp(instance_t instance,
                              ngap_pdusession_setup_resp_t *pdusession_setup_resp_p)
zhenghuangkun's avatar
zhenghuangkun committed
952 953 954 955 956
//------------------------------------------------------------------------------
{
    ngap_gNB_instance_t          *ngap_gNB_instance_p = NULL;
    struct ngap_gNB_ue_context_s *ue_context_p        = NULL;
    NGAP_NGAP_PDU_t               pdu;
yincong's avatar
yincong committed
957 958
    NGAP_PDUSessionResourceSetupResponse_t    *out;
    NGAP_PDUSessionResourceSetupResponseIEs_t *ie;
zhenghuangkun's avatar
zhenghuangkun committed
959 960 961
    uint8_t  *buffer  = NULL;
    uint32_t length;
    int      i;
yincong's avatar
yincong committed
962 963
    asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };

zhenghuangkun's avatar
zhenghuangkun committed
964 965
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
zhenghuangkun's avatar
zhenghuangkun committed
966
    DevAssert(pdusession_setup_resp_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
967 968 969
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
970
                        pdusession_setup_resp_p->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
971
        /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
972
        NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%08x\n",
zhenghuangkun's avatar
zhenghuangkun committed
973
                  pdusession_setup_resp_p->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
974 975 976 977 978 979 980 981 982
        return -1;
    }

    /* Uplink NAS transport can occur either during an ngap connected state
     * or during initial attach (for example: NAS authentication).
     */
    if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
            ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
        NGAP_WARN("You are attempting to send NAS data over non-connected "
983
                  "gNB ue ngap id: %08x, current state: %d\n",
zhenghuangkun's avatar
zhenghuangkun committed
984
                  pdusession_setup_resp_p->gNB_ue_ngap_id, ue_context_p->ue_state);
zhenghuangkun's avatar
zhenghuangkun committed
985 986 987 988 989 990
        return -1;
    }

    /* Prepare the NGAP message to encode */
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
yincong's avatar
yincong committed
991
    pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_PDUSessionResourceSetup;
zhenghuangkun's avatar
zhenghuangkun committed
992
    pdu.choice.successfulOutcome.criticality = NGAP_Criticality_reject;
yincong's avatar
yincong committed
993 994
    pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_PDUSessionResourceSetupResponse;
    out = &pdu.choice.successfulOutcome.value.choice.PDUSessionResourceSetupResponse;
zhenghuangkun's avatar
zhenghuangkun committed
995
    /* mandatory */
yincong's avatar
yincong committed
996
    ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
997
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
998
    ie->criticality = NGAP_Criticality_ignore;
yincong's avatar
yincong committed
999 1000
    ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_AMF_UE_NGAP_ID;
    asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1001 1002
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
yincong's avatar
yincong committed
1003 1004
    ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
1005
    ie->criticality = NGAP_Criticality_ignore;
yincong's avatar
yincong committed
1006 1007
    ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_RAN_UE_NGAP_ID;
    ie->value.choice.RAN_UE_NGAP_ID = pdusession_setup_resp_p->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1008 1009 1010
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1011
    if (pdusession_setup_resp_p->nb_of_pdusessions > 0) {
yincong's avatar
yincong committed
1012 1013
        ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1014
        ie->criticality = NGAP_Criticality_ignore;
yincong's avatar
yincong committed
1015
        ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_PDUSessionResourceSetupListSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1016

zhenghuangkun's avatar
zhenghuangkun committed
1017
        for (i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions; i++) {
yincong's avatar
yincong committed
1018 1019 1020
        	NGAP_PDUSessionResourceSetupItemSURes_t *item;
            NGAP_PDUSessionResourceSetupResponseTransfer_t     *pdusessionTransfer_p = NULL;

zhenghuangkun's avatar
zhenghuangkun committed
1021
            /* mandatory */
yincong's avatar
yincong committed
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
            item = (NGAP_PDUSessionResourceSetupItemSURes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupItemSURes_t));

            /* pDUSessionID */
            item->pDUSessionID = pdusession_setup_resp_p->pdusessions[i].pdusession_id;

            /* dLQosFlowPerTNLInformation */
            pdusessionTransfer_p = (NGAP_PDUSessionResourceSetupResponseTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseTransfer_t));

            pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;

            GTP_TEID_TO_ASN1(pdusession_setup_resp_p->pdusessions[i].gtp_teid, &pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.gTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1033

yincong's avatar
yincong committed
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
            pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf = malloc(pdusession_setup_resp_p->pdusessions[i].gNB_addr.length);

            memcpy(pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf,
            	   pdusession_setup_resp_p->pdusessions[i].gNB_addr.buffer,
            	   pdusession_setup_resp_p->pdusessions[i].gNB_addr.length);
            pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.size = pdusession_setup_resp_p->pdusessions[i].gNB_addr.length;
            pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.bits_unused = 0;

            NGAP_DEBUG("pdusession_setup_resp_p: pdusession ID %ld, gnb_addr %d.%d.%d.%d, SIZE %ld \n",
                       item->pDUSessionID,
                       pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[0],
                       pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[1],
                       pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[2],
                       pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.buf[3],
                       pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel.transportLayerAddress.size);

            /* associatedQosFlowList. number of 1? */
            for(int j=0; j < pdusession_setup_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
              NGAP_AssociatedQosFlowItem_t *ass_qos_item_p;
              ass_qos_item_p = (NGAP_AssociatedQosFlowItem_t *)calloc(1, sizeof(NGAP_AssociatedQosFlowItem_t));

              /* qosFlowIdentifier */
              ass_qos_item_p->qosFlowIdentifier = pdusession_setup_resp_p->pdusessions[i].associated_qos_flows[j].qci;

              /* qosFlowMappingIndication */
              if(pdusession_setup_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind != QOSFLOW_MAPPING_INDICATION_NON) {
                ass_qos_item_p->qosFlowMappingIndication = malloc(sizeof(*ass_qos_item_p->qosFlowMappingIndication));
                *ass_qos_item_p->qosFlowMappingIndication = pdusession_setup_resp_p->pdusessions[i].associated_qos_flows[j].qos_flow_mapping_ind;
              }
              ASN_SEQUENCE_ADD(&pdusessionTransfer_p->dLQosFlowPerTNLInformation.associatedQosFlowList.list, ass_qos_item_p);
            }

            memset(&res, 0, sizeof(res));
            res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
            item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
            item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;

            ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);

            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceSetupListSURes.list, item);
        }
zhenghuangkun's avatar
zhenghuangkun committed
1075 1076 1077 1078
        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1079
    if (pdusession_setup_resp_p->nb_of_pdusessions_failed > 0) {
yincong's avatar
yincong committed
1080 1081
        ie = (NGAP_PDUSessionResourceFailedToSetupListSURes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToSetupListSURes_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceFailedToSetupListSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1082
        ie->criticality = NGAP_Criticality_ignore;
yincong's avatar
yincong committed
1083
        ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_PDUSessionResourceFailedToSetupListSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1084

zhenghuangkun's avatar
zhenghuangkun committed
1085
        for (i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions_failed; i++) {
yincong's avatar
yincong committed
1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
        	NGAP_PDUSessionResourceFailedToSetupItemSURes_t *item;
            NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = NULL;

            /* mandatory */
            item = (NGAP_PDUSessionResourceFailedToSetupItemSURes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToSetupItemSURes_t));
            /* pDUSessionID */
            item->pDUSessionID = pdusession_setup_resp_p->pdusessions_failed[i].pdusession_id;

            /* cause */
            pdusessionUnTransfer_p = (NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t));
            pdusessionUnTransfer_p->cause.present = pdusession_setup_resp_p->pdusessions_failed[i].cause;
            switch(pdusessionUnTransfer_p->cause.present) {
              case NGAP_Cause_PR_radioNetwork:
                  pdusessionUnTransfer_p->cause.choice.radioNetwork = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_transport:
                  pdusessionUnTransfer_p->cause.choice.transport = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_nas:
                  pdusessionUnTransfer_p->cause.choice.nas = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_protocol:
                  pdusessionUnTransfer_p->cause.choice.protocol = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_misc:
                  pdusessionUnTransfer_p->cause.choice.misc = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
                  break;

              case NGAP_Cause_PR_NOTHING:
              default:
                  break;
zhenghuangkun's avatar
zhenghuangkun committed
1121 1122
            }

yincong's avatar
yincong committed
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
            NGAP_DEBUG("pdusession setup response: failed pdusession ID %ld\n", item->pDUSessionID);

            memset(&res, 0, sizeof(res));
            res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
            item->pDUSessionResourceSetupUnsuccessfulTransfer.buf = res.buffer;
            item->pDUSessionResourceSetupUnsuccessfulTransfer.size = res.result.encoded;

            ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);

            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSessionResourceFailedToSetupListSURes.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
1133 1134 1135 1136 1137 1138 1139
        }

        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    /* optional */
    if (0) {
yincong's avatar
yincong committed
1140
        ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1141 1142
        ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
        ie->criticality = NGAP_Criticality_ignore;
yincong's avatar
yincong committed
1143
        ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_CriticalityDiagnostics;
zhenghuangkun's avatar
zhenghuangkun committed
1144 1145 1146 1147
        // ie->value.choice.CriticalityDiagnostics = ;
        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

zhenghuangkun's avatar
zhenghuangkun committed
1148 1149 1150
    /* NGAP_PDUSESSIONSetupListBearerSURes_t  e_RABSetupListBearerSURes;
    memset(&e_RABSetupListBearerSURes, 0, sizeof(NGAP_PDUSESSIONSetupListBearerSURes_t));
    if (ngap_encode_ngap_pdusessionsetuplistbearersures(&e_RABSetupListBearerSURes, &initial_ies_p->e_RABSetupListBearerSURes.ngap_PDUSESSIONSetupItemBearerSURes) < 0 )
zhenghuangkun's avatar
zhenghuangkun committed
1151
      return -1;
zhenghuangkun's avatar
zhenghuangkun committed
1152
    ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSESSIONSetupListBearerSURes, &e_RABSetupListBearerSURes);
zhenghuangkun's avatar
zhenghuangkun committed
1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
    */
    fprintf(stderr, "start encode\n");

    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        NGAP_ERROR("Failed to encode uplink transport\n");
        /* Encode procedure has failed... */
        return -1;
    }

    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
1164
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1165 1166
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
1167
        MSC_AS_TIME_FMT" E_RAN Setup successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1168
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
zhenghuangkun's avatar
zhenghuangkun committed
1169 1170
        pdusession_setup_resp_p->gNB_ue_ngap_id,
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1171 1172
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1173
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1174 1175 1176 1177 1178
                                     length, ue_context_p->tx_stream);
    return 0;
}

//------------------------------------------------------------------------------
zhenghuangkun's avatar
zhenghuangkun committed
1179 1180
int ngap_gNB_pdusession_modify_resp(instance_t instance,
                               ngap_pdusession_modify_resp_t *pdusession_modify_resp_p)
zhenghuangkun's avatar
zhenghuangkun committed
1181 1182
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
1183
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1184 1185 1186
    ngap_gNB_instance_t           *ngap_gNB_instance_p = NULL;
    struct ngap_gNB_ue_context_s  *ue_context_p        = NULL;
    NGAP_NGAP_PDU_t                pdu;
zhenghuangkun's avatar
zhenghuangkun committed
1187 1188
    NGAP_PDUSESSIONModifyResponse_t    *out;
    NGAP_PDUSESSIONModifyResponseIEs_t *ie;
zhenghuangkun's avatar
zhenghuangkun committed
1189 1190 1191 1192 1193
    uint8_t  *buffer  = NULL;
    uint32_t length;
    int      i;
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
zhenghuangkun's avatar
zhenghuangkun committed
1194
    DevAssert(pdusession_modify_resp_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1195 1196 1197
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
1198
                        pdusession_modify_resp_p->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1199 1200
        /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
        NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%06x\n",
zhenghuangkun's avatar
zhenghuangkun committed
1201
                  pdusession_modify_resp_p->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211
        return -1;
    }

    /* Uplink NAS transport can occur either during an ngap connected state
     * or during initial attach (for example: NAS authentication).
     */
    if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
            ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
        NGAP_WARN("You are attempting to send NAS data over non-connected "
                  "gNB ue ngap id: %06x, current state: %d\n",
zhenghuangkun's avatar
zhenghuangkun committed
1212
                  pdusession_modify_resp_p->gNB_ue_ngap_id, ue_context_p->ue_state);
zhenghuangkun's avatar
zhenghuangkun committed
1213 1214 1215 1216 1217 1218
        return -1;
    }

    /* Prepare the NGAP message to encode */
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
zhenghuangkun's avatar
zhenghuangkun committed
1219
    pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONModify;
zhenghuangkun's avatar
zhenghuangkun committed
1220
    pdu.choice.successfulOutcome.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1221 1222
    pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_PDUSESSIONModifyResponse;
    out = &pdu.choice.successfulOutcome.value.choice.PDUSESSIONModifyResponse;
zhenghuangkun's avatar
zhenghuangkun committed
1223
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1224 1225
    ie = (NGAP_PDUSESSIONModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyResponseIEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
1226
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1227 1228
    ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_AMF_UE_NGAP_ID;
    ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1229 1230
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1231
    ie = (NGAP_PDUSESSIONModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1232 1233
    ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1234 1235
    ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_GNB_UE_NGAP_ID;
    ie->value.choice.GNB_UE_NGAP_ID = pdusession_modify_resp_p->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1236 1237 1238
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1239 1240 1241
    if (pdusession_modify_resp_p->nb_of_pdusessions > 0) {
        ie = (NGAP_PDUSESSIONModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONModifyListBearerModRes;
zhenghuangkun's avatar
zhenghuangkun committed
1242
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1243
        ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_PDUSESSIONModifyListBearerModRes;
zhenghuangkun's avatar
zhenghuangkun committed
1244

zhenghuangkun's avatar
zhenghuangkun committed
1245 1246 1247 1248
        for (i = 0; i < pdusession_modify_resp_p->nb_of_pdusessions; i++) {
            NGAP_PDUSESSIONModifyItemBearerModResIEs_t *item;
            item = (NGAP_PDUSESSIONModifyItemBearerModResIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyItemBearerModResIEs_t));
            item->id = NGAP_ProtocolIE_ID_id_PDUSESSIONModifyItemBearerModRes;
zhenghuangkun's avatar
zhenghuangkun committed
1249
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1250 1251 1252 1253
            item->value.present = NGAP_PDUSESSIONModifyItemBearerModResIEs__value_PR_PDUSESSIONModifyItemBearerModRes;
            item->value.choice.PDUSESSIONModifyItemBearerModRes.e_RAB_ID = pdusession_modify_resp_p->pdusessions[i].pdusession_id;
            NGAP_DEBUG("pdusession_modify_resp: modified pdusession ID %ld\n", item->value.choice.PDUSESSIONModifyItemBearerModRes.e_RAB_ID);
            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONModifyListBearerModRes.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
1254 1255 1256 1257 1258 1259
        }

        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1260 1261 1262
    if (pdusession_modify_resp_p->nb_of_pdusessions_failed > 0) {
        ie = (NGAP_PDUSESSIONModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONFailedToModifyList;
zhenghuangkun's avatar
zhenghuangkun committed
1263
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1264
        ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_PDUSESSIONList;
zhenghuangkun's avatar
zhenghuangkun committed
1265

zhenghuangkun's avatar
zhenghuangkun committed
1266 1267 1268 1269
        for (i = 0; i < pdusession_modify_resp_p->nb_of_pdusessions_failed; i++) {
            NGAP_PDUSESSIONItemIEs_t *item;
            item = (NGAP_PDUSESSIONItemIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONItemIEs_t));
            item->id = NGAP_ProtocolIE_ID_id_PDUSESSIONItem;
zhenghuangkun's avatar
zhenghuangkun committed
1270
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1271 1272 1273
            item->value.present = NGAP_PDUSESSIONItemIEs__value_PR_PDUSESSIONItem;
            item->value.choice.PDUSESSIONItem.e_RAB_ID = pdusession_modify_resp_p->pdusessions_failed[i].pdusession_id;
            item->value.choice.PDUSESSIONItem.cause.present = pdusession_modify_resp_p->pdusessions_failed[i].cause;
zhenghuangkun's avatar
zhenghuangkun committed
1274

zhenghuangkun's avatar
zhenghuangkun committed
1275
            switch(item->value.choice.PDUSESSIONItem.cause.present) {
zhenghuangkun's avatar
zhenghuangkun committed
1276
            case NGAP_Cause_PR_radioNetwork:
zhenghuangkun's avatar
zhenghuangkun committed
1277
                item->value.choice.PDUSESSIONItem.cause.choice.radioNetwork = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1278 1279 1280
                break;

            case NGAP_Cause_PR_transport:
zhenghuangkun's avatar
zhenghuangkun committed
1281
                item->value.choice.PDUSESSIONItem.cause.choice.transport = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1282 1283 1284
                break;

            case NGAP_Cause_PR_nas:
zhenghuangkun's avatar
zhenghuangkun committed
1285
                item->value.choice.PDUSESSIONItem.cause.choice.nas = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1286 1287 1288
                break;

            case NGAP_Cause_PR_protocol:
zhenghuangkun's avatar
zhenghuangkun committed
1289
                item->value.choice.PDUSESSIONItem.cause.choice.protocol = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1290 1291 1292
                break;

            case NGAP_Cause_PR_misc:
zhenghuangkun's avatar
zhenghuangkun committed
1293
                item->value.choice.PDUSESSIONItem.cause.choice.misc = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1294 1295 1296 1297 1298 1299 1300
                break;

            case NGAP_Cause_PR_NOTHING:
            default:
                break;
            }

zhenghuangkun's avatar
zhenghuangkun committed
1301 1302
            NGAP_DEBUG("pdusession_modify_resp: failed pdusession ID %ld\n", item->value.choice.PDUSESSIONItem.e_RAB_ID);
            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONList.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
1303 1304 1305 1306 1307 1308 1309
        }

        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    /* optional */
    if (0) {
zhenghuangkun's avatar
zhenghuangkun committed
1310
        ie = (NGAP_PDUSESSIONModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1311 1312
        ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1313
        ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_CriticalityDiagnostics;
zhenghuangkun's avatar
zhenghuangkun committed
1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
        // ie->value.choice.CriticalityDiagnostics = ;
        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    fprintf(stderr, "start encode\n");

    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        NGAP_ERROR("Failed to encode uplink transport\n");
        /* Encode procedure has failed... */
        return -1;
    }

    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
1328
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1329 1330
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
1331
        MSC_AS_TIME_FMT" E_RAN Modify successful Outcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1332
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
zhenghuangkun's avatar
zhenghuangkun committed
1333 1334
        pdusession_modify_resp_p->gNB_ue_ngap_id,
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1335 1336
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1337
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1338
                                     length, ue_context_p->tx_stream);
heshanyun's avatar
heshanyun committed
1339
#endif
zhenghuangkun's avatar
zhenghuangkun committed
1340 1341 1342
    return 0;
}
//------------------------------------------------------------------------------
zhenghuangkun's avatar
zhenghuangkun committed
1343 1344
int ngap_gNB_pdusession_release_resp(instance_t instance,
                                ngap_pdusession_release_resp_t *pdusession_release_resp_p)
zhenghuangkun's avatar
zhenghuangkun committed
1345 1346
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
1347
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1348 1349 1350
    ngap_gNB_instance_t            *ngap_gNB_instance_p = NULL;
    struct ngap_gNB_ue_context_s   *ue_context_p        = NULL;
    NGAP_NGAP_PDU_t                 pdu;
zhenghuangkun's avatar
zhenghuangkun committed
1351 1352
    NGAP_PDUSESSIONReleaseResponse_t    *out;
    NGAP_PDUSESSIONReleaseResponseIEs_t *ie;
zhenghuangkun's avatar
zhenghuangkun committed
1353 1354 1355 1356 1357
    uint8_t  *buffer  = NULL;
    uint32_t length;
    int      i;
    /* Retrieve the NGAP gNB instance associated with Mod_id */
    ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
zhenghuangkun's avatar
zhenghuangkun committed
1358
    DevAssert(pdusession_release_resp_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1359 1360 1361
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
1362
                        pdusession_release_resp_p->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1363 1364
        /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
        NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: %u\n",
zhenghuangkun's avatar
zhenghuangkun committed
1365
                  pdusession_release_resp_p->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1366 1367 1368 1369 1370 1371
        return -1;
    }

    /* Prepare the NGAP message to encode */
    memset(&pdu, 0, sizeof(pdu));
    pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
zhenghuangkun's avatar
zhenghuangkun committed
1372
    pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONRelease;
zhenghuangkun's avatar
zhenghuangkun committed
1373
    pdu.choice.successfulOutcome.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1374 1375
    pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_PDUSESSIONReleaseResponse;
    out = &pdu.choice.successfulOutcome.value.choice.PDUSESSIONReleaseResponse;
zhenghuangkun's avatar
zhenghuangkun committed
1376
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1377 1378
    ie = (NGAP_PDUSESSIONReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONReleaseResponseIEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
1379
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1380 1381
    ie->value.present = NGAP_PDUSESSIONReleaseResponseIEs__value_PR_AMF_UE_NGAP_ID;
    ie->value.choice.AMF_UE_NGAP_ID = ue_context_p->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1382 1383
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1384
    ie = (NGAP_PDUSESSIONReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONReleaseResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1385 1386
    ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1387 1388
    ie->value.present = NGAP_PDUSESSIONReleaseResponseIEs__value_PR_GNB_UE_NGAP_ID;
    ie->value.choice.GNB_UE_NGAP_ID = pdusession_release_resp_p->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1389 1390 1391
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1392 1393 1394
    if (pdusession_release_resp_p->nb_of_pdusessions_released > 0) {
        ie = (NGAP_PDUSESSIONReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONReleaseResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONReleaseListBearerRelComp;
zhenghuangkun's avatar
zhenghuangkun committed
1395
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1396
        ie->value.present = NGAP_PDUSESSIONReleaseResponseIEs__value_PR_PDUSESSIONReleaseListBearerRelComp;
zhenghuangkun's avatar
zhenghuangkun committed
1397

zhenghuangkun's avatar
zhenghuangkun committed
1398 1399 1400 1401
        for (i = 0; i < pdusession_release_resp_p->nb_of_pdusessions_released; i++) {
            NGAP_PDUSESSIONReleaseItemBearerRelCompIEs_t *item;
            item = (NGAP_PDUSESSIONReleaseItemBearerRelCompIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONReleaseItemBearerRelCompIEs_t));
            item->id = NGAP_ProtocolIE_ID_id_PDUSESSIONReleaseItemBearerRelComp;
zhenghuangkun's avatar
zhenghuangkun committed
1402
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1403 1404 1405 1406
            item->value.present = NGAP_PDUSESSIONReleaseItemBearerRelCompIEs__value_PR_PDUSESSIONReleaseItemBearerRelComp;
            item->value.choice.PDUSESSIONReleaseItemBearerRelComp.e_RAB_ID = pdusession_release_resp_p->pdusession_release[i].pdusession_id;
            NGAP_DEBUG("pdusession_release_resp: pdusession ID %ld\n", item->value.choice.PDUSESSIONReleaseItemBearerRelComp.e_RAB_ID);
            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONReleaseListBearerRelComp.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
1407 1408 1409 1410 1411 1412
        }

        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1413 1414 1415
    if (pdusession_release_resp_p->nb_of_pdusessions_failed > 0) {
        ie = (NGAP_PDUSESSIONReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONReleaseResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONFailedToReleaseList;
zhenghuangkun's avatar
zhenghuangkun committed
1416
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1417
        ie->value.present = NGAP_PDUSESSIONReleaseResponseIEs__value_PR_PDUSESSIONList;
zhenghuangkun's avatar
zhenghuangkun committed
1418

zhenghuangkun's avatar
zhenghuangkun committed
1419 1420 1421 1422
        for (i = 0; i < pdusession_release_resp_p->nb_of_pdusessions_failed; i++) {
            NGAP_PDUSESSIONItemIEs_t *item;
            item = (NGAP_PDUSESSIONItemIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONItemIEs_t));
            item->id = NGAP_ProtocolIE_ID_id_PDUSESSIONItem;
zhenghuangkun's avatar
zhenghuangkun committed
1423
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1424 1425 1426
            item->value.present = NGAP_PDUSESSIONItemIEs__value_PR_PDUSESSIONItem;
            item->value.choice.PDUSESSIONItem.e_RAB_ID = pdusession_release_resp_p->pdusessions_failed[i].pdusession_id;
            item->value.choice.PDUSESSIONItem.cause.present = pdusession_release_resp_p->pdusessions_failed[i].cause;
zhenghuangkun's avatar
zhenghuangkun committed
1427

zhenghuangkun's avatar
zhenghuangkun committed
1428
            switch(item->value.choice.PDUSESSIONItem.cause.present) {
zhenghuangkun's avatar
zhenghuangkun committed
1429
            case NGAP_Cause_PR_radioNetwork:
zhenghuangkun's avatar
zhenghuangkun committed
1430
                item->value.choice.PDUSESSIONItem.cause.choice.radioNetwork = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1431 1432 1433
                break;

            case NGAP_Cause_PR_transport:
zhenghuangkun's avatar
zhenghuangkun committed
1434
                item->value.choice.PDUSESSIONItem.cause.choice.transport = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1435 1436 1437
                break;

            case NGAP_Cause_PR_nas:
zhenghuangkun's avatar
zhenghuangkun committed
1438
                item->value.choice.PDUSESSIONItem.cause.choice.nas = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1439 1440 1441
                break;

            case NGAP_Cause_PR_protocol:
zhenghuangkun's avatar
zhenghuangkun committed
1442
                item->value.choice.PDUSESSIONItem.cause.choice.protocol = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1443 1444 1445
                break;

            case NGAP_Cause_PR_misc:
zhenghuangkun's avatar
zhenghuangkun committed
1446
                item->value.choice.PDUSESSIONItem.cause.choice.misc = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1447 1448 1449 1450 1451 1452 1453
                break;

            case NGAP_Cause_PR_NOTHING:
            default:
                break;
            }

zhenghuangkun's avatar
zhenghuangkun committed
1454
            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONList.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
        }

        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }



    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        NGAP_ERROR("Failed to encode release response\n");
        /* Encode procedure has failed... */
        return -1;
    }

    MSC_LOG_TX_MESSAGE(
        MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
1470
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1471 1472
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
1473
        MSC_AS_TIME_FMT" E_RAN Release successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1474
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
zhenghuangkun's avatar
zhenghuangkun committed
1475 1476
        pdusession_release_resp_p->gNB_ue_ngap_id,
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1477 1478
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1479
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1480
                                     length, ue_context_p->tx_stream);
zhenghuangkun's avatar
zhenghuangkun committed
1481 1482
    NGAP_INFO("pdusession_release_response sended gNB_UE_NGAP_ID %d  amf_ue_ngap_id %d nb_of_pdusessions_released %d nb_of_pdusessions_failed %d\n",
              pdusession_release_resp_p->gNB_ue_ngap_id, ue_context_p->amf_ue_ngap_id,pdusession_release_resp_p->nb_of_pdusessions_released,pdusession_release_resp_p->nb_of_pdusessions_failed);
heshanyun's avatar
heshanyun committed
1483
#endif
zhenghuangkun's avatar
zhenghuangkun committed
1484 1485 1486 1487 1488 1489 1490
    return 0;
}

int ngap_gNB_path_switch_req(instance_t instance,
                             ngap_path_switch_req_t *path_switch_req_p)
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
1491
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1492 1493
  ngap_gNB_instance_t          *ngap_gNB_instance_p = NULL;
  struct ngap_gNB_ue_context_s *ue_context_p        = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1494
  struct ngap_gNB_amf_data_s   *amf_desc_p = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1495 1496 1497 1498 1499

  NGAP_NGAP_PDU_t                 pdu;
  NGAP_PathSwitchRequest_t       *out;
  NGAP_PathSwitchRequestIEs_t    *ie;

zhenghuangkun's avatar
zhenghuangkun committed
1500 1501
  NGAP_PDUSESSIONToBeSwitchedDLItemIEs_t *e_RABToBeSwitchedDLItemIEs;
  NGAP_PDUSESSIONToBeSwitchedDLItem_t    *e_RABToBeSwitchedDLItem;
zhenghuangkun's avatar
zhenghuangkun committed
1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531

  uint8_t  *buffer = NULL;
  uint32_t length;
  int      ret = 0;//-1;

  /* Retrieve the NGAP gNB instance associated with Mod_id */
  ngap_gNB_instance_p = ngap_gNB_get_instance(instance);

  DevAssert(path_switch_req_p != NULL);
  DevAssert(ngap_gNB_instance_p != NULL);

  //if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
    //                                          path_switch_req_p->gNB_ue_ngap_id)) == NULL) {
    /* The context for this gNB ue ngap id doesn't exist in the map of gNB UEs */
    //NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%06x\n",
      //        path_switch_req_p->gNB_ue_ngap_id);
    //return -1;
  //}

  /* Uplink NAS transport can occur either during an ngap connected state
   * or during initial attach (for example: NAS authentication).
   */
  //if (!(ue_context_p->ue_state == NGAP_UE_CONNECTED ||
       // ue_context_p->ue_state == NGAP_UE_WAITING_CSR)) {
    //NGAP_WARN("You are attempting to send NAS data over non-connected "
        //      "gNB ue ngap id: %06x, current state: %d\n",
          //    path_switch_req_p->gNB_ue_ngap_id, ue_context_p->ue_state);
    //return -1;
  //}

zhenghuangkun's avatar
zhenghuangkun committed
1532 1533
  /* Select the AMF corresponding to the provided GUAMI. */
  amf_desc_p = ngap_gNB_nnsf_select_amf_by_guami_no_cause(ngap_gNB_instance_p, path_switch_req_p->ue_guami);
zhenghuangkun's avatar
zhenghuangkun committed
1534

zhenghuangkun's avatar
zhenghuangkun committed
1535
  if (amf_desc_p == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1536
    /*
zhenghuangkun's avatar
zhenghuangkun committed
1537
     * In case gNB has no AMF associated, the gNB should inform RRC and discard
zhenghuangkun's avatar
zhenghuangkun committed
1538 1539 1540
     * this request.
     */

zhenghuangkun's avatar
zhenghuangkun committed
1541
    NGAP_WARN("No AMF is associated to the gNB\n");
zhenghuangkun's avatar
zhenghuangkun committed
1542 1543 1544 1545 1546 1547 1548 1549 1550 1551
    // TODO: Inform RRC
    return -1;
  }

  /* The gNB should allocate a unique gNB UE NGAP ID for this UE. The value
   * will be used for the duration of the connectivity.
   */
  ue_context_p = ngap_gNB_allocate_new_UE_context();
  DevAssert(ue_context_p != NULL);

zhenghuangkun's avatar
zhenghuangkun committed
1552 1553
  /* Keep a reference to the selected AMF */
  ue_context_p->amf_ref       = amf_desc_p;
zhenghuangkun's avatar
zhenghuangkun committed
1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572
  ue_context_p->ue_initial_id = path_switch_req_p->ue_initial_id;
  ue_context_p->gNB_instance  = ngap_gNB_instance_p;

  do {
    struct ngap_gNB_ue_context_s *collision_p;

    /* Peek a random value for the gNB_ue_ngap_id */
    ue_context_p->gNB_ue_ngap_id = (random() + random()) & 0x00ffffff;

    if ((collision_p = RB_INSERT(ngap_ue_map, &ngap_gNB_instance_p->ngap_ue_head, ue_context_p))
        == NULL) {
      NGAP_DEBUG("Found usable gNB_ue_ngap_id: 0x%06x %u(10)\n",
                 ue_context_p->gNB_ue_ngap_id,
                 ue_context_p->gNB_ue_ngap_id);
      /* Break the loop as the id is not already used by another UE */
      break;
    }
  } while(1);
  
zhenghuangkun's avatar
zhenghuangkun committed
1573
  ue_context_p->amf_ue_ngap_id = path_switch_req_p->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591

  /* Prepare the NGAP message to encode */
  memset(&pdu, 0, sizeof(pdu));
  pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
  pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_PathSwitchRequest;
  pdu.choice.initiatingMessage.criticality = NGAP_Criticality_reject;
  pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_PathSwitchRequest;
  out = &pdu.choice.initiatingMessage.value.choice.PathSwitchRequest;

  /* mandatory */
  ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
  ie->criticality = NGAP_Criticality_reject;
  ie->value.present = NGAP_PathSwitchRequestIEs__value_PR_GNB_UE_NGAP_ID;
  ie->value.choice.GNB_UE_NGAP_ID = ue_context_p->gNB_ue_ngap_id;
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1592
  if (path_switch_req_p->nb_of_pdusessions > 0) {
zhenghuangkun's avatar
zhenghuangkun committed
1593
    ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1594
    ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeSwitchedDLList;
zhenghuangkun's avatar
zhenghuangkun committed
1595
    ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1596
    ie->value.present = NGAP_PathSwitchRequestIEs__value_PR_PDUSESSIONToBeSwitchedDLList;
zhenghuangkun's avatar
zhenghuangkun committed
1597

zhenghuangkun's avatar
zhenghuangkun committed
1598 1599 1600
    for (int i = 0; i < path_switch_req_p->nb_of_pdusessions; i++) {
      e_RABToBeSwitchedDLItemIEs = (NGAP_PDUSESSIONToBeSwitchedDLItemIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONToBeSwitchedDLItemIEs_t));
      e_RABToBeSwitchedDLItemIEs->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeSwitchedDLItem;
zhenghuangkun's avatar
zhenghuangkun committed
1601
      e_RABToBeSwitchedDLItemIEs->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1602
      e_RABToBeSwitchedDLItemIEs->value.present = NGAP_PDUSESSIONToBeSwitchedDLItemIEs__value_PR_PDUSESSIONToBeSwitchedDLItem;
zhenghuangkun's avatar
zhenghuangkun committed
1603

zhenghuangkun's avatar
zhenghuangkun committed
1604 1605 1606
      e_RABToBeSwitchedDLItem = &e_RABToBeSwitchedDLItemIEs->value.choice.PDUSESSIONToBeSwitchedDLItem;
      e_RABToBeSwitchedDLItem->e_RAB_ID = path_switch_req_p->pdusessions_tobeswitched[i].pdusession_id;
      INT32_TO_OCTET_STRING(path_switch_req_p->pdusessions_tobeswitched[i].gtp_teid, &e_RABToBeSwitchedDLItem->gTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1607

zhenghuangkun's avatar
zhenghuangkun committed
1608
      e_RABToBeSwitchedDLItem->transportLayerAddress.size  = path_switch_req_p->pdusessions_tobeswitched[i].gNB_addr.length;
zhenghuangkun's avatar
zhenghuangkun committed
1609 1610 1611 1612 1613
      e_RABToBeSwitchedDLItem->transportLayerAddress.bits_unused = 0;

      e_RABToBeSwitchedDLItem->transportLayerAddress.buf = calloc(1,e_RABToBeSwitchedDLItem->transportLayerAddress.size);

      memcpy (e_RABToBeSwitchedDLItem->transportLayerAddress.buf,
zhenghuangkun's avatar
zhenghuangkun committed
1614 1615
                path_switch_req_p->pdusessions_tobeswitched[i].gNB_addr.buffer,
                path_switch_req_p->pdusessions_tobeswitched[i].gNB_addr.length);
zhenghuangkun's avatar
zhenghuangkun committed
1616

zhenghuangkun's avatar
zhenghuangkun committed
1617
      NGAP_DEBUG("path_switch_req: pdusession ID %ld, teid %u, enb_addr %d.%d.%d.%d, SIZE %zu\n",
zhenghuangkun's avatar
zhenghuangkun committed
1618
               e_RABToBeSwitchedDLItem->e_RAB_ID,
zhenghuangkun's avatar
zhenghuangkun committed
1619
               path_switch_req_p->pdusessions_tobeswitched[i].gtp_teid,
zhenghuangkun's avatar
zhenghuangkun committed
1620 1621 1622 1623 1624 1625
               e_RABToBeSwitchedDLItem->transportLayerAddress.buf[0],
               e_RABToBeSwitchedDLItem->transportLayerAddress.buf[1],
               e_RABToBeSwitchedDLItem->transportLayerAddress.buf[2],
               e_RABToBeSwitchedDLItem->transportLayerAddress.buf[3],
               e_RABToBeSwitchedDLItem->transportLayerAddress.size);

zhenghuangkun's avatar
zhenghuangkun committed
1626
      ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONToBeSwitchedDLList.list, e_RABToBeSwitchedDLItemIEs);
zhenghuangkun's avatar
zhenghuangkun committed
1627 1628 1629 1630 1631 1632 1633
    }

    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
  }

  /* mandatory */
  ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1634
  ie->id = NGAP_ProtocolIE_ID_id_SourceAMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
1635
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1636 1637
  ie->value.present = NGAP_PathSwitchRequestIEs__value_PR_AMF_UE_NGAP_ID;
  ie->value.choice.AMF_UE_NGAP_ID = path_switch_req_p->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  /* mandatory */
  ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_EUTRAN_CGI;
  ie->criticality = NGAP_Criticality_ignore;
  ie->value.present = NGAP_PathSwitchRequestIEs__value_PR_EUTRAN_CGI;
  MACRO_GNB_ID_TO_CELL_IDENTITY(ngap_gNB_instance_p->gNB_id,
                                0,
                                &ie->value.choice.EUTRAN_CGI.cell_ID);
  MCC_MNC_TO_TBCD(ngap_gNB_instance_p->mcc[0],
                  ngap_gNB_instance_p->mnc[0],
                  ngap_gNB_instance_p->mnc_digit_length[0],
                  &ie->value.choice.EUTRAN_CGI.pLMNidentity);
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  /* mandatory */
  ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_TAI;
  ie->criticality = NGAP_Criticality_ignore;
  ie->value.present = NGAP_PathSwitchRequestIEs__value_PR_TAI;
  /* Assuming TAI is the TAI from the cell */
  INT16_TO_OCTET_STRING(ngap_gNB_instance_p->tac, &ie->value.choice.TAI.tAC);
  MCC_MNC_TO_PLMNID(ngap_gNB_instance_p->mcc[0],
                    ngap_gNB_instance_p->mnc[0],
                    ngap_gNB_instance_p->mnc_digit_length[0],
                    &ie->value.choice.TAI.pLMNidentity);
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  /* mandatory */
  ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_UESecurityCapabilities;
  ie->criticality = NGAP_Criticality_ignore;
  ie->value.present = NGAP_PathSwitchRequestIEs__value_PR_UESecurityCapabilities;
  ENCRALG_TO_BIT_STRING(path_switch_req_p->security_capabilities.encryption_algorithms,
              &ie->value.choice.UESecurityCapabilities.encryptionAlgorithms);
  INTPROTALG_TO_BIT_STRING(path_switch_req_p->security_capabilities.integrity_algorithms,
              &ie->value.choice.UESecurityCapabilities.integrityProtectionAlgorithms);
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
    NGAP_ERROR("Failed to encode Path Switch Req \n");
    /* Encode procedure has failed... */
    return -1;
  }

  /* Update the current NGAP UE state */
  ue_context_p->ue_state = NGAP_UE_WAITING_CSR;

  /* Assign a stream for this UE :
   * From 3GPP 36.412 7)Transport layers:
zhenghuangkun's avatar
zhenghuangkun committed
1689
   *  Within the SCTP association established between one AMF and gNB pair:
zhenghuangkun's avatar
zhenghuangkun committed
1690 1691 1692 1693 1694 1695 1696 1697 1698
   *  - a single pair of stream identifiers shall be reserved for the sole use
   *      of NGAP elementary procedures that utilize non UE-associated signalling.
   *  - At least one pair of stream identifiers shall be reserved for the sole use
   *      of NGAP elementary procedures that utilize UE-associated signallings.
   *      However a few pairs (i.e. more than one) should be reserved.
   *  - A single UE-associated signalling shall use one SCTP stream and
   *      the stream should not be changed during the communication of the
   *      UE-associated signalling.
   */
zhenghuangkun's avatar
zhenghuangkun committed
1699
  amf_desc_p->nextstream = (amf_desc_p->nextstream + 1) % amf_desc_p->out_streams;
zhenghuangkun's avatar
zhenghuangkun committed
1700

zhenghuangkun's avatar
zhenghuangkun committed
1701 1702
  if ((amf_desc_p->nextstream == 0) && (amf_desc_p->out_streams > 1)) {
    amf_desc_p->nextstream += 1;
zhenghuangkun's avatar
zhenghuangkun committed
1703 1704
  }

zhenghuangkun's avatar
zhenghuangkun committed
1705
  ue_context_p->tx_stream = amf_desc_p->nextstream;
zhenghuangkun's avatar
zhenghuangkun committed
1706 1707 1708

  MSC_LOG_TX_MESSAGE(
    MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
1709
    MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1710 1711
    (const char *)buffer,
    length,
zhenghuangkun's avatar
zhenghuangkun committed
1712
    MSC_AS_TIME_FMT" E_RAN Setup successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1713 1714
    0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
    ue_context_p->gNB_ue_ngap_id,
zhenghuangkun's avatar
zhenghuangkun committed
1715
    path_switch_req_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1716 1717 1718

  /* UE associated signalling -> use the allocated stream */
  ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1719
                                   amf_desc_p->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1720
                                   length, ue_context_p->tx_stream);
heshanyun's avatar
heshanyun committed
1721
#endif
zhenghuangkun's avatar
zhenghuangkun committed
1722

heshanyun's avatar
heshanyun committed
1723
  return 0;
zhenghuangkun's avatar
zhenghuangkun committed
1724 1725 1726 1727 1728
}


//-----------------------------------------------------------------------------
/*
zhenghuangkun's avatar
zhenghuangkun committed
1729
* gNB generate a S1 PDUSESSION Modification Indication towards AMF
zhenghuangkun's avatar
zhenghuangkun committed
1730
*/
zhenghuangkun's avatar
zhenghuangkun committed
1731
/*int ngap_gNB_generate_PDUSESSION_Modification_Indication(
zhenghuangkun's avatar
zhenghuangkun committed
1732
		instance_t instance,
zhenghuangkun's avatar
zhenghuangkun committed
1733
  ngap_pdusession_modification_ind_t *pdusession_modification_ind)
zhenghuangkun's avatar
zhenghuangkun committed
1734 1735 1736 1737
//-----------------------------------------------------------------------------
{
  struct ngap_gNB_ue_context_s        *ue_context_p        = NULL;
  NGAP_NGAP_PDU_t            pdu;
zhenghuangkun's avatar
zhenghuangkun committed
1738 1739 1740 1741
  NGAP_PDUSESSIONModificationIndication_t     *out = NULL;
  NGAP_PDUSESSIONModificationIndicationIEs_t   *ie = NULL;
  NGAP_PDUSESSIONToBeModifiedItemBearerModInd_t 	  *PDUSESSION_ToBeModifiedItem_BearerModInd = NULL;
  NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs_t *PDUSESSION_ToBeModifiedItem_BearerModInd_IEs = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1742

zhenghuangkun's avatar
zhenghuangkun committed
1743 1744
  NGAP_PDUSESSIONNotToBeModifiedItemBearerModInd_t 	  *PDUSESSION_NotToBeModifiedItem_BearerModInd = NULL;
  NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t  *PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1745 1746 1747 1748 1749 1750 1751 1752


  ngap_gNB_instance_t          *ngap_gNB_instance_p = NULL;
  ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
  uint8_t  *buffer = NULL;
  uint32_t  len = 0;
  int       ret = 0;
  DevAssert(ngap_gNB_instance_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1753
  DevAssert(pdusession_modification_ind != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1754

zhenghuangkun's avatar
zhenghuangkun committed
1755 1756
  int num_pdusessions_tobemodified = pdusession_modification_ind->nb_of_pdusessions_tobemodified;
  int num_pdusessions_nottobemodified = pdusession_modification_ind->nb_of_pdusessions_nottobemodified;
zhenghuangkun's avatar
zhenghuangkun committed
1757 1758 1759 1760

  uint32_t CSG_id = 0;

  if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
1761
		  pdusession_modification_ind->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1762 1763
          // The context for this gNB ue ngap id doesn't exist in the map of gNB UEs 
          NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%06x\n",
zhenghuangkun's avatar
zhenghuangkun committed
1764
        		  pdusession_modification_ind->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1765 1766 1767 1768 1769 1770
          return -1;
  }

  // Prepare the NGAP message to encode 
  memset(&pdu, 0, sizeof(pdu));
  pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
zhenghuangkun's avatar
zhenghuangkun committed
1771
  pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1772
  pdu.choice.initiatingMessage.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1773 1774
  pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_PDUSESSIONModificationIndication;
  out = &pdu.choice.initiatingMessage.value.choice.PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1775
  // mandatory 
zhenghuangkun's avatar
zhenghuangkun committed
1776 1777
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
1778
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1779 1780
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_AMF_UE_NGAP_ID;
  ie->value.choice.AMF_UE_NGAP_ID = pdusession_modification_ind->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1781 1782
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

zhenghuangkun's avatar
zhenghuangkun committed
1783
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1784 1785
  ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1786 1787
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_GNB_UE_NGAP_ID;
  ie->value.choice.GNB_UE_NGAP_ID = pdusession_modification_ind->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1788 1789 1790
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  //E-RABs to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1791 1792
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1793
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1794
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1795 1796

  //The following two for-loops here will probably need to change. We should do a different type of search
zhenghuangkun's avatar
zhenghuangkun committed
1797 1798 1799 1800 1801 1802
  for(int i=0; i<num_pdusessions_tobemodified; i++){
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs = (NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs_t *)calloc(1,sizeof(NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs_t));
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeModifiedItemBearerModInd;
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->criticality = NGAP_Criticality_reject;
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->value.present = NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs__value_PR_PDUSESSIONToBeModifiedItemBearerModInd;
	  PDUSESSION_ToBeModifiedItem_BearerModInd = &PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->value.choice.PDUSESSIONToBeModifiedItemBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1803 1804

	  {
zhenghuangkun's avatar
zhenghuangkun committed
1805
	  PDUSESSION_ToBeModifiedItem_BearerModInd->e_RAB_ID = pdusession_modification_ind->pdusessions_tobemodified[i].pdusession_id;
zhenghuangkun's avatar
zhenghuangkun committed
1806

zhenghuangkun's avatar
zhenghuangkun committed
1807 1808 1809 1810 1811
	  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.size  = pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.length/8;
	  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.bits_unused = pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.length%8;
	  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.buf = calloc(1, PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.size);
	  memcpy (PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.buf, pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.buffer,
			  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.size);
zhenghuangkun's avatar
zhenghuangkun committed
1812

zhenghuangkun's avatar
zhenghuangkun committed
1813
	  INT32_TO_OCTET_STRING(pdusession_modification_ind->pdusessions_tobemodified[i].gtp_teid, &PDUSESSION_ToBeModifiedItem_BearerModInd->dL_GTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1814 1815

	  }
zhenghuangkun's avatar
zhenghuangkun committed
1816
	  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONToBeModifiedListBearerModInd.list, PDUSESSION_ToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
1817 1818 1819 1820 1821
  }

  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  //E-RABs NOT to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1822 1823
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1824
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1825 1826
  if(num_pdusessions_nottobemodified > 0) {
	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1827

zhenghuangkun's avatar
zhenghuangkun committed
1828 1829 1830 1831 1832 1833
	  for(int i=0; i<num_pdusessions_nottobemodified; i++){
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs = (NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t *)calloc(1,sizeof(NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t));
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->id = NGAP_ProtocolIE_ID_id_PDUSESSIONNotToBeModifiedItemBearerModInd;
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->criticality = NGAP_Criticality_reject;
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->value.present = NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs__value_PR_PDUSESSIONNotToBeModifiedItemBearerModInd;
		  PDUSESSION_NotToBeModifiedItem_BearerModInd = &PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->value.choice.PDUSESSIONNotToBeModifiedItemBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1834 1835

		  {
zhenghuangkun's avatar
zhenghuangkun committed
1836
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->e_RAB_ID = pdusession_modification_ind->pdusessions_nottobemodified[i].pdusession_id;
zhenghuangkun's avatar
zhenghuangkun committed
1837

zhenghuangkun's avatar
zhenghuangkun committed
1838 1839 1840 1841 1842 1843
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.size  = pdusession_modification_ind->pdusessions_nottobemodified[i].gNB_addr.length/8;
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.bits_unused = pdusession_modification_ind->pdusessions_nottobemodified[i].gNB_addr.length%8;
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.buf =
	  	    				calloc(1, PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.size);
			  memcpy (PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.buf, pdusession_modification_ind->pdusessions_nottobemodified[i].gNB_addr.buffer,
					  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.size);
zhenghuangkun's avatar
zhenghuangkun committed
1844

zhenghuangkun's avatar
zhenghuangkun committed
1845
			  INT32_TO_OCTET_STRING(pdusession_modification_ind->pdusessions_nottobemodified[i].gtp_teid, &PDUSESSION_NotToBeModifiedItem_BearerModInd->dL_GTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1846 1847

		  }
zhenghuangkun's avatar
zhenghuangkun committed
1848
		  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list, PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
1849 1850 1851
	  }
  }
  else{
zhenghuangkun's avatar
zhenghuangkun committed
1852 1853
	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
	  ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list.size = 0;
zhenghuangkun's avatar
zhenghuangkun committed
1854 1855 1856 1857 1858 1859
  }  
  
	   

  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

zhenghuangkun's avatar
zhenghuangkun committed
1860
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1861 1862
  ie->id = NGAP_ProtocolIE_ID_id_CSGMembershipInfo;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1863
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_CSGMembershipInfo;
zhenghuangkun's avatar
zhenghuangkun committed
1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876
  ie->value.choice.CSGMembershipInfo.cSGMembershipStatus = NGAP_CSGMembershipStatus_member;
  INT32_TO_BIT_STRING(CSG_id, &ie->value.choice.CSGMembershipInfo.cSG_Id);
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);


  if (ngap_gNB_encode_pdu(&pdu, &buffer, &len) < 0) {
    NGAP_ERROR("Failed to encode S1 E-RAB modification indication \n");
    return -1;
  }

  // Non UE-Associated signalling -> stream = 0 
  NGAP_INFO("Size of encoded message: %d \n", len);
  ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1877
                                       ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1878 1879
                                       len, ue_context_p->tx_stream);  

zhenghuangkun's avatar
zhenghuangkun committed
1880
//ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance, ue_context_p->amf_ref->assoc_id, buffer, len, 0);
zhenghuangkun's avatar
zhenghuangkun committed
1881 1882 1883
  return ret;
}*/

zhenghuangkun's avatar
zhenghuangkun committed
1884
int ngap_gNB_generate_PDUSESSION_Modification_Indication(
zhenghuangkun's avatar
zhenghuangkun committed
1885
		instance_t instance,
zhenghuangkun's avatar
zhenghuangkun committed
1886
  ngap_pdusession_modification_ind_t *pdusession_modification_ind)
zhenghuangkun's avatar
zhenghuangkun committed
1887 1888
//-----------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
1889
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1890 1891
  struct ngap_gNB_ue_context_s        *ue_context_p        = NULL;
  NGAP_NGAP_PDU_t            pdu;
zhenghuangkun's avatar
zhenghuangkun committed
1892 1893 1894 1895
  NGAP_PDUSESSIONModificationIndication_t     *out = NULL;
  NGAP_PDUSESSIONModificationIndicationIEs_t   *ie = NULL;
  NGAP_PDUSESSIONToBeModifiedItemBearerModInd_t 	  *PDUSESSION_ToBeModifiedItem_BearerModInd = NULL;
  NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs_t *PDUSESSION_ToBeModifiedItem_BearerModInd_IEs = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1896

zhenghuangkun's avatar
zhenghuangkun committed
1897 1898
  //NGAP_PDUSESSIONNotToBeModifiedItemBearerModInd_t 	  *PDUSESSION_NotToBeModifiedItem_BearerModInd = NULL;
  //NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t  *PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1899 1900 1901 1902 1903 1904 1905 1906


  ngap_gNB_instance_t          *ngap_gNB_instance_p = NULL;
  ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
  uint8_t  *buffer = NULL;
  uint32_t  len = 0;
  int       ret = 0;
  DevAssert(ngap_gNB_instance_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1907
  DevAssert(pdusession_modification_ind != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1908

zhenghuangkun's avatar
zhenghuangkun committed
1909 1910
  int num_pdusessions_tobemodified = pdusession_modification_ind->nb_of_pdusessions_tobemodified;
  //int num_pdusessions_nottobemodified = pdusession_modification_ind->nb_of_pdusessions_nottobemodified;
zhenghuangkun's avatar
zhenghuangkun committed
1911 1912 1913 1914 1915

  //uint32_t CSG_id = 0;
  //uint32_t pseudo_gtp_teid = 10;

  if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
1916
		  pdusession_modification_ind->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1917 1918
          // The context for this gNB ue ngap id doesn't exist in the map of gNB UEs 
          NGAP_WARN("Failed to find ue context associated with gNB ue ngap id: 0x%06x\n",
zhenghuangkun's avatar
zhenghuangkun committed
1919
        		  pdusession_modification_ind->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1920 1921 1922 1923 1924 1925
          return -1;
  }

  // Prepare the NGAP message to encode 
  memset(&pdu, 0, sizeof(pdu));
  pdu.present = NGAP_NGAP_PDU_PR_initiatingMessage;
zhenghuangkun's avatar
zhenghuangkun committed
1926
  pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1927
  pdu.choice.initiatingMessage.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1928 1929
  pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_PDUSESSIONModificationIndication;
  out = &pdu.choice.initiatingMessage.value.choice.PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1930
  /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1931 1932
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
1933
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1934 1935
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_AMF_UE_NGAP_ID;
  ie->value.choice.AMF_UE_NGAP_ID = pdusession_modification_ind->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1936 1937
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

zhenghuangkun's avatar
zhenghuangkun committed
1938
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1939 1940
  ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1941 1942
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_GNB_UE_NGAP_ID;
  ie->value.choice.GNB_UE_NGAP_ID = pdusession_modification_ind->gNB_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1943 1944 1945
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  //E-RABs to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1946 1947
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1948
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1949
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1950 1951

  //The following two for-loops here will probably need to change. We should do a different type of search
zhenghuangkun's avatar
zhenghuangkun committed
1952 1953 1954 1955 1956 1957
  for(int i=0; i<num_pdusessions_tobemodified; i++){
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs = (NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs_t *)calloc(1,sizeof(NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs_t));
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeModifiedItemBearerModInd;
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->criticality = NGAP_Criticality_reject;
	  PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->value.present = NGAP_PDUSESSIONToBeModifiedItemBearerModIndIEs__value_PR_PDUSESSIONToBeModifiedItemBearerModInd;
	  PDUSESSION_ToBeModifiedItem_BearerModInd = &PDUSESSION_ToBeModifiedItem_BearerModInd_IEs->value.choice.PDUSESSIONToBeModifiedItemBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1958 1959

	  {
zhenghuangkun's avatar
zhenghuangkun committed
1960
	  PDUSESSION_ToBeModifiedItem_BearerModInd->e_RAB_ID = pdusession_modification_ind->pdusessions_tobemodified[i].pdusession_id;
zhenghuangkun's avatar
zhenghuangkun committed
1961

zhenghuangkun's avatar
zhenghuangkun committed
1962 1963 1964 1965 1966
	  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.size  = pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.length/8;
	  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.bits_unused = pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.length%8;
	  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.buf = calloc(1, PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.size);
	  memcpy (PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.buf, pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.buffer,
			  PDUSESSION_ToBeModifiedItem_BearerModInd->transportLayerAddress.size);
zhenghuangkun's avatar
zhenghuangkun committed
1967

zhenghuangkun's avatar
zhenghuangkun committed
1968
	  INT32_TO_OCTET_STRING(pdusession_modification_ind->pdusessions_tobemodified[i].gtp_teid, &PDUSESSION_ToBeModifiedItem_BearerModInd->dL_GTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1969 1970

	  }
zhenghuangkun's avatar
zhenghuangkun committed
1971
	  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONToBeModifiedListBearerModInd.list, PDUSESSION_ToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
1972 1973 1974 1975 1976
  }

  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  //E-RABs NOT to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1977 1978
  /*ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1979
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1980 1981
  //if(num_pdusessions_nottobemodified > 0) {
	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1982

zhenghuangkun's avatar
zhenghuangkun committed
1983 1984 1985 1986 1987 1988
	  for(int i=0; i<num_pdusessions_tobemodified; i++){
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs = (NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t *)calloc(1,sizeof(NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t));
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->id = NGAP_ProtocolIE_ID_id_PDUSESSIONNotToBeModifiedItemBearerModInd;
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->criticality = NGAP_Criticality_reject;
		  PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->value.present = NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs__value_PR_PDUSESSIONNotToBeModifiedItemBearerModInd;
		  PDUSESSION_NotToBeModifiedItem_BearerModInd = &PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs->value.choice.PDUSESSIONNotToBeModifiedItemBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1989 1990

		  {
zhenghuangkun's avatar
zhenghuangkun committed
1991
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->e_RAB_ID = 10; //pdusession_modification_ind->pdusessions_tobemodified[i].pdusession_id;
zhenghuangkun's avatar
zhenghuangkun committed
1992

zhenghuangkun's avatar
zhenghuangkun committed
1993 1994 1995 1996 1997 1998
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.size  = pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.length/8;
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.bits_unused = pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.length%8;
			  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.buf =
	  	    				calloc(1, PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.size);
			  memcpy (PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.buf, pdusession_modification_ind->pdusessions_tobemodified[i].gNB_addr.buffer,
					  PDUSESSION_NotToBeModifiedItem_BearerModInd->transportLayerAddress.size);
zhenghuangkun's avatar
zhenghuangkun committed
1999

zhenghuangkun's avatar
zhenghuangkun committed
2000 2001
			  //INT32_TO_OCTET_STRING(pdusession_modification_ind->pdusessions_tobemodified[i].gtp_teid, &PDUSESSION_NotToBeModifiedItem_BearerModInd->dL_GTP_TEID);
			    INT32_TO_OCTET_STRING(pseudo_gtp_teid, &PDUSESSION_NotToBeModifiedItem_BearerModInd->dL_GTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
2002 2003

		  }
zhenghuangkun's avatar
zhenghuangkun committed
2004
		  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list, PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
2005 2006 2007
	  }
 // }
  //else{
zhenghuangkun's avatar
zhenghuangkun committed
2008 2009
//	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
//	  ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list.size = 0;
zhenghuangkun's avatar
zhenghuangkun committed
2010 2011 2012 2013 2014 2015
//  } / 
  
	   

  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);*/

zhenghuangkun's avatar
zhenghuangkun committed
2016
  /*ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
2017 2018
  ie->id = NGAP_ProtocolIE_ID_id_CSGMembershipInfo;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
2019
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_CSGMembershipInfo;
zhenghuangkun's avatar
zhenghuangkun committed
2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033
  ie->value.choice.CSGMembershipInfo.cSGMembershipStatus = NGAP_CSGMembershipStatus_member;
  INT32_TO_BIT_STRING(CSG_id, &ie->value.choice.CSGMembershipInfo.cSG_Id);
  ie->value.choice.CSGMembershipInfo.cSG_Id.bits_unused=5; 
  ie->value.choice.CSGMembershipInfo.cellAccessMode = NGAP_CellAccessMode_hybrid;
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);*/
  
  if (ngap_gNB_encode_pdu(&pdu, &buffer, &len) < 0) {
    NGAP_ERROR("Failed to encode S1 E-RAB modification indication \n");
    return -1;
  }

  // Non UE-Associated signalling -> stream = 0 
  NGAP_INFO("Size of encoded message: %d \n", len);
  ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
2034
                                       ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
2035 2036
                                       len, ue_context_p->tx_stream);  

zhenghuangkun's avatar
zhenghuangkun committed
2037
//ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance, ue_context_p->amf_ref->assoc_id, buffer, len, 0);
heshanyun's avatar
heshanyun committed
2038 2039
#endif
  return 0;
zhenghuangkun's avatar
zhenghuangkun committed
2040 2041 2042
}