ngap_gNB_nas_procedures.c 99.8 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 672 673 674 675 676 677 678 679 680 681 682 683 684 685
                  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 "
                  "gNB ue ngap id: %06x, current state: %d\n",
                  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
    return 0;
}

//------------------------------------------------------------------------------
int ngap_gNB_ue_capabilities(instance_t instance,
                             ngap_ue_cap_info_ind_t *ue_cap_info_ind_p)
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
864
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904
    ngap_gNB_instance_t          *ngap_gNB_instance_p;
    struct ngap_gNB_ue_context_s *ue_context_p;
    NGAP_NGAP_PDU_t                       pdu;
    NGAP_UECapabilityInfoIndication_t    *out;
    NGAP_UECapabilityInfoIndicationIEs_t *ie;
    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;
    }

    /* UE capabilities message 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",
                  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;
    pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_UECapabilityInfoIndication;
    pdu.choice.initiatingMessage.criticality = NGAP_Criticality_ignore;
    pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_UECapabilityInfoIndication;
    out = &pdu.choice.initiatingMessage.value.choice.UECapabilityInfoIndication;
    /* mandatory */
    ie = (NGAP_UECapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UECapabilityInfoIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
905
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
906
    ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
907 908
    ie->value.present = NGAP_UECapabilityInfoIndicationIEs__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
909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_UECapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UECapabilityInfoIndicationIEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
    ie->criticality = NGAP_Criticality_reject;
    ie->value.present = NGAP_UECapabilityInfoIndicationIEs__value_PR_GNB_UE_NGAP_ID;
    ie->value.choice.GNB_UE_NGAP_ID = ue_cap_info_ind_p->gNB_ue_ngap_id;
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
    ie = (NGAP_UECapabilityInfoIndicationIEs_t *)calloc(1, sizeof(NGAP_UECapabilityInfoIndicationIEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_UERadioCapability;
    ie->criticality = NGAP_Criticality_reject;
    ie->value.present = NGAP_UECapabilityInfoIndicationIEs__value_PR_UERadioCapability;
    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 */

    if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
        /* Encode procedure has failed... */
        NGAP_ERROR("Failed to encode UE capabilities indication\n");
        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
                                     length, ue_context_p->tx_stream);
heshanyun's avatar
heshanyun committed
946
#endif
zhenghuangkun's avatar
zhenghuangkun committed
947 948 949 950
    return 0;
}

//------------------------------------------------------------------------------
zhenghuangkun's avatar
zhenghuangkun committed
951 952
int ngap_gNB_pdusession_setup_resp(instance_t instance,
                              ngap_pdusession_setup_resp_t *pdusession_setup_resp_p)
zhenghuangkun's avatar
zhenghuangkun committed
953 954
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
955
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
956 957 958
    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
959 960
    NGAP_PDUSESSIONSetupResponse_t    *out;
    NGAP_PDUSESSIONSetupResponseIEs_t *ie;
zhenghuangkun's avatar
zhenghuangkun committed
961 962 963 964 965
    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
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 972
        /* 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
973
                  pdusession_setup_resp_p->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
974 975 976 977 978 979 980 981 982 983
        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
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;
zhenghuangkun's avatar
zhenghuangkun committed
991
    pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONModify;
zhenghuangkun's avatar
zhenghuangkun committed
992
    pdu.choice.successfulOutcome.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
993 994
    pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_PDUSESSIONSetupResponse;
    out = &pdu.choice.successfulOutcome.value.choice.PDUSESSIONSetupResponse;
zhenghuangkun's avatar
zhenghuangkun committed
995
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
996 997
    ie = (NGAP_PDUSESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupResponseIEs_t));
    ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
998
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
999 1000
    ie->value.present = NGAP_PDUSESSIONSetupResponseIEs__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
1001 1002
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1003
    ie = (NGAP_PDUSESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1004 1005
    ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1006 1007
    ie->value.present = NGAP_PDUSESSIONSetupResponseIEs__value_PR_GNB_UE_NGAP_ID;
    ie->value.choice.GNB_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 1012 1013
    if (pdusession_setup_resp_p->nb_of_pdusessions > 0) {
        ie = (NGAP_PDUSESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONSetupListBearerSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1014
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1015
        ie->value.present = NGAP_PDUSESSIONSetupResponseIEs__value_PR_PDUSESSIONSetupListBearerSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1016

zhenghuangkun's avatar
zhenghuangkun committed
1017 1018
        for (i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions; i++) {
            NGAP_PDUSESSIONSetupItemBearerSUResIEs_t *item;
zhenghuangkun's avatar
zhenghuangkun committed
1019
            /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1020 1021
            item = (NGAP_PDUSESSIONSetupItemBearerSUResIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupItemBearerSUResIEs_t));
            item->id = NGAP_ProtocolIE_ID_id_PDUSESSIONSetupItemBearerSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1022
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
            item->value.present = NGAP_PDUSESSIONSetupItemBearerSUResIEs__value_PR_PDUSESSIONSetupItemBearerSURes;
            item->value.choice.PDUSESSIONSetupItemBearerSURes.e_RAB_ID = pdusession_setup_resp_p->pdusessions[i].pdusession_id;
            GTP_TEID_TO_ASN1(pdusession_setup_resp_p->pdusessions[i].gtp_teid, &item->value.choice.PDUSESSIONSetupItemBearerSURes.gTP_TEID);
            item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf = malloc(pdusession_setup_resp_p->pdusessions[i].gNB_addr.length);
            memcpy(item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf,
                   pdusession_setup_resp_p->pdusessions[i].gNB_addr.buffer,
                   pdusession_setup_resp_p->pdusessions[i].gNB_addr.length);
            item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.size = pdusession_setup_resp_p->pdusessions[i].gNB_addr.length;
            item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.bits_unused = 0;
            NGAP_DEBUG("pdusession_setup_resp: pdusession ID %ld, teid %u, enb_addr %d.%d.%d.%d, SIZE %ld\n",
                       item->value.choice.PDUSESSIONSetupItemBearerSURes.e_RAB_ID,
                       pdusession_setup_resp_p->pdusessions[i].gtp_teid,
                       item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[0],
                       item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[1],
                       item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[2],
                       item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.buf[3],
                       item->value.choice.PDUSESSIONSetupItemBearerSURes.transportLayerAddress.size);
            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONSetupListBearerSURes.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
1041 1042 1043 1044 1045 1046
        }

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

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1047 1048 1049
    if (pdusession_setup_resp_p->nb_of_pdusessions_failed > 0) {
        ie = (NGAP_PDUSESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupResponseIEs_t));
        ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONFailedToSetupListBearerSURes;
zhenghuangkun's avatar
zhenghuangkun committed
1050
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1051
        ie->value.present = NGAP_PDUSESSIONSetupResponseIEs__value_PR_PDUSESSIONList;
zhenghuangkun's avatar
zhenghuangkun committed
1052

zhenghuangkun's avatar
zhenghuangkun committed
1053 1054 1055 1056
        for (i = 0; i < pdusession_setup_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
1057
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1058 1059 1060
            item->value.present = NGAP_PDUSESSIONItemIEs__value_PR_PDUSESSIONItem;
            item->value.choice.PDUSESSIONItem.e_RAB_ID = pdusession_setup_resp_p->pdusessions_failed[i].pdusession_id;
            item->value.choice.PDUSESSIONItem.cause.present = pdusession_setup_resp_p->pdusessions_failed[i].cause;
zhenghuangkun's avatar
zhenghuangkun committed
1061

zhenghuangkun's avatar
zhenghuangkun committed
1062
            switch(item->value.choice.PDUSESSIONItem.cause.present) {
zhenghuangkun's avatar
zhenghuangkun committed
1063
            case NGAP_Cause_PR_radioNetwork:
zhenghuangkun's avatar
zhenghuangkun committed
1064
                item->value.choice.PDUSESSIONItem.cause.choice.radioNetwork = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1065 1066 1067
                break;

            case NGAP_Cause_PR_transport:
zhenghuangkun's avatar
zhenghuangkun committed
1068
                item->value.choice.PDUSESSIONItem.cause.choice.transport = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1069 1070 1071
                break;

            case NGAP_Cause_PR_nas:
zhenghuangkun's avatar
zhenghuangkun committed
1072
                item->value.choice.PDUSESSIONItem.cause.choice.nas = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1073 1074 1075
                break;

            case NGAP_Cause_PR_protocol:
zhenghuangkun's avatar
zhenghuangkun committed
1076
                item->value.choice.PDUSESSIONItem.cause.choice.protocol = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1077 1078 1079
                break;

            case NGAP_Cause_PR_misc:
zhenghuangkun's avatar
zhenghuangkun committed
1080
                item->value.choice.PDUSESSIONItem.cause.choice.misc = pdusession_setup_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1081 1082 1083 1084 1085 1086 1087
                break;

            case NGAP_Cause_PR_NOTHING:
            default:
                break;
            }

zhenghuangkun's avatar
zhenghuangkun committed
1088 1089
            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
1090 1091 1092 1093 1094 1095 1096
        }

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

    /* optional */
    if (0) {
zhenghuangkun's avatar
zhenghuangkun committed
1097
        ie = (NGAP_PDUSESSIONSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONSetupResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1098 1099
        ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1100
        ie->value.present = NGAP_PDUSESSIONSetupResponseIEs__value_PR_CriticalityDiagnostics;
zhenghuangkun's avatar
zhenghuangkun committed
1101 1102 1103 1104
        // ie->value.choice.CriticalityDiagnostics = ;
        ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    }

zhenghuangkun's avatar
zhenghuangkun committed
1105 1106 1107
    /* 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
1108
      return -1;
zhenghuangkun's avatar
zhenghuangkun committed
1109
    ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSESSIONSetupListBearerSURes, &e_RABSetupListBearerSURes);
zhenghuangkun's avatar
zhenghuangkun committed
1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
    */
    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
1121
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1122 1123
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
1124
        MSC_AS_TIME_FMT" E_RAN Setup successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1125
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
zhenghuangkun's avatar
zhenghuangkun committed
1126 1127
        pdusession_setup_resp_p->gNB_ue_ngap_id,
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1128 1129
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1130
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1131
                                     length, ue_context_p->tx_stream);
heshanyun's avatar
heshanyun committed
1132
#endif
zhenghuangkun's avatar
zhenghuangkun committed
1133 1134 1135 1136
    return 0;
}

