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
常顺宇
OpenXG-RAN
Commits
00f23402
Commit
00f23402
authored
Mar 09, 2018
by
Cedric Roux
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/bugfixes-2018-w10' into develop_integration_2018_w10
parents
727e29e3
71e7f971
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
275 additions
and
179 deletions
+275
-179
common/utils/itti/intertask_interface.c
common/utils/itti/intertask_interface.c
+97
-0
common/utils/itti/intertask_interface.h
common/utils/itti/intertask_interface.h
+12
-0
openair1/PHY/defs.h
openair1/PHY/defs.h
+2
-0
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+116
-157
openair2/LAYER2/MAC/proto.h
openair2/LAYER2/MAC/proto.h
+9
-9
openair2/LAYER2/RLC/rlc.c
openair2/LAYER2/RLC/rlc.c
+9
-0
openair3/UDP/udp_eNB_task.c
openair3/UDP/udp_eNB_task.c
+12
-1
targets/RT/USER/lte-enb.c
targets/RT/USER/lte-enb.c
+0
-7
targets/RT/USER/lte-ru.c
targets/RT/USER/lte-ru.c
+16
-1
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+2
-4
No files found.
common/utils/itti/intertask_interface.c
View file @
00f23402
...
...
@@ -391,6 +391,103 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
return
0
;
}
/* same as itti_send_msg_to_task but returns -1 in case of failure instead of crashing */
/* TODO: this is a hack - the whole logic needs a proper rework. */
/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
int
itti_try_send_msg_to_task
(
task_id_t
destination_task_id
,
instance_t
instance
,
MessageDef
*
message
)
{
thread_id_t
destination_thread_id
;
task_id_t
origin_task_id
;
message_list_t
*
new
;
uint32_t
priority
;
message_number_t
message_number
;
uint32_t
message_id
;
AssertFatal
(
message
!=
NULL
,
"Message is NULL!
\n
"
);
AssertFatal
(
destination_task_id
<
itti_desc
.
task_max
,
"Destination task id (%d) is out of range (%d)
\n
"
,
destination_task_id
,
itti_desc
.
task_max
);
destination_thread_id
=
TASK_GET_THREAD_ID
(
destination_task_id
);
message
->
ittiMsgHeader
.
destinationTaskId
=
destination_task_id
;
message
->
ittiMsgHeader
.
instance
=
instance
;
message
->
ittiMsgHeader
.
lte_time
.
frame
=
itti_desc
.
lte_time
.
frame
;
message
->
ittiMsgHeader
.
lte_time
.
slot
=
itti_desc
.
lte_time
.
slot
;
message_id
=
message
->
ittiMsgHeader
.
messageId
;
AssertFatal
(
message_id
<
itti_desc
.
messages_id_max
,
"Message id (%d) is out of range (%d)!
\n
"
,
message_id
,
itti_desc
.
messages_id_max
);
origin_task_id
=
ITTI_MSG_ORIGIN_ID
(
message
);
priority
=
itti_get_message_priority
(
message_id
);
/* Increment the global message number */
message_number
=
itti_increment_message_number
();
itti_dump_queue_message
(
origin_task_id
,
message_number
,
message
,
itti_desc
.
messages_info
[
message_id
].
name
,
sizeof
(
MessageHeader
)
+
message
->
ittiMsgHeader
.
ittiMsgSize
);
if
(
destination_task_id
!=
TASK_UNKNOWN
)
{
if
(
itti_desc
.
threads
[
destination_thread_id
].
task_state
==
TASK_STATE_ENDED
)
{
ITTI_DEBUG
(
ITTI_DEBUG_ISSUES
,
" Message %s, number %lu with priority %d can not be sent from %s to queue (%u:%s), ended destination task!
\n
"
,
itti_desc
.
messages_info
[
message_id
].
name
,
message_number
,
priority
,
itti_get_task_name
(
origin_task_id
),
destination_task_id
,
itti_get_task_name
(
destination_task_id
));
}
else
{
/* We cannot send a message if the task is not running */
AssertFatal
(
itti_desc
.
threads
[
destination_thread_id
].
task_state
==
TASK_STATE_READY
,
"Task %s Cannot send message %s (%d) to thread %d, it is not in ready state (%d)!
\n
"
,
itti_get_task_name
(
origin_task_id
),
itti_desc
.
messages_info
[
message_id
].
name
,
message_id
,
destination_thread_id
,
itti_desc
.
threads
[
destination_thread_id
].
task_state
);
/* Allocate new list element */
new
=
(
message_list_t
*
)
itti_malloc
(
origin_task_id
,
destination_task_id
,
sizeof
(
struct
message_list_s
));
/* Fill in members */
new
->
msg
=
message
;
new
->
message_number
=
message_number
;
new
->
message_priority
=
priority
;
/* Enqueue message in destination task queue */
if
(
lfds611_queue_enqueue
(
itti_desc
.
tasks
[
destination_task_id
].
message_queue
,
new
)
==
0
)
{
itti_free
(
origin_task_id
,
new
);
return
-
1
;
}
{
/* Only use event fd for tasks, subtasks will pool the queue */
if
(
TASK_GET_PARENT_TASK_ID
(
destination_task_id
)
==
TASK_UNKNOWN
)
{
ssize_t
write_ret
;
eventfd_t
sem_counter
=
1
;
/* Call to write for an event fd must be of 8 bytes */
write_ret
=
write
(
itti_desc
.
threads
[
destination_thread_id
].
task_event_fd
,
&
sem_counter
,
sizeof
(
sem_counter
));
AssertFatal
(
write_ret
==
sizeof
(
sem_counter
),
"Write to task message FD (%d) failed (%d/%d)
\n
"
,
destination_thread_id
,
(
int
)
write_ret
,
(
int
)
sizeof
(
sem_counter
));
}
}
ITTI_DEBUG
(
ITTI_DEBUG_SEND
,
" Message %s, number %lu with priority %d successfully sent from %s to queue (%u:%s)
\n
"
,
itti_desc
.
messages_info
[
message_id
].
name
,
message_number
,
priority
,
itti_get_task_name
(
origin_task_id
),
destination_task_id
,
itti_get_task_name
(
destination_task_id
));
}
}
else
{
/* This is a debug message to TASK_UNKNOWN, we can release safely release it */
int
result
=
itti_free
(
origin_task_id
,
message
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
}
return
0
;
}
void
itti_subscribe_event_fd
(
task_id_t
task_id
,
int
fd
)
{
thread_id_t
thread_id
;
...
...
common/utils/itti/intertask_interface.h
View file @
00f23402
...
...
@@ -108,6 +108,18 @@ int itti_send_broadcast_message(MessageDef *message_p);
**/
int
itti_send_msg_to_task
(
task_id_t
task_id
,
instance_t
instance
,
MessageDef
*
message
);
/* TODO: this is a hack. Almost no caller of itti_send_msg_to_task checks
* the return value so it has been changed to crash the program in case
* of failure instead of returning -1 as the documentation above says.
* The RLC UM code may receive too much data when doing UDP at a higher
* throughput than the link allows and so for this specific case we need
* a version that actually returns -1 on failure.
*
* This needs to be cleaned at some point.
*/
/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
int
itti_try_send_msg_to_task
(
task_id_t
task_id
,
instance_t
instance
,
MessageDef
*
message
);
/** \brief Add a new fd to monitor.
* NOTE: it is up to the user to read data associated with the fd
* \param task_id Task ID of the receiving task
...
...
openair1/PHY/defs.h
View file @
00f23402
...
...
@@ -738,6 +738,8 @@ typedef struct RU_t_s{
void
(
*
fh_south_asynch_in
)(
struct
RU_t_s
*
ru
,
int
*
frame
,
int
*
subframe
);
/// function pointer to initialization function for radio interface
int
(
*
start_rf
)(
struct
RU_t_s
*
ru
);
/// function pointer to release function for radio interface
int
(
*
stop_rf
)(
struct
RU_t_s
*
ru
);
/// function pointer to initialization function for radio interface
int
(
*
start_if
)(
struct
RU_t_s
*
ru
,
struct
PHY_VARS_eNB_s
*
eNB
);
/// function pointer to RX front-end processing routine (DFTs/prefix removal or NULL)
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
00f23402
This diff is collapsed.
Click to expand it.
openair2/LAYER2/MAC/proto.h
View file @
00f23402
...
...
@@ -855,15 +855,15 @@ in the DLSCH buffer.
@param post_padding number of bytes for padding at the end of MAC PDU
@returns Number of bytes used for header
*/
unsigned
char
generate_dlsch_header
(
unsigned
char
*
mac_header
,
unsigned
char
num_sdus
,
unsigned
short
*
sdu_lengths
,
unsigned
char
*
sdu_lcids
,
unsigned
char
drx_cmd
,
unsigned
short
timing_advance_cmd
,
unsigned
char
*
ue_cont_res_id
,
unsigned
char
short_padding
,
unsigned
short
post_padding
);
int
generate_dlsch_header
(
unsigned
char
*
mac_header
,
unsigned
char
num_sdus
,
unsigned
short
*
sdu_lengths
,
unsigned
char
*
sdu_lcids
,
unsigned
char
drx_cmd
,
unsigned
short
timing_advance_cmd
,
unsigned
char
*
ue_cont_res_id
,
unsigned
char
short_padding
,
unsigned
short
post_padding
);
/** \brief RRC eNB Configuration primitive for PHY/MAC. Allows configuration of PHY/MAC resources based on System Information (SI), RRCConnectionSetup and RRCConnectionReconfiguration messages.
@param Mod_id Instance ID of eNB
...
...
openair2/LAYER2/RLC/rlc.c
View file @
00f23402
...
...
@@ -437,6 +437,15 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t* const ctxt_pP,
break
;
case
RLC_MODE_UM
:
/* TODO: this is a hack, needs better solution. Let's not use too
* much memory and store at maximum 5 millions bytes.
*/
/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
if
(
rlc_um_get_buffer_occupancy
(
&
rlc_union_p
->
rlc
.
um
)
>
5000000
)
{
free_mem_block
(
sdu_pP
,
__func__
);
return
RLC_OP_STATUS_OUT_OF_RESSOURCES
;
}
new_sdu_p
=
get_free_mem_block
(
sdu_sizeP
+
sizeof
(
struct
rlc_um_data_req_alloc
),
__func__
);
if
(
new_sdu_p
!=
NULL
)
{
...
...
openair3/UDP/udp_eNB_task.c
View file @
00f23402
...
...
@@ -270,10 +270,21 @@ void udp_eNB_receiver(struct udp_socket_desc_s *udp_sock_pP)
n
,
inet_ntoa
(
addr
.
sin_addr
),
ntohs
(
addr
.
sin_port
));
#endif
if
(
itti_send_msg_to_task
(
udp_sock_pP
->
task_id
,
INSTANCE_DEFAULT
,
message_p
)
<
0
)
{
/* TODO: this is a hack. Let's accept failures and do nothing when
* it happens. Since itti_send_msg_to_task crashes when the message
* queue is full we wrote itti_try_send_msg_to_task that returns -1
* if the queue is full.
*/
/* look for HACK_RLC_UM_LIMIT for others places related to the hack. Please do not remove this comment. */
//if (itti_send_msg_to_task(udp_sock_pP->task_id, INSTANCE_DEFAULT, message_p) < 0) {
if
(
itti_try_send_msg_to_task
(
udp_sock_pP
->
task_id
,
INSTANCE_DEFAULT
,
message_p
)
<
0
)
{
#if 0
LOG_I(UDP_, "Failed to send message %d to task %d\n",
UDP_DATA_IND,
udp_sock_pP->task_id);
#endif
itti_free
(
TASK_UDP
,
message_p
);
itti_free
(
TASK_UDP
,
forwarded_buffer
);
return
;
}
}
...
...
targets/RT/USER/lte-enb.c
View file @
00f23402
...
...
@@ -163,13 +163,6 @@ extern void add_subframe(uint16_t *frameP, uint16_t *subframeP, int offset);
static
inline
int
rxtx
(
PHY_VARS_eNB
*
eNB
,
eNB_rxtx_proc_t
*
proc
,
char
*
thread_name
)
{
static
double
cpu_freq_GHz
=
0
.
0
;
if
(
cpu_freq_GHz
==
0
.
0
)
cpu_freq_GHz
=
get_cpu_freq_GHz
();
start_meas
(
&
softmodem_stats_rxtx_sf
);
// *******************************************************************
...
...
targets/RT/USER/lte-ru.c
View file @
00f23402
...
...
@@ -1523,7 +1523,13 @@ static void* ru_thread( void* param ) {
printf
(
"Exiting ru_thread
\n
"
);
if
(
ru
->
stop_rf
!=
NULL
)
{
if
(
ru
->
stop_rf
(
ru
)
!=
0
)
LOG_E
(
HW
,
"Could not stop the RF device
\n
"
);
else
LOG_I
(
PHY
,
"RU %d rf device stopped
\n
"
,
ru
->
idx
);
}
ru_thread_status
=
0
;
return
&
ru_thread_status
;
...
...
@@ -1617,6 +1623,12 @@ int start_rf(RU_t *ru) {
return
(
ru
->
rfdevice
.
trx_start_func
(
&
ru
->
rfdevice
));
}
int
stop_rf
(
RU_t
*
ru
)
{
ru
->
rfdevice
.
trx_end_func
(
&
ru
->
rfdevice
);
return
0
;
}
extern
void
fep_full
(
RU_t
*
ru
);
extern
void
ru_fep_full_2thread
(
RU_t
*
ru
);
extern
void
feptx_ofdm
(
RU_t
*
ru
);
...
...
@@ -2082,6 +2094,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
fh_south_in
=
rx_rf
;
// local synchronous RF RX
ru
->
fh_south_out
=
tx_rf
;
// local synchronous RF TX
ru
->
start_rf
=
start_rf
;
// need to start the local RF interface
ru
->
stop_rf
=
stop_rf
;
printf
(
"configuring ru_id %d (start_rf %p)
\n
"
,
ru
->
idx
,
start_rf
);
/*
if (ru->function == eNodeB_3GPP) { // configure RF parameters only for 3GPP eNodeB, we need to get them from RAU otherwise
...
...
@@ -2113,6 +2126,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
fh_south_asynch_in
=
NULL
;
// no asynchronous UL
}
ru
->
start_rf
=
NULL
;
// no local RF
ru
->
stop_rf
=
NULL
;
ru
->
start_if
=
start_if
;
// need to start if interface for IF5
ru
->
ifdevice
.
host_type
=
RAU_HOST
;
ru
->
ifdevice
.
eth_params
=
&
ru
->
eth_params
;
...
...
@@ -2137,6 +2151,7 @@ void set_function_spec_param(RU_t *ru)
ru
->
fh_north_out
=
NULL
;
ru
->
fh_north_asynch_in
=
NULL
;
ru
->
start_rf
=
NULL
;
// no local RF
ru
->
stop_rf
=
NULL
;
ru
->
start_if
=
start_if
;
// need to start if interface for IF4p5
ru
->
ifdevice
.
host_type
=
RAU_HOST
;
ru
->
ifdevice
.
eth_params
=
&
ru
->
eth_params
;
...
...
targets/RT/USER/lte-softmodem.c
View file @
00f23402
...
...
@@ -1005,10 +1005,8 @@ int main( int argc, char **argv )
printf
(
"Runtime table
\n
"
);
fill_modeled_runtime_table
(
runtime_phy_rx
,
runtime_phy_tx
);
cpuf
=
get_cpu_freq_GHz
();
#ifndef DEADLINE_SCHEDULER
printf
(
"NO deadline scheduler
\n
"
);
...
...
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