Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
alex037yang
OpenXG-RAN
Commits
af676180
Commit
af676180
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
69c8b8a9
a0f19a72
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 @
af676180
...
...
@@ -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 @
af676180
...
...
@@ -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 @
af676180
...
...
@@ -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 @
af676180
...
...
@@ -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 @
af676180
...
...
@@ -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 @
af676180
...
...
@@ -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 @
af676180
This diff is collapsed.
Click to expand it.
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am.c
View file @
af676180
...
...
@@ -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 @
af676180
...
...
@@ -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 @
af676180
...
...
@@ -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