With contributions from * Sakthivel Velumani <velumani@eurecom.fr> * Robert Schmidt <robert.schmidt@openairinterface.org> Squashed commit of the following: commit e8488acbcdaef6ee1688dc233c9e48e85b0fbfc8 Merge: f09468eb135d58645a85Author: laurent <laurent Thomas> Date: Sat Jan 21 15:03:40 2023 +0100 merge develop commit f09468eb13f729c49830786150918b03ae2d7524 Author: laurent <laurent Thomas> Date: Fri Jan 20 10:43:51 2023 +0100 continue e1AP development commit 76545cfbfc7ec5031633b1b0ec599c3560c1e5a7 Author: laurent <laurent Thomas> Date: Wed Jan 18 14:18:47 2023 +0100 fix regressions after merge develop commit 7071c480a6c433eb94501c49f4a7694ba77f4f6d Merge: 569b9fc5f3214aa50595Author: laurent <laurent Thomas> Date: Mon Jan 16 15:51:50 2023 +0100 merge develop commit 569b9fc5f37b9947b722885e423572a211d658da Author: laurent <laurent Thomas> Date: Wed Jan 4 17:07:01 2023 +0100 fix srb2 addition, simplify and remove dead code, fix one race commit 9fa89151c0f9b4a16a79d0685cc04d8cf2adfa44 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Jan 4 20:02:05 2023 +0530 Bearer context release decoder and encoder commit 7011cb518ed6df015ace536e9a08b2d1865188d9 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Jan 4 13:43:58 2023 +0530 Update documentation commit 3e8899fc962cb16fc1ded49590ca5dddede54978 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Jan 4 10:14:11 2023 +0530 Fix function arguments and warnings commit 989ad183a8d66961facaa6719fa7793b9d40d5b4 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Jan 3 20:18:31 2023 +0530 Moved E1-design.md to doc/ commit 04a8633dd509d9525755c5f3abfad976a1ba704e Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Jan 3 20:13:46 2023 +0530 Make libraries lower case in CMakeLists commit 033ec174c1f48a0e745a2a2e1c367aa361f5ae76 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Jan 3 17:55:25 2023 +0530 Renamed and updated cucp cuup config files commit f76a6913352bd8b2bb73ac25f225140cf05f93f2 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Jan 3 13:31:19 2023 +0530 Removed CU-UP checks from nr-softmodem commit ae70afe44c84ac16b977b388c63e80e24803c43c Author: laurent <laurent Thomas> Date: Mon Jan 2 13:01:45 2023 +0100 fix for gcc version hat doesnt accept declarations in switch commit 6a7a01043bf1e6e0ee9ac40b4d85ced7cdf6dcf4 Author: laurent <laurent Thomas> Date: Tue Dec 27 15:59:28 2022 +0100 first functional commit standalone cu-up commit 0caa4690f9e1acbe578d4de5a82ba62f45444a12 Merge: 3619f9550e1a0c0cd1c9Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Fri Dec 23 14:21:00 2022 +0530 Merge remote-tracking branch 'origin/develop' into e1-implementation-wip commit 3619f9550e4d3e78815334150ff8443db914f738 Merge: 1bcf8d5e00cfe698eb70Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Dec 21 15:47:40 2022 +0530 Merge remote-tracking branch 'origin/develop' into e1-implementation-wip commit 1bcf8d5e00a9b9ce440d825f83ddc1b48086daa8 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Sep 13 02:10:34 2022 -0400 Fix GTP rnti to ue_id after rebase commit 23075ff8b7ef5d56df844c05e0a7100fe7bd35de Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Sep 6 00:32:12 2022 -0400 Added documentation commit 28f6e507f74d3fb069441e05da523378dee0f6ed Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Mon Sep 5 15:02:02 2022 -0400 Header cleaups and unitary simulators build fixes commit e665dbab28c49327066cff72aed22e1de7797b59 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Sep 1 17:52:07 2022 -0400 Common interface between CUCP & CUUP for E1 and non E1 modes commit 5dcc1bf59a37ed87d7d32a617cfcd663d6415757 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Sep 1 13:53:49 2022 -0400 Allocate stack where ever possible Free memory after ASN encode commit 793a5379539a3a2b6c42cd327d8cef79fe21fb55 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Sep 1 10:41:50 2022 -0400 Fixes for build issues commit 0d3564f25a0d8746b0fc550ed371ce21e08cd05a Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Aug 31 20:57:14 2022 -0400 Fixed uesoftmodem linkage error commit 34adf865820f09900a5efed693ada1ccf6f0f1ad Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Aug 31 19:31:50 2022 -0400 Removed RRC thread from CUUP commit 536741910aff90a86ba3a60612f943b412c5ab40 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Aug 31 14:21:31 2022 -0400 Add header guard in one of E1AP header commit 22e9d9b6dea5d84d259ee2dc1aaa7cb943e55b08 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Aug 31 14:00:47 2022 -0400 Fix bug in PDCP ue_id commit 4c65339b07d347003ed89d5e00f49a62e9b21483 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 30 18:04:59 2022 -0400 Linked E1AP lib to L2_NR target E1AP builds for nr-softmodem commit 014fe30ac93c84d810e0209bc7f0d3b7a1bbaee3 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 30 15:49:27 2022 -0400 Remove xer prints from e1ap and gcc warning fixes commit 71f0c9126bbb91bc595b66d57e1e91db676d3b9d Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 30 15:42:30 2022 -0400 Fixed bug in integrity protection config commit 4e393ef9528c2b14d670a341b52fc63262abf894 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 30 14:34:37 2022 -0400 GTP init with only local address IP traffic works both directions in Mono, F1 and E1 commit ec3bde2c5deb99f554afc2053e351b9f79525e96 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 30 00:16:03 2022 -0400 Fix bug in pdcp config and GTP instance UL iperf still not works. Can see packets in wireshark. commit be8df4435eeae0a0755e2ac658f33caa2a3e3c94 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Sat Aug 27 20:15:04 2022 -0400 Fixes in node config after rebase commit 6f42ff88de7f1615f87c46771fd6617a5fdfc48f Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Sat Aug 27 01:38:21 2022 -0400 Added N3 tunnel address in config params fixed bug in address length feild commit b5e132041994344ebb5c2c59ca392612a32658fd Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Fri Aug 26 20:38:47 2022 -0400 Send UL UP address via F1 UE cxt mod msg commit ecfd0fe260aee6aad78c291368c246f88b6bffcf Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Fri Aug 26 15:08:53 2022 -0400 Update GTP remote address from response message Modified GTP tunnel update function accordingly Put GTP tunnel update out of F1AP F1 split works commit 14a37e414de3d653f25ccef1a790bc5b08fc7dc2 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Sat Aug 20 01:17:36 2022 -0400 Moved GTP tunnel creation out of F1AP message sending commit cdd58ab96e84f48cc8ab8f0fe6b3133081ff02f7 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Fri Aug 19 17:40:43 2022 -0400 Moved DRB config out of RRCReconfig complete Monolithic and F1 split works commit 61d66e490a1b61aa2b6ce18d993bb90d112d6374 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Aug 11 01:30:10 2022 -0400 Allow CUUP to have RRC inst without error commit dd7ae889372bb9fdf9e96be87c28eed0d9461d7f Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Aug 11 01:29:21 2022 -0400 Added missing IEs in bearer cxt response handler commit a6f1fe5fd254ccb36a54ede5b652161cb5e542e8 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Aug 10 21:02:30 2022 -0400 Unified bearer context message transfer for E1 and non-E1 mode compiles, to be tested commit f245ace285632edcc28d669123746b9bf458bc38 Author: laurent <laurent Thomas> Date: Tue Aug 9 17:46:52 2022 +0200 remove log_i() of fatal errors commit d2a0f3c8620981f3b65a136f0169e3be9c549742 Author: laurent <laurent Thomas> Date: Fri Aug 5 15:01:39 2022 +0200 fix rnti/ue_id for ue commit 7b52c6cd9e675c28cb9d6347d122f77234ec6542 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Aug 4 19:14:46 2022 -0400 Created separate functions in PDCP for E1 mode commit 46680d2b3d221e675c3aeb675137f45318e31acb Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Aug 4 19:13:10 2022 -0400 Bug fixes in bearer context setup response commit 3d091bfd31b7aba625e4ba4b4f0f337cf2c1f6db Author: laurent <laurent Thomas> Date: Thu Aug 4 15:42:11 2022 +0200 add missing file from previous commit commit 21838572196dec947da99f350f20c4d9408c3c17 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed Aug 3 16:59:16 2022 -0400 Minor bug fixes commit 34eb73fbc6f9d33098850d62b4808e54c80bb4ca Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 2 23:16:47 2022 -0400 Added config files for testing To be renamed or removed later commit a7e9c6fb9332295ad42585eb4338a6f9ff0ae7c0 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 2 23:15:21 2022 -0400 Made rrc_gNB_get_ue_context_from_ngap_ids() non static commit 028f0407571466ff24cf72b5c3814e42c346ae81 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 2 23:12:16 2022 -0400 Completed bearer context setup cycle To be tested: Handling of bearer context setup response and subsequent UE context modifition msg to F1AP task commit 4481d11324b13efa73ab0b5f4f156012485661ae Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Aug 2 23:01:50 2022 -0400 Fixed E1AP PPID (wireshark fixed) commit 7a22573f3e7e16960e3310609dea2783ddf404a2 Author: laurent <laurent Thomas> Date: Fri Jul 29 13:03:31 2022 +0200 fix compile issues, simplify gtp send function commit 0209011aa75a16e4c9c1eb36ebcf4fe0ff93aba2 Author: laurent <laurent Thomas> Date: Thu Jul 28 11:51:18 2022 +0200 restore compilation capability, gtp replacement of rnti by ueid commit ce3b886fd7f11322a8d37b924d1752e6a6adf777 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Fri Jul 22 08:35:31 2022 -0400 Included missing IEs in bearer cxt setup message commit 1208ae0d6fe4b25341c9036dde111fd4d00fd6e9 Author: Cedric Roux <cedric.roux@eurecom.fr> Date: Tue Jul 19 10:53:35 2022 +0200 replace rnti by ue_id in pdcp some sdap and gtp files had to be touched, the work is not finished in there some changes in nr_pdcp_oai_api.c simply assume ue_id is indeed rnti (will functions in this file be used by cu-up?) commit e67d1c88c786267458194e4de516919d0b5d1002 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Jul 19 10:08:39 2022 +0200 Replace RNTI with UE ID in GTP files (half done. Laurent to change ctxt_t) commit 7a141e8e941e5c2624a47da7c764531c03b8f617 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Jul 19 10:04:15 2022 +0200 Added RRC handler for bearer cxt setup in CUUP commit fe2106676bf9144347f30969a1bfd351136f536a Author: laurent <laurent Thomas> Date: Mon Jul 11 13:30:30 2022 +0200 fix race in startup procedure (config before starting threads that use the config) commit 3197baab60e53459928da30cea7a4e0514a074e3 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Sun Jul 10 11:30:31 2022 +0200 Fixed bugs in bearer creation commit 26be61167dec9068e572e08a21ddc96a0f2a7731 Author: laurent <laurent Thomas> Date: Sun Jul 10 10:50:57 2022 +0200 fix a race, add asn1c debug method commit 26750d1818aa206c4c56ada6dbed9bb66dfe3811 Author: laurent <laurent Thomas> Date: Wed Jul 6 22:34:10 2022 +0200 e1ap bearer setup encoding invalid commit d092788aa3f8229eb5c938a41534dfb318955135 Author: laurent <laurent Thomas> Date: Wed Jul 6 14:18:39 2022 +0200 fix regression with F1, some basic cleaning in NGAP commit 41a135734a33b284808d4c5049c431dbc0ff1c46 Author: laurent <laurent Thomas> Date: Wed Jul 6 11:24:52 2022 +0200 fix some ngap regressions commit 460acd840dd58fd46a995219cb9da8fda103668e Author: laurent <laurent Thomas> Date: Tue Jul 5 21:19:13 2022 +0200 build, run in F1 mode until UE connect but pdu session still fails commit 7c067095df287cc7a542be53e9a1471c11ec5af8 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Sat Jun 25 22:45:46 2022 +0530 Populate PDU and DRB paramenters from NGAP commit c4ada56a8c31b4c07fc1498e15b0954d9b1ad2f6 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue Jun 7 22:16:58 2022 +0530 setup resp decoding success commit a2f41597c7438934a203ccf3cced35b6b65e8cee Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Sat Jun 4 13:50:55 2022 +0530 Fixed bugs in E1 setup procedure E1 setup request decoding successful commit 6106207ba74c74579b5f375d572930a609abe3a9 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu May 26 20:13:14 2022 +0530 Fixing build issues commit 67235fac01aaca4c17da13bf658144ffe6bd12df Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Mon May 23 12:04:22 2022 +0200 Make nr-softmodem depend on E1AP module commit 391cee938e8250c355b6b914e747f2004c795817 Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Mon May 23 11:57:15 2022 +0200 Fix ITTI errors in E1AP target commit db4146e4a0432b7e3759d71efbeb450754c1f0d3 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Wed May 18 06:59:03 2022 +0530 CP UP task created commit 3058d2fc445acf5681a09f70409023718294d093 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue May 10 08:12:19 2022 +0530 Bearer context setup response message commit b911e9db2a4d0a35eb9a449ef02acefff30b558f Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Tue May 3 16:52:49 2022 +0530 Bearer context setup c structs commit d0f4d5f3539803253b9a995a90a47b3d825ea0ca Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Apr 28 02:21:50 2022 +0530 Bearer context setup message commit 489a5358fa0e199314254561a2d52c1a93f7803e Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Thu Apr 21 10:11:03 2022 +0530 Started with CUUP task commit b416061f5a237cbabbe09c6d81fe92df9e33fd72 Author: Sakthivel Velumani <velumani@eurecom.fr> Date: Fri Apr 15 18:46:27 2022 +0530 Setup request and response messages commit faca4b97dba92be857bd8442193365fc2c8ed122 Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Mon Apr 11 15:01:48 2022 +0200 Fixup for cmake execution commit ecfd9f7608a5820ae85278939e9bbaf7f1245dd6 Author: Robert Schmidt <robert.schmidt@eurecom.fr> Date: Tue Nov 24 21:39:20 2020 +0100 Move CMakeLists.txt into root commit 9f41f7c52b3c7a185e5e34bb1591b0eb66459837 Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Tue Apr 12 12:07:18 2022 +0200 Remove hwlat refs in build_oai: targets don't exist anymore commit e666cf5eedc67695febd33de1397331d6b7b2320 Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Mon Apr 11 14:37:32 2022 +0200 Create CMake E1AP_RELEASE variable from E1AP_VERSION commit 1f8413361c1b99ea46ee613da035803a1387f65c Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Sun Apr 10 14:25:38 2022 +0200 Add E1AP lib commit 7465cea49243fd6eb9869035b18860dface57098 Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Sun Apr 10 14:48:40 2022 +0200 Add E1AP Grammar and build ASN.1 lib at build time commit cde22f83032a199387ae1eae6b702f44ed154f3e Author: Robert Schmidt <robert.schmidt@openairinterface.org> Date: Fri Apr 22 13:42:51 2022 +0200 Accept higher vers. nums in make_version/MAKE_VERSION commit d5127b23608240374a439d1d9c2ff6d53c4b527c Author: Robert Schmidt <robert.schmidt@eurecom.fr> Date: Tue Nov 24 21:39:20 2020 +0100 Move CMakeLists.txt into root
1772 lines
87 KiB
C
1772 lines
87 KiB
C
/*
|
|
* 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 f1ap_cu_ue_context_management.c
|
|
* \brief F1AP UE Context Management, CU side
|
|
* \author EURECOM/NTUST
|
|
* \date 2018
|
|
* \version 0.1
|
|
* \company Eurecom
|
|
* \email: navid.nikaein@eurecom.fr, bing-kai.hong@eurecom.fr
|
|
* \note
|
|
* \warning
|
|
*/
|
|
|
|
#include "f1ap_common.h"
|
|
#include "f1ap_encoder.h"
|
|
#include "f1ap_decoder.h"
|
|
#include "f1ap_itti_messaging.h"
|
|
#include "f1ap_cu_ue_context_management.h"
|
|
#include <string.h>
|
|
|
|
#include "rrc_extern.h"
|
|
#include "rrc_eNB_UE_context.h"
|
|
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
|
|
#include "rrc_eNB_S1AP.h"
|
|
#include "rrc_eNB_GTPV1U.h"
|
|
#include "openair2/RRC/NR/rrc_gNB_NGAP.h"
|
|
#include <openair3/ocp-gtpu/gtp_itf.h>
|
|
|
|
static void setQos(F1AP_NonDynamic5QIDescriptor_t *toFill) {
|
|
asn1cCalloc(toFill, tmp);
|
|
/* fiveQI */
|
|
tmp->fiveQI = 1L;
|
|
|
|
/* OPTIONAL */
|
|
/* qoSPriorityLevel */
|
|
if (0) {
|
|
asn1cCallocOne(toFill->qoSPriorityLevel, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* averagingWindow */
|
|
if (0) {
|
|
asn1cCallocOne(toFill->averagingWindow, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxDataBurstVolume */
|
|
if (0) {
|
|
asn1cCallocOne(toFill->maxDataBurstVolume, 1L);
|
|
}
|
|
}
|
|
|
|
int CU_send_UE_CONTEXT_SETUP_REQUEST(instance_t instance,
|
|
f1ap_ue_context_setup_t *f1ap_ue_context_setup_req) {
|
|
F1AP_F1AP_PDU_t pdu= {0};
|
|
/* Create */
|
|
/* 0. Message Type */
|
|
pdu.present = F1AP_F1AP_PDU_PR_initiatingMessage;
|
|
asn1cCalloc(pdu.choice.initiatingMessage, tmp);
|
|
tmp->procedureCode = F1AP_ProcedureCode_id_UEContextSetup;
|
|
tmp->criticality = F1AP_Criticality_reject;
|
|
tmp->value.present = F1AP_InitiatingMessage__value_PR_UEContextSetupRequest;
|
|
F1AP_UEContextSetupRequest_t *out = &pdu.choice.initiatingMessage->value.choice.UEContextSetupRequest;
|
|
/* mandatory */
|
|
/* c1. GNB_CU_UE_F1AP_ID */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie1);
|
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
|
ie1->criticality = F1AP_Criticality_reject;
|
|
ie1->value.present = F1AP_UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_setup_req->rnti); //f1ap_ue_context_setup_req->gNB_CU_ue_id;
|
|
|
|
/* optional */
|
|
/* c2. GNB_DU_UE_F1AP_ID */
|
|
if (f1ap_ue_context_setup_req->gNB_DU_ue_id) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie2);
|
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
|
ie2->criticality = F1AP_Criticality_ignore;
|
|
ie2->value.present = F1AP_UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_setup_req->rnti); //*f1ap_ue_context_setup_req->gNB_DU_ue_id;
|
|
}
|
|
|
|
/* mandatory */
|
|
/* c3. SpCell_ID */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie3);
|
|
ie3->id = F1AP_ProtocolIE_ID_id_SpCell_ID;
|
|
ie3->criticality = F1AP_Criticality_reject;
|
|
ie3->value.present = F1AP_UEContextSetupRequestIEs__value_PR_NRCGI;
|
|
/* - nRCGI */
|
|
addnRCGI(ie3->value.choice.NRCGI, f1ap_ue_context_setup_req);
|
|
/* mandatory */
|
|
/* c4. ServCellIndex */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie4);
|
|
ie4->id = F1AP_ProtocolIE_ID_id_ServCellIndex;
|
|
ie4->criticality = F1AP_Criticality_reject;
|
|
ie4->value.present = F1AP_UEContextSetupRequestIEs__value_PR_ServCellIndex;
|
|
ie4->value.choice.ServCellIndex = 0;
|
|
|
|
/* optional */
|
|
/* c5. CellULConfigured */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie5);
|
|
ie5->id = F1AP_ProtocolIE_ID_id_SpCellULConfigured;
|
|
ie5->criticality = F1AP_Criticality_ignore;
|
|
ie5->value.present = F1AP_UEContextSetupRequestIEs__value_PR_CellULConfigured;
|
|
ie5->value.choice.CellULConfigured = F1AP_CellULConfigured_ul;
|
|
}
|
|
|
|
/* mandatory */
|
|
/* c6. CUtoDURRCInformation */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie6);
|
|
ie6->id = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation;
|
|
ie6->criticality = F1AP_Criticality_reject;
|
|
ie6->value.present = F1AP_UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
|
|
|
|
if (f1ap_ue_context_setup_req->cu_to_du_rrc_information!=NULL) {
|
|
/* optional */
|
|
/* 6.1 cG_ConfigInfo */
|
|
if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){
|
|
asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
|
|
OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo,
|
|
f1ap_ue_context_setup_req->cu_to_du_rrc_information->cG_ConfigInfo_length);
|
|
}
|
|
/* optional */
|
|
/* 6.2 uE_CapabilityRAT_ContainerList */
|
|
if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
|
|
asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
|
|
OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
|
|
f1ap_ue_context_setup_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length);
|
|
}
|
|
/* optional */
|
|
/* 6.3 measConfig */
|
|
if(f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig!=NULL){
|
|
asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig);
|
|
OCTET_STRING_fromBuf(measConfig, (const char*)f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig,
|
|
f1ap_ue_context_setup_req->cu_to_du_rrc_information->measConfig_length);
|
|
}
|
|
}
|
|
|
|
|
|
/* mandatory */
|
|
/* c7. Candidate_SpCell_List */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie7);
|
|
ie7->id = F1AP_ProtocolIE_ID_id_Candidate_SpCell_List; //90
|
|
ie7->criticality = F1AP_Criticality_ignore;
|
|
ie7->value.present = F1AP_UEContextSetupRequestIEs__value_PR_Candidate_SpCell_List;
|
|
|
|
for (int i=0; i<1; i++) {
|
|
asn1cSequenceAdd(ie7->value.choice.Candidate_SpCell_List.list,F1AP_Candidate_SpCell_ItemIEs_t, candidate_spCell_item_ies);
|
|
candidate_spCell_item_ies->id = F1AP_ProtocolIE_ID_id_Candidate_SpCell_Item; // 91
|
|
candidate_spCell_item_ies->criticality = F1AP_Criticality_reject;
|
|
candidate_spCell_item_ies->value.present = F1AP_Candidate_SpCell_ItemIEs__value_PR_Candidate_SpCell_Item;
|
|
/* 7.1 Candidate_SpCell_Item */
|
|
F1AP_Candidate_SpCell_Item_t *candidate_spCell_item=
|
|
&candidate_spCell_item_ies->value.choice.Candidate_SpCell_Item;
|
|
/* - candidate_SpCell_ID */
|
|
//FixMe: first cell ???
|
|
addnRCGI(candidate_spCell_item->candidate_SpCell_ID,f1ap_ue_context_setup_req);
|
|
/* TODO add correct mcc/mnc */
|
|
}
|
|
|
|
/* optional */
|
|
/* c8. DRXCycle */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie8);
|
|
ie8->id = F1AP_ProtocolIE_ID_id_DRXCycle;
|
|
ie8->criticality = F1AP_Criticality_ignore;
|
|
ie8->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRXCycle;
|
|
/* 8.1 longDRXCycleLength */
|
|
ie8->value.choice.DRXCycle.longDRXCycleLength = F1AP_LongDRXCycleLength_ms10; // enum
|
|
|
|
/* optional */
|
|
/* 8.2 shortDRXCycleLength */
|
|
if (0) {
|
|
asn1cCallocOne(ie6->value.choice.DRXCycle.shortDRXCycleLength,
|
|
F1AP_ShortDRXCycleLength_ms2); // enum
|
|
}
|
|
|
|
/* optional */
|
|
/* 8.3 shortDRXCycleTimer */
|
|
if (0) {
|
|
asn1cCallocOne(ie8->value.choice.DRXCycle.shortDRXCycleTimer,
|
|
123L);
|
|
}
|
|
}
|
|
|
|
/* optional */
|
|
/* c9. ResourceCoordinationTransferContainer */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie9);
|
|
ie9->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
|
|
ie9->criticality = F1AP_Criticality_ignore;
|
|
ie9->value.present = F1AP_UEContextSetupRequestIEs__value_PR_ResourceCoordinationTransferContainer;
|
|
ie9->value.choice.ResourceCoordinationTransferContainer.buf = malloc(4);
|
|
ie9->value.choice.ResourceCoordinationTransferContainer.size = 4;
|
|
strncpy((char *)ie9->value.choice.ResourceCoordinationTransferContainer.buf, "123", 4);
|
|
OCTET_STRING_fromBuf(&ie9->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
|
|
strlen("asdsa1d32sa1d31asd31as"));
|
|
}
|
|
|
|
/* mandatory */
|
|
/* c10. SCell_ToBeSetup_List */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie10);
|
|
ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetup_List;
|
|
ie10->criticality = F1AP_Criticality_ignore;
|
|
ie10->value.present = F1AP_UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
|
|
|
|
for (int i=0; i<1; i++) {
|
|
//
|
|
asn1cSequenceAdd(ie10->value.choice.SCell_ToBeSetup_List.list, F1AP_SCell_ToBeSetup_ItemIEs_t, scell_toBeSetup_item_ies);
|
|
scell_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetup_Item; //53
|
|
scell_toBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
|
scell_toBeSetup_item_ies->value.present = F1AP_SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
|
|
/* 10.1 SCell_ToBeSetup_Item */
|
|
F1AP_SCell_ToBeSetup_Item_t *scell_toBeSetup_item=&scell_toBeSetup_item_ies->value.choice.SCell_ToBeSetup_Item;
|
|
/* 10.1.1 sCell_ID */
|
|
addnRCGI(scell_toBeSetup_item->sCell_ID, f1ap_ue_context_setup_req);
|
|
/* TODO correct MCC/MNC */
|
|
/* 10.1.2 sCellIndex */
|
|
scell_toBeSetup_item->sCellIndex = 3; // issue here
|
|
|
|
/* OPTIONAL */
|
|
/* 10.1.3 sCellULConfigured*/
|
|
if (0) {
|
|
asn1cCallocOne(scell_toBeSetup_item->sCellULConfigured,
|
|
F1AP_CellULConfigured_ul_and_sul); // enum
|
|
}
|
|
}
|
|
|
|
/* mandatory */
|
|
/* c11. SRBs_ToBeSetup_List */
|
|
if(f1ap_ue_context_setup_req->srbs_to_be_setup_length > 0){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie11);
|
|
ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_List;
|
|
ie11->criticality = F1AP_Criticality_reject; // ?
|
|
ie11->value.present = F1AP_UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
|
|
|
|
for (int i=0; i<f1ap_ue_context_setup_req->srbs_to_be_setup_length; i++) {
|
|
asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetup_List.list, F1AP_SRBs_ToBeSetup_ItemIEs_t, srbs_toBeSetup_item_ies);
|
|
srbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetup_Item; // 73
|
|
srbs_toBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
|
srbs_toBeSetup_item_ies->value.present = F1AP_SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
|
|
/* 11.1 SRBs_ToBeSetup_Item */
|
|
F1AP_SRBs_ToBeSetup_Item_t *srbs_toBeSetup_item=&srbs_toBeSetup_item_ies->value.choice.SRBs_ToBeSetup_Item;
|
|
/* 11.1.1 sRBID */
|
|
srbs_toBeSetup_item->sRBID = f1ap_ue_context_setup_req->srbs_to_be_setup[i].srb_id;
|
|
/* OPTIONAL */
|
|
/* 11.1.2 duplicationIndication */
|
|
asn1cCallocOne(srbs_toBeSetup_item->duplicationIndication,
|
|
F1AP_DuplicationIndication_true); // enum
|
|
}
|
|
}
|
|
|
|
/* mandatory */
|
|
/* c12. DRBs_ToBeSetup_List */
|
|
if(f1ap_ue_context_setup_req->drbs_to_be_setup_length){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12);
|
|
ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_List;
|
|
ie12->criticality = F1AP_Criticality_reject;
|
|
ie12->value.present = F1AP_UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
|
|
LOG_I(F1AP, "Length of drbs_to_be_setup: %d \n", f1ap_ue_context_setup_req->drbs_to_be_setup_length);
|
|
|
|
for (int i = 0; i < f1ap_ue_context_setup_req->drbs_to_be_setup_length; i++) {
|
|
//
|
|
asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetup_List.list, F1AP_DRBs_ToBeSetup_ItemIEs_t, drbs_toBeSetup_item_ies);
|
|
drbs_toBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
|
|
drbs_toBeSetup_item_ies->criticality = F1AP_Criticality_reject;
|
|
drbs_toBeSetup_item_ies->value.present = F1AP_DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
|
|
/* 12.1 DRBs_ToBeSetup_Item */
|
|
F1AP_DRBs_ToBeSetup_Item_t *drbs_toBeSetup_item=&drbs_toBeSetup_item_ies->value.choice.DRBs_ToBeSetup_Item;
|
|
/* 12.1.1 dRBID */
|
|
drbs_toBeSetup_item->dRBID = f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id; // 9
|
|
/* 12.1.2 qoSInformation */
|
|
int some_decide_qos = 0; // BK: Need Check
|
|
|
|
if (some_decide_qos) {
|
|
drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
|
|
/* 12.1.2.1 eUTRANQoS */
|
|
asn1cCalloc(drbs_toBeSetup_item->qoSInformation.choice.eUTRANQoS, eUTRANQoS);
|
|
/* 12.1.2.1.1 qCI */
|
|
eUTRANQoS->qCI = 254L;
|
|
/* 12.1.2.1.2 allocationAndRetentionPriority */
|
|
{
|
|
/* 12.1.2.1.2.1 priorityLevel */
|
|
eUTRANQoS->allocationAndRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
|
|
/* 12.1.2.1.2.2 pre_emptionCapability */
|
|
eUTRANQoS->allocationAndRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_may_trigger_pre_emption; // enum
|
|
/* 12.1.2.1.2.2 pre_emptionVulnerability */
|
|
eUTRANQoS->allocationAndRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* 12.1.2.1.3 gbrQosInformation */
|
|
if (0) {
|
|
eUTRANQoS->gbrQosInformation = (F1AP_GBR_QosInformation_t *)calloc(1, sizeof(F1AP_GBR_QosInformation_t));
|
|
asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateDL, 1L);
|
|
asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_MaximumBitrateUL, 1L);
|
|
asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateDL, 1L);
|
|
asn_long2INTEGER(&eUTRANQoS->gbrQosInformation->e_RAB_GuaranteedBitrateUL, 1L);
|
|
}
|
|
} else {
|
|
/* 12.1.2 DRB_Information */
|
|
drbs_toBeSetup_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
|
|
F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
|
|
ie->id = F1AP_ProtocolIE_ID_id_DRB_Information;
|
|
ie->criticality = F1AP_Criticality_reject;
|
|
ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
|
|
F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information;
|
|
drbs_toBeSetup_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
|
|
/* 12.1.2.1 dRB_QoS */
|
|
{
|
|
/* qoS_Characteristics */
|
|
{
|
|
int some_decide_qoS_characteristics = 0; // BK: Need Check
|
|
|
|
if (some_decide_qoS_characteristics) {
|
|
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
|
setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
|
|
} else {
|
|
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
|
asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
|
|
/* qoSPriorityLevel */
|
|
tmp->qoSPriorityLevel = 1L;
|
|
/* packetDelayBudget */
|
|
tmp->packetDelayBudget = 1L;
|
|
/* packetErrorRate */
|
|
tmp->packetErrorRate.pER_Scalar = 1L;
|
|
tmp->packetErrorRate.pER_Exponent = 6L;
|
|
|
|
/* OPTIONAL */
|
|
/* delayCritical */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* averagingWindow */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxDataBurstVolume */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
|
|
}
|
|
} // if some_decide_qoS_characteristics
|
|
} // qoS_Characteristics
|
|
/* nGRANallocationRetentionPriority */
|
|
{
|
|
DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
|
|
DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
|
|
DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
|
|
} // nGRANallocationRetentionPriority
|
|
|
|
/* OPTIONAL */
|
|
/* gBR_QoS_Flow_Information */
|
|
if (0) {
|
|
asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateDownlink */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateUplink */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* reflective_QoS_Attribute */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
|
|
}
|
|
} // dRB_QoS
|
|
/* 12.1.2.2 sNSSAI */
|
|
{
|
|
/* sST */
|
|
OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
|
|
|
|
/* OPTIONAL */
|
|
/* sD */
|
|
if (0) {
|
|
asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
|
|
OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
|
|
strlen("asdsa1d32sa1d31asd31as"));
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* 12.1.2.3 notificationControl */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->notificationControl,
|
|
F1AP_NotificationControl_active); // enum
|
|
}
|
|
|
|
/* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy
|
|
|
|
for (int k = 0; k < 1; k ++) {
|
|
asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
|
|
F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
|
|
/* qoSFlowIndicator */
|
|
flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
|
|
/* qoSFlowLevelQoSParameters */
|
|
{
|
|
/* qoS_Characteristics */
|
|
{
|
|
int some_decide_qoS_characteristics = 0; // BK: Need Check
|
|
F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
|
|
|
|
if (some_decide_qoS_characteristics) {
|
|
QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
|
setQos(QosParams->choice.non_Dynamic_5QI);
|
|
} else {
|
|
QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
|
|
/* qoSPriorityLevel */
|
|
tmp->qoSPriorityLevel = 1L;
|
|
/* packetDelayBudget */
|
|
tmp->packetDelayBudget = 1L;
|
|
/* packetErrorRate */
|
|
tmp->packetErrorRate.pER_Scalar = 1L;
|
|
tmp->packetErrorRate.pER_Exponent = 6L;
|
|
|
|
/* OPTIONAL */
|
|
/* delayCritical */
|
|
if (0) {
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
|
|
*tmp = 1L;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* averagingWindow */
|
|
if (0) {
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
|
|
*tmp = 1L;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxDataBurstVolume */
|
|
if (0) {
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
|
|
*tmp= 1L;
|
|
}
|
|
} // if some_decide_qoS_characteristics
|
|
} // qoS_Characteristics
|
|
/* nGRANallocationRetentionPriority */
|
|
{
|
|
flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
|
|
flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
|
|
flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
|
|
} // nGRANallocationRetentionPriority
|
|
|
|
/* OPTIONAL */
|
|
/* gBR_QoS_Flow_Information */
|
|
if (0) {
|
|
asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateDownlink */
|
|
if (0) {
|
|
asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateUplink */
|
|
if (0) {
|
|
asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* reflective_QoS_Attribute */
|
|
if (0) {
|
|
asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
|
|
}
|
|
} // qoSFlowLevelQoSParameters
|
|
}
|
|
} // if some_decide_qos
|
|
|
|
/* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
|
|
for (int j = 0; j < f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
|
|
/*Use a dummy teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU*/
|
|
/* Use a dummy address and teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context setup response from the DU */
|
|
transport_layer_addr_t addr = { length: 32, buffer: { 0 } };
|
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid = newGtpuCreateTunnel(getCxt(CUtype, instance)->gtpInst,
|
|
f1ap_ue_context_setup_req->rnti,
|
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
|
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].drb_id,
|
|
0xFFFF, // We will set the right value from DU answer
|
|
-1, // no qfi
|
|
addr, // We will set the right value from DU answer
|
|
f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_dl_tnl[0].port,
|
|
cu_f1u_data_req,
|
|
NULL);
|
|
/* 12.3.1 ULTunnels_ToBeSetup_Item */
|
|
asn1cSequenceAdd(drbs_toBeSetup_item->uLUPTNLInformation_ToBeSetup_List.list,
|
|
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
|
|
uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
|
asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
|
|
gTPTunnel);
|
|
/* 12.3.1.1.1 transportLayerAddress */
|
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
|
|
&gTPTunnel->transportLayerAddress);
|
|
/* 12.3.1.1.2 gTP_TEID */
|
|
INT32_TO_OCTET_STRING(f1ap_ue_context_setup_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
|
|
&gTPTunnel->gTP_TEID);
|
|
}
|
|
|
|
/* 12.1.4 rLCMode */
|
|
/* TODO use rlc_mode from f1ap_drb_to_be_setup */
|
|
switch (f1ap_ue_context_setup_req->drbs_to_be_setup[i].rlc_mode) {
|
|
case RLC_MODE_AM:
|
|
drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_am;
|
|
break;
|
|
|
|
default:
|
|
drbs_toBeSetup_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* 12.1.5 ULConfiguration */
|
|
if (0) {
|
|
asn1cCalloc(drbs_toBeSetup_item->uLConfiguration, tmp);
|
|
tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* 12.1.6 duplicationActivation */
|
|
if (0) {
|
|
asn1cCalloc(drbs_toBeSetup_item->duplicationActivation, tmp);
|
|
*tmp = F1AP_DuplicationActivation_active; // enum
|
|
}
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* InactivityMonitoringRequest */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie12);
|
|
ie12->id = F1AP_ProtocolIE_ID_id_InactivityMonitoringRequest;
|
|
ie12->criticality = F1AP_Criticality_reject;
|
|
ie12->value.present = F1AP_UEContextSetupRequestIEs__value_PR_InactivityMonitoringRequest;
|
|
ie12->value.choice.InactivityMonitoringRequest = F1AP_InactivityMonitoringRequest_true; // 0
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* RAT_FrequencyPriorityInformation */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie13);
|
|
ie13->id = F1AP_ProtocolIE_ID_id_RAT_FrequencyPriorityInformation;
|
|
ie13->criticality = F1AP_Criticality_reject;
|
|
ie13->value.present = F1AP_UEContextSetupRequestIEs__value_PR_RAT_FrequencyPriorityInformation;
|
|
int endc = 1; // RK: Get this from somewhere ...
|
|
|
|
if (endc) {
|
|
ie13->value.choice.RAT_FrequencyPriorityInformation.present = F1AP_RAT_FrequencyPriorityInformation_PR_eNDC;
|
|
ie13->value.choice.RAT_FrequencyPriorityInformation.choice.eNDC = 11L;
|
|
} else {
|
|
ie13->value.choice.RAT_FrequencyPriorityInformation.present = F1AP_RAT_FrequencyPriorityInformation_PR_nGRAN;
|
|
ie13->value.choice.RAT_FrequencyPriorityInformation.choice.nGRAN = 11L;
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* RRCContainer */
|
|
if(f1ap_ue_context_setup_req->rrc_container_length > 0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie14);
|
|
ie14->id = F1AP_ProtocolIE_ID_id_RRCContainer;
|
|
ie14->criticality = F1AP_Criticality_reject;
|
|
ie14->value.present = F1AP_UEContextSetupRequestIEs__value_PR_RRCContainer;
|
|
OCTET_STRING_fromBuf(&ie14->value.choice.RRCContainer, (const char *)f1ap_ue_context_setup_req->rrc_container,
|
|
f1ap_ue_context_setup_req->rrc_container_length);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* MaskedIMEISV */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupRequestIEs_t, ie15);
|
|
ie15->id = F1AP_ProtocolIE_ID_id_MaskedIMEISV;
|
|
ie15->criticality = F1AP_Criticality_reject;
|
|
ie15->value.present = F1AP_UEContextSetupRequestIEs__value_PR_MaskedIMEISV;
|
|
MaskedIMEISV_TO_BIT_STRING(12340000l, &ie15->value.choice.MaskedIMEISV); // size (64)
|
|
}
|
|
|
|
/* encode */
|
|
uint8_t *buffer=NULL;
|
|
uint32_t len=0;
|
|
|
|
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
|
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT SETUP REQUEST\n");
|
|
return -1;
|
|
}
|
|
|
|
// xer_fprint(stdout, &asn_DEF_F1AP_F1AP_PDU, (void *)pdu);
|
|
// asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
|
|
// res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
|
|
// buffer = res.buffer;
|
|
// len = res.result.encoded;
|
|
// if (res.result.encoded <= 0) {
|
|
// LOG_E(F1AP, "ASN1 message encoding failed (%s, %lu)!\n", res.result.failed_type->name, res.result.encoded);
|
|
// return -1;
|
|
// }
|
|
LOG_D(F1AP,"F1AP UEContextSetupRequest Encoded %u bits\n", len);
|
|
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
|
|
return 0;
|
|
}
|
|
|
|
int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance,
|
|
uint32_t assoc_id,
|
|
uint32_t stream,
|
|
F1AP_F1AP_PDU_t *pdu) {
|
|
MessageDef *msg_p;
|
|
F1AP_UEContextSetupResponse_t *container;
|
|
F1AP_UEContextSetupResponseIEs_t *ie;
|
|
DevAssert(pdu);
|
|
msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_SETUP_RESP);
|
|
f1ap_ue_context_setup_t *f1ap_ue_context_setup_resp = &F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
|
container = &pdu->choice.successfulOutcome->value.choice.UEContextSetupResponse;
|
|
int i;
|
|
/* GNB_CU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
|
f1ap_ue_context_setup_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
|
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_CU_ue_id);
|
|
/* GNB_DU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
|
f1ap_ue_context_setup_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
|
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
|
f1ap_ue_context_setup_resp->rnti =
|
|
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
|
// DUtoCURRCInformation
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, true);
|
|
|
|
if (ie == NULL) {
|
|
LOG_E(F1AP,"%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
|
|
return -1;
|
|
}
|
|
|
|
f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1,sizeof(du_to_cu_rrc_information_t));
|
|
f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
|
memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
|
f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
|
|
// DRBs_Setup_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_DRBs_Setup_List, false);
|
|
|
|
if(ie!=NULL) {
|
|
f1ap_ue_context_setup_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_Setup_List.list.count;
|
|
f1ap_ue_context_setup_resp->drbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_to_be_setup_length,
|
|
sizeof(f1ap_drb_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_setup_resp->drbs_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
|
|
|
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_to_be_setup_length; ++i) {
|
|
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_to_be_setup[i];
|
|
F1AP_DRBs_Setup_Item_t *drbs_setup_item_p;
|
|
drbs_setup_item_p = &((F1AP_DRBs_Setup_ItemIEs_t *)ie->value.choice.DRBs_Setup_List.list.array[i])->value.choice.DRBs_Setup_Item;
|
|
drb_p->drb_id = drbs_setup_item_p->dRBID;
|
|
// TODO in the following, assume only one UP UL TNL is present.
|
|
// this matches/assumes OAI CU/DU implementation, can be up to 2!
|
|
drb_p->up_dl_tnl_length = 1;
|
|
AssertFatal(drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
|
"no DL UP TNL Information in DRBs to be Setup list\n");
|
|
F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
|
|
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
|
|
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
|
|
OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
|
|
GtpuUpdateTunnelOutgoingAddressAndTeid(getCxt(CUtype, instance)->gtpInst,
|
|
f1ap_ue_context_setup_resp->rnti,
|
|
(ebi_t)drbs_setup_item_p->dRBID,
|
|
drb_p->up_dl_tnl[0].tl_address,
|
|
drb_p->up_dl_tnl[0].teid);
|
|
}
|
|
}
|
|
|
|
// SRBs_FailedToBeSetup_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List, false);
|
|
|
|
if(ie!=NULL) {
|
|
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetup_List.list.count;
|
|
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length,
|
|
sizeof(f1ap_rb_failed_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
|
|
|
|
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length; ++i) {
|
|
f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_failed_to_be_setup[i];
|
|
srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetup_Item_t *)ie->value.choice.SRBs_FailedToBeSetup_List.list.array[i])->sRBID;
|
|
}
|
|
}
|
|
|
|
// DRBs_FailedToBeSetup_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List, false);
|
|
|
|
if(ie!=NULL) {
|
|
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetup_List.list.count;
|
|
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length,
|
|
sizeof(f1ap_rb_failed_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
|
|
|
|
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length; ++i) {
|
|
f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_failed_to_be_setup[i];
|
|
drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetup_Item_t *)ie->value.choice.DRBs_FailedToBeSetup_List.list.array[i])->dRBID;
|
|
}
|
|
}
|
|
|
|
// SCell_FailedtoSetup_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List, false);
|
|
|
|
if(ie!=NULL) {
|
|
LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetup_List \n");
|
|
}
|
|
|
|
// SRBs_Setup_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_SRBs_Setup_List, false);
|
|
|
|
if(ie!=NULL) {
|
|
f1ap_ue_context_setup_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_Setup_List.list.count;
|
|
f1ap_ue_context_setup_resp->srbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_to_be_setup_length,
|
|
sizeof(f1ap_srb_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_setup_resp->srbs_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
|
|
|
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_to_be_setup_length; ++i) {
|
|
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_to_be_setup[i];
|
|
F1AP_SRBs_Setup_Item_t *srbs_setup_item_p;
|
|
srbs_setup_item_p = &((F1AP_SRBs_Setup_ItemIEs_t *)ie->value.choice.SRBs_Setup_List.list.array[i])->value.choice.SRBs_Setup_Item;
|
|
srb_p->srb_id = srbs_setup_item_p->sRBID;
|
|
srb_p->lcid = srbs_setup_item_p->lCID;
|
|
}
|
|
}
|
|
|
|
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
|
|
return 0;
|
|
}
|
|
|
|
int CU_handle_UE_CONTEXT_SETUP_FAILURE(instance_t instance,
|
|
uint32_t assoc_id,
|
|
uint32_t stream,
|
|
F1AP_F1AP_PDU_t *pdu) {
|
|
AssertFatal(1==0,"Not implemented yet\n");
|
|
}
|
|
|
|
int CU_handle_UE_CONTEXT_RELEASE_REQUEST(instance_t instance,
|
|
uint32_t assoc_id,
|
|
uint32_t stream,
|
|
F1AP_F1AP_PDU_t *pdu) {
|
|
F1AP_UEContextReleaseRequest_t *container;
|
|
F1AP_UEContextReleaseRequestIEs_t *ie;
|
|
DevAssert(pdu);
|
|
container = &pdu->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
|
|
/* GNB_CU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
|
const rnti_t rnti = f1ap_get_rnti_by_cu_id(true, instance,
|
|
ie->value.choice.GNB_CU_UE_F1AP_ID);
|
|
/* GNB_DU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
|
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(CUtype, instance,
|
|
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
|
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
|
rnti2, rnti);
|
|
/* Cause */
|
|
/* We don't care for the moment
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseRequestIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_Cause, true);
|
|
|
|
switch(ie->value.choice.Cause.present)
|
|
{
|
|
case F1AP_Cause_PR_radioNetwork:
|
|
//ie->value.choice.Cause.choice.radioNetwork
|
|
break;
|
|
case F1AP_Cause_PR_transport:
|
|
//ie->value.choice.Cause.choice.transport
|
|
break;
|
|
case F1AP_Cause_PR_protocol:
|
|
//ie->value.choice.Cause.choice.protocol
|
|
break;
|
|
case F1AP_Cause_PR_misc:
|
|
//ie->value.choice.Cause.choice.misc
|
|
break;
|
|
case F1AP_Cause_PR_NOTHING:
|
|
default:
|
|
break;
|
|
}
|
|
*/
|
|
LOG_I(F1AP, "Received UE CONTEXT RELEASE REQUEST: Trigger RRC for RNTI %x\n", rnti);
|
|
|
|
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
|
AssertFatal(false,"must be devlopped\n");
|
|
} else {
|
|
struct rrc_eNB_ue_context_s *ue_context_pP;
|
|
ue_context_pP = rrc_eNB_get_ue_context(RC.rrc[instance], rnti);
|
|
rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_REQ(
|
|
instance,
|
|
ue_context_pP,
|
|
S1AP_CAUSE_RADIO_NETWORK,
|
|
21); // send cause 21: connection with ue lost
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int CU_send_UE_CONTEXT_RELEASE_COMMAND(instance_t instance,
|
|
f1ap_ue_context_release_cmd_t *cmd) {
|
|
F1AP_F1AP_PDU_t pdu= {0};
|
|
F1AP_UEContextReleaseCommand_t *out;
|
|
uint8_t *buffer=NULL;
|
|
uint32_t len=0;
|
|
/* Create */
|
|
/* 0. Message Type */
|
|
pdu.present = F1AP_F1AP_PDU_PR_initiatingMessage;
|
|
asn1cCalloc(pdu.choice.initiatingMessage, tmp);
|
|
tmp->procedureCode = F1AP_ProcedureCode_id_UEContextRelease;
|
|
tmp->criticality = F1AP_Criticality_reject;
|
|
tmp->value.present = F1AP_InitiatingMessage__value_PR_UEContextReleaseCommand;
|
|
out = &tmp->value.choice.UEContextReleaseCommand;
|
|
/* mandatory */
|
|
/* c1. GNB_CU_UE_F1AP_ID */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie1);
|
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
|
ie1->criticality = F1AP_Criticality_reject;
|
|
ie1->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, cmd->rnti);
|
|
/* mandatory */
|
|
/* c2. GNB_DU_UE_F1AP_ID */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie2);
|
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
|
ie2->criticality = F1AP_Criticality_reject;
|
|
ie2->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, cmd->rnti);
|
|
/* mandatory */
|
|
/* c3. Cause */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie3);
|
|
ie3->id = F1AP_ProtocolIE_ID_id_Cause;
|
|
ie3->criticality = F1AP_Criticality_ignore;
|
|
ie3->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_Cause;
|
|
|
|
switch (cmd->cause) {
|
|
case F1AP_CAUSE_RADIO_NETWORK:
|
|
ie3->value.choice.Cause.present = F1AP_Cause_PR_radioNetwork;
|
|
ie3->value.choice.Cause.choice.radioNetwork = cmd->cause_value;
|
|
break;
|
|
|
|
case F1AP_CAUSE_TRANSPORT:
|
|
ie3->value.choice.Cause.present = F1AP_Cause_PR_transport;
|
|
ie3->value.choice.Cause.choice.transport = cmd->cause_value;
|
|
break;
|
|
|
|
case F1AP_CAUSE_PROTOCOL:
|
|
ie3->value.choice.Cause.present = F1AP_Cause_PR_protocol;
|
|
ie3->value.choice.Cause.choice.protocol = cmd->cause_value;
|
|
break;
|
|
|
|
case F1AP_CAUSE_MISC:
|
|
ie3->value.choice.Cause.present = F1AP_Cause_PR_misc;
|
|
ie3->value.choice.Cause.choice.misc = cmd->cause_value;
|
|
break;
|
|
|
|
case F1AP_CAUSE_NOTHING:
|
|
default:
|
|
ie3->value.choice.Cause.present = F1AP_Cause_PR_NOTHING;
|
|
break;
|
|
}
|
|
|
|
/* optional */
|
|
/* c4. RRCContainer */
|
|
if(cmd->rrc_container!=NULL){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextReleaseCommandIEs_t, ie4);
|
|
ie4->id = F1AP_ProtocolIE_ID_id_RRCContainer;
|
|
ie4->criticality = F1AP_Criticality_ignore;
|
|
ie4->value.present = F1AP_UEContextReleaseCommandIEs__value_PR_RRCContainer;
|
|
OCTET_STRING_fromBuf(&ie4->value.choice.RRCContainer, (const char *)cmd->rrc_container,
|
|
cmd->rrc_container_length);
|
|
}
|
|
|
|
/* encode */
|
|
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
|
LOG_E(F1AP, "Failed to encode F1 context release command\n");
|
|
return -1;
|
|
}
|
|
|
|
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0);
|
|
return 0;
|
|
}
|
|
int CU_handle_UE_CONTEXT_RELEASE_COMPLETE(instance_t instance,
|
|
uint32_t assoc_id,
|
|
uint32_t stream,
|
|
F1AP_F1AP_PDU_t *pdu) {
|
|
F1AP_UEContextReleaseComplete_t *container;
|
|
F1AP_UEContextReleaseCompleteIEs_t *ie;
|
|
DevAssert(pdu);
|
|
container = &pdu->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
|
|
/* GNB_CU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
|
const rnti_t rnti = f1ap_get_rnti_by_cu_id(CUtype, instance,
|
|
ie->value.choice.GNB_CU_UE_F1AP_ID);
|
|
/* GNB_DU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
|
const rnti_t rnti2 = f1ap_get_rnti_by_du_id(CUtype, instance,
|
|
ie->value.choice.GNB_DU_UE_F1AP_ID);
|
|
AssertFatal(rnti == rnti2, "RNTI obtained through DU ID (%x) is different from CU ID (%x)\n",
|
|
rnti2, rnti);
|
|
/* Optional*/
|
|
/* CriticalityDiagnostics */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextReleaseCompleteIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_CriticalityDiagnostics, false);
|
|
|
|
if (ie) {
|
|
// ie->value.choice.CriticalityDiagnostics.procedureCode
|
|
// ie->value.choice.CriticalityDiagnostics.triggeringMessage
|
|
// ie->value.choice.CriticalityDiagnostics.procedureCriticality
|
|
// ie->value.choice.CriticalityDiagnostics.transactionID
|
|
// F1AP_CriticalityDiagnostics_IE_List
|
|
}
|
|
|
|
protocol_ctxt_t ctxt;
|
|
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, instance, ENB_FLAG_YES, rnti, 0, 0, instance);
|
|
|
|
if (f1ap_req(true, instance)->cell_type==CELL_MACRO_GNB) {
|
|
struct rrc_gNB_ue_context_s *ue_context_p =
|
|
rrc_gNB_get_ue_context(RC.nrrrc[instance], rnti);
|
|
|
|
if (ue_context_p) {
|
|
MessageDef *msg = itti_alloc_new_message(TASK_CU_F1, 0, NGAP_UE_CONTEXT_RELEASE_COMPLETE);
|
|
NGAP_UE_CONTEXT_RELEASE_COMPLETE(msg).gNB_ue_ngap_id = ue_context_p->ue_context.gNB_ue_ngap_id;
|
|
itti_send_msg_to_task(TASK_NGAP, instance, msg);
|
|
rrc_gNB_remove_ue_context(&ctxt, RC.nrrrc[instance], ue_context_p);
|
|
} else {
|
|
LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti);
|
|
}
|
|
|
|
} else {
|
|
struct rrc_eNB_ue_context_s *ue_context_p =
|
|
rrc_eNB_get_ue_context(RC.rrc[instance], rnti);
|
|
|
|
if (ue_context_p) {
|
|
/* The following is normally done in the function rrc_rx_tx() */
|
|
rrc_eNB_send_S1AP_UE_CONTEXT_RELEASE_CPLT(instance,
|
|
ue_context_p->ue_context.eNB_ue_s1ap_id);
|
|
rrc_eNB_send_GTPV1U_ENB_DELETE_TUNNEL_REQ(instance, ue_context_p);
|
|
|
|
// erase data of GTP tunnels in UE context
|
|
for (int e_rab = 0; e_rab < ue_context_p->ue_context.nb_of_e_rabs; e_rab++) {
|
|
ue_context_p->ue_context.enb_gtp_teid[e_rab] = 0;
|
|
memset(&ue_context_p->ue_context.enb_gtp_addrs[e_rab],
|
|
0, sizeof(ue_context_p->ue_context.enb_gtp_addrs[e_rab]));
|
|
ue_context_p->ue_context.enb_gtp_ebi[e_rab] = 0;
|
|
}
|
|
|
|
struct rrc_ue_s1ap_ids_s *rrc_ue_s1ap_ids =
|
|
rrc_eNB_S1AP_get_ue_ids(RC.rrc[instance], 0,
|
|
ue_context_p->ue_context.eNB_ue_s1ap_id);
|
|
|
|
if (rrc_ue_s1ap_ids)
|
|
rrc_eNB_S1AP_remove_ue_ids(RC.rrc[instance], rrc_ue_s1ap_ids);
|
|
|
|
/* trigger UE release in RRC */
|
|
rrc_eNB_remove_ue_context(&ctxt, RC.rrc[instance], ue_context_p);
|
|
} else {
|
|
LOG_E(F1AP, "could not find ue_context of UE RNTI %x\n", rnti);
|
|
}
|
|
}
|
|
|
|
pdcp_remove_UE(&ctxt);
|
|
|
|
LOG_I(F1AP, "Received UE CONTEXT RELEASE COMPLETE: Removing CU UE entry for RNTI %x\n", rnti);
|
|
f1ap_remove_ue(CUtype, instance, rnti);
|
|
return 0;
|
|
}
|
|
|
|
int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, f1ap_ue_context_setup_t *f1ap_ue_context_modification_req) {
|
|
F1AP_F1AP_PDU_t pdu= {0};
|
|
F1AP_UEContextModificationRequest_t *out;
|
|
uint8_t *buffer=NULL;
|
|
uint32_t len=0;
|
|
// for test
|
|
cellIDs_t hardCoded= { .mcc=208, .mnc=93, .mnc_digit_length=2};
|
|
/* Create */
|
|
/* 0. Message Type */
|
|
pdu.present = F1AP_F1AP_PDU_PR_initiatingMessage;
|
|
asn1cCalloc(pdu.choice.initiatingMessage, tmp);
|
|
tmp->procedureCode = F1AP_ProcedureCode_id_UEContextModification;
|
|
tmp->criticality = F1AP_Criticality_reject;
|
|
tmp->value.present = F1AP_InitiatingMessage__value_PR_UEContextModificationRequest;
|
|
out = &tmp->value.choice.UEContextModificationRequest;
|
|
/* mandatory */
|
|
/* c1. GNB_CU_UE_F1AP_ID */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie1);
|
|
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
|
ie1->criticality = F1AP_Criticality_reject;
|
|
ie1->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
|
ie1->value.choice.GNB_CU_UE_F1AP_ID = f1ap_get_cu_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
|
|
/* mandatory */
|
|
/* c2. GNB_DU_UE_F1AP_ID */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie2);
|
|
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
|
ie2->criticality = F1AP_Criticality_reject;
|
|
ie2->value.present = F1AP_UEContextModificationRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
|
ie2->value.choice.GNB_DU_UE_F1AP_ID = f1ap_get_du_ue_f1ap_id(CUtype, instance, f1ap_ue_context_modification_req->rnti);;
|
|
|
|
/* optional */
|
|
/* c3. NRCGI */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie3);
|
|
ie3->id = F1AP_ProtocolIE_ID_id_SpCell_ID;
|
|
ie3->criticality = F1AP_Criticality_ignore;
|
|
ie3->value.present = F1AP_UEContextModificationRequestIEs__value_PR_NRCGI;
|
|
/* - nRCGI */
|
|
addnRCGI(ie3->value.choice.NRCGI, &hardCoded);
|
|
}
|
|
|
|
/* optional */
|
|
/* c4. ServCellIndex */
|
|
if(0){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie4);
|
|
ie4->id = F1AP_ProtocolIE_ID_id_ServCellIndex;
|
|
ie4->criticality = F1AP_Criticality_reject;
|
|
ie4->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ServCellIndex;
|
|
ie4->value.choice.ServCellIndex = 5L;
|
|
}
|
|
|
|
/* optional */
|
|
/* c5. DRXCycle */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie5);
|
|
ie5->id = F1AP_ProtocolIE_ID_id_DRXCycle;
|
|
ie5->criticality = F1AP_Criticality_ignore;
|
|
ie5->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRXCycle;
|
|
ie5->value.choice.DRXCycle.longDRXCycleLength = F1AP_LongDRXCycleLength_ms10; // enum
|
|
|
|
if (0) {
|
|
asn1cCallocOne(ie5->value.choice.DRXCycle.shortDRXCycleLength,
|
|
F1AP_ShortDRXCycleLength_ms2); // enum
|
|
}
|
|
|
|
if (0) {
|
|
asn1cCallocOne(ie5->value.choice.DRXCycle.shortDRXCycleTimer, 123L);
|
|
}
|
|
}
|
|
|
|
/* optional */
|
|
/* c6. CUtoDURRCInformation */
|
|
if (f1ap_ue_context_modification_req->cu_to_du_rrc_information!=NULL) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie6);
|
|
ie6->id = F1AP_ProtocolIE_ID_id_CUtoDURRCInformation;
|
|
ie6->criticality = F1AP_Criticality_reject;
|
|
ie6->value.present = F1AP_UEContextModificationRequestIEs__value_PR_CUtoDURRCInformation;
|
|
/* 6.1 cG_ConfigInfo */
|
|
if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo!=NULL){
|
|
asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.cG_ConfigInfo, cG_ConfigInfo);
|
|
OCTET_STRING_fromBuf(cG_ConfigInfo, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo,
|
|
f1ap_ue_context_modification_req->cu_to_du_rrc_information->cG_ConfigInfo_length);
|
|
}
|
|
/* optional */
|
|
/* 6.2 uE_CapabilityRAT_ContainerList */
|
|
if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList!=NULL){
|
|
asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList, uE_CapabilityRAT_ContainerList );
|
|
OCTET_STRING_fromBuf(uE_CapabilityRAT_ContainerList, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList,
|
|
f1ap_ue_context_modification_req->cu_to_du_rrc_information->uE_CapabilityRAT_ContainerList_length) ;
|
|
}
|
|
/* optional */
|
|
/* 6.3 measConfig */
|
|
if(f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig!=NULL){
|
|
asn1cCalloc(ie6->value.choice.CUtoDURRCInformation.measConfig, measConfig);
|
|
OCTET_STRING_fromBuf(measConfig, (const char *)f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig,
|
|
f1ap_ue_context_modification_req->cu_to_du_rrc_information->measConfig_length);
|
|
}
|
|
}
|
|
|
|
/* optional */
|
|
/* c7. TransmissionActionIndicator */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie7);
|
|
ie7->id = F1AP_ProtocolIE_ID_id_TransmissionActionIndicator;
|
|
ie7->criticality = F1AP_Criticality_ignore;
|
|
ie7->value.present = F1AP_UEContextModificationRequestIEs__value_PR_TransmissionActionIndicator;
|
|
ie7->value.choice.TransmissionActionIndicator = F1AP_TransmissionActionIndicator_stop;
|
|
}
|
|
|
|
/* optional */
|
|
/* c8. ResourceCoordinationTransferContainer */
|
|
if (0) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie8);
|
|
ie8->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
|
|
ie8->criticality = F1AP_Criticality_ignore;
|
|
ie8->value.present = F1AP_UEContextModificationRequestIEs__value_PR_ResourceCoordinationTransferContainer;
|
|
OCTET_STRING_fromBuf(&ie8->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
|
|
strlen("asdsa1d32sa1d31asd31as"));
|
|
}
|
|
|
|
/* optional */
|
|
/* c7. RRCRconfigurationCompleteIndicator */
|
|
if (f1ap_ue_context_modification_req->ReconfigComplOutcome == RRCreconf_success) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie71);
|
|
ie71->id = F1AP_ProtocolIE_ID_id_RRCReconfigurationCompleteIndicator;
|
|
ie71->criticality = F1AP_Criticality_ignore;
|
|
ie71->value.present = F1AP_UEContextModificationRequestIEs__value_PR_RRCReconfigurationCompleteIndicator;
|
|
ie71->value.choice.RRCReconfigurationCompleteIndicator = F1AP_RRCReconfigurationCompleteIndicator_true;
|
|
}
|
|
|
|
/* optional */
|
|
/* c8. RRCContainer */
|
|
if (f1ap_ue_context_modification_req->rrc_container != NULL) {
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie81);
|
|
ie81->id = F1AP_ProtocolIE_ID_id_RRCContainer;
|
|
ie81->criticality = F1AP_Criticality_ignore;
|
|
ie81->value.present = F1AP_UEContextModificationRequestIEs__value_PR_RRCContainer;
|
|
OCTET_STRING_fromBuf(&ie81->value.choice.RRCContainer, (const char*)f1ap_ue_context_modification_req->rrc_container,
|
|
f1ap_ue_context_modification_req->rrc_container_length);
|
|
}
|
|
|
|
/* optional */
|
|
/* c9. SCell_ToBeSetupMod_List */
|
|
if(0){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie9);
|
|
ie9->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_List;
|
|
ie9->criticality = F1AP_Criticality_ignore;
|
|
ie9->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeSetupMod_List;
|
|
|
|
for (int i=0; i<1; i++) {
|
|
//
|
|
asn1cSequenceAdd(ie9->value.choice.SCell_ToBeSetupMod_List.list,
|
|
F1AP_SCell_ToBeSetupMod_ItemIEs_t, scell_toBeSetupMod_item_ies);
|
|
scell_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeSetupMod_Item;
|
|
scell_toBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
|
|
scell_toBeSetupMod_item_ies->value.present = F1AP_SCell_ToBeSetupMod_ItemIEs__value_PR_SCell_ToBeSetupMod_Item;
|
|
/* 8.1 SCell_ToBeSetup_Item */
|
|
F1AP_SCell_ToBeSetupMod_Item_t *scell_toBeSetupMod_item=
|
|
&scell_toBeSetupMod_item_ies->value.choice.SCell_ToBeSetupMod_Item;
|
|
// /* - sCell_ID */
|
|
addnRCGI(scell_toBeSetupMod_item->sCell_ID, &hardCoded);
|
|
/* sCellIndex */
|
|
scell_toBeSetupMod_item->sCellIndex = 6; // issue here
|
|
}
|
|
}
|
|
|
|
/* optional */
|
|
/* c10. SCell_ToBeRemoved_List */
|
|
if(0){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie10);
|
|
ie10->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_List;
|
|
ie10->criticality = F1AP_Criticality_ignore;
|
|
ie10->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SCell_ToBeRemoved_List;
|
|
|
|
for (int i=0; i<1; i++) {
|
|
//
|
|
asn1cSequenceAdd(ie10->value.choice.SCell_ToBeRemoved_List.list,
|
|
F1AP_SCell_ToBeRemoved_ItemIEs_t, scell_toBeRemoved_item_ies);
|
|
scell_toBeRemoved_item_ies = (F1AP_SCell_ToBeRemoved_ItemIEs_t *)calloc(1, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
|
|
//memset((void *)&scell_toBeRemoved_item_ies, 0, sizeof(F1AP_SCell_ToBeRemoved_ItemIEs_t));
|
|
scell_toBeRemoved_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_ToBeRemoved_Item;
|
|
scell_toBeRemoved_item_ies->criticality = F1AP_Criticality_ignore;
|
|
scell_toBeRemoved_item_ies->value.present = F1AP_SCell_ToBeRemoved_ItemIEs__value_PR_SCell_ToBeRemoved_Item;
|
|
/* 10.1 SCell_ToBeRemoved_Item */
|
|
F1AP_SCell_ToBeRemoved_Item_t *scell_toBeRemoved_item=
|
|
&scell_toBeRemoved_item_ies->value.choice.SCell_ToBeRemoved_Item;
|
|
/* - sCell_ID */
|
|
addnRCGI(scell_toBeRemoved_item->sCell_ID, &hardCoded);
|
|
}
|
|
}
|
|
|
|
/* mandatory */
|
|
/* c11. SRBs_ToBeSetupMod_List */
|
|
if(f1ap_ue_context_modification_req->srbs_to_be_setup_length > 0){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie11);
|
|
ie11->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_List;
|
|
ie11->criticality = F1AP_Criticality_reject;
|
|
ie11->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeSetupMod_List;
|
|
|
|
for (int i=0; i<f1ap_ue_context_modification_req->srbs_to_be_setup_length; i++) {
|
|
//
|
|
asn1cSequenceAdd(ie11->value.choice.SRBs_ToBeSetupMod_List, F1AP_SRBs_ToBeSetupMod_ItemIEs_t, srbs_toBeSetupMod_item_ies);
|
|
srbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeSetupMod_Item; // 73
|
|
srbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
|
|
srbs_toBeSetupMod_item_ies->value.present = F1AP_SRBs_ToBeSetupMod_ItemIEs__value_PR_SRBs_ToBeSetupMod_Item;
|
|
/* 11.1 SRBs_ToBeSetup_Item */
|
|
F1AP_SRBs_ToBeSetupMod_Item_t *srbs_toBeSetupMod_item=&srbs_toBeSetupMod_item_ies->value.choice.SRBs_ToBeSetupMod_Item;
|
|
/* 11.1.1 sRBID */
|
|
srbs_toBeSetupMod_item->sRBID = f1ap_ue_context_modification_req->srbs_to_be_setup[i].srb_id;
|
|
/* OPTIONAL */
|
|
/* 11.1.2 duplicationIndication */
|
|
asn1cCallocOne(srbs_toBeSetupMod_item->duplicationIndication,
|
|
F1AP_DuplicationIndication_true); // enum
|
|
}
|
|
}
|
|
|
|
/* mandatory */
|
|
/* c12. DRBs_ToBeSetupMod_List */
|
|
if(f1ap_ue_context_modification_req->drbs_to_be_setup_length){
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie12);
|
|
ie12->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_List;
|
|
ie12->criticality = F1AP_Criticality_reject;
|
|
ie12->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeSetupMod_List;
|
|
|
|
for (int i = 0; i < f1ap_ue_context_modification_req->drbs_to_be_setup_length; i++) {
|
|
asn1cSequenceAdd(ie12->value.choice.DRBs_ToBeSetupMod_List.list,
|
|
F1AP_DRBs_ToBeSetupMod_ItemIEs_t, drbs_toBeSetupMod_item_ies);
|
|
drbs_toBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeSetupMod_Item;
|
|
drbs_toBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
|
|
drbs_toBeSetupMod_item_ies->value.present = F1AP_DRBs_ToBeSetupMod_ItemIEs__value_PR_DRBs_ToBeSetupMod_Item;
|
|
/* 12.1 DRBs_ToBeSetupMod_Item */
|
|
F1AP_DRBs_ToBeSetupMod_Item_t *drbs_toBeSetupMod_item=
|
|
&drbs_toBeSetupMod_item_ies->value.choice.DRBs_ToBeSetupMod_Item;
|
|
/* dRBID */
|
|
drbs_toBeSetupMod_item->dRBID = f1ap_ue_context_modification_req->drbs_to_be_setup[i].drb_id;
|
|
/* qoSInformation */
|
|
|
|
if(f1ap_ue_context_modification_req->QoS_information_type == EUTRAN_QoS){
|
|
drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_eUTRANQoS;
|
|
drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
|
|
drbs_toBeSetupMod_item->qoSInformation.choice.eUTRANQoS->qCI = 253L;
|
|
/* uLUPTNLInformation_ToBeSetup_List */
|
|
int maxnoofULTunnels = 1; // 2;
|
|
|
|
for (int j=0; j<maxnoofULTunnels; j++) {
|
|
/* ULTunnels_ToBeSetup_Item */
|
|
asn1cSequenceAdd( drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
|
|
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
|
|
uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
|
asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
|
|
gTPTunnel);
|
|
/* transportLayerAddress */
|
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
|
|
/* gTP_TEID */
|
|
OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "4567",
|
|
strlen("4567"));
|
|
}
|
|
|
|
/* rLCMode */
|
|
drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional; // enum
|
|
|
|
/* OPTIONAL */
|
|
/* ULConfiguration */
|
|
if (0) {
|
|
drbs_toBeSetupMod_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
|
|
}
|
|
} //QoS information
|
|
|
|
else{
|
|
/* 12.1.2 DRB_Information */
|
|
drbs_toBeSetupMod_item->qoSInformation.present = F1AP_QoSInformation_PR_choice_extension;
|
|
F1AP_QoSInformation_ExtIEs_t *ie = (F1AP_QoSInformation_ExtIEs_t *)calloc(1, sizeof(*ie));
|
|
ie->id = F1AP_ProtocolIE_ID_id_DRB_Information;
|
|
ie->criticality = F1AP_Criticality_reject;
|
|
ie->value.present = F1AP_QoSInformation_ExtIEs__value_PR_DRB_Information;
|
|
F1AP_DRB_Information_t *DRB_Information = &ie->value.choice.DRB_Information;
|
|
drbs_toBeSetupMod_item->qoSInformation.choice.choice_extension = (struct F1AP_ProtocolIE_SingleContainer *)ie;
|
|
/* 12.1.2.1 dRB_QoS */
|
|
{
|
|
/* qoS_Characteristics */
|
|
{
|
|
int some_decide_qoS_characteristics = 0; // BK: Need Check
|
|
|
|
if (some_decide_qoS_characteristics) {
|
|
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
|
setQos(DRB_Information->dRB_QoS.qoS_Characteristics.choice.non_Dynamic_5QI);
|
|
} else {
|
|
DRB_Information->dRB_QoS.qoS_Characteristics.present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
|
asn1cCalloc(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI, tmp);
|
|
/* qoSPriorityLevel */
|
|
tmp->qoSPriorityLevel = 1L;
|
|
/* packetDelayBudget */
|
|
tmp->packetDelayBudget = 1L;
|
|
/* packetErrorRate */
|
|
tmp->packetErrorRate.pER_Scalar = 1L;
|
|
tmp->packetErrorRate.pER_Exponent = 6L;
|
|
|
|
/* OPTIONAL */
|
|
/* delayCritical */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->delayCritical, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* averagingWindow */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->averagingWindow, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxDataBurstVolume */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.qoS_Characteristics.choice.dynamic_5QI->maxDataBurstVolume, 1L);
|
|
}
|
|
} // if some_decide_qoS_characteristics
|
|
|
|
} // qoS_Characteristics
|
|
/* nGRANallocationRetentionPriority */
|
|
{
|
|
DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
|
|
DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
|
|
DRB_Information->dRB_QoS.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
|
|
} // nGRANallocationRetentionPriority
|
|
|
|
/* OPTIONAL */
|
|
/* gBR_QoS_Flow_Information */
|
|
if (0) {
|
|
asn1cCalloc(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information, tmp);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateDownlink */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateUplink */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* reflective_QoS_Attribute */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->dRB_QoS.reflective_QoS_Attribute, 1L);
|
|
}
|
|
} // dRB_QoS
|
|
/* 12.1.2.2 sNSSAI */
|
|
{
|
|
/* sST */
|
|
|
|
OCTET_STRING_fromBuf(&DRB_Information->sNSSAI.sST, "1", 1);
|
|
|
|
/* OPTIONAL */
|
|
/* sD */
|
|
if (0) {
|
|
asn1cCalloc(DRB_Information->sNSSAI.sD, tmp);
|
|
OCTET_STRING_fromBuf(tmp, "asdsa1d32sa1d31asd31as",
|
|
strlen("asdsa1d32sa1d31asd31as"));
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* 12.1.2.3 notificationControl */
|
|
if (0) {
|
|
asn1cCallocOne(DRB_Information->notificationControl,
|
|
F1AP_NotificationControl_active); // enum
|
|
}
|
|
|
|
/* 12.1.2.4 flows_Mapped_To_DRB_List */ // BK: need verifiy
|
|
|
|
for (int k = 0; k < 1; k ++) {
|
|
asn1cSequenceAdd(DRB_Information->flows_Mapped_To_DRB_List.list,
|
|
F1AP_Flows_Mapped_To_DRB_Item_t, flows_mapped_to_drb_item);
|
|
/* qoSFlowIndicator */
|
|
flows_mapped_to_drb_item->qoSFlowIdentifier = 1L;
|
|
/* qoSFlowLevelQoSParameters */
|
|
{
|
|
/* qoS_Characteristics */
|
|
{
|
|
int some_decide_qoS_characteristics = 0; // BK: Need Check
|
|
F1AP_QoS_Characteristics_t *QosParams=&flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.qoS_Characteristics;
|
|
|
|
if (some_decide_qoS_characteristics) {
|
|
QosParams->present = F1AP_QoS_Characteristics_PR_non_Dynamic_5QI;
|
|
setQos(QosParams->choice.non_Dynamic_5QI);
|
|
} else {
|
|
QosParams->present = F1AP_QoS_Characteristics_PR_dynamic_5QI;
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI, tmp);
|
|
/* qoSPriorityLevel */
|
|
tmp->qoSPriorityLevel = 1L;
|
|
/* packetDelayBudget */
|
|
tmp->packetDelayBudget = 1L;
|
|
/* packetErrorRate */
|
|
tmp->packetErrorRate.pER_Scalar = 1L;
|
|
tmp->packetErrorRate.pER_Exponent = 6L;
|
|
|
|
/* OPTIONAL */
|
|
/* delayCritical */
|
|
if (0) {
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI->delayCritical, tmp);
|
|
*tmp = 1L;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* averagingWindow */
|
|
if (0) {
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI->averagingWindow, tmp);
|
|
*tmp = 1L;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxDataBurstVolume */
|
|
if (0) {
|
|
asn1cCalloc(QosParams->choice.dynamic_5QI->maxDataBurstVolume, tmp);
|
|
*tmp= 1L;
|
|
}
|
|
} // if some_decide_qoS_characteristics
|
|
|
|
} // qoS_Characteristics
|
|
/* nGRANallocationRetentionPriority */
|
|
{
|
|
flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.priorityLevel = F1AP_PriorityLevel_highest; // enum
|
|
flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionCapability = F1AP_Pre_emptionCapability_shall_not_trigger_pre_emption; // enum
|
|
flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.nGRANallocationRetentionPriority.pre_emptionVulnerability = F1AP_Pre_emptionVulnerability_not_pre_emptable; // enum
|
|
} // nGRANallocationRetentionPriority
|
|
|
|
/* OPTIONAL */
|
|
/* gBR_QoS_Flow_Information */
|
|
if (0) {
|
|
asn1cCalloc(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information, tmp);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->maxFlowBitRateUplink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateDownlink, 1L);
|
|
asn_long2INTEGER(&tmp->guaranteedFlowBitRateUplink, 1L);
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateDownlink */
|
|
if (0) {
|
|
asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateDownlink, 1L);
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* maxPacketLossRateUplink */
|
|
if (0) {
|
|
asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.gBR_QoS_Flow_Information->maxPacketLossRateUplink, 1L);
|
|
}
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* reflective_QoS_Attribute */
|
|
if (0) {
|
|
asn1cCallocOne(flows_mapped_to_drb_item->qoSFlowLevelQoSParameters.reflective_QoS_Attribute, 1L);
|
|
}
|
|
} // qoSFlowLevelQoSParameters
|
|
}
|
|
|
|
} //QoS information
|
|
|
|
/* 12.1.3 uLUPTNLInformation_ToBeSetup_List */
|
|
for (int j = 0; j < f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl_length; j++) {
|
|
/* Use a dummy address and teid for the outgoing GTP-U tunnel (DU) which will be updated once we get the UE context modification response from the DU */
|
|
asn1cSequenceAdd(drbs_toBeSetupMod_item->uLUPTNLInformation_ToBeSetup_List.list,
|
|
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
|
|
uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
|
asn1cCalloc( uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
|
|
gTPTunnel);
|
|
/* 12.3.1.1.1 transportLayerAddress */
|
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].tl_address,
|
|
&gTPTunnel->transportLayerAddress);
|
|
/* 12.3.1.1.2 gTP_TEID */
|
|
INT32_TO_OCTET_STRING(f1ap_ue_context_modification_req->drbs_to_be_setup[i].up_ul_tnl[j].teid,
|
|
&gTPTunnel->gTP_TEID);
|
|
}
|
|
/* 12.1.4 rLCMode */
|
|
/* TODO use rlc_mode from f1ap_drb_to_be_setup */
|
|
switch (f1ap_ue_context_modification_req->drbs_to_be_setup[i].rlc_mode) {
|
|
case RLC_MODE_AM:
|
|
drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_am;
|
|
break;
|
|
|
|
default:
|
|
drbs_toBeSetupMod_item->rLCMode = F1AP_RLCMode_rlc_um_bidirectional;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* 12.1.5 ULConfiguration */
|
|
if (0) {
|
|
asn1cCalloc(drbs_toBeSetupMod_item->uLConfiguration, tmp);
|
|
tmp->uLUEConfiguration = F1AP_ULUEConfiguration_no_data;
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* 12.1.6 duplicationActivation */
|
|
if (0) {
|
|
asn1cCalloc(drbs_toBeSetupMod_item->duplicationActivation, tmp);
|
|
*tmp = F1AP_DuplicationActivation_active; // enum
|
|
}
|
|
}
|
|
}
|
|
|
|
/* optional */
|
|
if(0){
|
|
/* c13. DRBs_ToBeModified_List */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie13);
|
|
ie13->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_List;
|
|
ie13->criticality = F1AP_Criticality_reject;
|
|
ie13->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeModified_List;
|
|
|
|
for (int i=0; i<1; i++) {
|
|
//
|
|
asn1cSequenceAdd( ie13->value.choice.DRBs_ToBeModified_List.list,
|
|
F1AP_DRBs_ToBeModified_ItemIEs_t, drbs_toBeModified_item_ies);
|
|
drbs_toBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeModified_Item;
|
|
drbs_toBeModified_item_ies->criticality = F1AP_Criticality_reject;
|
|
drbs_toBeModified_item_ies->value.present = F1AP_DRBs_ToBeModified_ItemIEs__value_PR_DRBs_ToBeModified_Item;
|
|
/* 13.1 SRBs_ToBeModified_Item */
|
|
F1AP_DRBs_ToBeModified_Item_t *drbs_toBeModified_item=
|
|
&drbs_toBeModified_item_ies->value.choice.DRBs_ToBeModified_Item;
|
|
/* dRBID */
|
|
drbs_toBeModified_item->dRBID = 30L;
|
|
/* qoSInformation */
|
|
asn1cCalloc(drbs_toBeModified_item->qoSInformation, tmp);
|
|
tmp->present = F1AP_QoSInformation_PR_eUTRANQoS;
|
|
tmp->choice.eUTRANQoS = (F1AP_EUTRANQoS_t *)calloc(1, sizeof(F1AP_EUTRANQoS_t));
|
|
tmp->choice.eUTRANQoS->qCI = 254L;
|
|
/* ULTunnels_ToBeModified_List */
|
|
int maxnoofULTunnels = 1; // 2;
|
|
|
|
for (int j=0; j<maxnoofULTunnels; j++) {
|
|
/* ULTunnels_ToBeModified_Item */
|
|
asn1cSequenceAdd(drbs_toBeModified_item->uLUPTNLInformation_ToBeSetup_List.list,
|
|
F1AP_ULUPTNLInformation_ToBeSetup_Item_t, uLUPTNLInformation_ToBeSetup_Item);
|
|
uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
|
asn1cCalloc(uLUPTNLInformation_ToBeSetup_Item->uLUPTNLInformation.choice.gTPTunnel,
|
|
gTPTunnel);
|
|
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &gTPTunnel->transportLayerAddress);
|
|
OCTET_STRING_fromBuf(&gTPTunnel->gTP_TEID, "1204",
|
|
strlen("1204"));
|
|
}
|
|
|
|
/* OPTIONAL */
|
|
/* ULConfiguration */
|
|
if (0) {
|
|
drbs_toBeModified_item->uLConfiguration = (F1AP_ULConfiguration_t *)calloc(1, sizeof(F1AP_ULConfiguration_t));
|
|
}
|
|
}
|
|
}
|
|
|
|
/* optional */
|
|
if(0){
|
|
/* c14. SRBs_ToBeReleased_List */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie14);
|
|
ie14->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_List;
|
|
ie14->criticality = F1AP_Criticality_reject;
|
|
ie14->value.present = F1AP_UEContextModificationRequestIEs__value_PR_SRBs_ToBeReleased_List;
|
|
|
|
for (int i=0; i<1; i++) {
|
|
//
|
|
asn1cSequenceAdd(ie14->value.choice.SRBs_ToBeReleased_List.list,
|
|
F1AP_SRBs_ToBeReleased_ItemIEs_t, srbs_toBeReleased_item_ies);
|
|
srbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_ToBeReleased_Item;
|
|
srbs_toBeReleased_item_ies->criticality = F1AP_Criticality_ignore;
|
|
srbs_toBeReleased_item_ies->value.present = F1AP_SRBs_ToBeReleased_ItemIEs__value_PR_SRBs_ToBeReleased_Item;
|
|
/* 9.1 SRBs_ToBeReleased_Item */
|
|
F1AP_SRBs_ToBeReleased_Item_t *srbs_toBeReleased_item=
|
|
&srbs_toBeReleased_item_ies->value.choice.SRBs_ToBeReleased_Item;
|
|
/* - sRBID */
|
|
srbs_toBeReleased_item->sRBID = 2L;
|
|
}
|
|
}
|
|
|
|
/* optional */
|
|
if(0){
|
|
/* c15. DRBs_ToBeReleased_List */
|
|
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationRequestIEs_t, ie15);
|
|
ie15->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_List;
|
|
ie15->criticality = F1AP_Criticality_reject;
|
|
ie15->value.present = F1AP_UEContextModificationRequestIEs__value_PR_DRBs_ToBeReleased_List;
|
|
|
|
for (int i=0; i<1; i++) {
|
|
//
|
|
asn1cSequenceAdd(ie15->value.choice.DRBs_ToBeReleased_List.list,
|
|
F1AP_DRBs_ToBeReleased_ItemIEs_t, drbs_toBeReleased_item_ies);
|
|
drbs_toBeReleased_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_ToBeReleased_Item;
|
|
drbs_toBeReleased_item_ies->criticality = F1AP_Criticality_reject;
|
|
drbs_toBeReleased_item_ies->value.present = F1AP_DRBs_ToBeReleased_ItemIEs__value_PR_DRBs_ToBeReleased_Item;
|
|
/* 14.1 SRBs_ToBeReleased_Item */
|
|
F1AP_DRBs_ToBeReleased_Item_t *drbs_toBeReleased_item=
|
|
&drbs_toBeReleased_item_ies->value.choice.DRBs_ToBeReleased_Item;
|
|
/* dRBID */
|
|
drbs_toBeReleased_item->dRBID = 30L;
|
|
}
|
|
}
|
|
|
|
/* encode */
|
|
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
|
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT_MODIFICATION REQUEST\n");
|
|
return -1;
|
|
}
|
|
f1ap_itti_send_sctp_data_req(true, instance, buffer, len, 0 /* BK: fix me*/);
|
|
return 0;
|
|
}
|
|
|
|
int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
|
|
uint32_t assoc_id,
|
|
uint32_t stream,
|
|
F1AP_F1AP_PDU_t *pdu) {
|
|
|
|
MessageDef *msg_p;
|
|
F1AP_UEContextModificationResponse_t *container;
|
|
F1AP_UEContextModificationResponseIEs_t *ie;
|
|
DevAssert(pdu);
|
|
msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
|
|
f1ap_ue_context_setup_t *f1ap_ue_context_modification_resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p);
|
|
container = &pdu->choice.successfulOutcome->value.choice.UEContextModificationResponse;
|
|
int i;
|
|
|
|
/* GNB_CU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
|
f1ap_ue_context_modification_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
|
|
|
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_CU_ue_id);
|
|
|
|
/* GNB_DU_UE_F1AP_ID */
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
|
f1ap_ue_context_modification_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
|
|
|
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id);
|
|
|
|
f1ap_ue_context_modification_resp->rnti =
|
|
f1ap_get_rnti_by_du_id(CUtype, instance, f1ap_ue_context_modification_resp->gNB_DU_ue_id);
|
|
|
|
// DUtoCURRCInformation
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, false);
|
|
if(ie!=NULL){
|
|
f1ap_ue_context_modification_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1, sizeof(du_to_cu_rrc_information_t));
|
|
f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
|
|
|
memcpy(f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
|
f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
|
|
}
|
|
|
|
// DRBs_SetupMod_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List, false);
|
|
if(ie!=NULL){
|
|
f1ap_ue_context_modification_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_SetupMod_List.list.count;
|
|
f1ap_ue_context_modification_resp->drbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_to_be_setup_length,
|
|
sizeof(f1ap_drb_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_modification_resp->drbs_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
|
for (i = 0; i < f1ap_ue_context_modification_resp->drbs_to_be_setup_length; ++i) {
|
|
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_to_be_setup[i];
|
|
F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item_p;
|
|
drbs_setupmod_item_p = &((F1AP_DRBs_SetupMod_ItemIEs_t *)ie->value.choice.DRBs_SetupMod_List.list.array[i])->value.choice.DRBs_SetupMod_Item;
|
|
drb_p->drb_id = drbs_setupmod_item_p->dRBID;
|
|
// TODO in the following, assume only one UP UL TNL is present.
|
|
// this matches/assumes OAI CU/DU implementation, can be up to 2!
|
|
drb_p->up_dl_tnl_length = 1;
|
|
AssertFatal(drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
|
"no DL UP TNL Information in DRBs to be Setup list\n");
|
|
F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
|
|
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
|
|
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
|
|
OCTET_STRING_TO_INT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
|
|
GtpuUpdateTunnelOutgoingAddressAndTeid(getCxt(CUtype, instance)->gtpInst,
|
|
f1ap_ue_context_modification_resp->rnti,
|
|
(ebi_t)drbs_setupmod_item_p->dRBID,
|
|
drb_p->up_dl_tnl[0].tl_address,
|
|
drb_p->up_dl_tnl[0].teid);
|
|
}
|
|
}
|
|
// SRBs_FailedToBeSetupMod_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List, false);
|
|
if(ie!=NULL){
|
|
f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetupMod_List.list.count;
|
|
f1ap_ue_context_modification_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length,
|
|
sizeof(f1ap_rb_failed_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
|
|
for (i = 0; i < f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length; ++i) {
|
|
f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_failed_to_be_setup[i];
|
|
srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.SRBs_FailedToBeSetupMod_List.list.array[i])->sRBID;
|
|
}
|
|
|
|
}
|
|
// DRBs_FailedToBeSetupMod_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List, false);
|
|
if(ie!=NULL){
|
|
f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetupMod_List.list.count;
|
|
f1ap_ue_context_modification_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length,
|
|
sizeof(f1ap_rb_failed_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
|
|
for (i = 0; i < f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length; ++i) {
|
|
f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_failed_to_be_setup[i];
|
|
drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.DRBs_FailedToBeSetupMod_List.list.array[i])->dRBID;
|
|
}
|
|
}
|
|
|
|
// SCell_FailedtoSetupMod_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List, false);
|
|
if(ie!=NULL){
|
|
LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetupMod_List \n");
|
|
}
|
|
|
|
// SRBs_Setup_List
|
|
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
|
F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List, false);
|
|
if(ie!=NULL){
|
|
f1ap_ue_context_modification_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_SetupMod_List.list.count;
|
|
f1ap_ue_context_modification_resp->srbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_to_be_setup_length,
|
|
sizeof(f1ap_srb_to_be_setup_t));
|
|
AssertFatal(f1ap_ue_context_modification_resp->srbs_to_be_setup,
|
|
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
|
for (i = 0; i < f1ap_ue_context_modification_resp->srbs_to_be_setup_length; ++i) {
|
|
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_to_be_setup[i];
|
|
F1AP_SRBs_SetupMod_Item_t *srbs_setup_item_p;
|
|
srbs_setup_item_p = &((F1AP_SRBs_SetupMod_ItemIEs_t *)ie->value.choice.SRBs_SetupMod_List.list.array[i])->value.choice.SRBs_SetupMod_Item;
|
|
srb_p->srb_id = srbs_setup_item_p->sRBID;
|
|
srb_p->lcid = srbs_setup_item_p->lCID;
|
|
}
|
|
}
|
|
|
|
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
|
|
return 0;
|
|
}
|
|
|
|
int CU_handle_UE_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
|
|
uint32_t assoc_id,
|
|
uint32_t stream,
|
|
F1AP_F1AP_PDU_t *pdu) {
|
|
AssertFatal(1==0,"Not implemented yet\n");
|
|
}
|
|
|
|
int CU_handle_UE_CONTEXT_MODIFICATION_REQUIRED(instance_t instance,
|
|
uint32_t assoc_id,
|
|
uint32_t stream,
|
|
F1AP_F1AP_PDU_t *pdu) {
|
|
AssertFatal(1==0,"Not implemented yet\n");
|
|
}
|
|
|
|
int CU_send_UE_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
|
|
F1AP_UEContextModificationConfirm_t UEContextModificationConfirm_t) {
|
|
AssertFatal(1==0,"Not implemented yet\n");
|
|
}
|