//------------------------------------------------------------------------------
zhenghuangkun's avatar
zhenghuangkun committed
1137 1138
int ngap_gNB_pdusession_modify_resp(instance_t instance,
                               ngap_pdusession_modify_resp_t *pdusession_modify_resp_p)
zhenghuangkun's avatar
zhenghuangkun committed
1139 1140
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
1141
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1142 1143 1144
    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
1145 1146
    NGAP_PDUSESSIONModifyResponse_t    *out;
    NGAP_PDUSESSIONModifyResponseIEs_t *ie;
zhenghuangkun's avatar
zhenghuangkun committed
1147 1148 1149 1150 1151
    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
1152
    DevAssert(pdusession_modify_resp_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1153 1154 1155
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
1156
                        pdusession_modify_resp_p->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1157 1158
        /* 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
1159
                  pdusession_modify_resp_p->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169
        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
1170
                  pdusession_modify_resp_p->gNB_ue_ngap_id, ue_context_p->ue_state);
zhenghuangkun's avatar
zhenghuangkun committed
1171 1172 1173 1174 1175 1176
        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
1177
    pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONModify;
zhenghuangkun's avatar
zhenghuangkun committed
1178
    pdu.choice.successfulOutcome.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1179 1180
    pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_PDUSESSIONModifyResponse;
    out = &pdu.choice.successfulOutcome.value.choice.PDUSESSIONModifyResponse;
zhenghuangkun's avatar
zhenghuangkun committed
1181
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1182 1183
    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
1184
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1185 1186
    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
1187 1188
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1189
    ie = (NGAP_PDUSESSIONModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1190 1191
    ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1192 1193
    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
1194 1195 1196
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1197 1198 1199
    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
1200
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1201
        ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_PDUSESSIONModifyListBearerModRes;
zhenghuangkun's avatar
zhenghuangkun committed
1202

zhenghuangkun's avatar
zhenghuangkun committed
1203 1204 1205 1206
        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
1207
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1208 1209 1210 1211
            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
1212 1213 1214 1215 1216 1217
        }

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

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1218 1219 1220
    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
1221
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1222
        ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_PDUSESSIONList;
zhenghuangkun's avatar
zhenghuangkun committed
1223

zhenghuangkun's avatar
zhenghuangkun committed
1224 1225 1226 1227
        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
1228
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1229 1230 1231
            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
1232

zhenghuangkun's avatar
zhenghuangkun committed
1233
            switch(item->value.choice.PDUSESSIONItem.cause.present) {
zhenghuangkun's avatar
zhenghuangkun committed
1234
            case NGAP_Cause_PR_radioNetwork:
zhenghuangkun's avatar
zhenghuangkun committed
1235
                item->value.choice.PDUSESSIONItem.cause.choice.radioNetwork = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1236 1237 1238
                break;

            case NGAP_Cause_PR_transport:
zhenghuangkun's avatar
zhenghuangkun committed
1239
                item->value.choice.PDUSESSIONItem.cause.choice.transport = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1240 1241 1242
                break;

            case NGAP_Cause_PR_nas:
zhenghuangkun's avatar
zhenghuangkun committed
1243
                item->value.choice.PDUSESSIONItem.cause.choice.nas = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1244 1245 1246
                break;

            case NGAP_Cause_PR_protocol:
zhenghuangkun's avatar
zhenghuangkun committed
1247
                item->value.choice.PDUSESSIONItem.cause.choice.protocol = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1248 1249 1250
                break;

            case NGAP_Cause_PR_misc:
zhenghuangkun's avatar
zhenghuangkun committed
1251
                item->value.choice.PDUSESSIONItem.cause.choice.misc = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1252 1253 1254 1255 1256 1257 1258
                break;

            case NGAP_Cause_PR_NOTHING:
            default:
                break;
            }

zhenghuangkun's avatar
zhenghuangkun committed
1259 1260
            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
1261 1262 1263 1264 1265 1266 1267
        }

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

    /* optional */
    if (0) {
zhenghuangkun's avatar
zhenghuangkun committed
1268
        ie = (NGAP_PDUSESSIONModifyResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModifyResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1269 1270
        ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1271
        ie->value.present = NGAP_PDUSESSIONModifyResponseIEs__value_PR_CriticalityDiagnostics;
zhenghuangkun's avatar
zhenghuangkun committed
1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285
        // 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
1286
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1287 1288
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
1289
        MSC_AS_TIME_FMT" E_RAN Modify successful Outcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1290
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
zhenghuangkun's avatar
zhenghuangkun committed
1291 1292
        pdusession_modify_resp_p->gNB_ue_ngap_id,
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1293 1294
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1295
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1296
                                     length, ue_context_p->tx_stream);
heshanyun's avatar
heshanyun committed
1297
#endif
zhenghuangkun's avatar
zhenghuangkun committed
1298 1299 1300
    return 0;
}
//------------------------------------------------------------------------------
zhenghuangkun's avatar
zhenghuangkun committed
1301 1302
int ngap_gNB_pdusession_release_resp(instance_t instance,
                                ngap_pdusession_release_resp_t *pdusession_release_resp_p)
zhenghuangkun's avatar
zhenghuangkun committed
1303 1304
//------------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
1305
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1306 1307 1308
    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
1309 1310
    NGAP_PDUSESSIONReleaseResponse_t    *out;
    NGAP_PDUSESSIONReleaseResponseIEs_t *ie;
zhenghuangkun's avatar
zhenghuangkun committed
1311 1312 1313 1314 1315
    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
1316
    DevAssert(pdusession_release_resp_p != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1317 1318 1319
    DevAssert(ngap_gNB_instance_p != NULL);

    if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
1320
                        pdusession_release_resp_p->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1321 1322
        /* 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
1323
                  pdusession_release_resp_p->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1324 1325 1326 1327 1328 1329
        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
1330
    pdu.choice.successfulOutcome.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONRelease;
zhenghuangkun's avatar
zhenghuangkun committed
1331
    pdu.choice.successfulOutcome.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1332 1333
    pdu.choice.successfulOutcome.value.present = NGAP_SuccessfulOutcome__value_PR_PDUSESSIONReleaseResponse;
    out = &pdu.choice.successfulOutcome.value.choice.PDUSESSIONReleaseResponse;
zhenghuangkun's avatar
zhenghuangkun committed
1334
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1335 1336
    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
1337
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1338 1339
    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
1340 1341
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
    /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1342
    ie = (NGAP_PDUSESSIONReleaseResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONReleaseResponseIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1343 1344
    ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
    ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1345 1346
    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
1347 1348 1349
    ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1350 1351 1352
    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
1353
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1354
        ie->value.present = NGAP_PDUSESSIONReleaseResponseIEs__value_PR_PDUSESSIONReleaseListBearerRelComp;
zhenghuangkun's avatar
zhenghuangkun committed
1355

zhenghuangkun's avatar
zhenghuangkun committed
1356 1357 1358 1359
        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
1360
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1361 1362 1363 1364
            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
1365 1366 1367 1368 1369 1370
        }

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

    /* optional */
zhenghuangkun's avatar
zhenghuangkun committed
1371 1372 1373
    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
1374
        ie->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1375
        ie->value.present = NGAP_PDUSESSIONReleaseResponseIEs__value_PR_PDUSESSIONList;
zhenghuangkun's avatar
zhenghuangkun committed
1376

zhenghuangkun's avatar
zhenghuangkun committed
1377 1378 1379 1380
        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
1381
            item->criticality = NGAP_Criticality_ignore;
zhenghuangkun's avatar
zhenghuangkun committed
1382 1383 1384
            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
1385

zhenghuangkun's avatar
zhenghuangkun committed
1386
            switch(item->value.choice.PDUSESSIONItem.cause.present) {
zhenghuangkun's avatar
zhenghuangkun committed
1387
            case NGAP_Cause_PR_radioNetwork:
zhenghuangkun's avatar
zhenghuangkun committed
1388
                item->value.choice.PDUSESSIONItem.cause.choice.radioNetwork = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1389 1390 1391
                break;

            case NGAP_Cause_PR_transport:
zhenghuangkun's avatar
zhenghuangkun committed
1392
                item->value.choice.PDUSESSIONItem.cause.choice.transport = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1393 1394 1395
                break;

            case NGAP_Cause_PR_nas:
zhenghuangkun's avatar
zhenghuangkun committed
1396
                item->value.choice.PDUSESSIONItem.cause.choice.nas = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1397 1398 1399
                break;

            case NGAP_Cause_PR_protocol:
zhenghuangkun's avatar
zhenghuangkun committed
1400
                item->value.choice.PDUSESSIONItem.cause.choice.protocol = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1401 1402 1403
                break;

            case NGAP_Cause_PR_misc:
zhenghuangkun's avatar
zhenghuangkun committed
1404
                item->value.choice.PDUSESSIONItem.cause.choice.misc = pdusession_release_resp_p->pdusessions_failed[i].cause_value;
zhenghuangkun's avatar
zhenghuangkun committed
1405 1406 1407 1408 1409 1410 1411
                break;

            case NGAP_Cause_PR_NOTHING:
            default:
                break;
            }

zhenghuangkun's avatar
zhenghuangkun committed
1412
            ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONList.list, item);
zhenghuangkun's avatar
zhenghuangkun committed
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427
        }

        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
