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
zzha zzha
OpenXG-RAN
Commits
11b2f829
Commit
11b2f829
authored
9 years ago
by
Xenofon Foukas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Integrated timer to work with periodic report messages and agent tasks
parent
e88779c4
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
268 additions
and
70 deletions
+268
-70
openair2/ENB_APP/enb_agent.c
openair2/ENB_APP/enb_agent.c
+67
-49
openair2/ENB_APP/enb_agent_common.c
openair2/ENB_APP/enb_agent_common.c
+1
-1
openair2/ENB_APP/enb_agent_common.h
openair2/ENB_APP/enb_agent_common.h
+6
-10
openair2/ENB_APP/enb_agent_handler.c
openair2/ENB_APP/enb_agent_handler.c
+19
-3
openair2/ENB_APP/enb_agent_mac.c
openair2/ENB_APP/enb_agent_mac.c
+162
-7
openair2/ENB_APP/enb_agent_mac.h
openair2/ENB_APP/enb_agent_mac.h
+13
-0
No files found.
openair2/ENB_APP/enb_agent.c
View file @
11b2f829
...
...
@@ -53,7 +53,7 @@ static uint16_t in_port;
void
*
send_thread
(
void
*
args
);
void
*
receive_thread
(
void
*
args
);
pthread_t
new_thread
(
void
*
(
*
f
)(
void
*
),
void
*
b
);
err_code_t
enb_agent_timeout
(
void
*
args
);
Protocol__ProgranMessage
*
enb_agent_timeout
(
void
*
args
);
/*
* enb agent task mainly wakes up the tx thread for periodic and oneshot messages to the controller
...
...
@@ -61,6 +61,13 @@ err_code_t enb_agent_timeout(void* args);
*/
void
*
enb_agent_task
(
void
*
args
){
msg_context_t
*
d
=
(
msg_context_t
*
)
args
;
Protocol__ProgranMessage
*
msg
;
void
*
data
;
int
size
;
err_code_t
err_code
;
int
priority
;
MessageDef
*
msg_p
=
NULL
;
const
char
*
msg_name
=
NULL
;
instance_t
instance
;
...
...
@@ -86,7 +93,15 @@ void *enb_agent_task(void *args){
break
;
case
TIMER_HAS_EXPIRED
:
enb_agent_process_timeout
(
msg_p
->
ittiMsg
.
timer_has_expired
.
timer_id
,
&
msg_p
->
ittiMsg
.
timer_has_expired
.
arg
);
msg
=
enb_agent_process_timeout
(
msg_p
->
ittiMsg
.
timer_has_expired
.
timer_id
,
msg_p
->
ittiMsg
.
timer_has_expired
.
arg
);
if
(
msg
!=
NULL
){
data
=
enb_agent_send_message
(
msg
,
&
size
);
if
(
message_put
(
d
->
tx_mq
,
data
,
size
,
priority
)){
err_code
=
PROTOCOL__PROGRAN_ERR__MSG_ENQUEUING
;
goto
error
;
}
LOG_D
(
ENB_AGENT
,
"sent message with size %d
\n
"
,
size
);
}
break
;
default:
...
...
@@ -96,46 +111,49 @@ void *enb_agent_task(void *args){
result
=
itti_free
(
ITTI_MSG_ORIGIN_ID
(
msg_p
),
msg_p
);
AssertFatal
(
result
==
EXIT_SUCCESS
,
"Failed to free memory (%d)!
\n
"
,
result
);
continue
;
error:
LOG_E
(
ENB_AGENT
,
"enb_agent_task: error %d occured
\n
"
,
err_code
);
}
while
(
1
);
return
NULL
;
}
void
*
send_thread
(
void
*
args
)
{
#ifdef TEST_TIMER
msg_context_t
*
d
=
args
;
void
*
data
;
int
size
;
int
priority
;
struct
timeval
t1
,
t2
;
long
long
t
;
struct
timespec
ts
;
unsigned
int
delay
=
250
*
1000
;
while
(
1
)
{
gettimeofday
(
&
t1
,
NULL
);
enb_agent_sleep_until
(
&
ts
,
delay
);
gettimeofday
(
&
t2
,
NULL
);
t
=
((
t2
.
tv_sec
*
1000000
)
+
t2
.
tv_usec
)
-
((
t1
.
tv_sec
*
1000000
)
+
t1
.
tv_usec
);
LOG_I
(
ENB_AGENT
,
"Call to sleep_until(%d) took %lld us
\n
"
,
delay
,
t
);
sleep
(
1
);
}
#endif
/* while (1) {
// need logic for the timer, and
usleep(10);
if (message_put(d->tx_mq, data, size, priority)) goto error;
}
*/
return
NULL
;
error:
printf
(
"receive_thread: there was an error
\n
"
);
return
NULL
;
}
/* void *send_thread(void *args) { */
/* #ifdef TEST_TIMER */
/* msg_context_t *d = args; */
/* void *data; */
/* int size; */
/* int priority; */
/* struct timeval t1, t2; */
/* long long t; */
/* struct timespec ts; */
/* unsigned int delay = 250*1000; */
/* while(1) { */
/* gettimeofday(&t1, NULL); */
/* enb_agent_sleep_until(&ts, delay); */
/* gettimeofday(&t2, NULL); */
/* t = ((t2.tv_sec * 1000000) + t2.tv_usec) - ((t1.tv_sec * 1000000) + t1.tv_usec); */
/* LOG_I(ENB_AGENT, "Call to sleep_until(%d) took %lld us\n", delay, t); */
/* sleep(1); */
/* } */
/* #endif */
/* /\* while (1) { */
/* // need logic for the timer, and */
/* usleep(10); */
/* if (message_put(d->tx_mq, data, size, priority)) goto error; */
/* }*\/
*/
/* return NULL; */
/* error: */
/* printf("receive_thread: there was an error\n"); */
/* return NULL; */
/* } */
void
*
receive_thread
(
void
*
args
)
{
...
...
@@ -290,25 +308,25 @@ int enb_agent_start(mid_t mod_id, const Enb_properties_array_t* enb_properties){
* start the enb agent task for tx and interaction with the underlying network function
*/
if
(
itti_create_task
(
TASK_ENB_AGENT
,
enb_agent_task
,
NULL
)
<
0
)
{
if
(
itti_create_task
(
TASK_ENB_AGENT
,
enb_agent_task
,
(
void
*
)
&
shared_ctxt
[
mod_id
]
)
<
0
)
{
LOG_E
(
ENB_AGENT
,
"Create task for eNB Agent failed
\n
"
);
return
-
1
;
}
#ifdef TEST_TIMER
//
#ifdef TEST_TIMER
long
timer_id
=
0
;
enb_agent_timer_args_t
timer_args
;
memset
(
&
timer_args
,
0
,
sizeof
(
enb_agent_timer_args_t
));
timer_args
.
mod_id
=
mod_id
;
timer_args
.
cc_actions
=
ENB_AGENT_ACTION_APPLY
;
timer_args
.
cc_report_flags
=
PROTOCOL__PRP_CELL_STATS_TYPE__PRCST_NOISE_INTERFERENCE
;
timer_args
.
ue_actions
=
ENB_AGENT_ACTION_SEND
;
timer_args
.
ue_report_flags
=
PROTOCOL__PRP_UE_STATS_TYPE__PRUST_BSR
|
PROTOCOL__PRP_UE_STATS_TYPE__PRUST_DL_CQI
;
//
timer_args.cc_actions= ENB_AGENT_ACTION_APPLY;
//
timer_args.cc_report_flags = PROTOCOL__PRP_CELL_STATS_TYPE__PRCST_NOISE_INTERFERENCE;
//
timer_args.ue_actions = ENB_AGENT_ACTION_SEND;
//
timer_args.ue_report_flags = PROTOCOL__PRP_UE_STATS_TYPE__PRUST_BSR | PROTOCOL__PRP_UE_STATS_TYPE__PRUST_DL_CQI;
enb_agent_create_timer
(
1
,
0
,
ENB_AGENT_DEFAULT
,
mod_id
,
ENB_AGENT_TIMER_TYPE_PERIODIC
,
enb_agent_timeout
,(
void
*
)
&
timer_args
,
&
timer_id
);
#endif
//
#endif
new_thread
(
send_thread
,
&
shared_ctxt
);
//
new_thread(send_thread, &shared_ctxt);
//while (1) pause();
...
...
@@ -342,15 +360,15 @@ int enb_agent_stop(mid_t mod_id){
err_code_t
enb_agent_timeout
(
void
*
args
){
Protocol__ProgranMessage
*
enb_agent_timeout
(
void
*
args
){
// enb_agent_timer_args_t *timer_args = calloc(1, sizeof(*timer_args));
//memcpy (timer_args, args, sizeof(*timer_args));
enb_agent_timer_args_t
*
timer_args
=
(
enb_agent_timer_args_t
*
)
args
;
LOG_I
(
ENB_AGENT
,
"enb_agent %d timeout
\n
"
,
timer_args
->
mod_id
);
LOG_I
(
ENB_AGENT
,
"eNB action %d ENB flags %d
\n
"
,
timer_args
->
cc_actions
,
timer_args
->
cc_report_flags
);
LOG_I
(
ENB_AGENT
,
"UE action %d UE flags %d
\n
"
,
timer_args
->
ue_actions
,
timer_args
->
ue_report_flags
);
//
LOG_I(ENB_AGENT, "eNB action %d ENB flags %d \n", timer_args->cc_actions,timer_args->cc_report_flags);
//
LOG_I(ENB_AGENT, "UE action %d UE flags %d \n", timer_args->ue_actions,timer_args->ue_report_flags);
return
0
;
return
NULL
;
}
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/enb_agent_common.c
View file @
11b2f829
...
...
@@ -311,7 +311,7 @@ uint16_t get_sfn_sf (mid_t mod_id) {
frame
=
(
uint16_t
)
get_current_frame
(
mod_id
);
subframe
=
(
uint16_t
)
get_current_subframe
(
mod_id
);
sfn_sf
=
(
frame
<<
12
)
|
sub
frame
;
sfn_sf
=
(
subframe
<<
12
)
|
frame
;
return
sfn_sf
;
}
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/enb_agent_common.h
View file @
11b2f829
...
...
@@ -86,6 +86,8 @@ Protocol__ProgranMessage* enb_agent_handle_message (mid_t mod_id,
uint8_t
*
data
,
uint32_t
size
);
Protocol__ProgranMessage
*
enb_agent_handle_timed_task
(
void
*
args
);
void
*
enb_agent_send_message
(
Protocol__ProgranMessage
*
msg
,
uint32_t
*
size
);
...
...
@@ -107,7 +109,7 @@ int get_current_frame(mid_t mod_id);
int
get_current_subframe
(
mid_t
mod_id
);
/*Return the frame and subframe number in compact 16-bit format.
Bits 0-3
frame, rest for sub
frame. Required by progRAN protocol*/
Bits 0-3
subframe, rest for
frame. Required by progRAN protocol*/
uint16_t
get_sfn_sf
(
mid_t
mod_id
);
int
get_num_ues
(
mid_t
mod_id
);
...
...
@@ -137,7 +139,7 @@ int get_ue_wcqi (mid_t mod_id, mid_t ue_id);
/* Type of the callback executed when the timer expired */
typedef
err_code_t
(
*
enb_agent_timer_callback_t
)(
void
*
);
typedef
Protocol__ProgranMessage
*
(
*
enb_agent_timer_callback_t
)(
void
*
);
typedef
enum
{
/* oneshot timer: */
...
...
@@ -169,13 +171,7 @@ typedef enum {
typedef
struct
enb_agent_timer_args_s
{
mid_t
mod_id
;
agent_action_t
cc_actions
;
uint32_t
cc_report_flags
;
agent_action_t
ue_actions
;
uint32_t
ue_report_flags
;
Protocol__ProgranMessage
*
msg
;
}
enb_agent_timer_args_t
;
...
...
@@ -225,7 +221,7 @@ struct enb_agent_timer_element_s * get_timer_entry(long timer_id);
err_code_t
enb_agent_process_timeout
(
long
timer_id
,
void
*
timer_args
);
Protocol__ProgranMessage
*
enb_agent_process_timeout
(
long
timer_id
,
void
*
timer_args
);
int
enb_agent_compare_timer
(
struct
enb_agent_timer_element_s
*
a
,
struct
enb_agent_timer_element_s
*
b
);
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/enb_agent_handler.c
View file @
11b2f829
...
...
@@ -134,10 +134,27 @@ void * enb_agent_send_message(Protocol__ProgranMessage *msg,
LOG_E
(
ENB_AGENT
,
"errno %d occured
\n
"
,
err_code
);
return
NULL
;
}
Protocol__ProgranMessage
*
enb_agent_handle_timed_task
(
void
*
args
)
{
err_code_t
err_code
;
enb_agent_timer_args_t
*
timer_args
=
(
enb_agent_timer_args_t
*
)
args
;
Protocol__ProgranMessage
*
timed_task
,
*
reply_message
;
timed_task
=
timer_args
->
msg
;
err_code
=
((
*
messages_callback
[
timed_task
->
msg_case
-
1
][
timed_task
->
msg_dir
-
1
])(
timer_args
->
mod_id
,
(
void
*
)
timed_task
,
&
reply_message
));
if
(
err_code
<
0
){
goto
error
;
}
return
reply_message
;
error:
LOG_E
(
ENB_AGENT
,
"errno %d occured
\n
"
,
err_code
);
return
NULL
;
}
err_code_t
enb_agent_process_timeout
(
long
timer_id
,
void
*
timer_args
){
Protocol__ProgranMessage
*
enb_agent_process_timeout
(
long
timer_id
,
void
*
timer_args
){
struct
enb_agent_timer_element_s
*
found
=
get_timer_entry
(
timer_id
);
...
...
@@ -149,7 +166,6 @@ err_code_t enb_agent_process_timeout(long timer_id, void* timer_args){
return
found
->
cb
(
timer_args
);
error:
LOG_E
(
ENB_AGENT
,
"can't get the timer element
\n
"
);
return
TIMER_ELEMENT_NOT_FOUND
;
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/enb_agent_mac.c
View file @
11b2f829
...
...
@@ -48,6 +48,7 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr
int
size
;
err_code_t
err_code
;
xid_t
xid
;
uint32_t
usec_interval
,
sec_interval
;
//TODO: We do not deal with multiple CCs at the moment and eNB id is 0
int
cc_id
=
0
;
...
...
@@ -70,12 +71,13 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr
switch
(
stats_req
->
body_case
)
{
case
PROTOCOL__PRP_STATS_REQUEST__BODY_COMPLETE_STATS_REQUEST
:
;
Protocol__PrpCompleteStatsRequest
*
comp_req
=
stats_req
->
complete_stats_request
;
if
(
comp_req
->
report_frequency
==
PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_PERIODICAL
)
{
//TODO: Must create a periodic report. Implement once the
// timer functionality is supported
*
msg
=
NULL
;
return
0
;
}
else
if
(
comp_req
->
report_frequency
==
PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_CONTINUOUS
)
{
/* if (comp_req->report_frequency == PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_PERIODICAL) { */
/* //TODO: Must create a periodic report. Implement once the */
/* // timer functionality is supported */
/* *msg = NULL; */
/* return 0; */
/* } else */
if
(
comp_req
->
report_frequency
==
PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_CONTINUOUS
)
{
//TODO: Must create an event based report mechanism
*
msg
=
NULL
;
return
0
;
...
...
@@ -83,7 +85,7 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr
//TODO: Must implement to deactivate the event based reporting
*
msg
=
NULL
;
return
0
;
}
else
{
//One-off reporting
}
else
{
//One-off
or periodical
reporting
//Set the proper flags
ue_flags
=
comp_req
->
ue_report_flags
;
c_flags
=
comp_req
->
cell_report_flags
;
...
...
@@ -114,6 +116,33 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr
report_config
.
cc_report_type
[
i
].
cc_id
=
i
;
report_config
.
cc_report_type
[
i
].
cc_report_flags
=
c_flags
;
}
/* Check if request was periodical */
if
(
comp_req
->
report_frequency
==
PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_PERIODICAL
)
{
/* Create a one off progran message as an argument for the periodical task */
Protocol__ProgranMessage
*
timer_msg
;
stats_request_config_t
request_config
;
request_config
.
report_type
=
PROTOCOL__PRP_STATS_TYPE__PRST_COMPLETE_STATS
;
request_config
.
report_frequency
=
PROTOCOL__PRP_STATS_REPORT_FREQ__PRSRF_ONCE
;
request_config
.
period
=
0
;
request_config
.
config
=
&
report_config
;
enb_agent_mac_stats_request
(
enb_id
,
xid
,
&
request_config
,
&
timer_msg
);
/* Create a timer */
long
timer_id
=
0
;
enb_agent_timer_args_t
*
timer_args
;
timer_args
=
malloc
(
sizeof
(
enb_agent_timer_args_t
));
memset
(
timer_args
,
0
,
sizeof
(
enb_agent_timer_args_t
));
timer_args
->
mod_id
=
enb_id
;
timer_args
->
msg
=
timer_msg
;
/*Convert subframes to usec time*/
usec_interval
=
1000
*
comp_req
->
sf
;
sec_interval
=
0
;
/*add seconds if required*/
if
(
usec_interval
>=
1000
*
1000
)
{
sec_interval
=
usec_interval
/
(
1000
*
1000
);
usec_interval
=
usec_interval
%
(
1000
*
1000
);
}
enb_agent_create_timer
(
sec_interval
,
usec_interval
,
ENB_AGENT_DEFAULT
,
enb_id
,
ENB_AGENT_TIMER_TYPE_PERIODIC
,
enb_agent_handle_timed_task
,(
void
*
)
timer_args
,
&
timer_id
);
}
}
break
;
case
PROTOCOL__PRP_STATS_REQUEST__BODY_CELL_STATS_REQUEST
:;
...
...
@@ -172,6 +201,132 @@ int enb_agent_mac_handle_stats(mid_t mod_id, const void *params, Protocol__Progr
return
err_code
;
}
int
enb_agent_mac_stats_request
(
mid_t
mod_id
,
xid_t
xid
,
const
stats_request_config_t
*
report_config
,
Protocol__ProgranMessage
**
msg
)
{
Protocol__PrpHeader
*
header
;
int
i
;
if
(
prp_create_header
(
xid
,
PROTOCOL__PRP_TYPE__PRPT_STATS_REQUEST
,
&
header
)
!=
0
)
goto
error
;
Protocol__PrpStatsRequest
*
stats_request_msg
;
stats_request_msg
=
malloc
(
sizeof
(
Protocol__PrpStatsRequest
));
if
(
stats_request_msg
==
NULL
)
goto
error
;
protocol__prp_stats_request__init
(
stats_request_msg
);
stats_request_msg
->
header
=
header
;
stats_request_msg
->
type
=
report_config
->
report_type
;
stats_request_msg
->
has_type
=
1
;
switch
(
report_config
->
report_type
)
{
case
PROTOCOL__PRP_STATS_TYPE__PRST_COMPLETE_STATS
:
stats_request_msg
->
body_case
=
PROTOCOL__PRP_STATS_REQUEST__BODY_COMPLETE_STATS_REQUEST
;
Protocol__PrpCompleteStatsRequest
*
complete_stats
;
complete_stats
=
malloc
(
sizeof
(
Protocol__PrpCompleteStatsRequest
));
if
(
complete_stats
==
NULL
)
goto
error
;
protocol__prp_complete_stats_request__init
(
complete_stats
);
complete_stats
->
report_frequency
=
report_config
->
report_frequency
;
complete_stats
->
has_report_frequency
=
1
;
complete_stats
->
sf
=
report_config
->
period
;
complete_stats
->
has_sf
=
1
;
complete_stats
->
has_cell_report_flags
=
1
;
complete_stats
->
has_ue_report_flags
=
1
;
if
(
report_config
->
config
->
nr_cc
>
0
)
{
complete_stats
->
cell_report_flags
=
report_config
->
config
->
cc_report_type
[
0
].
cc_report_flags
;
}
if
(
report_config
->
config
->
nr_ue
>
0
)
{
complete_stats
->
ue_report_flags
=
report_config
->
config
->
ue_report_type
[
0
].
ue_report_flags
;
}
stats_request_msg
->
complete_stats_request
=
complete_stats
;
break
;
case
PROTOCOL__PRP_STATS_TYPE__PRST_CELL_STATS
:
stats_request_msg
->
body_case
=
PROTOCOL__PRP_STATS_REQUEST__BODY_CELL_STATS_REQUEST
;
Protocol__PrpCellStatsRequest
*
cell_stats
;
cell_stats
=
malloc
(
sizeof
(
Protocol__PrpCellStatsRequest
));
if
(
cell_stats
==
NULL
)
goto
error
;
protocol__prp_cell_stats_request__init
(
cell_stats
);
cell_stats
->
n_cell
=
report_config
->
config
->
nr_cc
;
cell_stats
->
has_flags
=
1
;
if
(
cell_stats
->
n_cell
>
0
)
{
uint32_t
*
cells
;
cells
=
(
uint32_t
*
)
malloc
(
sizeof
(
uint32_t
)
*
cell_stats
->
n_cell
);
for
(
i
=
0
;
i
<
cell_stats
->
n_cell
;
i
++
)
{
cells
[
i
]
=
report_config
->
config
->
cc_report_type
[
i
].
cc_id
;
}
cell_stats
->
cell
=
cells
;
cell_stats
->
flags
=
report_config
->
config
->
cc_report_type
[
i
].
cc_report_flags
;
}
stats_request_msg
->
cell_stats_request
=
cell_stats
;
break
;
case
PROTOCOL__PRP_STATS_TYPE__PRST_UE_STATS
:
stats_request_msg
->
body_case
=
PROTOCOL__PRP_STATS_REQUEST__BODY_UE_STATS_REQUEST
;
Protocol__PrpUeStatsRequest
*
ue_stats
;
ue_stats
=
malloc
(
sizeof
(
Protocol__PrpUeStatsRequest
));
if
(
ue_stats
==
NULL
)
goto
error
;
protocol__prp_ue_stats_request__init
(
ue_stats
);
ue_stats
->
n_rnti
=
report_config
->
config
->
nr_ue
;
ue_stats
->
has_flags
=
1
;
if
(
ue_stats
->
n_rnti
>
0
)
{
uint32_t
*
ues
;
ues
=
(
uint32_t
*
)
malloc
(
sizeof
(
uint32_t
)
*
ue_stats
->
n_rnti
);
for
(
i
=
0
;
i
<
ue_stats
->
n_rnti
;
i
++
)
{
ues
[
i
]
=
report_config
->
config
->
ue_report_type
[
i
].
ue_rnti
;
}
ue_stats
->
rnti
=
ues
;
ue_stats
->
flags
=
report_config
->
config
->
ue_report_type
[
i
].
ue_report_flags
;
}
stats_request_msg
->
ue_stats_request
=
ue_stats
;
break
;
default:
goto
error
;
}
*
msg
=
malloc
(
sizeof
(
Protocol__ProgranMessage
));
if
(
*
msg
==
NULL
)
goto
error
;
protocol__progran_message__init
(
*
msg
);
(
*
msg
)
->
msg_case
=
PROTOCOL__PROGRAN_MESSAGE__MSG_STATS_REQUEST_MSG
;
(
*
msg
)
->
msg_dir
=
PROTOCOL__PROGRAN_DIRECTION__INITIATING_MESSAGE
;
(
*
msg
)
->
stats_request_msg
=
stats_request_msg
;
return
0
;
error:
// TODO: Need to make proper error handling
if
(
header
!=
NULL
)
free
(
header
);
if
(
stats_request_msg
!=
NULL
)
free
(
stats_request_msg
);
if
(
*
msg
!=
NULL
)
free
(
*
msg
);
//LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
return
-
1
;
}
int
enb_agent_mac_destroy_stats_request
(
Protocol__ProgranMessage
*
msg
)
{
if
(
msg
->
msg_case
!=
PROTOCOL__PROGRAN_MESSAGE__MSG_STATS_REQUEST_MSG
)
goto
error
;
free
(
msg
->
stats_request_msg
->
header
);
if
(
msg
->
stats_request_msg
->
body_case
==
PROTOCOL__PRP_STATS_REQUEST__BODY_CELL_STATS_REQUEST
)
{
free
(
msg
->
stats_request_msg
->
cell_stats_request
->
cell
);
}
if
(
msg
->
stats_request_msg
->
body_case
==
PROTOCOL__PRP_STATS_REQUEST__BODY_UE_STATS_REQUEST
)
{
free
(
msg
->
stats_request_msg
->
ue_stats_request
->
rnti
);
}
free
(
msg
->
stats_request_msg
);
free
(
msg
);
return
0
;
error:
//LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
return
-
1
;
}
int
enb_agent_mac_stats_reply
(
mid_t
mod_id
,
xid_t
xid
,
const
report_config_t
*
report_config
,
...
...
This diff is collapsed.
Click to expand it.
openair2/ENB_APP/enb_agent_mac.h
View file @
11b2f829
...
...
@@ -69,11 +69,24 @@ typedef struct {
cc_report_type_t
*
cc_report_type
;
}
report_config_t
;
typedef
struct
{
uint8_t
report_type
;
uint8_t
report_frequency
;
uint16_t
period
;
/*In number of subframes*/
report_config_t
*
config
;
}
stats_request_config_t
;
int
enb_agent_mac_handle_stats
(
mid_t
mod_id
,
const
void
*
params
,
Protocol__ProgranMessage
**
msg
);
int
enb_agent_mac_stats_request
(
mid_t
mod_id
,
xid_t
xid
,
const
stats_request_config_t
*
report_config
,
Protocol__ProgranMessage
**
msg
);
int
enb_agent_mac_destroy_stats_request
(
Protocol__ProgranMessage
*
msg
);
int
enb_agent_mac_stats_reply
(
mid_t
mod_id
,
xid_t
xid
,
const
report_config_t
*
report_config
,
Protocol__ProgranMessage
**
msg
);
int
enb_agent_mac_destroy_stats_reply
(
Protocol__ProgranMessage
*
msg
);
#endif
This diff is collapsed.
Click to expand it.
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