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
a495b4f1
Commit
a495b4f1
authored
Apr 13, 2020
by
Raphael Defosseux
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/feature-4g-sched' into develop
parents
3b3e703e
4778e244
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
214 additions
and
204 deletions
+214
-204
common/utils/telnetsrv/telnetsrv_enb_measurements.c
common/utils/telnetsrv/telnetsrv_enb_measurements.c
+8
-8
openair1/SCHED/fapi_l1.c
openair1/SCHED/fapi_l1.c
+0
-3
openair2/LAYER2/MAC/pre_processor.c
openair2/LAYER2/MAC/pre_processor.c
+32
-8
openair2/PHY_INTERFACE/phy_stub_UE.c
openair2/PHY_INTERFACE/phy_stub_UE.c
+117
-170
openair2/PHY_INTERFACE/phy_stub_UE.h
openair2/PHY_INTERFACE/phy_stub_UE.h
+13
-3
targets/RT/USER/lte-ue.c
targets/RT/USER/lte-ue.c
+44
-12
No files found.
common/utils/telnetsrv/telnetsrv_enb_measurements.c
View file @
a495b4f1
...
...
@@ -110,13 +110,13 @@ void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt) {
void
measurcmd_display_macstats_ue
(
telnet_printfunc_t
prnt
)
{
UE_
list_t
*
UE_list
=
&
(
RC
.
mac
[
eNB_id
]
->
UE_list
);
UE_
info_t
*
UE_info
=
&
(
RC
.
mac
[
eNB_id
]
->
UE_info
);
for
(
int
UE_id
=
UE_
list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
for
(
int
i
=
0
;
i
<
UE_
list
->
numactiveCCs
[
UE_id
];
i
++
)
{
int
CC_id
=
UE_
list
->
ordered_CCids
[
i
][
UE_id
];
for
(
int
UE_id
=
UE_
info
->
list
.
head
;
UE_id
>=
0
;
UE_id
=
UE_info
->
list
.
next
[
UE_id
])
{
for
(
int
i
=
0
;
i
<
UE_
info
->
numactiveCCs
[
UE_id
];
i
++
)
{
int
CC_id
=
UE_
info
->
ordered_CCids
[
i
][
UE_id
];
prnt
(
"%s UE %i Id %i CCid %i %s
\n
"
,
HDR
,
i
,
UE_id
,
CC_id
,
HDR
);
eNB_UE_STATS
*
macuestatptr
=
&
(
UE_
list
->
eNB_UE_stats
[
CC_id
][
UE_id
]);
eNB_UE_STATS
*
macuestatptr
=
&
(
UE_
info
->
eNB_UE_stats
[
CC_id
][
UE_id
]);
telnet_ltemeasurdef_t
statsptr
[]
=
LTEMAC_UEMEASURE
;
measurcmd_display_measures
(
prnt
,
statsptr
,
sizeof
(
statsptr
)
/
sizeof
(
telnet_ltemeasurdef_t
));
}
...
...
@@ -155,7 +155,7 @@ void measurcmd_display_one_rlcstat(telnet_printfunc_t prnt, int UE_id, telnet_lt
void
measurcmd_display_rlcstats
(
telnet_printfunc_t
prnt
)
{
protocol_ctxt_t
ctxt
;
UE_
list_t
*
UE_list
=
&
(
RC
.
mac
[
eNB_id
]
->
UE_list
);
UE_
info_t
*
UE_info
=
&
(
RC
.
mac
[
eNB_id
]
->
UE_info
);
telnet_ltemeasurdef_t
statsptr
[]
=
LTE_RLCMEASURE
;
int
num_rlcmeasure
=
sizeof
(
statsptr
)
/
sizeof
(
telnet_ltemeasurdef_t
);
unsigned
int
*
rlcstats
=
malloc
(
num_rlcmeasure
*
sizeof
(
unsigned
int
));
...
...
@@ -165,9 +165,9 @@ void measurcmd_display_rlcstats(telnet_printfunc_t prnt) {
statsptr
[
i
].
vptr
=
rlcstats
+
i
;
}
for
(
int
UE_id
=
UE_
list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
for
(
int
UE_id
=
UE_
info
->
list
.
head
;
UE_id
>=
0
;
UE_id
=
UE_info
->
list
.
next
[
UE_id
])
{
#define NB_eNB_INST 1
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
eNB_id
,
ENB_FLAG_YES
,
UE_
list
->
eNB_UE_stats
[
0
][
UE_id
].
crnti
,
PROTOCOL_CTXT_SET_BY_MODULE_ID
(
&
ctxt
,
eNB_id
,
ENB_FLAG_YES
,
UE_
info
->
eNB_UE_stats
[
0
][
UE_id
].
crnti
,
eNB
->
frame
,
eNB
->
subframe
,
eNB_id
);
measurcmd_display_one_rlcstat
(
prnt
,
UE_id
,
statsptr
,
num_rlcmeasure
,
rlcstats
,
"DCCH"
,
&
ctxt
,
SRB_FLAG_YES
,
DCCH
);
measurcmd_display_one_rlcstat
(
prnt
,
UE_id
,
statsptr
,
num_rlcmeasure
,
rlcstats
,
"DTCH"
,
&
ctxt
,
SRB_FLAG_NO
,
DTCH
-
2
);
...
...
openair1/SCHED/fapi_l1.c
View file @
a495b4f1
...
...
@@ -597,7 +597,6 @@ void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,
uci
->
subframe
=
subframe
;
uci
->
rnti
=
ul_config_pdu
->
uci_sr_pdu
.
ue_information
.
ue_information_rel8
.
rnti
;
uci
->
ue_id
=
find_ulsch
(
ul_config_pdu
->
uci_sr_pdu
.
ue_information
.
ue_information_rel8
.
rnti
,
eNB
,
SEARCH_EXIST_OR_FREE
);
AssertFatal
(
uci
->
ue_id
<
MAX_MOBILES_PER_ENB
,
"illegal UE_id %d
\n
"
,
uci
->
ue_id
);
uci
->
type
=
SR
;
uci
->
pucch_fmt
=
pucch_format1
;
uci
->
num_antenna_ports
=
1
;
...
...
@@ -624,7 +623,6 @@ void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_
uci
->
subframe
=
subframe
;
uci
->
rnti
=
ul_config_pdu
->
uci_sr_harq_pdu
.
ue_information
.
ue_information_rel8
.
rnti
;
uci
->
ue_id
=
find_ulsch
(
ul_config_pdu
->
uci_sr_harq_pdu
.
ue_information
.
ue_information_rel8
.
rnti
,
eNB
,
SEARCH_EXIST_OR_FREE
);
AssertFatal
(
uci
->
ue_id
<
MAX_MOBILES_PER_ENB
,
"illegal UE_id %d
\n
"
,
uci
->
ue_id
);
uci
->
type
=
HARQ_SR
;
uci
->
num_antenna_ports
=
1
;
uci
->
num_pucch_resources
=
1
;
...
...
@@ -647,7 +645,6 @@ void handle_uci_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu
uci
->
subframe
=
subframe
;
uci
->
rnti
=
ul_config_pdu
->
uci_harq_pdu
.
ue_information
.
ue_information_rel8
.
rnti
;
uci
->
ue_id
=
find_ulsch
(
ul_config_pdu
->
uci_harq_pdu
.
ue_information
.
ue_information_rel8
.
rnti
,
eNB
,
SEARCH_EXIST_OR_FREE
);
AssertFatal
(
uci
->
ue_id
<
MAX_MOBILES_PER_ENB
,
"illegal UE_id %d
\n
"
,
uci
->
ue_id
);
uci
->
type
=
HARQ
;
uci
->
srs_active
=
srs_active
;
uci
->
num_antenna_ports
=
ul_config_pdu
->
uci_harq_pdu
.
harq_information
.
harq_information_rel11
.
num_ant_ports
;
...
...
openair2/LAYER2/MAC/pre_processor.c
View file @
a495b4f1
...
...
@@ -59,6 +59,15 @@ int next_ue_list_looped(UE_list_t* list, int UE_id) {
return
list
->
next
[
UE_id
]
<
0
?
list
->
head
:
list
->
next
[
UE_id
];
}
int
get_rbg_size_last
(
module_id_t
Mod_id
,
int
CC_id
)
{
const
int
RBGsize
=
get_min_rb_unit
(
Mod_id
,
CC_id
);
const
int
N_RB_DL
=
to_prb
(
RC
.
mac
[
Mod_id
]
->
common_channels
[
CC_id
].
mib
->
message
.
dl_Bandwidth
);
if
(
N_RB_DL
==
15
||
N_RB_DL
==
25
||
N_RB_DL
==
50
||
N_RB_DL
==
75
)
return
RBGsize
-
1
;
else
return
RBGsize
;
}
int
g_start_ue_dl
=
-
1
;
int
round_robin_dl
(
module_id_t
Mod_id
,
int
CC_id
,
...
...
@@ -70,7 +79,9 @@ int round_robin_dl(module_id_t Mod_id,
uint8_t
*
rbgalloc_mask
)
{
DevAssert
(
UE_list
->
head
>=
0
);
DevAssert
(
n_rbg_sched
>
0
);
const
int
N_RBG
=
to_rbg
(
RC
.
mac
[
Mod_id
]
->
common_channels
[
CC_id
].
mib
->
message
.
dl_Bandwidth
);
const
int
RBGsize
=
get_min_rb_unit
(
Mod_id
,
CC_id
);
const
int
RBGlastsize
=
get_rbg_size_last
(
Mod_id
,
CC_id
);
int
num_ue_req
=
0
;
UE_info_t
*
UE_info
=
&
RC
.
mac
[
Mod_id
]
->
UE_info
;
...
...
@@ -89,14 +100,26 @@ int round_robin_dl(module_id_t Mod_id,
UE_sched_ctrl_t
*
ue_ctrl
=
&
UE_info
->
UE_sched_ctrl
[
UE_id
];
const
uint8_t
round
=
ue_ctrl
->
round
[
CC_id
][
harq_pid
];
if
(
round
!=
8
)
{
// retransmission: allocate
int
nb_rb
=
UE_info
->
UE_template
[
CC_id
][
UE_id
].
nb_rb
[
harq_pid
];
const
int
nb_rb
=
UE_info
->
UE_template
[
CC_id
][
UE_id
].
nb_rb
[
harq_pid
];
if
(
nb_rb
==
0
)
continue
;
if
(
nb_rb
%
RBGsize
!=
0
)
nb_rb
+=
nb_rb
%
RBGsize
;
// should now divide evenly
int
nb_rbg
=
nb_rb
/
RBGsize
;
if
(
nb_rbg
>
n_rbg_sched
)
// needs more RBGs than we can allocate
int
nb_rbg
=
(
nb_rb
+
(
nb_rb
%
RBGsize
))
/
RBGsize
;
// needs more RBGs than we can allocate
if
(
nb_rbg
>
n_rbg_sched
)
{
LOG_D
(
MAC
,
"retransmission of UE %d needs more RBGs (%d) than we have (%d)
\n
"
,
UE_id
,
nb_rbg
,
n_rbg_sched
);
continue
;
}
// ensure that the number of RBs can be contained by the RBGs (!), i.e.
// if we allocate the last RBG this one should have the full RBGsize
if
((
nb_rb
%
RBGsize
)
==
0
&&
nb_rbg
==
n_rbg_sched
&&
rbgalloc_mask
[
N_RBG
-
1
]
&&
RBGlastsize
!=
RBGsize
)
{
LOG_D
(
MAC
,
"retransmission of UE %d needs %d RBs, but the last RBG %d is too small (%d, normal %d)
\n
"
,
UE_id
,
nb_rb
,
N_RBG
-
1
,
RBGlastsize
,
RBGsize
);
continue
;
}
const
uint8_t
cqi
=
ue_ctrl
->
dl_cqi
[
CC_id
];
const
int
idx
=
CCE_try_allocate_dlsch
(
Mod_id
,
CC_id
,
subframe
,
UE_id
,
cqi
);
if
(
idx
<
0
)
...
...
@@ -186,9 +209,10 @@ int round_robin_dl(module_id_t Mod_id,
continue
;
UE_sched_ctrl_t
*
ue_ctrl
=
&
UE_info
->
UE_sched_ctrl
[
UE_id
];
ue_ctrl
->
rballoc_sub_UE
[
CC_id
][
rbg
]
=
1
;
ue_ctrl
->
pre_nb_available_rbs
[
CC_id
]
+=
RBGsize
;
rb_required
[
UE_id
]
-=
RBGsize
;
rb_required_total
-=
RBGsize
;
const
int
sRBG
=
rbg
==
N_RBG
-
1
?
RBGlastsize
:
RBGsize
;
ue_ctrl
->
pre_nb_available_rbs
[
CC_id
]
+=
sRBG
;
rb_required
[
UE_id
]
-=
sRBG
;
rb_required_total
-=
sRBG
;
if
(
rb_required_total
<=
0
)
break
;
n_rbg_sched
--
;
...
...
openair2/PHY_INTERFACE/phy_stub_UE.c
View file @
a495b4f1
...
...
@@ -708,195 +708,142 @@ int tx_req_UE_MAC(nfapi_tx_request_t *req) {
return
0
;
}
int
dl_config_req_UE_MAC
(
nfapi_dl_config_request_t
*
req
,
module_id_t
Mod_id
)
{
int
sfn
=
NFAPI_SFNSF2SFN
(
req
->
sfn_sf
);
int
sf
=
NFAPI_SFNSF2SF
(
req
->
sfn_sf
);
void
dl_config_req_UE_MAC_dci
(
int
sfn
,
int
sf
,
nfapi_dl_config_request_pdu_t
*
dci
,
nfapi_dl_config_request_pdu_t
*
dlsch
,
int
num_ue
)
{
DevAssert
(
dci
->
pdu_type
==
NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE
);
DevAssert
(
dlsch
->
pdu_type
==
NFAPI_DL_CONFIG_DLSCH_PDU_TYPE
);
const
rnti_t
rnti
=
dci
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti
;
const
int
rnti_type
=
dci
->
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti_type
;
if
(
rnti
!=
dlsch
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
)
{
LOG_E
(
MAC
,
"%s(): sfn/sf %d.%d DLSCH PDU RNTI %x does not match DCI RNTI %x
\n
"
,
__func__
,
sfn
,
sf
,
rnti
,
dlsch
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
);
return
;
}
nfapi_dl_config_request_pdu_t
*
dl_config_pdu_list
=
req
->
dl_config_request_body
.
dl_config_pdu_list
;
for
(
int
i
=
0
;
i
<
req
->
dl_config_request_body
.
number_pdu
;
i
++
)
{
if
(
dl_config_pdu_list
[
i
].
pdu_type
==
NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE
)
{
const
rnti_t
rnti
=
dl_config_pdu_list
[
i
].
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti
;
const
int
rnti_type
=
dl_config_pdu_list
[
i
].
dci_dl_pdu
.
dci_dl_pdu_rel8
.
rnti_type
;
/* We assume the DCI DL PDU is followed by the DLSCH (the standard is
* more free), so advance by one more and directly process the
* following DLSCH PDU */
i
++
;
AssertFatal
(
i
<
req
->
dl_config_request_body
.
number_pdu
,
"Need PDU following DCI at index %d, but not found
\n
"
,
i
);
nfapi_dl_config_request_pdu_t
*
dl_config_pdu_tmp
=
&
dl_config_pdu_list
[
i
];
if
(
dl_config_pdu_tmp
->
pdu_type
!=
NFAPI_DL_CONFIG_DLSCH_PDU_TYPE
)
{
LOG_E
(
MAC
,
"expected DLSCH PDU at index %d
\n
"
,
i
);
continue
;
}
if
(
rnti
!=
dl_config_pdu_tmp
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
)
{
LOG_I
(
MAC
,
"%s(): sfn/sf %d DLSCH PDU RNTI %x does not match DCI RNTI %x
\n
"
,
__func__
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
rnti
,
dl_config_pdu_tmp
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
);
continue
;
}
const
int
pdu_index
=
dl_config_pdu_tmp
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
;
if
(
pdu_index
<
0
&&
pdu_index
>=
tx_req_num_elems
)
{
LOG_E
(
MAC
,
"dl_config_req_UE_MAC 2: Problem with receiving data: "
"sfn/sf:%d PDU[%d] size:%d, TX_PDU index: %d
\n
"
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
i
,
dl_config_pdu_list
[
i
].
pdu_size
,
dl_config_pdu_tmp
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
);
continue
;
}
if
(
rnti_type
==
1
)
{
// C-RNTI (Normal DLSCH case)
if
(
UE_mac_inst
[
Mod_id
].
crnti
!=
rnti
)
{
LOG_D
(
MAC
,
"sfn/sf %d/%d DCI not for UE %d/RNTI %x but for RNTI %x, "
"skipping
\n
"
,
sfn
,
sf
,
Mod_id
,
UE_mac_inst
[
Mod_id
].
crnti
,
rnti
);
continue
;
}
const
int
pdu_index
=
dlsch
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
;
if
(
pdu_index
<
0
||
pdu_index
>=
tx_req_num_elems
)
{
LOG_E
(
MAC
,
"%s(): Problem with receiving data: "
"sfn/sf:%d.%d PDU size:%d, TX_PDU index: %d
\n
"
,
__func__
,
sfn
,
sf
,
dci
->
pdu_size
,
dlsch
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
);
return
;
}
if
(
rnti_type
==
1
)
{
// C-RNTI (Normal DLSCH case)
for
(
int
ue_id
=
0
;
ue_id
<
num_ue
;
ue_id
++
)
{
if
(
UE_mac_inst
[
ue_id
].
crnti
==
rnti
)
{
LOG_D
(
MAC
,
"%s() Received data: sfn/sf:%d
PDU[%d]
"
"%s() Received data: sfn/sf:%d
.%d
"
"size:%d, TX_PDU index: %d, tx_req_num_elems: %d
\n
"
,
__func__
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
i
,
dl_config_pdu_list
[
i
].
pdu_size
,
dl_config_pdu_tmp
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
,
sfn
,
sf
,
dci
->
pdu_size
,
dlsch
->
dlsch_pdu
.
dlsch_pdu_rel8
.
pdu_index
,
tx_req_num_elems
);
ue_send_sdu
(
Mod
_id
,
0
,
sfn
,
sf
,
ue_send_sdu
(
ue
_id
,
0
,
sfn
,
sf
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_length
,
0
);
}
else
if
(
rnti_type
==
2
)
{
if
(
rnti
==
0xFFFF
)
{
/* SI-RNTI */
if
(
UE_mac_inst
[
Mod_id
].
UE_mode
[
0
]
==
NOT_SYNCHED
)
{
/* this check is in the code before refactoring, but I don't know
* why. Leave it in here for the moment */
continue
;
}
ue_decode_si
(
Mod_id
,
0
,
sfn
,
0
,
return
;
}
}
}
else
if
(
rnti_type
==
2
)
{
if
(
rnti
==
0xFFFF
)
{
/* SI-RNTI */
for
(
int
ue_id
=
0
;
ue_id
<
num_ue
;
ue_id
++
)
{
if
(
UE_mac_inst
[
ue_id
].
UE_mode
[
0
]
==
NOT_SYNCHED
)
continue
;
ue_decode_si
(
ue_id
,
0
,
sfn
,
0
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_length
);
}
}
else
if
(
rnti
==
0xFFFE
)
{
/* PI-RNTI */
for
(
int
ue_id
=
0
;
ue_id
<
num_ue
;
ue_id
++
)
{
LOG_I
(
MAC
,
"%s() Received paging message: sfn/sf:%d.%d
\n
"
,
__func__
,
sfn
,
sf
);
ue_decode_p
(
ue_id
,
0
,
sfn
,
0
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_length
);
}
}
else
if
(
rnti
==
0x0002
)
{
/* RA-RNTI */
for
(
int
ue_id
=
0
;
ue_id
<
num_ue
;
ue_id
++
)
{
if
(
UE_mac_inst
[
ue_id
].
UE_mode
[
0
]
!=
RA_RESPONSE
)
{
LOG_D
(
MAC
,
"UE %d not awaiting RAR, is in mode %d
\n
"
,
ue_id
,
UE_mac_inst
[
ue_id
].
UE_mode
[
0
]);
continue
;
}
// RNTI parameter not actually used. Provided only to comply with
// existing function definition. Not sure about parameters to fill
// the preamble index.
const
rnti_t
ra_rnti
=
UE_mac_inst
[
ue_id
].
RA_prach_resources
.
ra_RNTI
;
DevAssert
(
ra_rnti
==
0x0002
);
if
(
UE_mac_inst
[
ue_id
].
UE_mode
[
0
]
!=
PUSCH
&&
UE_mac_inst
[
ue_id
].
RA_prach_resources
.
Msg3
!=
NULL
&&
ra_rnti
==
dlsch
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
)
{
LOG_E
(
MAC
,
"%s(): Received RAR, PreambleIndex: %d
\n
"
,
__func__
,
UE_mac_inst
[
ue_id
].
RA_prach_resources
.
ra_PreambleIndex
);
ue_process_rar
(
ue_id
,
0
,
sfn
,
ra_rnti
,
//RA-RNTI
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_length
);
}
else
if
(
rnti
==
0xFFFE
)
{
/* PI-RNTI */
LOG_I
(
MAC
,
"%s() Received paging message: sfn/sf:%d PDU[%d]
\n
"
,
__func__
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
i
);
ue_decode_p
(
Mod_id
,
0
,
sfn
,
0
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_length
);
}
else
if
(
rnti
==
0x0002
)
{
/* RA-RNTI */
LOG_E
(
MAC
,
"%s(): Received RAR?
\n
"
,
__func__
);
// RNTI parameter not actually used. Provided only to comply with
// existing function definition. Not sure about parameters to fill
// the preamble index.
const
rnti_t
ra_rnti
=
UE_mac_inst
[
Mod_id
].
RA_prach_resources
.
ra_RNTI
;
DevAssert
(
ra_rnti
==
0x0002
);
if
(
UE_mac_inst
[
Mod_id
].
UE_mode
[
0
]
!=
PUSCH
&&
UE_mac_inst
[
Mod_id
].
RA_prach_resources
.
Msg3
!=
NULL
&&
ra_rnti
==
dl_config_pdu_tmp
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
)
{
LOG_E
(
MAC
,
"dl_config_req_UE_MAC 5 Received RAR, PreambleIndex: %d
\n
"
,
UE_mac_inst
[
Mod_id
].
RA_prach_resources
.
ra_PreambleIndex
);
ue_process_rar
(
Mod_id
,
0
,
sfn
,
ra_rnti
,
//RA-RNTI
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
,
&
dl_config_pdu_tmp
->
dlsch_pdu
.
dlsch_pdu_rel8
.
rnti
,
//t-crnti
UE_mac_inst
[
Mod_id
].
RA_prach_resources
.
ra_PreambleIndex
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
);
UE_mac_inst
[
Mod_id
].
UE_mode
[
0
]
=
RA_RESPONSE
;
// Expecting an UL_CONFIG_ULSCH_PDU to enable Msg3 Txon (first
// ULSCH Txon for the UE)
UE_mac_inst
[
Mod_id
].
first_ULSCH_Tx
=
1
;
}
}
else
{
LOG_W
(
MAC
,
"can not handle special RNTI %x
\n
"
,
rnti
);
&
UE_mac_inst
[
ue_id
].
crnti
,
//t-crnti
UE_mac_inst
[
ue_id
].
RA_prach_resources
.
ra_PreambleIndex
,
tx_request_pdu_list
[
pdu_index
].
segments
[
0
].
segment_data
);
UE_mac_inst
[
ue_id
].
UE_mode
[
0
]
=
RA_RESPONSE
;
// Expecting an UL_CONFIG_ULSCH_PDU to enable Msg3 Txon (first
// ULSCH Txon for the UE)
UE_mac_inst
[
ue_id
].
first_ULSCH_Tx
=
1
;
}
}
}
else
if
(
dl_config_pdu_list
[
i
].
pdu_type
==
NFAPI_DL_CONFIG_BCH_PDU_TYPE
)
{
// BCH case: Last parameter is 1 if first time synchronization and zero
// otherwise. Not sure which value to put for our case.
if
(
UE_mac_inst
[
Mod_id
].
UE_mode
[
0
]
==
NOT_SYNCHED
){
dl_phy_sync_success
(
Mod_id
,
sfn
,
0
,
1
);
LOG_E
(
MAC
,
"%s(): Received MIB: UE_mode: %d, sfn/sf: %d.%d
\n
"
,
__func__
,
UE_mac_inst
[
Mod_id
].
UE_mode
[
0
],
sfn
,
sf
);
UE_mac_inst
[
Mod_id
].
UE_mode
[
0
]
=
PRACH
;
}
else
{
dl_phy_sync_success
(
Mod_id
,
sfn
,
0
,
0
);
}
}
else
{
LOG_W
(
MAC
,
"can not handle special RNTI %x
\n
"
,
rnti
);
}
}
return
0
;
}
int
hi_dci0_req_UE_MAC
(
nfapi_hi_dci0_request_t
*
req
,
module_id_t
Mod_id
)
{
if
(
req
!=
NULL
&&
req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
!=
NULL
)
{
LOG_D
(
PHY
,
"[UE-PHY_STUB] hi dci0 request sfn_sf:%d number_of_dci:%d "
"number_of_hi:%d
\n
"
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
req
->
hi_dci0_request_body
.
number_of_dci
,
req
->
hi_dci0_request_body
.
number_of_hi
);
for
(
int
i
=
0
;
i
<
req
->
hi_dci0_request_body
.
number_of_dci
+
req
->
hi_dci0_request_body
.
number_of_hi
;
i
++
)
{
LOG_D
(
PHY
,
"[UE-PHY_STUB] HI_DCI0_REQ sfn_sf:%d PDU[%d]
\n
"
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
i
);
if
(
req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
[
i
].
pdu_type
==
NFAPI_HI_DCI0_DCI_PDU_TYPE
)
{
LOG_D
(
PHY
,
"[UE-PHY_STUB] HI_DCI0_REQ sfn_sf:%d PDU[%d] - "
"NFAPI_HI_DCI0_DCI_PDU_TYPE
\n
"
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
i
);
const
nfapi_hi_dci0_dci_pdu_rel8_t
*
dci
=
&
req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
[
i
].
dci_pdu
.
dci_pdu_rel8
;
if
(
dci
->
rnti
!=
UE_mac_inst
[
Mod_id
].
crnti
)
continue
;
const
int
sfn
=
NFAPI_SFNSF2SFN
(
req
->
sfn_sf
);
const
int
sf
=
NFAPI_SFNSF2SF
(
req
->
sfn_sf
);
if
(
dci
->
cqi_csi_request
)
fill_ulsch_cqi_indication_UE_MAC
(
Mod_id
,
sfn
,
sf
,
UL_INFO
,
dci
->
rnti
);
}
else
if
(
req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
[
i
].
pdu_type
==
NFAPI_HI_DCI0_HI_PDU_TYPE
)
{
nfapi_hi_dci0_request_pdu_t
*
hi_dci0_req_pdu
=
&
req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
[
i
];
// This is meaningful only after ACKnowledging the first ULSCH Txon
// (i.e. Msg3)
if
(
hi_dci0_req_pdu
->
hi_pdu
.
hi_pdu_rel8
.
hi_value
==
1
&&
UE_mac_inst
[
Mod_id
].
first_ULSCH_Tx
==
1
)
{
// LOG_I(MAC,"[UE-PHY_STUB] HI_DCI0_REQ 2 sfn_sf:%d PDU[%d] -
// NFAPI_HI_DCI0_HI_PDU_TYPE\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
// UE_mac_inst[Mod_id].UE_mode[0] = PUSCH;
// UE_mac_inst[Mod_id].first_ULSCH_Tx = 0;
}
}
else
{
LOG_E
(
PHY
,
"[UE-PHY_STUB] HI_DCI0_REQ sfn_sf:%d PDU[%d] - unknown pdu "
"type:%d
\n
"
,
NFAPI_SFNSF2DEC
(
req
->
sfn_sf
),
i
,
req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
[
i
].
pdu_type
);
}
void
dl_config_req_UE_MAC_bch
(
int
sfn
,
int
sf
,
nfapi_dl_config_request_pdu_t
*
bch
,
int
num_ue
)
{
DevAssert
(
bch
->
pdu_type
==
NFAPI_DL_CONFIG_BCH_PDU_TYPE
);
for
(
int
ue_id
=
0
;
ue_id
<
num_ue
;
ue_id
++
)
{
if
(
UE_mac_inst
[
ue_id
].
UE_mode
[
0
]
==
NOT_SYNCHED
){
dl_phy_sync_success
(
ue_id
,
sfn
,
0
,
1
);
LOG_E
(
MAC
,
"%s(): Received MIB: UE_mode: %d, sfn/sf: %d.%d
\n
"
,
__func__
,
UE_mac_inst
[
ue_id
].
UE_mode
[
0
],
sfn
,
sf
);
UE_mac_inst
[
ue_id
].
UE_mode
[
0
]
=
PRACH
;
}
else
{
dl_phy_sync_success
(
ue_id
,
sfn
,
0
,
0
);
}
}
}
return
0
;
void
hi_dci0_req_UE_MAC
(
int
sfn
,
int
sf
,
nfapi_hi_dci0_request_pdu_t
*
hi_dci0
,
int
num_ue
)
{
if
(
hi_dci0
->
pdu_type
!=
NFAPI_HI_DCI0_DCI_PDU_TYPE
)
return
;
const
nfapi_hi_dci0_dci_pdu_rel8_t
*
dci
=
&
hi_dci0
->
dci_pdu
.
dci_pdu_rel8
;
if
(
!
dci
->
cqi_csi_request
)
return
;
for
(
int
ue_id
=
0
;
ue_id
<
num_ue
;
ue_id
++
)
{
if
(
dci
->
rnti
==
UE_mac_inst
[
ue_id
].
crnti
)
{
fill_ulsch_cqi_indication_UE_MAC
(
ue_id
,
sfn
,
sf
,
UL_INFO
,
dci
->
rnti
);
return
;
}
}
}
// The following set of memcpy functions should be getting called as callback
...
...
openair2/PHY_INTERFACE/phy_stub_UE.h
View file @
a495b4f1
...
...
@@ -93,13 +93,23 @@ void handle_nfapi_ul_pdu_UE_MAC(module_id_t Mod_id,
nfapi_ul_config_request_pdu_t
*
ul_config_pdu
,
uint16_t
frame
,
uint8_t
subframe
,
uint8_t
srs_present
,
int
index
);
//int dl_config_req_UE_MAC(nfapi_dl_config_request_t* req, nfapi_tx_request_pdu_t* tx_request_pdu_list);
int
dl_config_req_UE_MAC
(
nfapi_dl_config_request_t
*
req
,
module_id_t
Mod_id
);
void
dl_config_req_UE_MAC_dci
(
int
sfn
,
int
sf
,
nfapi_dl_config_request_pdu_t
*
dci
,
nfapi_dl_config_request_pdu_t
*
dlsch
,
int
num_ue
);
void
dl_config_req_UE_MAC_bch
(
int
sfn
,
int
sf
,
nfapi_dl_config_request_pdu_t
*
bch
,
int
num_ue
);
int
tx_req_UE_MAC
(
nfapi_tx_request_t
*
req
);
int
hi_dci0_req_UE_MAC
(
nfapi_hi_dci0_request_t
*
req
,
module_id_t
Mod_id
);
void
hi_dci0_req_UE_MAC
(
int
sfn
,
int
sf
,
nfapi_hi_dci0_request_pdu_t
*
bch
,
int
num_ue
);
// The following set of memcpy functions should be getting called as callback functions from
// pnf_p7_subframe_ind.
...
...
targets/RT/USER/lte-ue.c
View file @
a495b4f1
...
...
@@ -1108,6 +1108,45 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg)
}
}
if
(
dl_config_req
&&
tx_request_pdu_list
)
{
nfapi_dl_config_request_body_t
*
dl_config_req_body
=
&
dl_config_req
->
dl_config_request_body
;
for
(
int
i
=
0
;
i
<
dl_config_req_body
->
number_pdu
;
++
i
)
{
nfapi_dl_config_request_pdu_t
*
pdu
=
&
dl_config_req_body
->
dl_config_pdu_list
[
i
];
if
(
pdu
->
pdu_type
==
NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE
)
{
i
+=
1
;
AssertFatal
(
i
<
dl_config_req
->
dl_config_request_body
.
number_pdu
,
"Need PDU following DCI at index %d, but not found
\n
"
,
i
);
nfapi_dl_config_request_pdu_t
*
dlsch
=
&
dl_config_req_body
->
dl_config_pdu_list
[
i
];
if
(
dlsch
->
pdu_type
!=
NFAPI_DL_CONFIG_DLSCH_PDU_TYPE
)
{
LOG_E
(
MAC
,
"expected DLSCH PDU at index %d
\n
"
,
i
);
continue
;
}
dl_config_req_UE_MAC_dci
(
NFAPI_SFNSF2SFN
(
dl_config_req
->
sfn_sf
),
NFAPI_SFNSF2SF
(
dl_config_req
->
sfn_sf
),
pdu
,
dlsch
,
ue_num
);
}
else
if
(
pdu
->
pdu_type
==
NFAPI_DL_CONFIG_BCH_PDU_TYPE
)
{
dl_config_req_UE_MAC_bch
(
NFAPI_SFNSF2SFN
(
dl_config_req
->
sfn_sf
),
NFAPI_SFNSF2SF
(
dl_config_req
->
sfn_sf
),
pdu
,
ue_num
);
}
}
}
if
(
hi_dci0_req
)
{
nfapi_hi_dci0_request_body_t
*
hi_dci0_body
=
&
hi_dci0_req
->
hi_dci0_request_body
;
for
(
int
i
=
0
;
i
<
hi_dci0_body
->
number_of_dci
+
hi_dci0_body
->
number_of_hi
;
i
++
)
{
nfapi_hi_dci0_request_pdu_t
*
pdu
=
&
hi_dci0_body
->
hi_dci0_pdu_list
[
i
];
hi_dci0_req_UE_MAC
(
NFAPI_SFNSF2SFN
(
hi_dci0_req
->
sfn_sf
),
NFAPI_SFNSF2SF
(
hi_dci0_req
->
sfn_sf
),
pdu
,
ue_num
);
}
}
//for (Mod_id=0; Mod_id<NB_UE_INST; Mod_id++) {
for
(
ue_index
=
0
;
ue_index
<
ue_num
;
ue_index
++
)
{
ue_Mod_id
=
ue_thread_id
+
NB_THREAD_INST
*
ue_index
;
...
...
@@ -1136,15 +1175,6 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg)
phy_procedures_UE_SL_RX
(
UE
,
proc
);
if
(
dl_config_req
!=
NULL
&&
tx_request_pdu_list
!=
NULL
)
{
//if(dl_config_req!= NULL) {
dl_config_req_UE_MAC
(
dl_config_req
,
ue_Mod_id
);
}
if
(
hi_dci0_req
!=
NULL
&&
hi_dci0_req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
!=
NULL
)
{
hi_dci0_req_UE_MAC
(
hi_dci0_req
,
ue_Mod_id
);
}
if
(
NFAPI_MODE
!=
NFAPI_UE_STUB_PNF
)
phy_procedures_UE_SL_TX
(
UE
,
proc
);
}
...
...
@@ -1183,7 +1213,7 @@ static void *UE_phy_stub_single_thread_rxn_txnp4(void *arg)
if
(
UE_mac_inst
[
ue_Mod_id
].
UE_mode
[
0
]
==
PRACH
&&
ue_Mod_id
==
next_Mod_id
)
{
next_ra_frame
++
;
if
(
next_ra_frame
>
2
00
)
{
if
(
next_ra_frame
>
5
00
)
{
// check if we have PRACH opportunity
if
(
is_prach_subframe
(
&
UE
->
frame_parms
,
proc
->
frame_tx
,
proc
->
subframe_tx
)
&&
UE_mac_inst
[
ue_Mod_id
].
SI_Decoded
==
1
)
{
// The one working strangely...
...
...
@@ -1413,12 +1443,14 @@ static void *UE_phy_stub_thread_rxn_txnp4(void *arg)
oai_subframe_ind
(
timer_frame
,
timer_subframe
);
if
(
dl_config_req
!=
NULL
)
{
dl_config_req_UE_MAC
(
dl_config_req
,
Mod_id
);
AssertFatal
(
0
,
"dl_config_req_UE_MAC() not handled
\n
"
);
//dl_config_req_UE_MAC(dl_config_req, Mod_id);
}
//if(UE_mac_inst[Mod_id].hi_dci0_req!= NULL){
if
(
hi_dci0_req
!=
NULL
&&
hi_dci0_req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
!=
NULL
)
{
hi_dci0_req_UE_MAC
(
hi_dci0_req
,
Mod_id
);
AssertFatal
(
0
,
"hi_dci0_req_UE_MAC() not handled
\n
"
);
//hi_dci0_req_UE_MAC(hi_dci0_req, Mod_id);
//if(UE_mac_inst[Mod_id].hi_dci0_req->hi_dci0_request_body.hi_dci0_pdu_list!=NULL){
free
(
hi_dci0_req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
);
hi_dci0_req
->
hi_dci0_request_body
.
hi_dci0_pdu_list
=
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