1428
        MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1429 1430
        (const char *)buffer,
        length,
zhenghuangkun's avatar
zhenghuangkun committed
1431
        MSC_AS_TIME_FMT" E_RAN Release successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1432
        0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
zhenghuangkun's avatar
zhenghuangkun committed
1433 1434
        pdusession_release_resp_p->gNB_ue_ngap_id,
        ue_context_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1435 1436
    /* UE associated signalling -> use the allocated stream */
    ngap_gNB_itti_send_sctp_data_req(ngap_gNB_instance_p->instance,
zhenghuangkun's avatar
zhenghuangkun committed
1437
                                     ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1438
                                     length, ue_context_p->tx_stream);
zhenghuangkun's avatar
zhenghuangkun committed
1439 1440
    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
1441
#endif
zhenghuangkun's avatar
zhenghuangkun committed
1442 1443 1444 1445 1446 1447 1448
    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
1449
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1450 1451
  ngap_gNB_instance_t          *ngap_gNB_instance_p = NULL;
  struct ngap_gNB_ue_context_s *ue_context_p        = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1452
  struct ngap_gNB_amf_data_s   *amf_desc_p = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1453 1454 1455 1456 1457

  NGAP_NGAP_PDU_t                 pdu;
  NGAP_PathSwitchRequest_t       *out;
  NGAP_PathSwitchRequestIEs_t    *ie;

zhenghuangkun's avatar
zhenghuangkun committed
1458 1459
  NGAP_PDUSESSIONToBeSwitchedDLItemIEs_t *e_RABToBeSwitchedDLItemIEs;
  NGAP_PDUSESSIONToBeSwitchedDLItem_t    *e_RABToBeSwitchedDLItem;
zhenghuangkun's avatar
zhenghuangkun committed
1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489

  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
1490 1491
  /* 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
1492

zhenghuangkun's avatar
zhenghuangkun committed
1493
  if (amf_desc_p == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1494
    /*
zhenghuangkun's avatar
zhenghuangkun committed
1495
     * In case gNB has no AMF associated, the gNB should inform RRC and discard
zhenghuangkun's avatar
zhenghuangkun committed
1496 1497 1498
     * this request.
     */

zhenghuangkun's avatar
zhenghuangkun committed
1499
    NGAP_WARN("No AMF is associated to the gNB\n");
zhenghuangkun's avatar
zhenghuangkun committed
1500 1501 1502 1503 1504 1505 1506 1507 1508 1509
    // 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
1510 1511
  /* Keep a reference to the selected AMF */
  ue_context_p->amf_ref       = amf_desc_p;
zhenghuangkun's avatar
zhenghuangkun committed
1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
  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
1531
  ue_context_p->amf_ue_ngap_id = path_switch_req_p->amf_ue_ngap_id;
zhenghuangkun's avatar
zhenghuangkun committed
1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549

  /* 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
1550
  if (path_switch_req_p->nb_of_pdusessions > 0) {
zhenghuangkun's avatar
zhenghuangkun committed
1551
    ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1552
    ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeSwitchedDLList;
zhenghuangkun's avatar
zhenghuangkun committed
1553
    ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1554
    ie->value.present = NGAP_PathSwitchRequestIEs__value_PR_PDUSESSIONToBeSwitchedDLList;
zhenghuangkun's avatar
zhenghuangkun committed
1555

zhenghuangkun's avatar
zhenghuangkun committed
1556 1557 1558
    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
1559
      e_RABToBeSwitchedDLItemIEs->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1560
      e_RABToBeSwitchedDLItemIEs->value.present = NGAP_PDUSESSIONToBeSwitchedDLItemIEs__value_PR_PDUSESSIONToBeSwitchedDLItem;
zhenghuangkun's avatar
zhenghuangkun committed
1561

zhenghuangkun's avatar
zhenghuangkun committed
1562 1563 1564
      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
1565

zhenghuangkun's avatar
zhenghuangkun committed
1566
      e_RABToBeSwitchedDLItem->transportLayerAddress.size  = path_switch_req_p->pdusessions_tobeswitched[i].gNB_addr.length;
zhenghuangkun's avatar
zhenghuangkun committed
1567 1568 1569 1570 1571
      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
1572 1573
                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
1574

zhenghuangkun's avatar
zhenghuangkun committed
1575
      NGAP_DEBUG("path_switch_req: pdusession ID %ld, teid %u, enb_addr %d.%d.%d.%d, SIZE %zu\n",
zhenghuangkun's avatar
zhenghuangkun committed
1576
               e_RABToBeSwitchedDLItem->e_RAB_ID,
zhenghuangkun's avatar
zhenghuangkun committed
1577
               path_switch_req_p->pdusessions_tobeswitched[i].gtp_teid,
zhenghuangkun's avatar
zhenghuangkun committed
1578 1579 1580 1581 1582 1583
               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
1584
      ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONToBeSwitchedDLList.list, e_RABToBeSwitchedDLItemIEs);
zhenghuangkun's avatar
zhenghuangkun committed
1585 1586 1587 1588 1589 1590 1591
    }

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

  /* mandatory */
  ie = (NGAP_PathSwitchRequestIEs_t *)calloc(1, sizeof(NGAP_PathSwitchRequestIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1592
  ie->id = NGAP_ProtocolIE_ID_id_SourceAMF_UE_NGAP_ID;
zhenghuangkun's avatar
zhenghuangkun committed
1593
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1594 1595
  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
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646
  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
1647
   *  Within the SCTP association established between one AMF and gNB pair:
zhenghuangkun's avatar
zhenghuangkun committed
1648 1649 1650 1651 1652 1653 1654 1655 1656
   *  - 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
1657
  amf_desc_p->nextstream = (amf_desc_p->nextstream + 1) % amf_desc_p->out_streams;
zhenghuangkun's avatar
zhenghuangkun committed
1658

zhenghuangkun's avatar
zhenghuangkun committed
1659 1660
  if ((amf_desc_p->nextstream == 0) && (amf_desc_p->out_streams > 1)) {
    amf_desc_p->nextstream += 1;
zhenghuangkun's avatar
zhenghuangkun committed
1661 1662
  }

zhenghuangkun's avatar
zhenghuangkun committed
1663
  ue_context_p->tx_stream = amf_desc_p->nextstream;
zhenghuangkun's avatar
zhenghuangkun committed
1664 1665 1666

  MSC_LOG_TX_MESSAGE(
    MSC_NGAP_GNB,
zhenghuangkun's avatar
zhenghuangkun committed
1667
    MSC_NGAP_AMF,
zhenghuangkun's avatar
zhenghuangkun committed
1668 1669
    (const char *)buffer,
    length,
zhenghuangkun's avatar
zhenghuangkun committed
1670
    MSC_AS_TIME_FMT" E_RAN Setup successfulOutcome gNB_ue_ngap_id %u amf_ue_ngap_id %u",
zhenghuangkun's avatar
zhenghuangkun committed
1671 1672
    0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
    ue_context_p->gNB_ue_ngap_id,
zhenghuangkun's avatar
zhenghuangkun committed
1673
    path_switch_req_p->amf_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1674 1675 1676

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

heshanyun's avatar
heshanyun committed
1681
  return 0;
zhenghuangkun's avatar
zhenghuangkun committed
1682 1683 1684 1685 1686
}


//-----------------------------------------------------------------------------
/*
zhenghuangkun's avatar
zhenghuangkun committed
1687
* gNB generate a S1 PDUSESSION Modification Indication towards AMF
zhenghuangkun's avatar
zhenghuangkun committed
1688
*/
zhenghuangkun's avatar
zhenghuangkun committed
1689
/*int ngap_gNB_generate_PDUSESSION_Modification_Indication(
zhenghuangkun's avatar
zhenghuangkun committed
1690
		instance_t instance,
zhenghuangkun's avatar
zhenghuangkun committed
1691
  ngap_pdusession_modification_ind_t *pdusession_modification_ind)
zhenghuangkun's avatar
zhenghuangkun committed
1692 1693 1694 1695
//-----------------------------------------------------------------------------
{
  struct ngap_gNB_ue_context_s        *ue_context_p        = NULL;
  NGAP_NGAP_PDU_t            pdu;
zhenghuangkun's avatar
zhenghuangkun committed
1696 1697 1698 1699
  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
1700

zhenghuangkun's avatar
zhenghuangkun committed
1701 1702
  NGAP_PDUSESSIONNotToBeModifiedItemBearerModInd_t 	  *PDUSESSION_NotToBeModifiedItem_BearerModInd = NULL;
  NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t  *PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1703 1704 1705 1706 1707 1708 1709 1710


  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
1711
  DevAssert(pdusession_modification_ind != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1712

zhenghuangkun's avatar
zhenghuangkun committed
1713 1714
  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
1715 1716 1717 1718

  uint32_t CSG_id = 0;

  if ((ue_context_p = ngap_gNB_get_ue_context(ngap_gNB_instance_p,
zhenghuangkun's avatar
zhenghuangkun committed
1719
		  pdusession_modification_ind->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1720 1721
          // 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
1722
        		  pdusession_modification_ind->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1723 1724 1725 1726 1727 1728
          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
1729
  pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1730
  pdu.choice.initiatingMessage.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1731 1732
  pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_PDUSESSIONModificationIndication;
  out = &pdu.choice.initiatingMessage.value.choice.PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1733
  // mandatory 
zhenghuangkun's avatar
zhenghuangkun committed
1734 1735
  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
1736
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1737 1738
  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
1739 1740
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

zhenghuangkun's avatar
zhenghuangkun committed
1741
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1742 1743
  ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1744 1745
  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
1746 1747 1748
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  //E-RABs to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1749 1750
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1751
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1752
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1753 1754

  //The following two for-loops here will probably need to change. We should do a different type of search
zhenghuangkun's avatar
zhenghuangkun committed
1755 1756 1757 1758 1759 1760
  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
1761 1762

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

zhenghuangkun's avatar
zhenghuangkun committed
1765 1766 1767 1768 1769
	  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
1770

zhenghuangkun's avatar
zhenghuangkun committed
1771
	  INT32_TO_OCTET_STRING(pdusession_modification_ind->pdusessions_tobemodified[i].gtp_teid, &PDUSESSION_ToBeModifiedItem_BearerModInd->dL_GTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1772 1773

	  }
zhenghuangkun's avatar
zhenghuangkun committed
1774
	  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONToBeModifiedListBearerModInd.list, PDUSESSION_ToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
1775 1776 1777 1778 1779
  }

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

  //E-RABs NOT to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1780 1781
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1782
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1783 1784
  if(num_pdusessions_nottobemodified > 0) {
	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1785

zhenghuangkun's avatar
zhenghuangkun committed
1786 1787 1788 1789 1790 1791
	  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
1792 1793

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

zhenghuangkun's avatar
zhenghuangkun committed
1796 1797 1798 1799 1800 1801
			  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
1802

zhenghuangkun's avatar
zhenghuangkun committed
1803
			  INT32_TO_OCTET_STRING(pdusession_modification_ind->pdusessions_nottobemodified[i].gtp_teid, &PDUSESSION_NotToBeModifiedItem_BearerModInd->dL_GTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1804 1805

		  }
zhenghuangkun's avatar
zhenghuangkun committed
1806
		  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list, PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
1807 1808 1809
	  }
  }
  else{
zhenghuangkun's avatar
zhenghuangkun committed
1810 1811
	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
	  ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list.size = 0;
zhenghuangkun's avatar
zhenghuangkun committed
1812 1813 1814 1815 1816 1817
  }  
  
	   

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

zhenghuangkun's avatar
zhenghuangkun committed
1818
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1819 1820
  ie->id = NGAP_ProtocolIE_ID_id_CSGMembershipInfo;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1821
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_CSGMembershipInfo;
zhenghuangkun's avatar
zhenghuangkun committed
1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834
  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
1835
                                       ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1836 1837
                                       len, ue_context_p->tx_stream);  

zhenghuangkun's avatar
zhenghuangkun committed
1838
//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
1839 1840 1841
  return ret;
}*/

zhenghuangkun's avatar
zhenghuangkun committed
1842
int ngap_gNB_generate_PDUSESSION_Modification_Indication(
zhenghuangkun's avatar
zhenghuangkun committed
1843
		instance_t instance,
zhenghuangkun's avatar
zhenghuangkun committed
1844
  ngap_pdusession_modification_ind_t *pdusession_modification_ind)
zhenghuangkun's avatar
zhenghuangkun committed
1845 1846
//-----------------------------------------------------------------------------
{
heshanyun's avatar
heshanyun committed
1847
#if 0
zhenghuangkun's avatar
zhenghuangkun committed
1848 1849
  struct ngap_gNB_ue_context_s        *ue_context_p        = NULL;
  NGAP_NGAP_PDU_t            pdu;
zhenghuangkun's avatar
zhenghuangkun committed
1850 1851 1852 1853
  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
1854

zhenghuangkun's avatar
zhenghuangkun committed
1855 1856
  //NGAP_PDUSESSIONNotToBeModifiedItemBearerModInd_t 	  *PDUSESSION_NotToBeModifiedItem_BearerModInd = NULL;
  //NGAP_PDUSESSIONNotToBeModifiedItemBearerModIndIEs_t  *PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs = NULL;
zhenghuangkun's avatar
zhenghuangkun committed
1857 1858 1859 1860 1861 1862 1863 1864


  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
1865
  DevAssert(pdusession_modification_ind != NULL);
zhenghuangkun's avatar
zhenghuangkun committed
1866

zhenghuangkun's avatar
zhenghuangkun committed
1867 1868
  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
1869 1870 1871 1872 1873

  //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
1874
		  pdusession_modification_ind->gNB_ue_ngap_id)) == NULL) {
zhenghuangkun's avatar
zhenghuangkun committed
1875 1876
          // 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
1877
        		  pdusession_modification_ind->gNB_ue_ngap_id);
