Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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 UE
Commits
9b76c583
Commit
9b76c583
authored
Jan 28, 2021
by
Xue Song
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modify the f1 establishment process
parent
4657aecf
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
328 additions
and
161 deletions
+328
-161
executables/nr-softmodem.c
executables/nr-softmodem.c
+12
-12
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+1
-1
openair2/F1AP/f1ap_du_interface_management.c
openair2/F1AP/f1ap_du_interface_management.c
+82
-76
openair2/GNB_APP/gnb_config.c
openair2/GNB_APP/gnb_config.c
+162
-24
openair2/RRC/NR/MESSAGES/asn1_msg.c
openair2/RRC/NR/MESSAGES/asn1_msg.c
+13
-6
openair2/RRC/NR/nr_rrc_defs.h
openair2/RRC/NR/nr_rrc_defs.h
+5
-0
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+53
-42
No files found.
executables/nr-softmodem.c
View file @
9b76c583
...
@@ -460,24 +460,24 @@ int create_gNB_tasks(uint32_t gnb_nb) {
...
@@ -460,24 +460,24 @@ int create_gNB_tasks(uint32_t gnb_nb) {
LOG_E
(
GNB_APP
,
"Create task for gNB APP failed
\n
"
);
LOG_E
(
GNB_APP
,
"Create task for gNB APP failed
\n
"
);
return
-
1
;
return
-
1
;
}
}
LOG_I
(
NR_RRC
,
"Creating NR RRC gNB Task
\n
"
);
if
(
itti_create_task
(
TASK_RRC_GNB
,
rrc_gnb_task
,
NULL
)
<
0
)
{
LOG_E
(
NR_RRC
,
"Create task for NR RRC gNB failed
\n
"
);
return
-
1
;
}
}
}
if
(
gnb_nb
>
0
)
{
if
(
gnb_nb
>
0
)
{
if
(
!
NODE_IS_D
U
(
RC
.
nrrrc
[
0
]
->
node_type
))
{
if
(
NODE_IS_C
U
(
RC
.
nrrrc
[
0
]
->
node_type
))
{
LOG_I
(
NR_RRC
,
"Creating NR RRC gNB Task
\n
"
);
printf
(
"####### node is CU
\n
"
);
if
(
itti_create_task
(
TASK_RRC_GNB
,
rrc_gnb
_task
,
NULL
)
<
0
)
{
if
(
itti_create_task
(
TASK_CU_F1
,
F1AP_CU
_task
,
NULL
)
<
0
)
{
LOG_E
(
NR_RRC
,
"Create task for NR RRC gNB
failed
\n
"
);
LOG_E
(
F1AP
,
"Create task for F1AP CU
failed
\n
"
);
return
-
1
;
return
-
1
;
}
}
}
if
(
NODE_IS_CU
(
RC
.
nrrrc
[
0
]
->
node_type
))
{
if
(
NODE_IS_DU
(
RC
.
nrrrc
[
0
]
->
node_type
))
{
printf
(
"####### node is CU
\n
"
);
if
(
itti_create_task
(
TASK_CU_F1
,
F1AP_CU_task
,
NULL
)
<
0
)
{
LOG_E
(
F1AP
,
"Create task for F1AP CU failed
\n
"
);
return
-
1
;
}
}
}
else
{
printf
(
"####### node is DU
\n
"
);
printf
(
"####### node is DU
\n
"
);
if
(
itti_create_task
(
TASK_DU_F1
,
F1AP_DU_task
,
NULL
)
<
0
)
{
if
(
itti_create_task
(
TASK_DU_F1
,
F1AP_DU_task
,
NULL
)
<
0
)
{
LOG_E
(
F1AP
,
"Create task for F1AP DU failed
\n
"
);
LOG_E
(
F1AP
,
"Create task for F1AP DU failed
\n
"
);
...
...
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
9b76c583
...
@@ -265,7 +265,7 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
...
@@ -265,7 +265,7 @@ void nr_postDecode(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) {
LOG_D
(
PHY
,
"ULSCH received ok
\n
"
);
LOG_D
(
PHY
,
"ULSCH received ok
\n
"
);
nr_fill_indication
(
gNB
,
ulsch_harq
->
frame
,
ulsch_harq
->
slot
,
rdata
->
ulsch_id
,
rdata
->
harq_pid
,
0
);
nr_fill_indication
(
gNB
,
ulsch_harq
->
frame
,
ulsch_harq
->
slot
,
rdata
->
ulsch_id
,
rdata
->
harq_pid
,
0
);
log_dump
(
PHY
,
ulsch_harq
->
b
,
16
,
LOG_DUMP_CHAR
,
"gnb pusch rx frame %d %d: "
,
ulsch_harq
->
frame
,
ulsch_harq
->
slot
);
//
log_dump(PHY, ulsch_harq->b, 16, LOG_DUMP_CHAR,"gnb pusch rx frame %d %d: ", ulsch_harq->frame, ulsch_harq->slot);
}
else
{
}
else
{
LOG_I
(
PHY
,
"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d
\n
"
,
LOG_I
(
PHY
,
"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d
\n
"
,
gNB
->
Mod_id
,
ulsch_harq
->
frame
,
ulsch_harq
->
slot
,
gNB
->
Mod_id
,
ulsch_harq
->
frame
,
ulsch_harq
->
slot
,
...
...
openair2/F1AP/f1ap_du_interface_management.c
View file @
9b76c583
...
@@ -463,96 +463,102 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
...
@@ -463,96 +463,102 @@ int DU_handle_F1_SETUP_RESPONSE(instance_t instance,
F1AP_SETUP_RESP
(
msg_p
).
gNB_CU_name
);
F1AP_SETUP_RESP
(
msg_p
).
gNB_CU_name
);
break
;
break
;
case
F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List
:
case
F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List
:
{
AssertFatal
(
ie
->
criticality
==
F1AP_Criticality_reject
,
AssertFatal
(
ie
->
criticality
==
F1AP_Criticality_reject
,
"ie->criticality != F1AP_Criticality_reject
\n
"
);
"ie->criticality != F1AP_Criticality_reject
\n
"
);
AssertFatal
(
ie
->
value
.
present
==
F1AP_F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List
,
AssertFatal
(
ie
->
value
.
present
==
F1AP_F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List
,
"ie->value.present != F1AP_F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List
\n
"
);
"ie->value.present != F1AP_F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List
\n
"
);
num_cells_to_activate
=
ie
->
value
.
choice
.
Cells_to_be_Activated_List
.
list
.
count
;
num_cells_to_activate
=
ie
->
value
.
choice
.
Cells_to_be_Activated_List
.
list
.
count
;
LOG_D
(
F1AP
,
"F1AP: Activating %d cells
\n
"
,
num_cells_to_activate
);
LOG_D
(
F1AP
,
"F1AP: Activating %d cells
\n
"
,
num_cells_to_activate
);
for
(
int
i
=
0
;
i
<
num_cells_to_activate
;
i
++
)
{
for
(
int
i
=
0
;
i
<
num_cells_to_activate
;
i
++
)
{
F1AP_Cells_to_be_Activated_List_ItemIEs_t
*
cells_to_be_activated_list_item_ies
=
(
F1AP_Cells_to_be_Activated_List_ItemIEs_t
*
)
ie
->
value
.
choice
.
Cells_to_be_Activated_List
.
list
.
array
[
i
];
F1AP_Cells_to_be_Activated_List_ItemIEs_t
*
cells_to_be_activated_list_item_ies
=
(
F1AP_Cells_to_be_Activated_List_ItemIEs_t
*
)
ie
->
value
.
choice
.
Cells_to_be_Activated_List
.
list
.
array
[
i
];
AssertFatal
(
cells_to_be_activated_list_item_ies
->
id
==
F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item
,
AssertFatal
(
cells_to_be_activated_list_item_ies
->
id
==
F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item
,
"cells_to_be_activated_list_item_ies->id != F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item"
);
"cells_to_be_activated_list_item_ies->id != F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List_Item"
);
AssertFatal
(
cells_to_be_activated_list_item_ies
->
criticality
==
F1AP_Criticality_reject
,
AssertFatal
(
cells_to_be_activated_list_item_ies
->
criticality
==
F1AP_Criticality_reject
,
"cells_to_be_activated_list_item_ies->criticality == F1AP_Criticality_reject"
);
"cells_to_be_activated_list_item_ies->criticality == F1AP_Criticality_reject"
);
AssertFatal
(
cells_to_be_activated_list_item_ies
->
value
.
present
==
F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item
,
AssertFatal
(
cells_to_be_activated_list_item_ies
->
value
.
present
==
F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item
,
"cells_to_be_activated_list_item_ies->value.present == F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item"
);
"cells_to_be_activated_list_item_ies->value.present == F1AP_Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item"
);
cell
=
&
cells_to_be_activated_list_item_ies
->
value
.
choice
.
Cells_to_be_Activated_List_Item
;
cell
=
&
cells_to_be_activated_list_item_ies
->
value
.
choice
.
Cells_to_be_Activated_List_Item
;
TBCD_TO_MCC_MNC
(
&
cell
->
nRCGI
.
pLMN_Identity
,
F1AP_SETUP_RESP
(
msg_p
).
mcc
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
mnc
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
mnc_digit_length
[
i
]);
TBCD_TO_MCC_MNC
(
&
cell
->
nRCGI
.
pLMN_Identity
,
F1AP_SETUP_RESP
(
msg_p
).
mcc
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
mnc
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
mnc_digit_length
[
i
]);
AssertFatal
(
cell
->
nRPCI
!=
NULL
,
"nRPCI is null
\n
"
);
AssertFatal
(
cell
->
nRPCI
!=
NULL
,
"nRPCI is null
\n
"
);
LOG_D
(
F1AP
,
"nr_cellId : %x %x %x %x %x
\n
"
,
LOG_D
(
F1AP
,
"nr_cellId : %x %x %x %x %x
\n
"
,
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
0
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
0
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
1
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
1
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
2
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
2
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
3
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
3
],
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
4
]);
cell
->
nRCGI
.
nRCellIdentity
.
buf
[
4
]);
BIT_STRING_TO_NR_CELL_IDENTITY
(
&
cell
->
nRCGI
.
nRCellIdentity
,
BIT_STRING_TO_NR_CELL_IDENTITY
(
&
cell
->
nRCGI
.
nRCellIdentity
,
F1AP_SETUP_RESP
(
msg_p
).
nr_cellid
[
i
]);
F1AP_SETUP_RESP
(
msg_p
).
nr_cellid
[
i
]);
F1AP_SETUP_RESP
(
msg_p
).
nrpci
[
i
]
=
*
cell
->
nRPCI
;
F1AP_ProtocolExtensionContainer_154P112_t
*
ext
=
(
F1AP_ProtocolExtensionContainer_154P112_t
*
)
cell
->
iE_Extensions
;
if
(
0
)
{
AssertFatal
(
ext
!=
NULL
,
"Extension is null
\n
"
);
F1AP_ProtocolExtensionContainer_154P112_t
*
ext
=
(
F1AP_ProtocolExtensionContainer_154P112_t
*
)
cell
->
iE_Extensions
;
AssertFatal
(
ext
!=
NULL
,
"Extension is null
\n
"
);
for
(
int
cnt
=
0
;
cnt
<
ext
->
list
.
count
;
cnt
++
)
{
for
(
int
cnt
=
0
;
cnt
<
ext
->
list
.
count
;
cnt
++
)
{
F1AP_Cells_to_be_Activated_List_ItemExtIEs_t
*
cells_to_be_activated_list_itemExtIEs
=
(
F1AP_Cells_to_be_Activated_List_ItemExtIEs_t
*
)
ext
->
list
.
array
[
cnt
];
F1AP_Cells_to_be_Activated_List_ItemExtIEs_t
*
cells_to_be_activated_list_itemExtIEs
=
(
F1AP_Cells_to_be_Activated_List_ItemExtIEs_t
*
)
ext
->
list
.
array
[
cnt
];
switch
(
cells_to_be_activated_list_itemExtIEs
->
id
)
{
switch
(
cells_to_be_activated_list_itemExtIEs
->
id
)
{
/*
/*
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_NOTHING:
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_NOTHING:
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_GNB_CUSystemInformation,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_GNB_CUSystemInformation,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_AvailablePLMNList,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_AvailablePLMNList,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_ExtendedAvailablePLMN_List,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_ExtendedAvailablePLMN_List,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_IAB_Info_IAB_donor_CU,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_IAB_Info_IAB_donor_CU,
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_AvailableSNPN_ID_List
case F1AP_Cells_to_be_Activated_List_ItemExtIEs__extensionValue_PR_AvailableSNPN_ID_List
*/
*/
case
F1AP_ProtocolIE_ID_id_gNB_CUSystemInformation
:
case
F1AP_ProtocolIE_ID_id_gNB_CUSystemInformation
:
{
{
F1AP_SETUP_RESP
(
msg_p
).
nrpci
[
i
]
=
*
cell
->
nRPCI
;
F1AP_GNB_CUSystemInformation_t
*
gNB_CUSystemInformation
=
(
F1AP_GNB_CUSystemInformation_t
*
)
&
cells_to_be_activated_list_itemExtIEs
->
extensionValue
.
choice
.
GNB_CUSystemInformation
;
F1AP_GNB_CUSystemInformation_t
*
gNB_CUSystemInformation
=
(
F1AP_GNB_CUSystemInformation_t
*
)
&
cells_to_be_activated_list_itemExtIEs
->
extensionValue
.
choice
.
GNB_CUSystemInformation
;
F1AP_SETUP_RESP
(
msg_p
).
num_SI
[
i
]
=
gNB_CUSystemInformation
->
sibtypetobeupdatedlist
.
list
.
count
;
F1AP_SETUP_RESP
(
msg_p
).
num_SI
[
i
]
=
gNB_CUSystemInformation
->
sibtypetobeupdatedlist
.
list
.
count
;
AssertFatal
(
ext
->
list
.
count
==
1
,
"At least one SI message should be there, and only 1 for now!
\n
"
);
AssertFatal
(
ext
->
list
.
count
==
1
,
"At least one SI message should be there, and only 1 for now!
\n
"
);
LOG_D
(
F1AP
,
"F1AP: F1Setup-Resp Cell %d MCC %d MNC %d NRCellid %lx num_si %d
\n
"
,
LOG_D
(
F1AP
,
"F1AP: F1Setup-Resp Cell %d MCC %d MNC %d NRCellid %lx num_si %d
\n
"
,
i
,
F1AP_SETUP_RESP
(
msg_p
).
mcc
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
mnc
[
i
],
i
,
F1AP_SETUP_RESP
(
msg_p
).
mcc
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
mnc
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
nr_cellid
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
num_SI
[
i
]);
F1AP_SETUP_RESP
(
msg_p
).
nr_cellid
[
i
],
F1AP_SETUP_RESP
(
msg_p
).
num_SI
[
i
]);
for
(
int
si
=
0
;
si
<
gNB_CUSystemInformation
->
sibtypetobeupdatedlist
.
list
.
count
;
si
++
)
{
for
(
int
si
=
0
;
si
<
gNB_CUSystemInformation
->
sibtypetobeupdatedlist
.
list
.
count
;
si
++
)
{
F1AP_SibtypetobeupdatedListItem_t
*
sib_item
=
gNB_CUSystemInformation
->
sibtypetobeupdatedlist
.
list
.
array
[
si
];
F1AP_SibtypetobeupdatedListItem_t
*
sib_item
=
gNB_CUSystemInformation
->
sibtypetobeupdatedlist
.
list
.
array
[
si
];
size_t
size
=
sib_item
->
sIBmessage
.
size
;
size_t
size
=
sib_item
->
sIBmessage
.
size
;
F1AP_SETUP_RESP
(
msg_p
).
SI_container_length
[
i
][
si
]
=
size
;
F1AP_SETUP_RESP
(
msg_p
).
SI_container_length
[
i
][
si
]
=
size
;
LOG_D
(
F1AP
,
"F1AP: F1Setup-Resp SI_container_length[%d][%d] %ld bytes
\n
"
,
i
,
(
int
)
sib_item
->
sIBtype
,
size
);
LOG_D
(
F1AP
,
"F1AP: F1Setup-Resp SI_container_length[%d][%d] %ld bytes
\n
"
,
i
,
(
int
)
sib_item
->
sIBtype
,
size
);
F1AP_SETUP_RESP
(
msg_p
).
SI_container
[
i
][
si
]
=
malloc
(
F1AP_SETUP_RESP
(
msg_p
).
SI_container_length
[
i
][
si
]);
F1AP_SETUP_RESP
(
msg_p
).
SI_container
[
i
][
si
]
=
malloc
(
F1AP_SETUP_RESP
(
msg_p
).
SI_container_length
[
i
][
si
]);
memcpy
((
void
*
)
F1AP_SETUP_RESP
(
msg_p
).
SI_container
[
i
][
sib_item
->
sIBtype
],
memcpy
((
void
*
)
F1AP_SETUP_RESP
(
msg_p
).
SI_container
[
i
][
si
],
(
void
*
)
sib_item
->
sIBmessage
.
buf
,
(
void
*
)
sib_item
->
sIBmessage
.
buf
,
size
);
size
);
}
break
;
}
}
case
F1AP_ProtocolIE_ID_id_AvailablePLMNList
:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
break
;
case
F1AP_ProtocolIE_ID_id_ExtendedAvailablePLMN_List
:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
break
;
case
F1AP_ProtocolIE_ID_id_IAB_Info_IAB_donor_CU
:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
break
;
case
F1AP_ProtocolIE_ID_id_AvailableSNPN_ID_List
:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
break
;
default:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id %d unknown
\n
"
,(
int
)
cells_to_be_activated_list_itemExtIEs
->
id
);
break
;
}
}
break
;
}
// for (cnt=...
case
F1AP_ProtocolIE_ID_id_AvailablePLMNList
:
}
// for (cells_to_activate...
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
break
;
break
;
}
// case F1AP_ProtocolIE_ID_id_Cells_to_be_Activated_List
case
F1AP_ProtocolIE_ID_id_ExtendedAvailablePLMN_List
:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
default:
break
;
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id %d unknown
\n
"
,
(
int
)
ie
->
id
);
case
F1AP_ProtocolIE_ID_id_IAB_Info_IAB_donor_CU
:
break
;
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
break
;
case
F1AP_ProtocolIE_ID_id_AvailableSNPN_ID_List
:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id_AvailablePLMNList not supported yet
\n
"
);
break
;
default:
AssertFatal
(
1
==
0
,
"F1AP_ProtocolIE_ID_id %d unknown
\n
"
,(
int
)
cells_to_be_activated_list_itemExtIEs
->
id
);
break
;
}
}
// for (cnt=...
}
}
// for (cells_to_activate...
}
// switch ie
}
// switch ie
}
// for IE
}
// for IE
AssertFatal
(
TransactionId
!=-
1
,
"TransactionId was not sent
\n
"
);
AssertFatal
(
TransactionId
!=-
1
,
"TransactionId was not sent
\n
"
);
AssertFatal
(
num_cells_to_activate
>
0
,
"No cells activated
\n
"
);
AssertFatal
(
num_cells_to_activate
>
0
,
"No cells activated
\n
"
);
F1AP_SETUP_RESP
(
msg_p
).
num_cells_to_activate
=
num_cells_to_activate
;
F1AP_SETUP_RESP
(
msg_p
).
num_cells_to_activate
=
num_cells_to_activate
;
// tmp
// tmp
F1AP_SETUP_RESP
(
msg_p
).
num_SI
[
0
]
=
1
;
//
F1AP_SETUP_RESP (msg_p).num_SI[0] = 1;
for
(
int
i
=
0
;
i
<
num_cells_to_activate
;
i
++
)
for
(
int
i
=
0
;
i
<
num_cells_to_activate
;
i
++
)
AssertFatal
(
F1AP_SETUP_RESP
(
msg_p
).
num_SI
[
i
]
>
0
,
"System Information %d is missing"
,
i
);
AssertFatal
(
F1AP_SETUP_RESP
(
msg_p
).
num_SI
[
i
]
>
0
,
"System Information %d is missing"
,
i
);
...
...
openair2/GNB_APP/gnb_config.c
View file @
9b76c583
...
@@ -1358,15 +1358,15 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
...
@@ -1358,15 +1358,15 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
F1AP_SETUP_REQ
(
msg_p
).
sctp_out_streams
=
(
uint16_t
)
*
(
SCTPParams
[
GNB_SCTP_OUTSTREAMS_IDX
].
uptr
);
F1AP_SETUP_REQ
(
msg_p
).
sctp_out_streams
=
(
uint16_t
)
*
(
SCTPParams
[
GNB_SCTP_OUTSTREAMS_IDX
].
uptr
);
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
k
];
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
k
];
// wait until RRC cell information is configured
// wait until RRC cell information is configured
// int cell_info_configured=
0;
int
cell_info_configured
=
0
;
//
do {
do
{
//
LOG_I(GNB_APP,"ngran_gNB_DU: Waiting for basic cell configuration\n");
LOG_I
(
GNB_APP
,
"ngran_gNB_DU: Waiting for basic cell configuration
\n
"
);
//
usleep(100000);
usleep
(
100000
);
//
pthread_mutex_lock(&rrc->cell_info_mutex);
pthread_mutex_lock
(
&
rrc
->
cell_info_mutex
);
//
cell_info_configured = rrc->cell_info_configured;
cell_info_configured
=
rrc
->
cell_info_configured
;
//
pthread_mutex_unlock(&rrc->cell_info_mutex);
pthread_mutex_unlock
(
&
rrc
->
cell_info_mutex
);
// } while (cell_info_configured ==
0);
}
while
(
cell_info_configured
==
0
);
rrc
->
configuration
.
mcc
[
0
]
=
F1AP_SETUP_REQ
(
msg_p
).
mcc
[
k
];
rrc
->
configuration
.
mcc
[
0
]
=
F1AP_SETUP_REQ
(
msg_p
).
mcc
[
k
];
rrc
->
configuration
.
mnc
[
0
]
=
F1AP_SETUP_REQ
(
msg_p
).
mnc
[
k
];
rrc
->
configuration
.
mnc
[
0
]
=
F1AP_SETUP_REQ
(
msg_p
).
mnc
[
k
];
...
@@ -1424,7 +1424,155 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
...
@@ -1424,7 +1424,155 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i) {
}
}
int
du_check_plmn_identity
(
rrc_gNB_carrier_data_t
*
carrier
,
uint16_t
mcc
,
uint16_t
mnc
,
uint8_t
mnc_digit_length
)
{
int
du_check_plmn_identity
(
rrc_gNB_carrier_data_t
*
carrier
,
uint16_t
mcc
,
uint16_t
mnc
,
uint8_t
mnc_digit_length
)
{
return
(
1
);
NR_SIB1_t
*
sib1
=
carrier
->
siblock1
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
;
AssertFatal
(
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
plmn_IdentityList
.
list
.
count
>
0
,
"plmn info isn't there
\n
"
);
AssertFatal
(
mnc_digit_length
==
2
||
mnc_digit_length
==
3
,
"impossible mnc_digit_length %d
\n
"
,
mnc_digit_length
);
NR_PLMN_Identity_t
*
plmn_Identity
=
sib1
->
cellAccessRelatedInfo
.
plmn_IdentityList
.
list
.
array
[
0
]
->
plmn_IdentityList
.
list
.
array
[
0
];
// check if mcc is different and return failure if so
LOG_I
(
GNB_APP
,
"plmn_Identity->mcc: %d%d%d
\n
"
,
*
plmn_Identity
->
mcc
->
list
.
array
[
0
],
*
plmn_Identity
->
mcc
->
list
.
array
[
1
],
*
plmn_Identity
->
mcc
->
list
.
array
[
2
]);
if
(
mcc
!=
((
*
plmn_Identity
->
mcc
->
list
.
array
[
0
])
*
100
)
+
((
*
plmn_Identity
->
mcc
->
list
.
array
[
1
])
*
10
)
+
(
*
plmn_Identity
->
mcc
->
list
.
array
[
2
]))
{
LOG_E
(
GNB_APP
,
"mcc in F1AP_SETUP_RESP message is different from mcc in DU
\n
"
);
return
(
0
);
}
// check that mnc digit length is different and return failure if so
if
(
mnc_digit_length
!=
plmn_Identity
->
mnc
.
list
.
count
)
{
LOG_E
(
GNB_APP
,
"mnc(length: %d) in F1AP_SETUP_RESP message is different from mnc(length: %d) in DU
\n
"
,
mnc_digit_length
,
plmn_Identity
->
mnc
.
list
.
count
);
return
0
;
}
// check that 2 digit mnc is different and return failure if so
if
(
mnc_digit_length
==
2
&&
(
mnc
!=
(
*
plmn_Identity
->
mnc
.
list
.
array
[
0
]
*
10
)
+
(
*
plmn_Identity
->
mnc
.
list
.
array
[
1
])))
{
LOG_E
(
GNB_APP
,
"mnc(%d) in F1AP_SETUP_RESP message is different from mnc(%d%d) in DU
\n
"
,
mnc
,
*
plmn_Identity
->
mnc
.
list
.
array
[
0
],
*
plmn_Identity
->
mnc
.
list
.
array
[
1
]);
return
(
0
);
}
else
if
(
mnc_digit_length
==
3
&&
(
mnc
!=
(
*
plmn_Identity
->
mnc
.
list
.
array
[
0
]
*
100
)
+
(
*
plmn_Identity
->
mnc
.
list
.
array
[
1
]
*
10
)
+
(
*
plmn_Identity
->
mnc
.
list
.
array
[
2
])))
{
LOG_E
(
GNB_APP
,
"mnc(%d) in F1AP_SETUP_RESP message is different from mnc(%d%d%d) in DU
\n
"
,
mnc
,
*
plmn_Identity
->
mnc
.
list
.
array
[
0
],
*
plmn_Identity
->
mnc
.
list
.
array
[
1
],
*
plmn_Identity
->
mnc
.
list
.
array
[
2
]);
return
(
0
);
}
// if we're here, the mcc/mnc match so return success
return
(
1
);
}
void
du_extract_and_decode_SI
(
int
inst
,
int
si_ind
,
uint8_t
*
si_container
,
int
si_container_length
)
{
gNB_RRC_INST
*
rrc
=
RC
.
nrrrc
[
inst
];
rrc_gNB_carrier_data_t
*
carrier
=
&
rrc
->
carrier
;
NR_BCCH_DL_SCH_Message_t
*
bcch_message
;
AssertFatal
(
si_ind
==
0
,
"Can only handle a single SI block for now
\n
"
);
LOG_I
(
GNB_APP
,
"rrc inst %d: Trying to decode SI block %d @ %p, length %d
\n
"
,
inst
,
si_ind
,
si_container
,
si_container_length
);
// point to first SI block
bcch_message
=
&
carrier
->
systemInformation
;
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_BCCH_DL_SCH_Message
,
(
void
**
)
&
bcch_message
,
(
const
void
*
)
si_container
,
si_container_length
);
if
((
dec_rval
.
code
!=
RC_OK
)
&&
(
dec_rval
.
consumed
==
0
))
{
AssertFatal
(
1
==
0
,
"[GNB_APP][NR_RRC inst %"
PRIu8
"] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)
\n
"
,
inst
,
dec_rval
.
consumed
);
}
if
(
bcch_message
->
message
.
present
==
NR_BCCH_DL_SCH_MessageType_PR_c1
)
{
switch
(
bcch_message
->
message
.
choice
.
c1
->
present
)
{
case
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1
:
AssertFatal
(
1
==
0
,
"Should have received SIB1 from CU
\n
"
);
break
;
case
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation
:
{
NR_SystemInformation_t
*
si
=
bcch_message
->
message
.
choice
.
c1
->
choice
.
systemInformation
;
if
(
si
->
criticalExtensions
.
present
==
NR_SystemInformation__criticalExtensions_PR_systemInformation
)
{
for
(
int
i
=
0
;
i
<
si
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
;
i
++
)
{
LOG_I
(
GNB_APP
,
"Extracting SI %d/%d
\n
"
,
i
,
si
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
count
);
SystemInformation_IEs__sib_TypeAndInfo__Member
*
typeAndInfo
;
typeAndInfo
=
si
->
criticalExtensions
.
choice
.
systemInformation
->
sib_TypeAndInfo
.
list
.
array
[
i
];
switch
(
typeAndInfo
->
present
)
{
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_NOTHING
:
AssertFatal
(
0
,
"Should have received SIB2 SIB3 from CU
\n
"
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB2 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
carrier
->
sib2
=
typeAndInfo
->
choice
.
sib2
;
carrier
->
SIB23
=
(
uint8_t
*
)
malloc
(
64
);
memcpy
((
void
*
)
carrier
->
SIB23
,
(
void
*
)
si_container
,
si_container_length
);
carrier
->
sizeof_SIB23
=
si_container_length
;
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3
:
carrier
->
sib3
=
typeAndInfo
->
choice
.
sib3
;
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB3 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib4
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB4 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib5
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB5 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib6
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB6 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib7
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB7 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib8
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB8 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib9
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB9 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib10_v1610
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB10 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib11_v1610
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB11 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib12_v1610
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB12 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib13_v1610
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB13 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
case
NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib14_v1610
:
LOG_I
(
GNB_APP
,
"[NR_RRC %"
PRIu8
"] Found SIB14 in CU F1AP_SETUP_RESP message
\n
"
,
inst
);
break
;
default:
AssertFatal
(
1
==
0
,
"Shouldn't have received this SI %d
\n
"
,
typeAndInfo
->
present
);
break
;
}
}
}
break
;
}
case
NR_BCCH_DL_SCH_MessageType__c1_PR_NOTHING
:
AssertFatal
(
0
,
"Should have received SIB1 from CU
\n
"
);
break
;
}
}
else
AssertFatal
(
1
==
0
,
"No SI messages
\n
"
);
}
}
void
configure_gnb_du_mac
(
int
inst
)
{
void
configure_gnb_du_mac
(
int
inst
)
{
...
@@ -1460,10 +1608,11 @@ void gNB_app_handle_f1ap_setup_resp(f1ap_setup_resp_t *resp) {
...
@@ -1460,10 +1608,11 @@ void gNB_app_handle_f1ap_setup_resp(f1ap_setup_resp_t *resp) {
resp
->
nrpci
[
j
]
==
carrier
->
physCellId
))
{
resp
->
nrpci
[
j
]
==
carrier
->
physCellId
))
{
// copy system information and decode it
// copy system information and decode it
for
(
si_ind
=
0
;
si_ind
<
resp
->
num_SI
[
j
];
si_ind
++
)
{
for
(
si_ind
=
0
;
si_ind
<
resp
->
num_SI
[
j
];
si_ind
++
)
{
// extract_and_decode_SI(i,
// si_ind,
du_extract_and_decode_SI
(
i
,
// resp->SI_container[j][si_ind],
si_ind
,
// resp->SI_container_length[j][si_ind]);
resp
->
SI_container
[
j
][
si_ind
],
resp
->
SI_container_length
[
j
][
si_ind
]);
}
}
// perform MAC/L1 common configuration
// perform MAC/L1 common configuration
...
@@ -1537,17 +1686,6 @@ void nr_read_config_and_init(void) {
...
@@ -1537,17 +1686,6 @@ void nr_read_config_and_init(void) {
RCconfig_NRRRC
(
msg_p
,
gnb_id
,
RC
.
nrrrc
[
gnb_id
]);
RCconfig_NRRRC
(
msg_p
,
gnb_id
,
RC
.
nrrrc
[
gnb_id
]);
}
}
if
(
NODE_IS_DU
(
RC
.
nrrrc
[
0
]
->
node_type
))
{
RC
.
nrrrc
[
0
]
->
carrier
.
servingcellconfigcommon
=
RC
.
nrrrc
[
0
]
->
configuration
.
scc
;
RC
.
nrrrc
[
0
]
->
carrier
.
MIB
=
(
uint8_t
*
)
malloc16
(
4
);
RC
.
nrrrc
[
0
]
->
carrier
.
sizeof_MIB
=
do_MIB_NR
(
RC
.
nrrrc
[
0
],
0
);
RC
.
nrrrc
[
0
]
->
carrier
.
sizeof_SIB1
=
do_SIB1_NR
(
&
RC
.
nrrrc
[
0
]
->
carrier
,
&
RC
.
nrrrc
[
0
]
->
configuration
);
struct
rrc_gNB_ue_context_s
*
ue_context_p
=
rrc_gNB_allocate_new_UE_context
(
RC
.
nrrrc
[
0
]);
LOG_I
(
GNB_APP
,
"Adding new user (%p)
\n
"
,
ue_context_p
);
rrc_add_nsa_user
(
RC
.
nrrrc
[
0
],
ue_context_p
,
NULL
);
}
if
(
NODE_IS_CU
(
RC
.
nrrrc
[
0
]
->
node_type
))
{
if
(
NODE_IS_CU
(
RC
.
nrrrc
[
0
]
->
node_type
))
{
pdcp_layer_init_for_CU
();
pdcp_layer_init_for_CU
();
nr_DRB_preconfiguration
(
0x1234
);
nr_DRB_preconfiguration
(
0x1234
);
...
...
openair2/RRC/NR/MESSAGES/asn1_msg.c
View file @
9b76c583
...
@@ -301,9 +301,9 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
...
@@ -301,9 +301,9 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
// TODO : Add support for more than one PLMN
// TODO : Add support for more than one PLMN
//int num_plmn = configuration->num_plmn;
//int num_plmn = configuration->num_plmn;
int
num_plmn
=
1
;
int
num_plmn
=
1
;
struct
NR_PLMN_Identity
nr_plmn
[
num_plmn
]
;
struct
NR_PLMN_Identity
*
nr_plmn
=
CALLOC
(
1
,
sizeof
(
struct
NR_PLMN_Identity
)
*
num_plmn
)
;
NR_MCC_MNC_Digit_t
nr_mcc_digit
[
num_plmn
][
3
]
;
NR_MCC_MNC_Digit_t
(
*
nr_mcc_digit
)[
3
]
=
(
NR_MCC_MNC_Digit_t
(
*
)[
3
])
CALLOC
(
1
,
sizeof
(
NR_MCC_MNC_Digit_t
)
*
num_plmn
*
3
)
;
NR_MCC_MNC_Digit_t
nr_mnc_digit
[
num_plmn
][
3
]
;
NR_MCC_MNC_Digit_t
(
*
nr_mnc_digit
)[
3
]
=
(
NR_MCC_MNC_Digit_t
(
*
)[
3
])
CALLOC
(
1
,
sizeof
(
NR_MCC_MNC_Digit_t
)
*
num_plmn
*
3
);
;
memset
(
nr_plmn
,
0
,
sizeof
(
nr_plmn
));
memset
(
nr_plmn
,
0
,
sizeof
(
nr_plmn
));
memset
(
nr_mcc_digit
,
0
,
sizeof
(
nr_mcc_digit
));
memset
(
nr_mcc_digit
,
0
,
sizeof
(
nr_mcc_digit
));
memset
(
nr_mnc_digit
,
0
,
sizeof
(
nr_mnc_digit
));
memset
(
nr_mnc_digit
,
0
,
sizeof
(
nr_mnc_digit
));
...
@@ -336,9 +336,14 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
...
@@ -336,9 +336,14 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
nr_mnc_digit
[
i
][
2
]
=
(
configuration
->
mnc
[
i
])
%
10
;
nr_mnc_digit
[
i
][
2
]
=
(
configuration
->
mnc
[
i
])
%
10
;
nr_plmn
[
i
].
mnc
.
list
.
size
=
0
;
nr_plmn
[
i
].
mnc
.
list
.
size
=
0
;
nr_plmn
[
i
].
mnc
.
list
.
count
=
0
;
nr_plmn
[
i
].
mnc
.
list
.
count
=
0
;
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
0
]);
if
(
nr_mnc_digit
[
i
][
0
]
==
0
)
{
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
1
]);
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
1
]);
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
2
]);
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
2
]);
}
else
{
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
0
]);
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
1
]);
ASN_SEQUENCE_ADD
(
&
nr_plmn
[
i
].
mnc
.
list
,
&
nr_mnc_digit
[
i
][
2
]);
}
ASN_SEQUENCE_ADD
(
&
nr_plmn_info
->
plmn_IdentityList
.
list
,
&
nr_plmn
[
i
]);
ASN_SEQUENCE_ADD
(
&
nr_plmn_info
->
plmn_IdentityList
.
list
,
&
nr_plmn
[
i
]);
}
//end plmn loop
}
//end plmn loop
...
@@ -362,6 +367,8 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
...
@@ -362,6 +367,8 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
nr_uac_BarringInfoSet.uac_BarringForAccessIdentity.bits_unused = 1;
nr_uac_BarringInfoSet.uac_BarringForAccessIdentity.bits_unused = 1;
ASN_SEQUENCE_ADD(&sib1->uac_BarringInfo->uac_BarringInfoSetList, &nr_uac_BarringInfoSet);
ASN_SEQUENCE_ADD(&sib1->uac_BarringInfo->uac_BarringInfoSetList, &nr_uac_BarringInfoSet);
#endif
#endif
xer_fprint
(
stdout
,
&
asn_DEF_NR_BCCH_DL_SCH_Message
,
(
void
*
)
sib1_message
);
//encode SIB1 to data
//encode SIB1 to data
carrier
->
SIB1
=
(
uint8_t
*
)
malloc16
(
128
);
carrier
->
SIB1
=
(
uint8_t
*
)
malloc16
(
128
);
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_BCCH_DL_SCH_Message
,
enc_rval
=
uper_encode_to_buffer
(
&
asn_DEF_NR_BCCH_DL_SCH_Message
,
...
...
openair2/RRC/NR/nr_rrc_defs.h
View file @
9b76c583
...
@@ -438,6 +438,9 @@ typedef struct {
...
@@ -438,6 +438,9 @@ typedef struct {
NR_BCCH_BCH_Message_t
*
mib_DU
;
NR_BCCH_BCH_Message_t
*
mib_DU
;
NR_BCCH_DL_SCH_Message_t
*
siblock1_DU
;
NR_BCCH_DL_SCH_Message_t
*
siblock1_DU
;
NR_SIB1_t
*
sib1
;
NR_SIB1_t
*
sib1
;
NR_SIB2_t
*
sib2
;
NR_SIB3_t
*
sib3
;
NR_BCCH_DL_SCH_Message_t
systemInformation
;
// SIB23
int
ssb_SubcarrierOffset
;
int
ssb_SubcarrierOffset
;
int
pdsch_AntennaPorts
;
int
pdsch_AntennaPorts
;
int
pusch_TargetSNRx10
;
int
pusch_TargetSNRx10
;
...
@@ -496,6 +499,8 @@ typedef struct gNB_RRC_INST_s {
...
@@ -496,6 +499,8 @@ typedef struct gNB_RRC_INST_s {
int
srs_enable
[
MAX_NUM_CCs
];
int
srs_enable
[
MAX_NUM_CCs
];
uint16_t
sctp_in_streams
;
uint16_t
sctp_in_streams
;
uint16_t
sctp_out_streams
;
uint16_t
sctp_out_streams
;
int
cell_info_configured
;
pthread_mutex_t
cell_info_mutex
;
}
gNB_RRC_INST
;
}
gNB_RRC_INST
;
...
...
openair2/RRC/NR/rrc_gNB.c
View file @
9b76c583
...
@@ -213,9 +213,13 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
...
@@ -213,9 +213,13 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
static
void
init_NR_SI
(
gNB_RRC_INST
*
rrc
,
gNB_RrcConfigurationReq
*
configuration
)
{
static
void
init_NR_SI
(
gNB_RRC_INST
*
rrc
,
gNB_RrcConfigurationReq
*
configuration
)
{
LOG_D
(
RRC
,
"%s()
\n\n\n\n
"
,
__FUNCTION__
);
LOG_D
(
RRC
,
"%s()
\n\n\n\n
"
,
__FUNCTION__
);
rrc
->
carrier
.
MIB
=
(
uint8_t
*
)
malloc16
(
4
);
if
(
NODE_IS_DU
(
rrc
->
node_type
)
||
NODE_IS_MONOLITHIC
(
rrc
->
node_type
))
{
rrc
->
carrier
.
sizeof_MIB
=
do_MIB_NR
(
rrc
,
0
);
rrc
->
carrier
.
MIB
=
(
uint8_t
*
)
malloc16
(
4
);
rrc
->
carrier
.
sizeof_SIB1
=
do_SIB1_NR
(
&
rrc
->
carrier
,
configuration
);
rrc
->
carrier
.
sizeof_MIB
=
do_MIB_NR
(
rrc
,
0
);
rrc
->
carrier
.
sizeof_SIB1
=
do_SIB1_NR
(
&
rrc
->
carrier
,
configuration
);
}
if
(
!
NODE_IS_DU
(
rrc
->
node_type
))
{
if
(
!
NODE_IS_DU
(
rrc
->
node_type
))
{
rrc
->
carrier
.
SIB23
=
(
uint8_t
*
)
malloc16
(
100
);
rrc
->
carrier
.
SIB23
=
(
uint8_t
*
)
malloc16
(
100
);
AssertFatal
(
rrc
->
carrier
.
SIB23
!=
NULL
,
"cannot allocate memory for SIB"
);
AssertFatal
(
rrc
->
carrier
.
SIB23
!=
NULL
,
"cannot allocate memory for SIB"
);
...
@@ -224,7 +228,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
...
@@ -224,7 +228,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
AssertFatal
(
rrc
->
carrier
.
sizeof_SIB23
!=
255
,
"FATAL, RC.nrrrc[mod].carrier[CC_id].sizeof_SIB23 == 255"
);
AssertFatal
(
rrc
->
carrier
.
sizeof_SIB23
!=
255
,
"FATAL, RC.nrrrc[mod].carrier[CC_id].sizeof_SIB23 == 255"
);
}
}
LOG_I
(
NR_RRC
,
"Done init_NR_SI
\n
"
);
LOG_I
(
NR_RRC
,
"Done init_NR_SI
\n
"
);
if
(
!
NODE_IS_CU
(
RC
.
nrrrc
[
0
]
->
node_type
)){
if
(
NODE_IS_MONOLITHIC
(
rrc
->
node_type
)){
rrc_mac_config_req_gNB
(
rrc
->
module_id
,
rrc_mac_config_req_gNB
(
rrc
->
module_id
,
rrc
->
carrier
.
ssb_SubcarrierOffset
,
rrc
->
carrier
.
ssb_SubcarrierOffset
,
rrc
->
carrier
.
pdsch_AntennaPorts
,
rrc
->
carrier
.
pdsch_AntennaPorts
,
...
@@ -237,6 +241,12 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
...
@@ -237,6 +241,12 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
);
);
}
}
/* set flag to indicate that cell information is configured. This is required
* in DU to trigger F1AP_SETUP procedure */
pthread_mutex_lock
(
&
rrc
->
cell_info_mutex
);
rrc
->
cell_info_configured
=
1
;
pthread_mutex_unlock
(
&
rrc
->
cell_info_mutex
);
if
(
get_softmodem_params
()
->
phy_test
>
0
||
get_softmodem_params
()
->
do_ra
>
0
)
{
if
(
get_softmodem_params
()
->
phy_test
>
0
||
get_softmodem_params
()
->
do_ra
>
0
)
{
// This is for phytest only, emulate first X2 message if uecap.raw file is present
// This is for phytest only, emulate first X2 message if uecap.raw file is present
FILE
*
fd
;
FILE
*
fd
;
...
@@ -316,6 +326,8 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
...
@@ -316,6 +326,8 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
rrc
->
carrier
.
pusch_TargetSNRx10
=
configuration
->
pusch_TargetSNRx10
;
rrc
->
carrier
.
pusch_TargetSNRx10
=
configuration
->
pusch_TargetSNRx10
;
rrc
->
carrier
.
pucch_TargetSNRx10
=
configuration
->
pucch_TargetSNRx10
;
rrc
->
carrier
.
pucch_TargetSNRx10
=
configuration
->
pucch_TargetSNRx10
;
/// System Information INIT
/// System Information INIT
pthread_mutex_init
(
&
rrc
->
cell_info_mutex
,
NULL
);
rrc
->
cell_info_configured
=
0
;
LOG_I
(
NR_RRC
,
PROTOCOL_NR_RRC_CTXT_FMT
" Checking release
\n
"
,
PROTOCOL_NR_RRC_CTXT_ARGS
(
&
ctxt
));
LOG_I
(
NR_RRC
,
PROTOCOL_NR_RRC_CTXT_FMT
" Checking release
\n
"
,
PROTOCOL_NR_RRC_CTXT_ARGS
(
&
ctxt
));
init_NR_SI
(
rrc
,
configuration
);
init_NR_SI
(
rrc
,
configuration
);
rrc_init_nr_global_param
();
rrc_init_nr_global_param
();
...
@@ -2380,44 +2392,43 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
...
@@ -2380,44 +2392,43 @@ void rrc_gNB_process_f1_setup_req(f1ap_setup_req_t *f1_setup_req) {
LOG_W
(
NR_RRC
,
"instance %d mib length %d
\n
"
,
i
,
f1_setup_req
->
mib_length
[
i
]);
LOG_W
(
NR_RRC
,
"instance %d mib length %d
\n
"
,
i
,
f1_setup_req
->
mib_length
[
i
]);
LOG_W
(
NR_RRC
,
"instance %d sib1 length %d
\n
"
,
i
,
f1_setup_req
->
sib1_length
[
i
]);
LOG_W
(
NR_RRC
,
"instance %d sib1 length %d
\n
"
,
i
,
f1_setup_req
->
sib1_length
[
i
]);
memcpy
((
void
*
)
rrc
->
carrier
.
MIB
,
f1_setup_req
->
mib
[
i
],
f1_setup_req
->
mib_length
[
i
]);
memcpy
((
void
*
)
rrc
->
carrier
.
MIB
,
f1_setup_req
->
mib
[
i
],
f1_setup_req
->
mib_length
[
i
]);
if
(
0
)
{
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
asn_dec_rval_t
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_BCCH_BCH_Message
,
&
asn_DEF_NR_BCCH_BCH_Message
,
(
void
**
)
&
rrc
->
carrier
.
mib_DU
,
(
void
**
)
&
rrc
->
carrier
.
mib_DU
,
f1_setup_req
->
mib
[
i
],
f1_setup_req
->
mib
[
i
],
f1_setup_req
->
mib_length
[
i
]);
f1_setup_req
->
mib_length
[
i
]);
AssertFatal
(
dec_rval
.
code
==
RC_OK
,
AssertFatal
(
dec_rval
.
code
==
RC_OK
,
"[gNB_DU %"
PRIu8
"] Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits)
\n
"
,
"[gNB_DU %"
PRIu8
"] Failed to decode NR_BCCH_BCH_MESSAGE (%zu bits)
\n
"
,
j
,
j
,
dec_rval
.
consumed
);
dec_rval
.
consumed
);
NR_BCCH_BCH_Message_t
*
mib
=
&
rrc
->
carrier
.
mib
;
NR_BCCH_BCH_Message_t
*
mib
=
&
rrc
->
carrier
.
mib
;
NR_BCCH_BCH_Message_t
*
mib_DU
=
rrc
->
carrier
.
mib_DU
;
NR_BCCH_BCH_Message_t
*
mib_DU
=
rrc
->
carrier
.
mib_DU
;
mib
->
message
.
present
=
NR_BCCH_BCH_MessageType_PR_mib
;
mib
->
message
.
present
=
NR_BCCH_BCH_MessageType_PR_mib
;
mib
->
message
.
choice
.
mib
=
CALLOC
(
1
,
sizeof
(
struct
NR_MIB
));
// mib->message.choice.mib = calloc(1, sizeof(NR_MIB_t));
memset
(
mib
->
message
.
choice
.
mib
,
0
,
sizeof
(
struct
NR_MIB
));
mib
->
message
.
choice
.
mib
=
mib_DU
->
message
.
choice
.
mib
;
memcpy
(
mib
->
message
.
choice
.
mib
,
mib_DU
->
message
.
choice
.
mib
,
sizeof
(
struct
NR_MIB
));
rrc
->
carrier
.
SIB1
=
malloc
(
f1_setup_req
->
sib1_length
[
i
]);
rrc
->
carrier
.
SIB1
=
malloc
(
f1_setup_req
->
sib1_length
[
i
]);
rrc
->
carrier
.
sizeof_SIB1
=
f1_setup_req
->
sib1_length
[
i
];
rrc
->
carrier
.
sizeof_SIB1
=
f1_setup_req
->
sib1_length
[
i
];
memcpy
((
void
*
)
rrc
->
carrier
.
SIB1
,
f1_setup_req
->
sib1
[
i
],
f1_setup_req
->
sib1_length
[
i
]);
memcpy
((
void
*
)
rrc
->
carrier
.
SIB1
,
f1_setup_req
->
sib1
[
i
],
f1_setup_req
->
sib1_length
[
i
]);
dec_rval
=
uper_decode_complete
(
NULL
,
dec_rval
=
uper_decode_complete
(
NULL
,
&
asn_DEF_NR_BCCH_DL_SCH_Message
,
&
asn_DEF_NR_BCCH_DL_SCH_Message
,
(
void
**
)
&
rrc
->
carrier
.
siblock1_DU
,
(
void
**
)
&
rrc
->
carrier
.
siblock1_DU
,
f1_setup_req
->
sib1
[
i
],
f1_setup_req
->
sib1
[
i
],
f1_setup_req
->
sib1_length
[
i
]);
f1_setup_req
->
sib1_length
[
i
]);
AssertFatal
(
dec_rval
.
code
==
RC_OK
,
AssertFatal
(
dec_rval
.
code
==
RC_OK
,
"[gNB_DU %"
PRIu8
"] Failed to decode NR_BCCH_DLSCH_MESSAGE (%zu bits)
\n
"
,
"[gNB_DU %"
PRIu8
"] Failed to decode NR_BCCH_DLSCH_MESSAGE (%zu bits)
\n
"
,
j
,
j
,
dec_rval
.
consumed
);
dec_rval
.
consumed
);
// Parse message and extract SystemInformationBlockType1 field
// Parse message and extract SystemInformationBlockType1 field
NR_BCCH_DL_SCH_Message_t
*
bcch_message
=
rrc
->
carrier
.
siblock1_DU
;
NR_BCCH_DL_SCH_Message_t
*
bcch_message
=
rrc
->
carrier
.
siblock1_DU
;
AssertFatal
(
bcch_message
->
message
.
present
==
NR_BCCH_DL_SCH_MessageType_PR_c1
,
AssertFatal
(
bcch_message
->
message
.
present
==
NR_BCCH_DL_SCH_MessageType_PR_c1
,
"bcch_message->message.present != NR_BCCH_DL_SCH_MessageType_PR_c1
\n
"
);
"bcch_message->message.present != NR_BCCH_DL_SCH_MessageType_PR_c1
\n
"
);
AssertFatal
(
bcch_message
->
message
.
choice
.
c1
->
present
==
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1
,
AssertFatal
(
bcch_message
->
message
.
choice
.
c1
->
present
==
NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1
,
"bcch_message->message.choice.c1->present != NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1
\n
"
);
"bcch_message->message.choice.c1->present != NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1
\n
"
);
rrc
->
carrier
.
sib1
=
bcch_message
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
;
rrc
->
carrier
.
sib1
=
bcch_message
->
message
.
choice
.
c1
->
choice
.
systemInformationBlockType1
;
rrc
->
carrier
.
physCellId
=
f1_setup_req
->
nr_pci
[
i
];
rrc
->
carrier
.
physCellId
=
f1_setup_req
->
nr_pci
[
i
];
}
// prepare F1_SETUP_RESPONSE
// prepare F1_SETUP_RESPONSE
if
(
msg_p
==
NULL
)
{
if
(
msg_p
==
NULL
)
{
...
...
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