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
zzha zzha
OpenXG-RAN
Commits
d6a01a73
Commit
d6a01a73
authored
2 years ago
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_RRC_Paging' into integration_2022_wk51
parents
2c846e26
97bce210
Branches unavailable
2024.w06
2024.w05
2024.w04
2024.w03
2024.w02
2024.w01
2023.w51
2023.w50
2023.w49
2023.w48
2023.w47
2023.w45
2023.w43
2023.w42
2023.w41
2023.w40
2023.w39
2023.w38
2023.w37
2023.w36
2023.w34
2023.w33
2023.w32
2023.w31
2023.w30
2023.w29
2023.w28
2023.w27
2023.w26
2023.w25
2023.w24
2023.w23
2023.w22
2023.w21
2023.w20
2023.w19
2023.w18
2023.w18b
2023.w16
2023.w15
2023.w14
2023.w13
2023.w12
2023.w11
2023.w11b
2023.w10
2023.w10b
2023.w09
2023.w08
2023.w08b
2023.w07
2023.w06
2023.w05
2023.w03
2023.w02
2022.w51
v2.1.0
v2.0.0
No related merge requests found
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
456 additions
and
15 deletions
+456
-15
doc/FEATURE_SET.md
doc/FEATURE_SET.md
+2
-1
openair2/COMMON/f1ap_messages_def.h
openair2/COMMON/f1ap_messages_def.h
+2
-4
openair2/COMMON/f1ap_messages_types.h
openair2/COMMON/f1ap_messages_types.h
+13
-0
openair2/F1AP/dummy_enb.c
openair2/F1AP/dummy_enb.c
+7
-0
openair2/F1AP/f1ap_cu_paging.c
openair2/F1AP/f1ap_cu_paging.c
+92
-3
openair2/F1AP/f1ap_cu_paging.h
openair2/F1AP/f1ap_cu_paging.h
+8
-3
openair2/F1AP/f1ap_cu_task.c
openair2/F1AP/f1ap_cu_task.c
+7
-0
openair2/F1AP/f1ap_decoder.c
openair2/F1AP/f1ap_decoder.c
+4
-0
openair2/F1AP/f1ap_du_paging.c
openair2/F1AP/f1ap_du_paging.c
+67
-1
openair2/F1AP/f1ap_du_paging.h
openair2/F1AP/f1ap_du_paging.h
+11
-1
openair2/F1AP/f1ap_handlers.c
openair2/F1AP/f1ap_handlers.c
+2
-1
openair2/RRC/LTE/rrc_defs.h
openair2/RRC/LTE/rrc_defs.h
+3
-1
openair2/RRC/NR/MESSAGES/asn1_msg.c
openair2/RRC/NR/MESSAGES/asn1_msg.c
+42
-0
openair2/RRC/NR/MESSAGES/asn1_msg.h
openair2/RRC/NR/MESSAGES/asn1_msg.h
+1
-0
openair2/RRC/NR/nr_rrc_proto.h
openair2/RRC/NR/nr_rrc_proto.h
+6
-0
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+128
-0
openair2/RRC/NR/rrc_gNB_NGAP.c
openair2/RRC/NR/rrc_gNB_NGAP.c
+34
-0
openair2/RRC/NR/rrc_gNB_NGAP.h
openair2/RRC/NR/rrc_gNB_NGAP.h
+6
-0
openair3/UTILS/conversions.h
openair3/UTILS/conversions.h
+21
-0
No files found.
doc/FEATURE_SET.md
View file @
d6a01a73
...
...
@@ -357,7 +357,8 @@ The following features are valid for the gNB and the 5G-NR UE.
-
RRCSetupRequest/RRCSetup/RRCSetupComplete
-
RRC Uplink/Downlink Information transfer carrying NAS messages transparently
-
RRC Reconfiguration/Reconfiguration complete
-
Support for master cell group configuration
-
Paging
-
Support for master cell group configuration
-
Interface with NGAP for the interactions with the AMF
-
Interface with F1AP for CU/DU split deployment option
-
Periodic RRC measurements of serving cell (no A/B events)
...
...
This diff is collapsed.
Click to expand it.
openair2/COMMON/f1ap_messages_def.h
View file @
d6a01a73
...
...
@@ -40,7 +40,6 @@ MESSAGE_DEF(F1AP_UL_RRC_MESSAGE , MESSAGE_PRIORITY_MED, f1ap_ul_r
MESSAGE_DEF
(
F1AP_UE_CONTEXT_RELEASE_REQ
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_release_req_t
,
f1ap_ue_context_release_req
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_RELEASE_CMD
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_release_cmd_t
,
f1ap_ue_context_release_cmd
)
/* RRC -> F1AP messages */
MESSAGE_DEF
(
F1AP_DL_RRC_MESSAGE
,
MESSAGE_PRIORITY_MED
,
f1ap_dl_rrc_message_t
,
f1ap_dl_rrc_message
)
//MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_req_t , f1ap_initial_context_setup_req )
...
...
@@ -49,6 +48,5 @@ MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_se
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_REQ
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_setup_t
,
f1ap_ue_context_modification_req
)
MESSAGE_DEF
(
F1AP_UE_CONTEXT_MODIFICATION_RESP
,
MESSAGE_PRIORITY_MED
,
f1ap_ue_context_setup_t
,
f1ap_ue_context_modification_resp
)
/* CU -> DU*/
MESSAGE_DEF
(
F1AP_PAGING_IND
,
MESSAGE_PRIORITY_MED
,
f1ap_paging_ind_t
,
f1ap_paging_ind
)
This diff is collapsed.
Click to expand it.
openair2/COMMON/f1ap_messages_types.h
View file @
d6a01a73
...
...
@@ -50,6 +50,8 @@
#define F1AP_UE_CONTEXT_RELEASE_REQ(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req
#define F1AP_UE_CONTEXT_RELEASE_CMD(mSGpTR) (mSGpTR)->ittiMsg.f1ap_ue_context_release_req
#define F1AP_PAGING_IND(mSGpTR) (mSGpTR)->ittiMsg.f1ap_paging_ind
/* Length of the transport layer address string
* 160 bits / 8 bits by char.
*/
...
...
@@ -424,4 +426,15 @@ typedef struct f1ap_ue_context_release_s {
}
f1ap_ue_context_release_req_t
,
f1ap_ue_context_release_cmd_t
,
f1ap_ue_context_release_cplt_t
;
typedef
struct
f1ap_paging_ind_s
{
uint16_t
ueidentityindexvalue
;
uint64_t
fiveg_s_tmsi
;
uint8_t
fiveg_s_tmsi_length
;
uint16_t
mcc
;
uint16_t
mnc
;
uint8_t
mnc_digit_length
;
uint64_t
nr_cellid
;
uint8_t
paging_drx
;
}
f1ap_paging_ind_t
;
#endif
/* F1AP_MESSAGES_TYPES_H_ */
This diff is collapsed.
Click to expand it.
openair2/F1AP/dummy_enb.c
View file @
d6a01a73
...
...
@@ -52,3 +52,10 @@ abort();
int
dl_rrc_message
(
module_id_t
module_id
,
const
f1ap_dl_rrc_message_t
*
dl_rrc
)
{
abort
();
}
int
rrc_gNB_generate_pcch_msg
(
uint32_t
tmsi
,
uint8_t
paging_drx
,
instance_t
instance
,
uint8_t
CC_id
)
{
abort
();
}
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_cu_paging.c
View file @
d6a01a73
...
...
@@ -19,8 +19,8 @@
* contact@openairinterface.org
*/
/*! \file f1ap_
du_interface_management.h
* \brief f1ap interface
management for D
U
/*! \file f1ap_
cu_paging.c
* \brief f1ap interface
paging for C
U
* \author EURECOM/NTUST
* \date 2018
* \version 0.1
...
...
@@ -28,4 +28,93 @@
* \email: navid.nikaein@eurecom.fr, bing-kai.hong@eurecom.fr
* \note
* \warning
*/
\ No newline at end of file
*/
#include "f1ap_common.h"
#include "f1ap_encoder.h"
#include "f1ap_itti_messaging.h"
#include "f1ap_cu_paging.h"
extern
f1ap_setup_req_t
*
f1ap_du_data_from_du
;
int
CU_send_Paging
(
instance_t
instance
,
f1ap_paging_ind_t
*
paging
)
{
F1AP_F1AP_PDU_t
pdu
=
{
0
};
pdu
.
present
=
F1AP_F1AP_PDU_PR_initiatingMessage
;
asn1cCalloc
(
pdu
.
choice
.
initiatingMessage
,
msg
);
msg
->
procedureCode
=
F1AP_ProcedureCode_id_Paging
;
msg
->
criticality
=
F1AP_Criticality_reject
;
msg
->
value
.
present
=
F1AP_InitiatingMessage__value_PR_Paging
;
/* mandatory */
/* UEIdentityIndexValue */
{
asn1cSequenceAdd
(
msg
->
value
.
choice
.
Paging
.
protocolIEs
.
list
,
F1AP_PagingIEs_t
,
ie
);
ie
->
id
=
F1AP_ProtocolIE_ID_id_UEIdentityIndexValue
;
ie
->
criticality
=
F1AP_Criticality_reject
;
ie
->
value
.
present
=
F1AP_PagingIEs__value_PR_UEIdentityIndexValue
;
ie
->
value
.
choice
.
UEIdentityIndexValue
.
present
=
F1AP_UEIdentityIndexValue_PR_indexLength10
;
UEIDENTITYINDEX_TO_BIT_STRING
(
paging
->
ueidentityindexvalue
,
&
ie
->
value
.
choice
.
UEIdentityIndexValue
.
choice
.
indexLength10
);
}
/* mandatory */
/* PagingIdentity */
{
asn1cSequenceAdd
(
msg
->
value
.
choice
.
Paging
.
protocolIEs
.
list
,
F1AP_PagingIEs_t
,
ie
);
ie
->
id
=
F1AP_ProtocolIE_ID_id_PagingIdentity
;
ie
->
criticality
=
F1AP_Criticality_reject
;
ie
->
value
.
present
=
F1AP_PagingIEs__value_PR_PagingIdentity
;
ie
->
value
.
choice
.
PagingIdentity
.
present
=
F1AP_PagingIdentity_PR_cNUEPagingIdentity
;
asn1cCalloc
(
ie
->
value
.
choice
.
PagingIdentity
.
choice
.
cNUEPagingIdentity
,
id
);
id
->
present
=
F1AP_CNUEPagingIdentity_PR_fiveG_S_TMSI
;
FIVEG_S_TMSI_TO_BIT_STRING
(
paging
->
fiveg_s_tmsi
,
&
id
->
choice
.
fiveG_S_TMSI
);
}
/* optional */
/* PagingDRX */
{
asn1cSequenceAdd
(
msg
->
value
.
choice
.
Paging
.
protocolIEs
.
list
,
F1AP_PagingIEs_t
,
ie
);
ie
->
id
=
F1AP_ProtocolIE_ID_id_PagingDRX
;
ie
->
criticality
=
F1AP_Criticality_ignore
;
ie
->
value
.
present
=
F1AP_PagingIEs__value_PR_PagingDRX
;
ie
->
value
.
choice
.
PagingDRX
=
paging
->
paging_drx
;
}
/* mandatory */
/* PagingCell_list */
{
asn1cSequenceAdd
(
msg
->
value
.
choice
.
Paging
.
protocolIEs
.
list
,
F1AP_PagingIEs_t
,
ie
);
ie
->
id
=
F1AP_ProtocolIE_ID_id_PagingCell_List
;
ie
->
criticality
=
F1AP_Criticality_reject
;
ie
->
value
.
present
=
F1AP_PagingIEs__value_PR_PagingCell_list
;
asn1cSequenceAdd
(
ie
->
value
.
choice
.
PagingCell_list
,
F1AP_PagingCell_ItemIEs_t
,
itemies
);
itemies
->
id
=
F1AP_ProtocolIE_ID_id_PagingCell_Item
;
itemies
->
criticality
=
F1AP_Criticality_reject
;
itemies
->
value
.
present
=
F1AP_PagingCell_ItemIEs__value_PR_PagingCell_Item
;
F1AP_NRCGI_t
*
nRCGI
=
&
itemies
->
value
.
choice
.
PagingCell_Item
.
nRCGI
;
MCC_MNC_TO_PLMNID
(
paging
->
mcc
,
paging
->
mnc
,
paging
->
mnc_digit_length
,
&
nRCGI
->
pLMN_Identity
);
NR_CELL_ID_TO_BIT_STRING
(
paging
->
nr_cellid
,
&
nRCGI
->
nRCellIdentity
);
}
uint8_t
*
buffer
;
uint32_t
len
;
/* encode */
if
(
f1ap_encode_pdu
(
&
pdu
,
&
buffer
,
&
len
)
<
0
)
{
LOG_E
(
F1AP
,
"Failed to encode F1 Paging failure
\n
"
);
ASN_STRUCT_FREE_CONTENTS_ONLY
(
asn_DEF_F1AP_F1AP_PDU
,
&
pdu
);
return
-
1
;
}
ASN_STRUCT_FREE_CONTENTS_ONLY
(
asn_DEF_F1AP_F1AP_PDU
,
&
pdu
);
f1ap_itti_send_sctp_data_req
(
true
,
instance
,
buffer
,
len
,
0
);
return
0
;
}
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_cu_paging.h
View file @
d6a01a73
...
...
@@ -19,8 +19,8 @@
* contact@openairinterface.org
*/
/*! \file f1ap_
du_interface_management
.h
* \brief f1ap interface
management for D
U
/*! \file f1ap_
cu_paging
.h
* \brief f1ap interface
paging for C
U
* \author EURECOM/NTUST
* \date 2018
* \version 0.1
...
...
@@ -28,4 +28,9 @@
* \email: navid.nikaein@eurecom.fr, bing-kai.hong@eurecom.fr
* \note
* \warning
*/
\ No newline at end of file
*/
#ifndef F1AP_CU_PAGING_H_
#define F1AP_CU_PAGING_H_
int
CU_send_Paging
(
instance_t
instance
,
f1ap_paging_ind_t
*
paging
);
#endif
/* F1AP_DU_PAGING_H_ */
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_cu_task.c
View file @
d6a01a73
...
...
@@ -34,6 +34,7 @@
#include "f1ap_cu_interface_management.h"
#include "f1ap_cu_rrc_message_transfer.h"
#include "f1ap_cu_ue_context_management.h"
#include "f1ap_cu_paging.h"
#include "f1ap_cu_task.h"
#include <openair3/ocp-gtpu/gtp_itf.h>
...
...
@@ -193,6 +194,12 @@ void *F1AP_CU_task(void *arg) {
&
F1AP_UE_CONTEXT_RELEASE_CMD
(
received_msg
));
break
;
case
F1AP_PAGING_IND
:
LOG_I
(
F1AP
,
"CU Task Received F1AP_PAGING_IND
\n
"
);
CU_send_Paging
(
ITTI_MSG_DESTINATION_INSTANCE
(
received_msg
),
&
F1AP_PAGING_IND
(
received_msg
));
break
;
// case F1AP_SETUP_RESPONSE: // This is from RRC
// CU_send_F1_SETUP_RESPONSE(instance, *f1ap_setup_ind, &(F1AP_SETUP_RESP) f1ap_setup_resp)
// break;
...
...
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_decoder.c
View file @
d6a01a73
...
...
@@ -83,6 +83,10 @@ static int f1ap_decode_initiating_message(F1AP_F1AP_PDU_t *pdu) {
LOG_I
(
F1AP
,
"%s(): F1AP_ProcedureCode_id_UEContextModification
\n
"
,
__func__
);
break
;
case
F1AP_ProcedureCode_id_Paging
:
LOG_I
(
F1AP
,
"%s(): F1AP_ProcedureCode_id_Paging
\n
"
,
__func__
);
break
;
// case F1AP_ProcedureCode_id_InitialContextSetup:
// res = asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_F1AP_F1AP_PDU, pdu);
// message_id = F1AP_INITIAL_CONTEXT_SETUP_LOG;
...
...
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_du_paging.c
View file @
d6a01a73
...
...
@@ -28,4 +28,70 @@
* \email: navid.nikaein@eurecom.fr, bing-kai.hong@eurecom.fr
* \note
* \warning
*/
\ No newline at end of file
*/
#include "f1ap_common.h"
#include "f1ap_du_paging.h"
#include "conversions.h"
#include "asn1_conversions.h"
#include "openair2/RRC/LTE/rrc_proto.h"
int
DU_handle_Paging
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
)
{
F1AP_Paging_t
*
paging
;
F1AP_PagingIEs_t
*
ie
;
long
tmsi
;
uint8_t
pagingdrx
;
uint8_t
*
fiveg_tmsi_buf
=
NULL
;
DevAssert
(
pdu
);
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_F1AP_F1AP_PDU
,
pdu
);
}
paging
=
&
pdu
->
choice
.
initiatingMessage
->
value
.
choice
.
Paging
;
// get UEIdentityIndexValue
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_PagingIEs_t
,
ie
,
paging
,
F1AP_ProtocolIE_ID_id_UEIdentityIndexValue
,
true
);
LOG_D
(
F1AP
,
"indexLength10 %d
\n
"
,
BIT_STRING_to_uint32
(
&
ie
->
value
.
choice
.
UEIdentityIndexValue
.
choice
.
indexLength10
));
// get PagingIdentity
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_PagingIEs_t
,
ie
,
paging
,
F1AP_ProtocolIE_ID_id_PagingIdentity
,
true
);
if
(
ie
!=
NULL
){
fiveg_tmsi_buf
=
ie
->
value
.
choice
.
PagingIdentity
.
choice
.
cNUEPagingIdentity
->
choice
.
fiveG_S_TMSI
.
buf
;
tmsi
=
((
long
)
fiveg_tmsi_buf
[
0
]
<<
40
)
+
((
long
)
fiveg_tmsi_buf
[
1
]
<<
32
)
+
(
fiveg_tmsi_buf
[
2
]
<<
24
)
+
(
fiveg_tmsi_buf
[
3
]
<<
16
)
+
(
fiveg_tmsi_buf
[
4
]
<<
8
)
+
fiveg_tmsi_buf
[
5
];
LOG_D
(
F1AP
,
"tmsi %ld
\n
"
,
tmsi
);
}
// get PagingDRX
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_PagingIEs_t
,
ie
,
paging
,
F1AP_ProtocolIE_ID_id_PagingDRX
,
true
);
if
(
ie
!=
NULL
)
{
pagingdrx
=
(
uint8_t
)
ie
->
value
.
choice
.
PagingDRX
;
}
LOG_D
(
F1AP
,
"pagingdrx %u
\n
"
,
pagingdrx
);
// get PagingCell_List
F1AP_FIND_PROTOCOLIE_BY_ID
(
F1AP_PagingIEs_t
,
ie
,
paging
,
F1AP_ProtocolIE_ID_id_PagingCell_List
,
true
);
for
(
uint8_t
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
rrc_gNB_generate_pcch_msg
((
uint32_t
)
tmsi
,
pagingdrx
,
instance
,
CC_id
);
}
return
0
;
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_du_paging.h
View file @
d6a01a73
...
...
@@ -28,4 +28,14 @@
* \email: navid.nikaein@eurecom.fr, bing-kai.hong@eurecom.fr
* \note
* \warning
*/
\ No newline at end of file
*/
#ifndef F1AP_DU_PAGING_H_
#define F1AP_DU_PAGING_H_
int
DU_handle_Paging
(
instance_t
instance
,
uint32_t
assoc_id
,
uint32_t
stream
,
F1AP_F1AP_PDU_t
*
pdu
);
#endif
/* F1AP_DU_PAGING_H_ */
This diff is collapsed.
Click to expand it.
openair2/F1AP/f1ap_handlers.c
View file @
d6a01a73
...
...
@@ -38,6 +38,7 @@
#include "f1ap_du_rrc_message_transfer.h"
#include "f1ap_cu_ue_context_management.h"
#include "f1ap_du_ue_context_management.h"
#include "f1ap_du_paging.h"
/* Handlers matrix. Only f1 related procedure present here */
f1ap_message_processing_t
f1ap_messages_processing
[][
3
]
=
{
...
...
@@ -61,7 +62,7 @@ f1ap_message_processing_t f1ap_messages_processing[][3] = {
{
0
,
0
,
0
},
/* UEInactivityNotification */
{
0
,
0
,
0
},
/* GNBDUResourceCoordination */
{
0
,
0
,
0
},
/* SystemInformationDeliveryCommand */
{
0
,
0
,
0
},
/* Paging */
{
DU_handle_Paging
,
0
,
0
},
/* Paging */
{
0
,
0
,
0
},
/* Notify */
{
0
,
0
,
0
},
/* WriteReplaceWarning */
{
0
,
0
,
0
},
/* PWSCancel */
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/LTE/rrc_defs.h
View file @
d6a01a73
...
...
@@ -917,11 +917,13 @@ typedef struct UE_RRC_INST_s {
}
UE_RRC_INST
;
typedef
struct
UE_PF_PO_s
{
bool
enable_flag
;
/* flag indicate whether current object is used */
bool
enable_flag
;
/* flag indicate whether current object is used */
uint16_t
ue_index_value
;
/* UE index value */
uint8_t
PF_min
;
/* minimal value of Paging Frame (PF) */
uint8_t
PO
;
/* Paging Occasion (PO) */
uint32_t
T
;
/* DRX cycle */
uint8_t
PF_offset
;
uint8_t
i_s
;
}
UE_PF_PO_t
;
#include "rrc_proto.h"
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/MESSAGES/asn1_msg.c
View file @
d6a01a73
...
...
@@ -74,6 +74,8 @@
#include "NR_RRCReconfigurationComplete-IEs.h"
#include "NR_DLInformationTransfer.h"
#include "NR_RRCReestablishmentRequest.h"
#include "NR_PCCH-Message.h"
#include "NR_PagingRecord.h"
#include "NR_UE-CapabilityRequestFilterNR.h"
#include "common/utils/nr/nr_common.h"
#if defined(NR_Rel16)
...
...
@@ -136,6 +138,7 @@
#include "intertask_interface.h"
#include "common/ran_context.h"
#include "conversions.h"
//#define XER_PRINT
...
...
@@ -2131,3 +2134,42 @@ NR_MeasConfig_t *get_defaultMeasConfig(const gNB_RrcConfigurationReq *conf)
return
mc
;
}
uint8_t
do_NR_Paging
(
uint8_t
Mod_id
,
uint8_t
*
buffer
,
uint32_t
tmsi
)
{
LOG_D
(
NR_RRC
,
"[gNB %d] do_NR_Paging start
\n
"
,
Mod_id
);
NR_PCCH_Message_t
pcch_msg
;
pcch_msg
.
message
.
present
=
NR_PCCH_MessageType_PR_c1
;
asn1cCalloc
(
pcch_msg
.
message
.
choice
.
c1
,
c1
);
c1
->
present
=
NR_PCCH_MessageType__c1_PR_paging
;
c1
->
choice
.
paging
=
CALLOC
(
1
,
sizeof
(
NR_Paging_t
));
c1
->
choice
.
paging
->
pagingRecordList
=
CALLOC
(
1
,
sizeof
(
*
pcch_msg
.
message
.
choice
.
c1
->
choice
.
paging
->
pagingRecordList
));
c1
->
choice
.
paging
->
nonCriticalExtension
=
NULL
;
asn_set_empty
(
&
c1
->
choice
.
paging
->
pagingRecordList
->
list
);
c1
->
choice
.
paging
->
pagingRecordList
->
list
.
count
=
0
;
asn1cSequenceAdd
(
c1
->
choice
.
paging
->
pagingRecordList
->
list
,
NR_PagingRecord_t
,
paging_record_p
);
/* convert ue_paging_identity_t to PagingUE_Identity_t */
paging_record_p
->
ue_Identity
.
present
=
NR_PagingUE_Identity_PR_ng_5G_S_TMSI
;
// set ng_5G_S_TMSI
INT32_TO_BIT_STRING
(
tmsi
,
&
paging_record_p
->
ue_Identity
.
choice
.
ng_5G_S_TMSI
);
/* add to list */
LOG_D
(
NR_RRC
,
"[gNB %d] do_Paging paging_record: PagingRecordList.count %d
\n
"
,
Mod_id
,
c1
->
choice
.
paging
->
pagingRecordList
->
list
.
count
);
asn_enc_rval_t
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_PCCH_Message
,
NULL
,
(
void
*
)
&
pcch_msg
,
buffer
,
RRC_BUF_SIZE
);
ASN_STRUCT_FREE_CONTENTS_ONLY
(
asn_DEF_NR_PCCH_Message
,
&
pcch_msg
);
if
(
enc_rval
.
encoded
==
-
1
)
{
LOG_I
(
NR_RRC
,
"[gNB AssertFatal]ASN1 message encoding failed (%s, %lu)!
\n
"
,
enc_rval
.
failed_type
->
name
,
enc_rval
.
encoded
);
return
-
1
;
}
if
(
LOG_DEBUGFLAG
(
DEBUG_ASN1
)
)
{
xer_fprint
(
stdout
,
&
asn_DEF_NR_PCCH_Message
,
(
void
*
)
&
pcch_msg
);
}
return
((
enc_rval
.
encoded
+
7
)
/
8
);
}
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/MESSAGES/asn1_msg.h
View file @
d6a01a73
...
...
@@ -193,5 +193,6 @@ do_RRCReestablishmentComplete(
int64_t
rrc_TransactionIdentifier
);
NR_MeasConfig_t
*
get_defaultMeasConfig
(
const
gNB_RrcConfigurationReq
*
conf
);
uint8_t
do_NR_Paging
(
uint8_t
Mod_id
,
uint8_t
*
buffer
,
uint32_t
tmsi
);
#endif
/* __RRC_NR_MESSAGES_ASN1_MSG__H__ */
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/nr_rrc_proto.h
View file @
d6a01a73
...
...
@@ -219,4 +219,10 @@ void nr_pdcp_add_drbs(eNB_flag_t enb_flag,
uint8_t
*
const
kUPenc
,
uint8_t
*
const
kUPint
,
struct
NR_CellGroupConfig__rlc_BearerToAddModList
*
rlc_bearer2add_list
);
int
rrc_gNB_generate_pcch_msg
(
uint32_t
tmsi
,
uint8_t
paging_drx
,
instance_t
instance
,
uint8_t
CC_id
);
#endif
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB.c
View file @
d6a01a73
...
...
@@ -4024,6 +4024,10 @@ void *rrc_gnb_task(void *args_p) {
rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_COMMAND
(
msg_p
,
msg_name_p
,
instance
);
break
;
case
NGAP_PAGING_IND
:
rrc_gNB_process_PAGING_IND
(
msg_p
,
msg_name_p
,
instance
);
break
;
default:
LOG_E
(
NR_RRC
,
"[gNB %ld] Received unexpected message %s
\n
"
,
instance
,
msg_name_p
);
break
;
...
...
@@ -4218,6 +4222,130 @@ rrc_gNB_generate_RRCRelease(
ue_context_pP
->
ue_context
.
ue_release_timer_rrc
=
1
;
}
}
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
;
uint8_t
Tue
;
uint32_t
pfoffset
;
uint32_t
N
;
/* N: min(T,nB). total count of PF in one DRX cycle */
uint32_t
Ns
=
0
;
/* Ns: max(1,nB/T) */
uint8_t
i_s
;
/* i_s = floor(UE_ID/N) mod Ns */
uint32_t
T
;
/* DRX cycle */
uint32_t
length
;
uint8_t
buffer
[
RRC_BUF_SIZE
];
struct
NR_SIB1
*
sib1
=
RC
.
nrrrc
[
instance
]
->
carrier
.
siblock1
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
;
/* get default DRX cycle from configuration */
Tc
=
sib1
->
servingCellConfigCommon
->
downlinkConfigCommon
.
pcch_Config
.
defaultPagingCycle
;
Tue
=
paging_drx
;
/* set T = min(Tc,Tue) */
T
=
Tc
<
Tue
?
Ttab
[
Tc
]
:
Ttab
[
Tue
];
/* set N = PCCH-Config->nAndPagingFrameOffset */
switch
(
sib1
->
servingCellConfigCommon
->
downlinkConfigCommon
.
pcch_Config
.
nAndPagingFrameOffset
.
present
)
{
case
NR_PCCH_Config__nAndPagingFrameOffset_PR_oneT
:
N
=
T
;
pfoffset
=
0
;
break
;
case
NR_PCCH_Config__nAndPagingFrameOffset_PR_halfT
:
N
=
T
/
2
;
pfoffset
=
1
;
break
;
case
NR_PCCH_Config__nAndPagingFrameOffset_PR_quarterT
:
N
=
T
/
4
;
pfoffset
=
3
;
break
;
case
NR_PCCH_Config__nAndPagingFrameOffset_PR_oneEighthT
:
N
=
T
/
8
;
pfoffset
=
7
;
break
;
case
NR_PCCH_Config__nAndPagingFrameOffset_PR_oneSixteenthT
:
N
=
T
/
16
;
pfoffset
=
15
;
break
;
default:
LOG_E
(
RRC
,
"[gNB %ld] In rrc_gNB_generate_pcch_msg: pfoffset error (pfoffset %d)
\n
"
,
instance
,
sib1
->
servingCellConfigCommon
->
downlinkConfigCommon
.
pcch_Config
.
nAndPagingFrameOffset
.
present
);
return
(
-
1
);
}
switch
(
sib1
->
servingCellConfigCommon
->
downlinkConfigCommon
.
pcch_Config
.
ns
)
{
case
NR_PCCH_Config__ns_four
:
if
(
*
sib1
->
servingCellConfigCommon
->
downlinkConfigCommon
.
initialDownlinkBWP
.
pdcch_ConfigCommon
->
choice
.
setup
->
pagingSearchSpace
==
0
){
LOG_E
(
RRC
,
"[gNB %ld] In rrc_gNB_generate_pcch_msg: ns error only 1 or 2 is allowed when pagingSearchSpace is 0
\n
"
,
instance
);
return
(
-
1
);
}
else
{
Ns
=
4
;
}
break
;
case
NR_PCCH_Config__ns_two
:
Ns
=
2
;
break
;
case
NR_PCCH_Config__ns_one
:
Ns
=
1
;
break
;
default:
LOG_E
(
RRC
,
"[gNB %ld] In rrc_gNB_generate_pcch_msg: ns error (ns %ld)
\n
"
,
instance
,
sib1
->
servingCellConfigCommon
->
downlinkConfigCommon
.
pcch_Config
.
ns
);
return
(
-
1
);
}
/* insert data to UE_PF_PO or update data in UE_PF_PO */
pthread_mutex_lock
(
&
ue_pf_po_mutex
);
uint8_t
i
=
0
;
for
(
i
=
0
;
i
<
MAX_MOBILES_PER_ENB
;
i
++
)
{
if
((
UE_PF_PO
[
CC_id
][
i
].
enable_flag
==
true
&&
UE_PF_PO
[
CC_id
][
i
].
ue_index_value
==
(
uint16_t
)(
tmsi
%
1024
))
||
(
UE_PF_PO
[
CC_id
][
i
].
enable_flag
!=
true
))
{
/* set T = min(Tc,Tue) */
UE_PF_PO
[
CC_id
][
i
].
T
=
T
;
/* set UE_ID */
UE_PF_PO
[
CC_id
][
i
].
ue_index_value
=
(
uint16_t
)(
tmsi
%
1024
);
/* calculate PF and PO */
/* set PF_min and PF_offset: (SFN + PF_offset) mod T = (T div N)*(UE_ID mod N) */
UE_PF_PO
[
CC_id
][
i
].
PF_min
=
(
T
/
N
)
*
(
UE_PF_PO
[
CC_id
][
i
].
ue_index_value
%
N
);
UE_PF_PO
[
CC_id
][
i
].
PF_offset
=
pfoffset
;
/* set i_s */
/* i_s = floor(UE_ID/N) mod Ns */
i_s
=
(
uint8_t
)((
UE_PF_PO
[
CC_id
][
i
].
ue_index_value
/
N
)
%
Ns
);
UE_PF_PO
[
CC_id
][
i
].
i_s
=
i_s
;
// TODO,set PO
if
(
UE_PF_PO
[
CC_id
][
i
].
enable_flag
==
true
)
{
//paging exist UE log
LOG_D
(
NR_RRC
,
"[gNB %ld] CC_id %d In rrc_gNB_generate_pcch_msg: Update exist UE %d, T %d, N %d, PF %d, i_s %d, PF_offset %d
\n
"
,
instance
,
CC_id
,
UE_PF_PO
[
CC_id
][
i
].
ue_index_value
,
T
,
N
,
UE_PF_PO
[
CC_id
][
i
].
PF_min
,
UE_PF_PO
[
CC_id
][
i
].
i_s
,
UE_PF_PO
[
CC_id
][
i
].
PF_offset
);
}
else
{
/* set enable_flag */
UE_PF_PO
[
CC_id
][
i
].
enable_flag
=
true
;
//paging new UE log
LOG_D
(
NR_RRC
,
"[gNB %ld] CC_id %d In rrc_gNB_generate_pcch_msg: Insert a new UE %d, T %d, N %d, PF %d, i_s %d, PF_offset %d
\n
"
,
instance
,
CC_id
,
UE_PF_PO
[
CC_id
][
i
].
ue_index_value
,
T
,
N
,
UE_PF_PO
[
CC_id
][
i
].
PF_min
,
UE_PF_PO
[
CC_id
][
i
].
i_s
,
UE_PF_PO
[
CC_id
][
i
].
PF_offset
);
}
break
;
}
}
pthread_mutex_unlock
(
&
ue_pf_po_mutex
);
/* Create message for PDCP (DLInformationTransfer_t) */
length
=
do_NR_Paging
(
instance
,
buffer
,
tmsi
);
if
(
length
==
-
1
)
{
LOG_I
(
NR_RRC
,
"do_Paging error
\n
"
);
return
-
1
;
}
// TODO, send message to pdcp
return
0
;
}
void
nr_rrc_trigger
(
protocol_ctxt_t
*
ctxt
,
int
CC_id
,
int
frame
,
int
subframe
)
{
MessageDef
*
message_p
;
...
...
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB_NGAP.c
View file @
d6a01a73
...
...
@@ -1714,3 +1714,37 @@ void nr_rrc_rx_tx(void) {
}
/*------------------------------------------------------------------------------*/
int
rrc_gNB_process_PAGING_IND
(
MessageDef
*
msg_p
,
const
char
*
msg_name
,
instance_t
instance
)
{
for
(
uint16_t
tai_size
=
0
;
tai_size
<
NGAP_PAGING_IND
(
msg_p
).
tai_size
;
tai_size
++
)
{
LOG_I
(
NR_RRC
,
"[gNB %ld] In NGAP_PAGING_IND: MCC %d, MNC %d, TAC %d
\n
"
,
instance
,
NGAP_PAGING_IND
(
msg_p
).
plmn_identity
[
tai_size
].
mcc
,
NGAP_PAGING_IND
(
msg_p
).
plmn_identity
[
tai_size
].
mnc
,
NGAP_PAGING_IND
(
msg_p
).
tac
[
tai_size
]);
for
(
uint8_t
j
=
0
;
j
<
RC
.
nrrrc
[
instance
]
->
configuration
.
num_plmn
;
j
++
)
{
if
(
RC
.
nrrrc
[
instance
]
->
configuration
.
mcc
[
j
]
==
NGAP_PAGING_IND
(
msg_p
).
plmn_identity
[
tai_size
].
mcc
&&
RC
.
nrrrc
[
instance
]
->
configuration
.
mnc
[
j
]
==
NGAP_PAGING_IND
(
msg_p
).
plmn_identity
[
tai_size
].
mnc
&&
RC
.
nrrrc
[
instance
]
->
configuration
.
tac
==
NGAP_PAGING_IND
(
msg_p
).
tac
[
tai_size
])
{
for
(
uint8_t
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
if
(
NODE_IS_CU
(
RC
.
nrrrc
[
instance
]
->
node_type
))
{
MessageDef
*
m
=
itti_alloc_new_message
(
TASK_RRC_GNB
,
0
,
F1AP_PAGING_IND
);
F1AP_PAGING_IND
(
m
).
mcc
=
RC
.
nrrrc
[
j
]
->
configuration
.
mcc
[
0
];
F1AP_PAGING_IND
(
m
).
mnc
=
RC
.
nrrrc
[
j
]
->
configuration
.
mnc
[
0
];
F1AP_PAGING_IND
(
m
).
mnc_digit_length
=
RC
.
nrrrc
[
j
]
->
configuration
.
mnc_digit_length
[
0
];
F1AP_PAGING_IND
(
m
).
nr_cellid
=
RC
.
nrrrc
[
j
]
->
nr_cellid
;
F1AP_PAGING_IND
(
m
).
ueidentityindexvalue
=
(
uint16_t
)(
NGAP_PAGING_IND
(
msg_p
).
ue_paging_identity
.
s_tmsi
.
m_tmsi
%
1024
);
F1AP_PAGING_IND
(
m
).
fiveg_s_tmsi
=
NGAP_PAGING_IND
(
msg_p
).
ue_paging_identity
.
s_tmsi
.
m_tmsi
;
F1AP_PAGING_IND
(
m
).
paging_drx
=
NGAP_PAGING_IND
(
msg_p
).
paging_drx
;
LOG_E
(
F1AP
,
"ueidentityindexvalue %u fiveg_s_tmsi %ld paging_drx %u
\n
"
,
F1AP_PAGING_IND
(
m
).
ueidentityindexvalue
,
F1AP_PAGING_IND
(
m
).
fiveg_s_tmsi
,
F1AP_PAGING_IND
(
m
).
paging_drx
);
itti_send_msg_to_task
(
TASK_CU_F1
,
instance
,
m
);
}
else
{
rrc_gNB_generate_pcch_msg
(
NGAP_PAGING_IND
(
msg_p
).
ue_paging_identity
.
s_tmsi
.
m_tmsi
,(
uint8_t
)
NGAP_PAGING_IND
(
msg_p
).
paging_drx
,
instance
,
CC_id
);
}
// end of nodetype check
}
// end of cc loop
}
// end of mcc mnc check
}
// end of num_plmn
}
// end of tai size
return
0
;
}
This diff is collapsed.
Click to expand it.
openair2/RRC/NR/rrc_gNB_NGAP.h
View file @
d6a01a73
...
...
@@ -189,4 +189,10 @@ nr_rrc_pdcp_config_security(
const
uint8_t
send_security_mode_command
);
int
rrc_gNB_process_PAGING_IND
(
MessageDef
*
msg_p
,
const
char
*
msg_name
,
instance_t
instance
);
#endif
This diff is collapsed.
Click to expand it.
openair3/UTILS/conversions.h
View file @
d6a01a73
...
...
@@ -544,6 +544,27 @@ do { \
(bITsTRING)->bits_unused = 4; \
} while(0)
#define UEIDENTITYINDEX_TO_BIT_STRING(mACRO, bITsTRING) \
do { \
(bITsTRING)->buf = calloc(2, sizeof(uint8_t)); \
(bITsTRING)->buf[0] = (mACRO) >> 2; \
(bITsTRING)->buf[1] = ((mACRO) & 0x03)<<6; \
(bITsTRING)->size = 2; \
(bITsTRING)->bits_unused = 6; \
} while(0)
#define FIVEG_S_TMSI_TO_BIT_STRING(mACRO, bITsTRING) \
do { \
(bITsTRING)->buf = calloc(6, sizeof(uint8_t)); \
(bITsTRING)->buf[0] = ((mACRO) >> 40) & 0xff; \
(bITsTRING)->buf[1] = ((mACRO) >> 32) & 0xff; \
(bITsTRING)->buf[2] = ((mACRO) >> 24) & 0xff; \
(bITsTRING)->buf[3] = ((mACRO) >> 16) & 0xff; \
(bITsTRING)->buf[4] = ((mACRO) >> 8 ) & 0xff; \
(bITsTRING)->buf[5] = ((mACRO) & 0xff); \
(bITsTRING)->size = 6; \
(bITsTRING)->bits_unused = 0; \
} while(0)
/* Used to format an uint32_t containing an ipv4 address */
#define IPV4_ADDR "%u.%u.%u.%u"
...
...
This diff is collapsed.
Click to expand it.
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