zhenghuangkun's avatar
zhenghuangkun committed
1878 1879 1880 1881 1882 1883
          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
1884
  pdu.choice.initiatingMessage.procedureCode = NGAP_ProcedureCode_id_PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1885
  pdu.choice.initiatingMessage.criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1886 1887
  pdu.choice.initiatingMessage.value.present = NGAP_InitiatingMessage__value_PR_PDUSESSIONModificationIndication;
  out = &pdu.choice.initiatingMessage.value.choice.PDUSESSIONModificationIndication;
zhenghuangkun's avatar
zhenghuangkun committed
1888
  /* mandatory */
zhenghuangkun's avatar
zhenghuangkun committed
1889 1890
  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
1891
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1892 1893
  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
1894 1895
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

zhenghuangkun's avatar
zhenghuangkun committed
1896
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1897 1898
  ie->id = NGAP_ProtocolIE_ID_id_gNB_UE_NGAP_ID;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1899 1900
  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
1901 1902 1903
  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);

  //E-RABs to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1904 1905
  ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1906
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1907
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1908 1909

  //The following two for-loops here will probably need to change. We should do a different type of search
zhenghuangkun's avatar
zhenghuangkun committed
1910 1911 1912 1913 1914 1915
  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
1916 1917

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

zhenghuangkun's avatar
zhenghuangkun committed
1920 1921 1922 1923 1924
	  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
