Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG-RAN
Commits
a0dfe342
Commit
a0dfe342
authored
May 31, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add bearer
parent
c81ed57a
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
206 additions
and
16 deletions
+206
-16
common/utils/telnetsrv/CMakeLists.txt
common/utils/telnetsrv/CMakeLists.txt
+6
-1
common/utils/telnetsrv/telnetsrv_bearer.c
common/utils/telnetsrv/telnetsrv_bearer.c
+96
-0
openair2/RRC/NR/MESSAGES/asn1_msg.c
openair2/RRC/NR/MESSAGES/asn1_msg.c
+1
-1
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+103
-14
No files found.
common/utils/telnetsrv/CMakeLists.txt
View file @
a0dfe342
...
...
@@ -59,8 +59,13 @@ add_library(telnetsrv_ci MODULE telnetsrv_ci.c)
target_link_libraries
(
telnetsrv_ci PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs
)
add_dependencies
(
telnetsrv telnetsrv_ci
)
message
(
STATUS
"Add bearer specific telnet functions in libtelnetsrv_bearer.so"
)
add_library
(
telnetsrv_bearer MODULE telnetsrv_bearer.c
)
target_link_libraries
(
telnetsrv_bearer PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs
)
add_dependencies
(
telnetsrv telnetsrv_bearer
)
# all libraries should be written to root build dir
set_target_properties
(
telnetsrv telnetsrv_enb telnetsrv_5Gue telnetsrv_ci
set_target_properties
(
telnetsrv telnetsrv_enb telnetsrv_5Gue telnetsrv_ci
telnetsrv_bearer
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../../..
)
common/utils/telnetsrv/telnetsrv_bearer.c
0 → 100644
View file @
a0dfe342
/*
* 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
*/
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
#define TELNETSERVERCODE
#include "telnetsrv.h"
#define ERROR_MSG_RET(mSG, aRGS...) do { prnt(mSG, ##aRGS); return 1; } while (0)
static
int
get_single_ue_rnti
(
void
)
{
rrc_gNB_ue_context_t
*
ue_context_p
=
NULL
;
RB_FOREACH
(
ue_context_p
,
rrc_nr_ue_tree_s
,
&
(
RC
.
nrrrc
[
0
]
->
rrc_ue_head
))
{
return
ue_context_p
->
ue_context
.
rnti
;
}
return
-
1
;
}
int
get_single_rnti
(
char
*
buf
,
int
debug
,
telnet_printfunc_t
prnt
)
{
if
(
buf
)
ERROR_MSG_RET
(
"no parameter allowed
\n
"
);
int
rnti
=
get_single_ue_rnti
();
if
(
rnti
<
1
)
ERROR_MSG_RET
(
"different number of UEs
\n
"
);
prnt
(
"single UE RNTI %04x
\n
"
,
rnti
);
return
0
;
}
void
rrc_gNB_trigger_new_bearer
(
int
rnti
);
int
add_bearer
(
char
*
buf
,
int
debug
,
telnet_printfunc_t
prnt
)
{
int
rnti
=
-
1
;
if
(
!
buf
)
{
rnti
=
get_single_ue_rnti
();
if
(
rnti
<
1
)
ERROR_MSG_RET
(
"no UE found
\n
"
);
}
else
{
rnti
=
strtol
(
buf
,
NULL
,
16
);
if
(
rnti
<
1
||
rnti
>=
0xfffe
)
ERROR_MSG_RET
(
"RNTI needs to be [1,0xfffe]
\n
"
);
}
// verify it exists in RRC as well
rrc_gNB_ue_context_t
*
rrcue
=
rrc_gNB_get_ue_context_by_rnti
(
RC
.
nrrrc
[
0
],
rnti
);
if
(
!
rrcue
)
ERROR_MSG_RET
(
"could not find UE with RNTI %04x
\n
"
,
rnti
);
rrc_gNB_trigger_new_bearer
(
rnti
);
prnt
(
"called rrc_gNB_trigger_new_bearer(%04x)
\n
"
,
rnti
);
return
0
;
}
static
telnetshell_cmddef_t
bearercmds
[]
=
{
{
"get_single_rnti"
,
""
,
get_single_rnti
},
{
"add_bearer"
,
"[rnti(hex,opt)]"
,
add_bearer
},
{
""
,
""
,
NULL
},
};
static
telnetshell_vardef_t
bearervars
[]
=
{
{
""
,
0
,
0
,
NULL
}
};
void
add_bearer_cmds
(
void
)
{
add_telnetcmd
(
"bearer"
,
bearervars
,
bearercmds
);
}
openair2/RRC/NR/MESSAGES/asn1_msg.c
View file @
a0dfe342
...
...
@@ -803,7 +803,7 @@ int16_t do_RRCReconfiguration(
dl_dcch_msg
.
message
.
choice
.
c1
->
choice
.
rrcReconfiguration
->
criticalExtensions
.
choice
.
rrcReconfiguration
=
ie
;
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
if
(
true
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_DL_DCCH_Message
,
(
void
*
)
&
dl_dcch_msg
);
}
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
a0dfe342
...
...
@@ -48,6 +48,7 @@
#include "common/utils/LOG/log.h"
#include "COMMON/mac_rrc_primitives.h"
#include "RRC/NR/MESSAGES/asn1_msg.h"
#include "openair2/E1AP/e1ap_asnc.h"
#include "NR_BCCH-BCH-Message.h"
#include "NR_UL-DCCH-Message.h"
...
...
@@ -1036,20 +1037,21 @@ static void rrc_gNB_process_RRCReconfigurationComplete(const protocol_ctxt_t *co
/* Refresh SRBs/DRBs */
LOG_D
(
NR_RRC
,
"Configuring PDCP DRBs/SRBs for UE %04x
\n
"
,
ue_p
->
rnti
);
ue_id_t
reestablish_ue_id
=
0
;
if
(
DRB_configList
&&
DRB_configList
->
list
.
array
[
0
]
->
reestablishPDCP
&&
*
DRB_configList
->
list
.
array
[
0
]
->
reestablishPDCP
==
NR_DRB_ToAddMod__reestablishPDCP_true
)
{
for
(
int
i
=
0
;
i
<
MAX_MOBILES_PER_GNB
;
i
++
)
{
nr_reestablish_rnti_map_t
*
nr_reestablish_rnti_map
=
&
(
RC
.
nrrrc
[
ctxt_pP
->
module_id
])
->
nr_reestablish_rnti_map
[
i
];
if
(
nr_reestablish_rnti_map
->
ue_id
==
ctxt_pP
->
rntiMaybeUEid
)
{
ue_context_pP
->
ue_context
.
ue_reconfiguration_after_reestablishment_counter
++
;
reestablish_ue_id
=
nr_reestablish_rnti_map
[
i
].
c_rnti
;
LOG_D
(
NR_RRC
,
"Removing reestablish_rnti_map[%d] UEid %lx, RNTI %04x
\n
"
,
i
,
nr_reestablish_rnti_map
->
ue_id
,
nr_reestablish_rnti_map
->
c_rnti
);
// clear current C-RNTI from map
nr_reestablish_rnti_map
->
ue_id
=
0
;
nr_reestablish_rnti_map
->
c_rnti
=
0
;
break
;
}
}
}
// we don't consider Reestablishment right now, uncomment to prevent segfault
//if (DRB_configList && DRB_configList->list.array[0]->reestablishPDCP && *DRB_configList->list.array[0]->reestablishPDCP == NR_DRB_ToAddMod__reestablishPDCP_true) {
// for (int i = 0; i < MAX_MOBILES_PER_GNB; i++) {
// nr_reestablish_rnti_map_t *nr_reestablish_rnti_map = &(RC.nrrrc[ctxt_pP->module_id])->nr_reestablish_rnti_map[i];
// if (nr_reestablish_rnti_map->ue_id == ctxt_pP->rntiMaybeUEid) {
// ue_context_pP->ue_context.ue_reconfiguration_after_reestablishment_counter++;
// reestablish_ue_id = nr_reestablish_rnti_map[i].c_rnti;
// LOG_D(NR_RRC, "Removing reestablish_rnti_map[%d] UEid %lx, RNTI %04x\n", i, nr_reestablish_rnti_map->ue_id, nr_reestablish_rnti_map->c_rnti);
// // clear current C-RNTI from map
// nr_reestablish_rnti_map->ue_id = 0;
// nr_reestablish_rnti_map->c_rnti = 0;
// break;
// }
// }
//}
NR_SRB_ToAddModList_t
*
SRBs
=
createSRBlist
(
ue_p
,
false
);
nr_pdcp_add_srbs
(
ctxt_pP
->
enb_flag
,
...
...
@@ -2979,6 +2981,93 @@ rrc_gNB_generate_RRCRelease(
/* UE will be freed after UE context release complete */
}
void
rrc_gNB_trigger_new_bearer
(
int
rnti
)
{
/* get RRC and UE */
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
0
];
rrc_gNB_ue_context_t
*
ue_context_p
=
rrc_gNB_get_ue_context_by_rnti
(
rrc
,
rnti
);
if
(
ue_context_p
==
NULL
)
{
LOG_E
(
RRC
,
"unknown UE RNTI %04x
\n
"
,
rnti
);
return
;
}
gNB_RRC_UE_t
*
ue
=
&
ue_context_p
->
ue_context
;
/* get the existing PDU sessoin */
if
(
ue
->
nb_of_pdusessions
<
1
)
{
LOG_E
(
RRC
,
"no PDU session set up yet, cannot create additional bearer
\n
"
);
return
;
}
if
(
ue
->
established_drbs
[
0
].
status
!=
DRB_INACTIVE
&&
ue
->
established_drbs
[
1
].
status
!=
DRB_INACTIVE
)
{
LOG_E
(
RRC
,
"already have two established bearers, aborting
\n
"
);
return
;
}
e1ap_bearer_setup_req_t
bearer_req
=
{
0
};
bearer_req
.
gNB_cu_cp_ue_id
=
ue
->
gNB_ue_ngap_id
;
bearer_req
.
rnti
=
ue
->
rnti
;
bearer_req
.
cipheringAlgorithm
=
ue
->
ciphering_algorithm
;
memcpy
(
bearer_req
.
encryptionKey
,
ue
->
kgnb
,
sizeof
(
ue
->
kgnb
));
bearer_req
.
integrityProtectionAlgorithm
=
ue
->
integrity_algorithm
;
memcpy
(
bearer_req
.
integrityProtectionKey
,
ue
->
kgnb
,
sizeof
(
ue
->
kgnb
));
bearer_req
.
ueDlAggMaxBitRate
=
10000
;
/* probably does not matter */
pdu_session_to_setup_t
*
pdu
=
&
bearer_req
.
pduSession
[
0
];
//bearer_req.numPDUSessions++;
bearer_req
.
numPDUSessions
=
1
;
//pdu->sessionId = session->pdusession_id;
//pdu->sst = msg->allowed_nssai[i].sST;
//pdu->integrityProtectionIndication = rrc->security.do_drb_integrity ? E1AP_IntegrityProtectionIndication_required : E1AP_IntegrityProtectionIndication_not_needed;
//pdu->confidentialityProtectionIndication = rrc->security.do_drb_ciphering ? E1AP_ConfidentialityProtectionIndication_required : E1AP_ConfidentialityProtectionIndication_not_needed;
//pdu->teId = session->gtp_teid;
pdu
->
numDRB2Setup
=
1
;
// One DRB per PDU Session. TODO: Remove hardcoding
DRB_nGRAN_to_setup_t
*
drb
=
&
pdu
->
DRBnGRanList
[
0
];
int
drb_id
=
2
;
drb
->
id
=
drb_id
;
drb
->
defaultDRB
=
E1AP_DefaultDRB_false
;
drb
->
sDAP_Header_UL
=
!
(
rrc
->
configuration
.
enable_sdap
);
drb
->
sDAP_Header_DL
=
!
(
rrc
->
configuration
.
enable_sdap
);
drb
->
pDCP_SN_Size_UL
=
E1AP_PDCP_SN_Size_s_18
;
drb
->
pDCP_SN_Size_DL
=
E1AP_PDCP_SN_Size_s_18
;
drb
->
discardTimer
=
E1AP_DiscardTimer_infinity
;
drb
->
reorderingTimer
=
E1AP_T_Reordering_ms0
;
drb
->
rLC_Mode
=
E1AP_RLC_Mode_rlc_am
;
drb
->
numCellGroups
=
1
;
// assume one cell group associated with a DRB
for
(
int
k
=
0
;
k
<
drb
->
numCellGroups
;
k
++
)
{
cell_group_t
*
cellGroup
=
drb
->
cellGroupList
+
k
;
cellGroup
->
id
=
0
;
// MCG
}
int
xid
=
rrc_gNB_get_next_transaction_identifier
(
0
);
/* GIGANTIC HACK: DRBs would be added internally in fill_DRB_configList(),
* but it checks and will skip our request because the PDU session is up.
* Below, simply add the new bearer to DRB_configList so the reconfiguration
* will have all bearers */
generateDRB
(
ue
,
drb_id
,
&
ue
->
pduSession
[
0
],
rrc
->
configuration
.
enable_sdap
,
rrc
->
security
.
do_drb_integrity
,
rrc
->
security
.
do_drb_ciphering
);
NR_DRB_ToAddMod_t
*
DRB_config
=
generateDRB_ASN1
(
&
ue
->
established_drbs
[
drb_id
-
1
]);
asn1cSeqAdd
(
&
ue
->
DRB_configList
->
list
,
DRB_config
);
//asn1cSeqAdd(&ue->DRB_configList2[xid]->list, DRB_config);
/* associate the new bearer to it */
ue
->
xids
[
xid
]
=
RRC_PDUSESSION_MODIFY
;
ue
->
pduSession
[
0
].
xid
=
xid
;
// hack: fake xid for ongoing PDU session
LOG_W
(
RRC
,
"trigger new bearer %ld for UE %04x xid %d
\n
"
,
drb
->
id
,
ue
->
rnti
,
xid
);
rrc
->
cucp_cuup
.
bearer_context_setup
(
&
bearer_req
,
0
,
xid
);
}
int
rrc_gNB_generate_pcch_msg
(
uint32_t
tmsi
,
uint8_t
paging_drx
,
instance_t
instance
,
uint8_t
CC_id
){
const
unsigned
int
Ttab
[
4
]
=
{
32
,
64
,
128
,
256
};
uint8_t
Tc
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment