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
canghaiwuhen
OpenXG-RAN
Commits
26bdf501
Commit
26bdf501
authored
Mar 04, 2016
by
Xenofon Foukas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added bugfixes for remote scheduling
parent
93b7cf05
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
94 additions
and
76 deletions
+94
-76
openair1/SCHED/phy_procedures_lte_eNb.c
openair1/SCHED/phy_procedures_lte_eNb.c
+2
-2
openair2/ENB_APP/enb_agent_common.c
openair2/ENB_APP/enb_agent_common.c
+64
-62
openair2/ENB_APP/enb_agent_mac.c
openair2/ENB_APP/enb_agent_mac.c
+2
-0
openair2/LAYER2/MAC/eNB_agent_scheduler_dlsch_ue_remote.c
openair2/LAYER2/MAC/eNB_agent_scheduler_dlsch_ue_remote.c
+26
-12
No files found.
openair1/SCHED/phy_procedures_lte_eNb.c
View file @
26bdf501
...
...
@@ -153,8 +153,8 @@ void remove_harq_pid_from_freelist(LTE_eNB_DLSCH_t *DLSCH_ptr, int harq_pid)
* to be refined in case things don't work properly
*/
if
(
harq_pid
!=
DLSCH_ptr
->
harq_pid_freelist
[
DLSCH_ptr
->
head_freelist
])
{
LOG_E
(
PHY
,
"%s:%d: critical error, get in touch with the authors
\n
"
,
__FILE__
,
__LINE__
);
abort
();
//
LOG_E(PHY, "%s:%d: critical error, get in touch with the authors\n", __FILE__, __LINE__);
//
abort();
}
DLSCH_ptr
->
head_freelist
=
(
DLSCH_ptr
->
head_freelist
+
1
)
%
10
;
}
...
...
openair2/ENB_APP/enb_agent_common.c
View file @
26bdf501
...
...
@@ -272,31 +272,33 @@ int enb_agent_destroy_echo_reply(Protocol__ProgranMessage *msg) {
int
enb_agent_destroy_enb_config_reply
(
Protocol__ProgranMessage
*
msg
)
{
if
(
msg
->
msg_case
!=
PROTOCOL__PROGRAN_MESSAGE__MSG_ENB_CONFIG_REPLY_MSG
)
goto
error
;
free
(
msg
->
enb_config_reply_msg
->
header
);
int
i
,
j
;
Protocol__PrpEnbConfigReply
*
reply
=
msg
->
enb_config_reply_msg
;
for
(
i
=
0
;
i
<
reply
->
n_cell_config
;
i
++
){
free
(
reply
->
cell_config
[
i
]
->
mbsfn_subframe_config_rfoffset
);
free
(
reply
->
cell_config
[
i
]
->
mbsfn_subframe_config_rfperiod
);
free
(
reply
->
cell_config
[
i
]
->
mbsfn_subframe_config_sfalloc
);
for
(
j
=
0
;
j
<
reply
->
cell_config
[
i
]
->
si_config
->
n_si_message
;
j
++
){
free
(
reply
->
cell_config
[
i
]
->
si_config
->
si_message
[
j
]);
}
free
(
reply
->
cell_config
[
i
]
->
si_config
->
si_message
);
free
(
reply
->
cell_config
[
i
]
->
si_config
);
free
(
reply
->
cell_config
[
i
]);
}
free
(
reply
->
cell_config
);
free
(
reply
);
free
(
msg
);
return
0
;
error:
//LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
return
-
1
;
if
(
msg
->
msg_case
!=
PROTOCOL__PROGRAN_MESSAGE__MSG_ENB_CONFIG_REPLY_MSG
)
goto
error
;
free
(
msg
->
enb_config_reply_msg
->
header
);
int
i
,
j
;
Protocol__PrpEnbConfigReply
*
reply
=
msg
->
enb_config_reply_msg
;
for
(
i
=
0
;
i
<
reply
->
n_cell_config
;
i
++
){
free
(
reply
->
cell_config
[
i
]
->
mbsfn_subframe_config_rfoffset
);
free
(
reply
->
cell_config
[
i
]
->
mbsfn_subframe_config_rfperiod
);
free
(
reply
->
cell_config
[
i
]
->
mbsfn_subframe_config_sfalloc
);
if
(
reply
->
cell_config
[
i
]
->
si_config
!=
NULL
)
{
for
(
j
=
0
;
j
<
reply
->
cell_config
[
i
]
->
si_config
->
n_si_message
;
j
++
){
free
(
reply
->
cell_config
[
i
]
->
si_config
->
si_message
[
j
]);
}
free
(
reply
->
cell_config
[
i
]
->
si_config
->
si_message
);
free
(
reply
->
cell_config
[
i
]
->
si_config
);
}
free
(
reply
->
cell_config
[
i
]);
}
free
(
reply
->
cell_config
);
free
(
reply
);
free
(
msg
);
return
0
;
error:
//LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
return
-
1
;
}
int
enb_agent_destroy_ue_config_reply
(
Protocol__ProgranMessage
*
msg
)
{
...
...
@@ -507,7 +509,7 @@ uint16_t get_sfn_sf (mid_t mod_id) {
frame
=
(
frame_t
)
get_current_system_frame_num
(
mod_id
);
subframe
=
(
sub_frame_t
)
get_current_subframe
(
mod_id
);
frame_mask
=
((
1
<<
12
)
-
1
);
sf_mask
=
((
1
<<
4
)
-
1
);
sf_mask
=
((
1
<<
4
)
-
1
);
sfn_sf
=
(
subframe
&
sf_mask
)
|
((
frame
&
frame_mask
)
<<
4
);
return
sfn_sf
;
...
...
@@ -1873,42 +1875,42 @@ int enb_agent_enb_config_reply(mid_t mod_id, const void *params, Protocol__Progr
cell_conf
[
i
]
->
init_nr_pdcch_ofdm_sym
=
get_num_pdcch_symb
(
enb_id
,
i
);
cell_conf
[
i
]
->
has_init_nr_pdcch_ofdm_sym
=
1
;
//TODO: Fill in with actual value
Protocol__PrpSiConfig
*
si_config
;
si_config
=
malloc
(
sizeof
(
Protocol__PrpSiConfig
));
if
(
si_config
==
NULL
)
goto
error
;
protocol__prp_si_config__init
(
si_config
);
/
/TODO: Fill in with actual value, Frame number to apply the SI configuration
si_config
->
sfn
=
1
;
si_config
->
has_sfn
=
1
;
/
/TODO: Fill in with actual value, the length of SIB1 in bytes
si_config
->
sib1_length
=
get_sib1_length
(
enb_id
,
i
);
si_config
->
has_sib1_length
=
1
;
/
/TODO: Fill in with actual value, Scheduling window for all SIs in SF
si_config
->
si_window_length
=
(
uint32_t
)
get_si_window_length
(
enb_id
,
i
);
si_config
->
has_si_window_length
=
1
;
/
/TODO: Fill in with actual value, the number of SI messages
si_config
->
n_si_message
=
1
;
Protocol__PrpSiMessage
**
si_message
;
si_message
=
malloc
(
sizeof
(
Protocol__PrpSiMessage
*
)
*
si_config
->
n_si_message
);
if
(
si_message
==
NULL
)
goto
error
;
for
(
j
=
0
;
j
<
si_config
->
n_si_message
;
j
++
){
si_message
[
j
]
=
malloc
(
sizeof
(
Protocol__PrpSiMessage
));
if
(
si_message
[
j
]
==
NULL
)
goto
error
;
protocol__prp_si_message__init
(
si_message
[
j
]);
//TODO: Fill in with actual value, Periodicity of SI msg in radio frames
si_message
[
j
]
->
periodicity
=
1
;
//SIPeriod
si_message
[
j
]
->
has_periodicity
=
1
;
//TODO: Fill in with actual value, rhe length of the SI message in bytes
si_message
[
j
]
->
length
=
10
;
si_message
[
j
]
->
has_length
=
1
;
}
if
(
si_config
->
n_si_message
>
0
){
si_config
->
si_message
=
si_message
;
}
cell_conf
[
i
]
->
si_config
=
si_config
;
/* Protocol__PrpSiConfig *si_config; */
/* si_config = malloc(sizeof(Protocol__PrpSiConfig)); */
/* if(si_config == NULL) */
/* goto error; */
/* protocol__prp_si_config__init(si_config); */
/
* //TODO: Fill in with actual value, Frame number to apply the SI configuration */
/* si_config->sfn = 1; */
/* si_config->has_sfn = 1; */
/
* //TODO: Fill in with actual value, the length of SIB1 in bytes */
/* si_config->sib1_length = get_sib1_length(enb_id,i); */
/* si_config->has_sib1_length = 1; */
/
* //TODO: Fill in with actual value, Scheduling window for all SIs in SF */
/* si_config->si_window_length = (uint32_t) get_si_window_length(enb_id,i); */
/* si_config->has_si_window_length = 1; */
/
* //TODO: Fill in with actual value, the number of SI messages */
/* si_config->n_si_message=1; */
/* Protocol__PrpSiMessage **si_message; */
/* si_message = malloc(sizeof(Protocol__PrpSiMessage *) * si_config->n_si_message); */
/* if(si_message == NULL) */
/* goto error; */
/* for(j = 0; j < si_config->n_si_message; j++){ */
/* si_message[j] = malloc(sizeof(Protocol__PrpSiMessage)); */
/* if(si_message[j] == NULL) */
/* goto error; */
/* protocol__prp_si_message__init(si_message[j]); */
/* //TODO: Fill in with actual value, Periodicity of SI msg in radio frames */
/* si_message[j]->periodicity = 1; //SIPeriod */
/* si_message[j]->has_periodicity = 1; */
/* //TODO: Fill in with actual value, rhe length of the SI message in bytes */
/* si_message[j]->length = 10; */
/* si_message[j]->has_length = 1; */
/* } */
/* if(si_config->n_si_message > 0){ */
/* si_config->si_message = si_message; */
/* } */
/* cell_conf[i]->si_config = si_config; */
//TODO: Fill in with actual value, the DL transmission bandwidth in RBs
cell_conf
[
i
]
->
dl_bandwidth
=
get_N_RB_DL
(
enb_id
,
i
);
...
...
openair2/ENB_APP/enb_agent_mac.c
View file @
26bdf501
...
...
@@ -41,6 +41,7 @@
#include "LAYER2/MAC/proto.h"
#include "LAYER2/MAC/enb_agent_mac_proto.h"
#include "LAYER2/MAC/eNB_agent_scheduler_dlsch_ue_remote.h"
#include "liblfds700.h"
...
...
@@ -1369,6 +1370,7 @@ int enb_agent_register_mac_xface(mid_t mod_id, AGENT_MAC_xface *xface) {
xface
->
enb_agent_send_sf_trigger
=
enb_agent_send_sf_trigger
;
xface
->
enb_agent_send_update_mac_stats
=
enb_agent_send_update_mac_stats
;
xface
->
enb_agent_schedule_ue_spec
=
schedule_ue_spec_default
;
//xface->enb_agent_schedule_ue_spec = schedule_ue_spec_remote;
xface
->
enb_agent_get_pending_dl_mac_config
=
enb_agent_get_pending_dl_mac_config
;
xface
->
enb_agent_notify_ue_state_change
=
enb_agent_ue_state_change
;
...
...
openair2/LAYER2/MAC/eNB_agent_scheduler_dlsch_ue_remote.c
View file @
26bdf501
...
...
@@ -46,7 +46,7 @@ int queue_initialized = 0;
void
schedule_ue_spec_remote
(
mid_t
mod_id
,
uint32_t
frame
,
uint32_t
subframe
,
int
*
mbsfn_flag
,
Protocol__ProgranMessage
**
dl_info
)
{
if
(
queue_initialized
)
{
if
(
!
queue_initialized
)
{
TAILQ_INIT
(
&
queue_head
);
queue_initialized
=
1
;
}
...
...
@@ -54,22 +54,26 @@ void schedule_ue_spec_remote(mid_t mod_id, uint32_t frame, uint32_t subframe,
dl_mac_config_element_t
*
dl_config_elem
;
int
diff
;
LOG_D
(
MAC
,
"Current frame and subframe %d, %d
\n
"
,
frame
,
subframe
);
// First we check to see if we have a scheduling decision for this sfn_sf already in our queue
while
(
queue_head
.
tqh_first
!=
NULL
)
{
dl_config_elem
=
queue_head
.
tqh_first
;
diff
=
get_sf_difference
(
mod_id
,
dl_config_elem
->
dl_info
->
dl_mac_config_msg
->
sfn_sf
);
// Check if this decision is for now, for a later or a previous subframe
if
(
diff
==
0
)
{
// Now
LOG_D
(
MAC
,
"Found a decision for this subframe in the queue. Let's use it!
\n
"
);
TAILQ_REMOVE
(
&
queue_head
,
queue_head
.
tqh_first
,
configs
);
*
dl_info
=
dl_config_elem
->
dl_info
;
free
(
dl_config_elem
);
return
;
}
else
if
(
diff
<
0
)
{
//previous subframe , delete message and free memory
LOG_D
(
MAC
,
"Found a decision for a previous subframe in the queue. Let's get rid of it
\n
"
);
TAILQ_REMOVE
(
&
queue_head
,
queue_head
.
tqh_first
,
configs
);
enb_agent_mac_destroy_dl_config
(
dl_config_elem
->
dl_info
);
free
(
dl_config_elem
);
}
else
{
// next subframe, nothing to do now
LOG_D
(
MAC
,
"Found a decision for a future subframe in the queue. Nothing to do now
\n
"
);
enb_agent_mac_create_empty_dl_config
(
mod_id
,
dl_info
);
return
;
}
...
...
@@ -81,17 +85,22 @@ void schedule_ue_spec_remote(mid_t mod_id, uint32_t frame, uint32_t subframe,
diff
=
get_sf_difference
(
mod_id
,
(
*
dl_info
)
->
dl_mac_config_msg
->
sfn_sf
);
if
(
diff
==
0
)
{
// Got a command for this sfn_sf
LOG_D
(
MAC
,
"Found a decision for this subframe pending. Let's use it
\n
"
);
return
;
}
else
if
(
diff
<
0
)
{
LOG_D
(
MAC
,
"Found a decision for a previous subframe. Let's get rid of it
\n
"
);
enb_agent_mac_destroy_dl_config
(
*
dl_info
);
*
dl_info
=
NULL
;
enb_agent_get_pending_dl_mac_config
(
mod_id
,
dl_info
);
}
else
{
// Intended for future subframe. Store it in local cache
LOG_D
(
MAC
,
"Found a decision for a future subframe in the queue. Let's store it in the cache
\n
"
);
dl_mac_config_element_t
*
e
=
malloc
(
sizeof
(
dl_mac_config_element_t
));
e
->
dl_info
=
*
dl_info
;
TAILQ_INSERT_TAIL
(
&
queue_head
,
e
,
configs
);
enb_agent_mac_create_empty_dl_config
(
mod_id
,
dl_info
);
// No need to look for another. Messages arrive ordered
return
;
}
enb_agent_get_pending_dl_mac_config
(
mod_id
,
dl_info
);
}
// We found no pending command, so we will simply pass an empty one
...
...
@@ -114,25 +123,30 @@ int get_sf_difference(mid_t mod_id, uint16_t sfn_sf) {
uint16_t
sf_mask
=
((
1
<<
4
)
-
1
);
uint16_t
subframe
=
(
sfn_sf
&
sf_mask
);
LOG_D
(
MAC
,
"Target frame and subframe %d, %d
\n
"
,
frame
,
subframe
);
if
(
frame
==
current_frame
)
{
return
subframe
-
current_subframe
;
}
else
if
(
frame
>
current_frame
)
{
diff_in_subframes
=
9
-
current_subframe
;
diff_in_subframes
+=
(
subframe
+
1
);
diff_in_subframes
+=
(
frame
-
2
)
*
10
;
diff_in_subframes
=
((
frame
*
10
)
+
subframe
)
-
((
current_frame
*
10
)
+
current_subframe
);
// diff_in_subframes = 9 - current_subframe;
//diff_in_subframes += (subframe + 1);
//diff_in_subframes += (frame-2) * 10;
if
(
diff_in_subframes
>
SCHED_AHEAD_SUBFRAMES
)
{
return
-
1
;
}
else
{
return
1
;
}
}
else
{
//frame < current_frame
diff_in_subframes
=
9
-
current_subframe
;
diff_in_subframes
+=
(
subframe
+
1
);
if
(
frame
>
0
)
{
diff_in_subframes
+=
(
frame
-
1
)
*
10
;
}
diff_in_subframes
+=
(
1023
-
current_frame
)
*
10
;
//diff_in_subframes = 9 - current_subframe;
//diff_in_subframes += (subframe + 1);
//if (frame > 0) {
// diff_in_subframes += (frame - 1) * 10;
//}
//diff_in_subframes += (1023 - current_frame) * 10;
diff_in_subframes
=
10240
-
((
current_frame
*
10
)
+
current_subframe
)
+
((
frame
*
10
)
+
subframe
);
if
(
diff_in_subframes
>
SCHED_AHEAD_SUBFRAMES
)
{
return
-
1
;
}
else
{
...
...
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