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
4ee0cb09
Commit
4ee0cb09
authored
Jan 20, 2017
by
Cedric Roux
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'bugfix-188-multi-UEs-fixes' into develop_integration_w03
parents
c3a2ffa5
08f47675
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
410 additions
and
143 deletions
+410
-143
openair2/LAYER2/MAC/config.c
openair2/LAYER2/MAC/config.c
+16
-6
openair2/LAYER2/MAC/eNB_scheduler.c
openair2/LAYER2/MAC/eNB_scheduler.c
+14
-23
openair2/LAYER2/MAC/eNB_scheduler_RA.c
openair2/LAYER2/MAC/eNB_scheduler_RA.c
+23
-4
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+2
-0
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+22
-74
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+39
-15
openair2/LAYER2/MAC/pre_processor.c
openair2/LAYER2/MAC/pre_processor.c
+274
-11
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
+9
-0
openair2/RRC/LITE/MESSAGES/asn1_msg.c
openair2/RRC/LITE/MESSAGES/asn1_msg.c
+1
-1
openair2/RRC/LITE/rrc_eNB.c
openair2/RRC/LITE/rrc_eNB.c
+10
-9
No files found.
openair2/LAYER2/MAC/config.c
View file @
4ee0cb09
...
...
@@ -195,10 +195,14 @@ rrc_mac_config_req(
}
}
else
{
if
(
logicalChannelConfig
)
UE_list
->
UE_template
[
CC_idP
][
UE_id
].
lcgidmap
[
logicalChannelIdentity
]
=
*
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelGroup
;
else
UE_list
->
UE_template
[
CC_idP
][
UE_id
].
lcgidmap
[
logicalChannelIdentity
]
=
0
;
if
(
UE_id
==
-
1
)
{
LOG_E
(
MAC
,
"%s:%d:%s: ERROR, UE_id == -1
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
}
else
{
if
(
logicalChannelConfig
)
UE_list
->
UE_template
[
CC_idP
][
UE_id
].
lcgidmap
[
logicalChannelIdentity
]
=
*
logicalChannelConfig
->
ul_SpecificParameters
->
logicalChannelGroup
;
else
UE_list
->
UE_template
[
CC_idP
][
UE_id
].
lcgidmap
[
logicalChannelIdentity
]
=
0
;
}
}
}
...
...
@@ -296,7 +300,10 @@ rrc_mac_config_req(
if
(
physicalConfigDedicated
!=
NULL
)
{
if
(
eNB_flagP
==
1
)
{
mac_xface
->
phy_config_dedicated_eNB
(
Mod_idP
,
CC_idP
,
UE_RNTI
(
Mod_idP
,
UE_id
),
physicalConfigDedicated
);
if
(
UE_id
==
-
1
)
LOG_E
(
MAC
,
"%s:%d:%s: ERROR, UE_id == -1
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
else
mac_xface
->
phy_config_dedicated_eNB
(
Mod_idP
,
CC_idP
,
UE_RNTI
(
Mod_idP
,
UE_id
),
physicalConfigDedicated
);
}
else
{
mac_xface
->
phy_config_dedicated_ue
(
Mod_idP
,
0
,
eNB_index
,
physicalConfigDedicated
);
UE_mac_inst
[
Mod_idP
].
physicalConfigDedicated
=
physicalConfigDedicated
;
// for SR proc
...
...
@@ -308,7 +315,10 @@ rrc_mac_config_req(
if
(
sCellToAddMod_r10
!=
NULL
)
{
if
(
eNB_flagP
==
1
)
{
mac_xface
->
phy_config_dedicated_scell_eNB
(
Mod_idP
,
UE_RNTI
(
Mod_idP
,
UE_id
),
sCellToAddMod_r10
,
1
);
if
(
UE_id
==
-
1
)
LOG_E
(
MAC
,
"%s:%d:%s: ERROR, UE_id == -1
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
else
mac_xface
->
phy_config_dedicated_scell_eNB
(
Mod_idP
,
UE_RNTI
(
Mod_idP
,
UE_id
),
sCellToAddMod_r10
,
1
);
}
else
{
//#warning "phy_config_dedicated_scell_ue is empty"
...
...
openair2/LAYER2/MAC/eNB_scheduler.c
View file @
4ee0cb09
...
...
@@ -99,7 +99,7 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
int
result
;
#endif
DCI_PDU
*
DCI_pdu
[
MAX_NUM_CCs
];
int
CC_id
,
i
,
next_i
;
int
CC_id
,
i
;
//
,next_i;
UE_list_t
*
UE_list
=&
eNB_mac_inst
[
module_idP
].
UE_list
;
rnti_t
rnti
;
void
*
DLSCH_dci
=
NULL
;
...
...
@@ -121,10 +121,21 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
memset
(
eNB_mac_inst
[
module_idP
].
common_channels
[
CC_id
].
vrb_map
,
0
,
100
);
}
// clear DCI and BCCH contents before scheduling
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
DCI_pdu
[
CC_id
]
->
Num_common_dci
=
0
;
DCI_pdu
[
CC_id
]
->
Num_ue_spec_dci
=
0
;
#ifdef Rel10
eNB_mac_inst
[
module_idP
].
common_channels
[
CC_id
].
mcch_active
=
0
;
#endif
eNB_mac_inst
[
module_idP
].
frame
=
frameP
;
eNB_mac_inst
[
module_idP
].
subframe
=
subframeP
;
}
// refresh UE list based on UEs dropped by PHY in previous subframe
i
=
UE_list
->
head
;
for
(
i
=
0
;
i
<
NUMBER_OF_UE_MAX
;
i
++
)
{
if
(
UE_list
->
active
[
i
]
!=
TRUE
)
continue
;
while
(
i
>=
0
)
{
rnti
=
UE_RNTI
(
module_idP
,
i
);
CC_id
=
UE_PCCID
(
module_idP
,
i
);
if
((
frameP
==
0
)
&&
(
subframeP
==
0
))
...
...
@@ -132,8 +143,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
UE_list
->
UE_sched_ctrl
[
i
].
ul_out_of_sync
==
0
?
"in synch"
:
"out of sync"
,
UE_list
->
UE_template
[
CC_id
][
i
].
phr_info
);
next_i
=
UE_list
->
next
[
i
];
PHY_vars_eNB_g
[
module_idP
][
CC_id
]
->
pusch_stats_bsr
[
i
][(
frameP
*
10
)
+
subframeP
]
=-
63
;
if
(
i
==
UE_list
->
head
)
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR
,
PHY_vars_eNB_g
[
module_idP
][
CC_id
]
->
pusch_stats_bsr
[
i
][(
frameP
*
10
)
+
subframeP
]);
...
...
@@ -261,8 +270,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
}
}
}
// ul_failure_timer>0
i
=
next_i
;
}
#if defined(ENABLE_ITTI)
...
...
@@ -319,22 +326,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
#endif
// clear DCI and BCCH contents before scheduling
for
(
CC_id
=
0
;
CC_id
<
MAX_NUM_CCs
;
CC_id
++
)
{
DCI_pdu
[
CC_id
]
->
Num_common_dci
=
0
;
DCI_pdu
[
CC_id
]
->
Num_ue_spec_dci
=
0
;
#ifdef Rel10
eNB_mac_inst
[
module_idP
].
common_channels
[
CC_id
].
mcch_active
=
0
;
#endif
eNB_mac_inst
[
module_idP
].
frame
=
frameP
;
eNB_mac_inst
[
module_idP
].
subframe
=
subframeP
;
}
/* #ifndef DISABLE_SF_TRIGGER */
/* //Send subframe trigger to the controller */
/* if (mac_agent_registered[module_idP]) { */
...
...
openair2/LAYER2/MAC/eNB_scheduler_RA.c
View file @
4ee0cb09
...
...
@@ -73,7 +73,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
unsigned
char
i
,
harq_pid
,
round
;
int16_t
rrc_sdu_length
;
unsigned
char
lcid
,
offset
;
module_id_t
UE_id
=
UE_INDEX_INVALID
;
int
UE_id
=
-
1
;
unsigned
short
TBsize
=
-
1
;
unsigned
short
msg4_padding
,
msg4_post_padding
,
msg4_header
;
uint8_t
*
vrb_map
;
...
...
@@ -266,6 +266,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
// check for Msg4 Message
UE_id
=
find_UE_id
(
module_idP
,
RA_template
->
rnti
);
if
(
UE_id
==
-
1
)
{
printf
(
"%s:%d:%s: FATAL ERROR
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
abort
();
}
if
(
Is_rrc_registered
==
1
)
{
...
...
@@ -709,7 +710,10 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
RA_template
->
RA_dci_size_bits2
,
RA_template
->
RA_dci_fmt2
,
0
);
printf
(
"MAC: msg4 retransmission for rnti %x (round %d) fsf %d/%d
\n
"
,
RA_template
->
rnti
,
round
,
frameP
,
subframeP
);
}
else
printf
(
"MAC: msg4 retransmission for rnti %x (round %d) fsf %d/%d CCE allocation failed!
\n
"
,
RA_template
->
rnti
,
round
,
frameP
,
subframeP
);
LOG_W
(
MAC
,
"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d: Msg4 not acknowledged, adding ue specific dci (rnti %x) for RA (Msg4 Retransmission)
\n
"
,
module_idP
,
CC_id
,
frameP
,
subframeP
,
RA_template
->
rnti
);
}
else
{
...
...
@@ -718,6 +722,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
remove UE instance across all the layers: mac_xface->cancel_RA();
}
*/
printf
(
"MAC: msg4 acknowledged for rnti %x fsf %d/%d, let's configure it
\n
"
,
RA_template
->
rnti
,
frameP
,
subframeP
);
LOG_I
(
MAC
,
"[eNB %d][RAPROC] CC_id %d Frame %d, subframeP %d : Msg4 acknowledged
\n
"
,
module_idP
,
CC_id
,
frameP
,
subframeP
);
RA_template
->
wait_ack_Msg4
=
0
;
RA_template
->
RA_active
=
FALSE
;
...
...
@@ -746,14 +751,26 @@ void initiate_ra_proc(module_id_t module_idP, int CC_id,frame_t frameP, uint16_t
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC
,
0
);
for
(
i
=
0
;
i
<
NB_RA_PROC_MAX
;
i
++
)
{
if
(
RA_template
[
i
].
RA_active
==
FALSE
)
{
if
(
RA_template
[
i
].
RA_active
==
FALSE
&&
RA_template
[
i
].
wait_ack_Msg4
==
0
)
{
int
loop
=
0
;
RA_template
[
i
].
RA_active
=
TRUE
;
RA_template
[
i
].
generate_rar
=
1
;
RA_template
[
i
].
generate_Msg4
=
0
;
RA_template
[
i
].
wait_ack_Msg4
=
0
;
RA_template
[
i
].
timing_offset
=
timing_offset
;
// Put in random rnti (to be replaced with proper procedure!!)
RA_template
[
i
].
rnti
=
taus
();
/* TODO: find better procedure to allocate RNTI */
do
{
RA_template
[
i
].
rnti
=
taus
();
loop
++
;
}
while
(
loop
!=
100
&&
/* TODO: this is not correct, the rnti may be in use without
* being in the MAC yet. To be refined.
*/
!
(
find_UE_id
(
module_idP
,
RA_template
[
i
].
rnti
)
==
-
1
&&
/* 1024 and 60000 arbirarily chosen, not coming from standard */
RA_template
[
i
].
rnti
>=
1024
&&
RA_template
[
i
].
rnti
<
60000
));
if
(
loop
==
100
)
{
printf
(
"%s:%d:%s: FATAL ERROR! contact the authors
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
abort
();
}
RA_template
[
i
].
RA_rnti
=
1
+
subframeP
+
(
10
*
f_id
);
RA_template
[
i
].
preamble_index
=
preamble_index
;
LOG_D
(
MAC
,
"[eNB %d][RAPROC] CC_id %d Frame %d Activating RAR generation for process %d, rnti %x, RA_active %d
\n
"
,
...
...
@@ -763,6 +780,8 @@ void initiate_ra_proc(module_id_t module_idP, int CC_id,frame_t frameP, uint16_t
return
;
}
}
LOG_E
(
MAC
,
"[eNB %d][RAPROC] FAILURE: CC_id %d Frame %d Initiating RA procedure for preamble index %d
\n
"
,
module_idP
,
CC_id
,
frameP
,
preamble_index
);
}
void
cancel_ra_proc
(
module_id_t
module_idP
,
int
CC_id
,
frame_t
frameP
,
rnti_t
rnti
)
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
4ee0cb09
...
...
@@ -453,9 +453,11 @@ schedule_ue_spec(
UE_sched_ctrl
*
ue_sched_ctl
;
int
i
;
#if 0
if (UE_list->head==-1) {
return;
}
#endif
start_meas
(
&
eNB
->
schedule_dlsch
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_SCHEDULE_DLSCH
,
VCD_FUNCTION_IN
);
...
...
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
View file @
4ee0cb09
...
...
@@ -107,18 +107,17 @@ DCI_PDU *get_dci_sdu(module_id_t module_idP, int CC_id,frame_t frameP, sub_frame
int
find_UE_id
(
module_id_t
mod_idP
,
rnti_t
rntiP
)
//------------------------------------------------------------------------------
{
int
UE_id
;
UE_list_t
*
UE_list
=
&
eNB_mac_inst
[
mod_idP
].
UE_list
;
for
(
UE_id
=
UE_list
->
head
;
UE_id
>=
0
;
UE_id
=
UE_list
->
next
[
UE_id
])
{
for
(
UE_id
=
0
;
UE_id
<
NUMBER_OF_UE_MAX
;
UE_id
++
)
{
if
(
UE_list
->
active
[
UE_id
]
!=
TRUE
)
continue
;
if
(
UE_list
->
UE_template
[
UE_PCCID
(
mod_idP
,
UE_id
)][
UE_id
].
rnti
==
rntiP
)
{
return
(
UE_id
);
}
}
return
(
-
1
);
}
//------------------------------------------------------------------------------
...
...
@@ -235,21 +234,17 @@ void dump_ue_list(UE_list_t *listP, int ul_flag)
int
add_new_ue
(
module_id_t
mod_idP
,
int
cc_idP
,
rnti_t
rntiP
,
int
harq_pidP
)
{
int
UE_id
;
int
j
;
int
i
,
j
;
UE_list_t
*
UE_list
=
&
eNB_mac_inst
[
mod_idP
].
UE_list
;
LOG_D
(
MAC
,
"[eNB %d, CC_id %d] Adding UE with rnti %x (next avail %d, num_UEs %d)
\n
"
,
mod_idP
,
cc_idP
,
rntiP
,
UE_list
->
avail
,
UE_list
->
num_UEs
);
dump_ue_list
(
UE_list
,
0
);
if
(
UE_list
->
avail
>=
0
)
{
UE_id
=
UE_list
->
avail
;
AssertFatal
(
UE_id
<
NUMBER_OF_UE_MAX
,
"BAD UE_id %u > NUMBER_OF_UE_MAX"
,
UE_id
);
UE_list
->
avail
=
UE_list
->
next
[
UE_list
->
avail
];
UE_list
->
next
[
UE_id
]
=
UE_list
->
head
;
UE_list
->
next_ul
[
UE_id
]
=
UE_list
->
head_ul
;
UE_list
->
head
=
UE_id
;
UE_list
->
head_ul
=
UE_id
;
for
(
i
=
0
;
i
<
NUMBER_OF_UE_MAX
;
i
++
)
{
if
(
UE_list
->
active
[
i
]
==
TRUE
)
continue
;
printf
(
"MAC: new UE id %d rnti %x
\n
"
,
i
,
rntiP
);
UE_id
=
i
;
UE_list
->
UE_template
[
cc_idP
][
UE_id
].
rnti
=
rntiP
;
UE_list
->
UE_template
[
cc_idP
][
UE_id
].
configured
=
FALSE
;
UE_list
->
numactiveCCs
[
UE_id
]
=
1
;
...
...
@@ -273,6 +268,7 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP)
return
(
UE_id
);
}
printf
(
"MAC: cannot add new UE for rnti %x
\n
"
,
rntiP
);
LOG_E
(
MAC
,
"error in add_new_ue(), could not find space in UE_list, Dumping UE list
\n
"
);
dump_ue_list
(
UE_list
,
0
);
return
(
-
1
);
...
...
@@ -282,23 +278,27 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP)
int
rrc_mac_remove_ue
(
module_id_t
mod_idP
,
rnti_t
rntiP
)
//------------------------------------------------------------------------------
{
int
prev
,
i
,
ret
=-
1
;
int
i
;
UE_list_t
*
UE_list
=
&
eNB_mac_inst
[
mod_idP
].
UE_list
;
int
UE_id
=
find_UE_id
(
mod_idP
,
rntiP
);
int
pCC_id
=
UE_PCCID
(
mod_idP
,
UE_id
)
;
int
pCC_id
;
if
(
UE_id
==
-
1
)
{
printf
(
"MAC: cannot remove UE rnti %x
\n
"
,
rntiP
);
LOG_W
(
MAC
,
"rrc_mac_remove_ue: UE %x not found
\n
"
,
rntiP
);
mac_phy_remove_ue
(
mod_idP
,
rntiP
);
mac_phy_remove_ue
(
mod_idP
,
rntiP
);
return
0
;
}
pCC_id
=
UE_PCCID
(
mod_idP
,
UE_id
);
printf
(
"MAC: remove UE %d rnti %x
\n
"
,
UE_id
,
rntiP
);
LOG_I
(
MAC
,
"Removing UE %d from Primary CC_id %d (rnti %x)
\n
"
,
UE_id
,
pCC_id
,
rntiP
);
dump_ue_list
(
UE_list
,
0
);
UE_list
->
active
[
UE_id
]
=
FALSE
;
UE_list
->
num_UEs
--
;
// clear all remaining pending transmissions
UE_list
->
UE_template
[
pCC_id
][
UE_id
].
bsr_info
[
LCGID0
]
=
0
;
UE_list
->
UE_template
[
pCC_id
][
UE_id
].
bsr_info
[
LCGID1
]
=
0
;
...
...
@@ -313,58 +313,13 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP)
eNB_dlsch_info
[
mod_idP
][
pCC_id
][
UE_id
].
rnti
=
NOT_A_RNTI
;
eNB_dlsch_info
[
mod_idP
][
pCC_id
][
UE_id
].
status
=
S_DL_NONE
;
prev
=
UE_list
->
head
;
for
(
i
=
UE_list
->
head
;
i
>=
0
;
i
=
UE_list
->
next
[
i
])
{
if
(
i
==
UE_id
)
{
// link prev to next in Active list
if
(
i
==
UE_list
->
head
)
{
UE_list
->
head
=
UE_list
->
next
[
i
];
}
else
{
UE_list
->
next
[
prev
]
=
UE_list
->
next
[
i
];
}
// add UE id (i)to available
UE_list
->
next
[
i
]
=
UE_list
->
avail
;
UE_list
->
avail
=
i
;
UE_list
->
active
[
i
]
=
FALSE
;
UE_list
->
num_UEs
--
;
ret
=
0
;
break
;
}
prev
=
i
;
}
// do the same for UL
prev
=
UE_list
->
head_ul
;
for
(
i
=
UE_list
->
head_ul
;
i
>=
0
;
i
=
UE_list
->
next_ul
[
i
])
{
if
(
i
==
UE_id
)
{
// link prev to next in Active list
if
(
i
==
UE_list
->
head_ul
)
{
UE_list
->
head_ul
=
UE_list
->
next_ul
[
i
];
}
else
{
UE_list
->
next_ul
[
prev
]
=
UE_list
->
next_ul
[
i
];
}
// add UE id (i)to available
UE_list
->
next_ul
[
i
]
=
UE_list
->
avail
;
ret
=
0
;
break
;
}
prev
=
i
;
}
mac_phy_remove_ue
(
mod_idP
,
rntiP
);
// check if this has an RA process active
RA_TEMPLATE
*
RA_template
;
for
(
i
=
0
;
i
<
NB_RA_PROC_MAX
;
i
++
)
{
RA_template
=
(
RA_TEMPLATE
*
)
&
eNB_mac_inst
[
mod_idP
].
common_channels
[
pCC_id
].
RA_template
[
i
];
if
((
RA_template
->
RA_active
==
TRUE
)
&&
(
RA_template
->
rnti
==
rntiP
)){
if
(
RA_template
->
rnti
==
rntiP
){
RA_template
->
RA_active
=
FALSE
;
RA_template
->
generate_rar
=
0
;
RA_template
->
generate_Msg4
=
0
;
...
...
@@ -372,18 +327,11 @@ int rrc_mac_remove_ue(module_id_t mod_idP,rnti_t rntiP)
RA_template
->
timing_offset
=
0
;
RA_template
->
RRC_timer
=
20
;
RA_template
->
rnti
=
0
;
break
;
//
break;
}
}
if
(
ret
==
0
)
{
return
(
0
);
}
LOG_E
(
MAC
,
"error in mac_remove_ue(), could not find previous to %d in UE_list, should never happen, Dumping UE list
\n
"
,
UE_id
);
dump_ue_list
(
UE_list
,
0
);
mac_xface
->
macphy_exit
(
"mac_remove_ue: Problem in UE_list"
);
return
(
-
1
);
return
0
;
}
...
...
@@ -1096,7 +1044,7 @@ try_again:
1
<<
DCI_pdu
->
dci_alloc
[
j
].
L
,
nCCE
,
nCCE_max
,
DCI_pdu
->
num_pdcch_symbols
);
}
dump_CCE_table
(
CCE_table
,
nCCE_max
,
subframeP
,
dci_alloc
->
rnti
,
dci_alloc
->
L
);
//
dump_CCE_table(CCE_table,nCCE_max,subframeP,dci_alloc->rnti,dci_alloc->L);
goto
failed
;
}
...
...
openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
View file @
4ee0cb09
...
...
@@ -751,6 +751,39 @@ void schedule_ulsch_rnti(module_id_t module_idP,
continue
;
}
/* let's drop the UE if get_eNB_UE_stats returns NULL when calling it with any of the UE's active UL CCs */
/* TODO: refine? */
drop_ue
=
0
;
for
(
n
=
0
;
n
<
UE_list
->
numactiveULCCs
[
UE_id
];
n
++
)
{
CC_id
=
UE_list
->
ordered_ULCCids
[
n
][
UE_id
];
if
(
mac_xface
->
get_eNB_UE_stats
(
module_idP
,
CC_id
,
rnti
)
==
NULL
)
{
LOG_W
(
MAC
,
"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context
\n
"
,
module_idP
,
frameP
,
subframeP
,
UE_id
,
rnti
,
CC_id
);
drop_ue
=
1
;
break
;
}
}
if
(
drop_ue
==
1
)
{
/* we can't come here, ulsch_scheduler_pre_processor won't put in the list a UE with no PHY context */
abort
();
/* TODO: this is a hack. Sometimes the UE has no PHY context but
* is still present in the MAC with 'ul_failure_timer' = 0 and
* 'ul_out_of_sync' = 0. It seems wrong and the UE stays there forever. Let's
* start an UL out of sync procedure in this case.
* The root cause of this problem has to be found and corrected.
* In the meantime, this hack...
*/
if
(
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_failure_timer
==
0
&&
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_out_of_sync
==
0
)
{
LOG_W
(
MAC
,
"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: UE in weird state, let's put it 'out of sync'
\n
"
,
module_idP
,
frameP
,
subframeP
,
UE_id
,
rnti
,
CC_id
);
// inform RRC of failure and clear timer
mac_eNB_rrc_ul_failure
(
module_idP
,
CC_id
,
frameP
,
subframeP
,
rnti
);
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_failure_timer
=
0
;
UE_list
->
UE_sched_ctrl
[
UE_id
].
ul_out_of_sync
=
1
;
}
continue
;
}
// loop over all active UL CC_ids for this UE
for
(
n
=
0
;
n
<
UE_list
->
numactiveULCCs
[
UE_id
];
n
++
)
{
// This is the actual CC_id in the list
...
...
@@ -758,15 +791,6 @@ void schedule_ulsch_rnti(module_id_t module_idP,
frame_parms
=
mac_xface
->
get_lte_frame_parms
(
module_idP
,
CC_id
);
eNB_UE_stats
=
mac_xface
->
get_eNB_UE_stats
(
module_idP
,
CC_id
,
rnti
);
if
(
eNB_UE_stats
==
NULL
)
{
LOG_W
(
MAC
,
"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: no PHY context
\n
"
,
module_idP
,
frameP
,
subframeP
,
UE_id
,
rnti
,
CC_id
);
drop_ue
=
1
;
continue
;
// mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n");
}
if
(
drop_ue
==
1
)
continue
;
if
(
CCE_allocation_infeasible
(
module_idP
,
CC_id
,
0
,
subframeP
,
aggregation
,
rnti
))
{
LOG_W
(
MAC
,
"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE
\n
"
,
module_idP
,
frameP
,
subframeP
,
UE_id
,
rnti
,
CC_id
);
continue
;
// break;
...
...
@@ -882,6 +906,12 @@ void schedule_ulsch_rnti(module_id_t module_idP,
T_INT
(
subframeP
),
T_INT
(
harq_pid
),
T_INT
(
mcs
),
T_INT
(
first_rb
[
CC_id
]),
T_INT
(
rb_table
[
rb_table_index
]),
T_INT
(
TBS
),
T_INT
(
ndi
));
if
(
mac_eNB_get_rrc_status
(
module_idP
,
rnti
)
<
RRC_CONNECTED
)
LOG_I
(
MAC
,
"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)
\n
"
,
module_idP
,
harq_pid
,
rnti
,
CC_id
,
frameP
,
subframeP
,
UE_id
,
mcs
,
first_rb
[
CC_id
],
rb_table
[
rb_table_index
],
rb_table_index
,
TBS
,
harq_pid
);
// bad indices : 20 (40 PRB), 21 (45 PRB), 22 (48 PRB)
// increment for next UE allocation
first_rb
[
CC_id
]
+=
rb_table
[
rb_table_index
];
...
...
@@ -891,12 +921,6 @@ void schedule_ulsch_rnti(module_id_t module_idP,
if
(
UE_id
==
UE_list
->
head
)
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME
(
VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED
,
UE_sched_ctrl
->
ul_scheduled
);
if
(
mac_eNB_get_rrc_status
(
module_idP
,
rnti
)
<
RRC_CONNECTED
)
LOG_I
(
MAC
,
"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)
\n
"
,
module_idP
,
harq_pid
,
rnti
,
CC_id
,
frameP
,
subframeP
,
UE_id
,
mcs
,
first_rb
[
CC_id
],
rb_table
[
rb_table_index
],
rb_table_index
,
TBS
,
harq_pid
);
// adjust total UL buffer status by TBS, wait for UL sdus to do final update
LOG_D
(
MAC
,
"[eNB %d] CC_id %d UE %d/%x : adjusting ul_total_buffer, old %d, TBS %d
\n
"
,
module_idP
,
CC_id
,
UE_id
,
rnti
,
UE_template
->
ul_total_buffer
,
TBS
);
if
(
UE_template
->
ul_total_buffer
>
TBS
)
...
...
openair2/LAYER2/MAC/pre_processor.c
View file @
4ee0cb09
This diff is collapsed.
Click to expand it.
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
View file @
4ee0cb09
...
...
@@ -557,6 +557,15 @@ rlc_am_mac_status_indication (
status_resp
.
head_sdu_is_segmented
=
0
;
status_resp
.
rlc_info
.
rlc_protocol_state
=
rlc
->
protocol_state
;
/* TODO: remove this hack. Problem is: there is a race.
* UE comes. SRB2 is configured via message to RRC.
* At some point the RLC AM is created but not configured yet.
* At this moment (I think) MAC calls mac_rlc_status_ind
* which calls this function. But the init was not finished yet
* and we have a crash below when testing mem_block != NULL.
*/
if
(
rlc
->
input_sdus
==
NULL
)
return
status_resp
;
if
(
rlc
->
last_frame_status_indication
!=
ctxt_pP
->
frame
)
{
rlc_am_check_timer_poll_retransmit
(
ctxt_pP
,
rlc
);
rlc_am_check_timer_reordering
(
ctxt_pP
,
rlc
);
...
...
openair2/RRC/LITE/MESSAGES/asn1_msg.c
View file @
4ee0cb09
...
...
@@ -99,7 +99,7 @@ int errno;
# endif
#endif
#define XER_PRINT
//
#define XER_PRINT
extern
Enb_properties_array_t
enb_properties
;
typedef
struct
xer_sprint_string_s
{
...
...
openair2/RRC/LITE/rrc_eNB.c
View file @
4ee0cb09
...
...
@@ -96,7 +96,7 @@
#if defined(FLEXRAN_AGENT_SB_IF)
#include "flexran_agent_extern.h"
#endif
#define XER_PRINT
//
#define XER_PRINT
#ifdef PHY_EMUL
extern
EMULATION_VARS
*
Emul_vars
;
...
...
@@ -4191,9 +4191,11 @@ rrc_eNB_decode_ccch(
* the current one must be removed from MAC/PHY (zombie UE)
*/
if
((
ue_context_p
=
rrc_eNB_ue_context_random_exist
(
ctxt_pP
,
random_value
)))
{
//#warning "TODO: random_exist: remove UE from MAC/PHY (how?)"
// AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)");
LOG_W
(
RRC
,
"new UE rnti %x (coming with random value) is already there as UE %x, removing %x from MAC/PHY
\n
"
,
ctxt_pP
->
rnti
,
ue_context_p
->
ue_context
.
rnti
,
ctxt_pP
->
rnti
);
rrc_mac_remove_ue
(
ctxt_pP
->
module_id
,
ctxt_pP
->
rnti
);
ue_context_p
=
NULL
;
return
0
;
}
else
{
ue_context_p
=
rrc_eNB_get_next_free_ue_context
(
ctxt_pP
,
random_value
);
}
...
...
@@ -4204,9 +4206,8 @@ rrc_eNB_decode_ccch(
m_tmsi_t
m_tmsi
=
BIT_STRING_to_uint32
(
&
s_TMSI
.
m_TMSI
);
random_value
=
(((
uint64_t
)
mme_code
)
<<
32
)
|
m_tmsi
;
if
((
ue_context_p
=
rrc_eNB_ue_context_stmsi_exist
(
ctxt_pP
,
mme_code
,
m_tmsi
)))
{
//#warning "TODO: stmsi_exist: remove UE from MAC/PHY (how?)"
LOG_I
(
RRC
,
" S-TMSI exists, ue_context_p %p, old rnti %x => %x
\n
"
,
ue_context_p
,
ue_context_p
->
ue_context
.
rnti
,
ctxt_pP
->
rnti
);
rrc_mac_remove_ue
(
ctxt_pP
->
module_id
,
ue_context_p
->
ue_context
.
rnti
);
stmsi_received
=
1
;
/* replace rnti in the context */
/* for that, remove the context from the RB tree */
...
...
@@ -4218,8 +4219,6 @@ rrc_eNB_decode_ccch(
/* reset timers */
ue_context_p
->
ue_context
.
ul_failure_timer
=
0
;
ue_context_p
->
ue_context
.
ue_release_timer
=
0
;
// AssertFatal(0 == 1, "TODO: remove UE from MAC/PHY (how?)");
// ue_context_p = NULL;
}
else
{
LOG_I
(
RRC
,
" S-TMSI doesn't exist, setting Initialue_identity_s_TMSI.m_tmsi to %p => %x
\n
"
,
ue_context_p
,
m_tmsi
);
ue_context_p
=
rrc_eNB_get_next_free_ue_context
(
ctxt_pP
,
NOT_A_RANDOM_UE_IDENTITY
);
...
...
@@ -4230,7 +4229,8 @@ rrc_eNB_decode_ccch(
ue_context_p
->
ue_context
.
Initialue_identity_s_TMSI
.
mme_code
=
mme_code
;
ue_context_p
->
ue_context
.
Initialue_identity_s_TMSI
.
m_tmsi
=
m_tmsi
;
}
else
{
break
;
/* TODO: do we have to break here? */
//break;
}
}
...
...
@@ -4786,6 +4786,7 @@ rrc_eNB_decode_dcch(
#ifdef XER_PRINT
xer_fprint
(
stdout
,
&
asn_DEF_UL_DCCH_Message
,
(
void
*
)
ul_dcch_msg
);
#endif
LOG_I
(
RRC
,
"got UE capabilities for UE %x
\n
"
,
ctxt_pP
->
rnti
);
dec_rval
=
uper_decode
(
NULL
,
&
asn_DEF_UE_EUTRA_Capability
,
(
void
**
)
&
UE_EUTRA_Capability
,
...
...
@@ -4796,7 +4797,7 @@ rrc_eNB_decode_dcch(
choice
.
c1
.
choice
.
ueCapabilityInformation_r8
.
ue_CapabilityRAT_ContainerList
.
list
.
array
[
0
]
->
ueCapabilityRAT_Container
.
size
,
0
,
0
);
//#ifdef XER_PRINT
xer_fprint
(
stdout
,
&
asn_DEF_UE_EUTRA_Capability
,
(
void
*
)
UE_EUTRA_Capability
);
//
xer_fprint(stdout, &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability);
//#endif
#if defined(ENABLE_USE_MME)
...
...
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