1925

zhenghuangkun's avatar
zhenghuangkun committed
1926
	  INT32_TO_OCTET_STRING(pdusession_modification_ind->pdusessions_tobemodified[i].gtp_teid, &PDUSESSION_ToBeModifiedItem_BearerModInd->dL_GTP_TEID);
zhenghuangkun's avatar
zhenghuangkun committed
1927 1928

	  }
zhenghuangkun's avatar
zhenghuangkun committed
1929
	  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONToBeModifiedListBearerModInd.list, PDUSESSION_ToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
1930 1931 1932 1933 1934
  }

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

  //E-RABs NOT to be modified list
zhenghuangkun's avatar
zhenghuangkun committed
1935 1936
  /*ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
  ie->id = NGAP_ProtocolIE_ID_id_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1937
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1938 1939
  //if(num_pdusessions_nottobemodified > 0) {
	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
zhenghuangkun's avatar
zhenghuangkun committed
1940

zhenghuangkun's avatar
zhenghuangkun committed
1941 1942 1943 1944 1945 1946
	  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
1947 1948

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

zhenghuangkun's avatar
zhenghuangkun committed
1951 1952 1953 1954 1955 1956
			  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
1957

zhenghuangkun's avatar
zhenghuangkun committed
1958 1959
			  //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
1960 1961

		  }
zhenghuangkun's avatar
zhenghuangkun committed
1962
		  ASN_SEQUENCE_ADD(&ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list, PDUSESSION_NotToBeModifiedItem_BearerModInd_IEs);
zhenghuangkun's avatar
zhenghuangkun committed
1963 1964 1965
	  }
 // }
  //else{
zhenghuangkun's avatar
zhenghuangkun committed
1966 1967
//	  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_PDUSESSIONNotToBeModifiedListBearerModInd;
//	  ie->value.choice.PDUSESSIONNotToBeModifiedListBearerModInd.list.size = 0;
zhenghuangkun's avatar
zhenghuangkun committed
1968 1969 1970 1971 1972 1973
//  } / 
  
	   

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

zhenghuangkun's avatar
zhenghuangkun committed
1974
  /*ie = (NGAP_PDUSESSIONModificationIndicationIEs_t *)calloc(1, sizeof(NGAP_PDUSESSIONModificationIndicationIEs_t));
zhenghuangkun's avatar
zhenghuangkun committed
1975 1976
  ie->id = NGAP_ProtocolIE_ID_id_CSGMembershipInfo;
  ie->criticality = NGAP_Criticality_reject;
zhenghuangkun's avatar
zhenghuangkun committed
1977
  ie->value.present = NGAP_PDUSESSIONModificationIndicationIEs__value_PR_CSGMembershipInfo;
zhenghuangkun's avatar
zhenghuangkun committed
1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991
  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
1992
                                       ue_context_p->amf_ref->assoc_id, buffer,
zhenghuangkun's avatar
zhenghuangkun committed
1993 1994
                                       len, ue_context_p->tx_stream);  

zhenghuangkun's avatar
zhenghuangkun committed
1995
//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
1996 1997
#endif
  return 0;
zhenghuangkun's avatar
zhenghuangkun committed
1998 1999 2000
}