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
wangwenhui
OpenXG-RAN
Commits
544d80c4
Commit
544d80c4
authored
Feb 25, 2019
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into feature-127-protocol-split
parents
97126eb5
f6cab340
Changes
20
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
2949 additions
and
2044 deletions
+2949
-2044
README.txt
README.txt
+1
-0
ci-scripts/buildOnVM.sh
ci-scripts/buildOnVM.sh
+12
-5
ci-scripts/cppcheck_suppressions.list
ci-scripts/cppcheck_suppressions.list
+9
-0
ci-scripts/createVM.sh
ci-scripts/createVM.sh
+31
-0
ci-scripts/main.py
ci-scripts/main.py
+20
-0
ci-scripts/runTestOnVM.sh
ci-scripts/runTestOnVM.sh
+8
-1
common/utils/T/tracer/gui/notify.c
common/utils/T/tracer/gui/notify.c
+1
-1
common/utils/T/tracer/textlog.c
common/utils/T/tracer/textlog.c
+3
-0
common/utils/T/tracer/utils.c
common/utils/T/tracer/utils.c
+1
-1
openair1/PHY/TOOLS/lte_phy_scope_tm4.c
openair1/PHY/TOOLS/lte_phy_scope_tm4.c
+0
-3
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+850
-531
openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
+17
-9
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+1866
-1387
openair2/LAYER2/MAC/mac_proto.h
openair2/LAYER2/MAC/mac_proto.h
+5
-5
openair2/LAYER2/MAC/pre_processor.c
openair2/LAYER2/MAC/pre_processor.c
+89
-64
openair3/S1AP/s1ap_eNB_trace.c
openair3/S1AP/s1ap_eNB_trace.c
+1
-1
openair3/TEST/EPC_TEST/generate_scenario.c
openair3/TEST/EPC_TEST/generate_scenario.c
+1
-1
openair3/TEST/EPC_TEST/play_scenario.c
openair3/TEST/EPC_TEST/play_scenario.c
+1
-1
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+13
-6
targets/RT/USER/lte-ru.c
targets/RT/USER/lte-ru.c
+20
-28
No files found.
README.txt
View file @
544d80c4
...
...
@@ -62,3 +62,4 @@ v1.0.0 -> January 2019. This version first implements the architectural split de
New tools: config library, telnet server, ...
A lot of bugfixes and a proper automated Continuous Integration process validates contributions.
v1.0.1 -> February 2019: Bug fix for the UE L1 simulator.
v1.0.2 -> February 2019: Full OAI support for 3.13.1 UHD
ci-scripts/buildOnVM.sh
View file @
544d80c4
...
...
@@ -94,14 +94,21 @@ function build_on_vm {
echo
"############################################################"
echo
"Creating VM (
$VM_NAME
) on Ubuntu Cloud Image base"
echo
"############################################################"
acquire_vm_create_lock
uvt-kvm create
$VM_NAME
release
=
xenial
--memory
$VM_MEMORY
--cpu
$VM_CPU
--unsafe-caching
--template
ci-scripts/template-host.xml
fi
echo
"Waiting for VM to be started"
uvt-kvm
wait
$VM_NAME
--insecure
VM_IP_ADDR
=
`
uvt-kvm ip
$VM_NAME
`
echo
"
$VM_NAME
has for IP addr =
$VM_IP_ADDR
"
release_vm_create_lock
else
echo
"Waiting for VM to be started"
uvt-kvm
wait
$VM_NAME
--insecure
VM_IP_ADDR
=
`
uvt-kvm ip
$VM_NAME
`
echo
"
$VM_NAME
has for IP addr =
$VM_IP_ADDR
"
fi
echo
"############################################################"
echo
"Copying GIT repo into VM (
$VM_NAME
)"
...
...
ci-scripts/cppcheck_suppressions.list
View file @
544d80c4
...
...
@@ -67,6 +67,15 @@ syntaxError:openair1/SIMULATION/LTE_PHY/dlsim_tm4.c
// omg, otg commented out in cmakelist to be cleaned up definitely?
arrayIndexOutOfBounds:openair2/UTIL/OMG/omg.c
uninitvar:openair2/UTIL/OTG/otg_rx_socket.c
//-----------------------------------------------------------------------------
// cppcheck is not able to understand that buf is initialized at the first
// iteration of the loop.
nullPointer:common/utils/T/local_tracer.c:243
//-----------------------------------------------------------------------------
// once again cppcheck is not to understand that fds is initialized in the
// first iteration of the loop
nullPointer:common/utils/T/tracer/multi.c:264
nullPointer:common/utils/T/tracer/multi.c:265
//
//*****************************************************************************
//
...
...
ci-scripts/createVM.sh
View file @
544d80c4
...
...
@@ -49,6 +49,35 @@ function create_usage {
echo
""
}
function
acquire_vm_create_lock
{
local
FlockFile
=
"/tmp/vmclone.lck"
local
unlocked
=
"0"
touch
${
FlockFile
}
2>/dev/null
if
[[
$?
-ne
0
]]
then
echo
"Cannot access lock file
${
FlockFile
}
"
exit
2
fi
while
[
$unlocked
-eq
0
]
do
exec
5>
${
FlockFile
}
flock
-nx
5
if
[[
$?
-ne
0
]]
then
echo
"Another instance of VM creation is running"
sleep
10
else
unlocked
=
"1"
fi
done
chmod
666
${
FlockFile
}
2>/dev/null
}
function
release_vm_create_lock
{
local
FlockFile
=
"/tmp/vmclone.lck"
rm
-Rf
${
FlockFile
}
}
function
create_vm
{
echo
"############################################################"
echo
"OAI CI VM script"
...
...
@@ -60,10 +89,12 @@ function create_vm {
echo
"############################################################"
echo
"Creating VM (
$VM_NAME
) on Ubuntu Cloud Image base"
echo
"############################################################"
acquire_vm_create_lock
uvt-kvm create
$VM_NAME
release
=
xenial
--memory
$VM_MEMORY
--cpu
$VM_CPU
--unsafe-caching
--template
ci-scripts/template-host.xml
echo
"Waiting for VM to be started"
uvt-kvm
wait
$VM_NAME
--insecure
VM_IP_ADDR
=
`
uvt-kvm ip
$VM_NAME
`
echo
"
$VM_NAME
has for IP addr =
$VM_IP_ADDR
"
release_vm_create_lock
}
ci-scripts/main.py
View file @
544d80c4
...
...
@@ -59,6 +59,7 @@ import re # reg
import
pexpect
# pexpect
import
time
# sleep
import
os
import
subprocess
import
xml.etree.ElementTree
as
ET
import
logging
import
datetime
...
...
@@ -1962,7 +1963,16 @@ class SSHConnection():
self
.
command
(
'cp /opt/ltebox/var/log/xGwLog.0 .'
,
'\$'
,
5
)
self
.
command
(
'zip spgw.log.zip xGwLog.0'
,
'\$'
,
60
)
self
.
close
()
def
RetrieveSystemVersion
(
self
):
if
self
.
eNBIPAddress
==
'none'
:
self
.
eNBOsVersion
=
'Ubuntu 16.04.5 LTS'
self
.
eNBKernelVersion
=
'4.15.0-45-generic'
self
.
eNBUhdVersion
=
'3.13.0.1-0'
self
.
eNBCpuNb
=
'4'
self
.
eNBCpuModel
=
'Intel(R) Core(TM) i5-6200U'
self
.
eNBCpuMHz
=
'2399.996 MHz'
return
if
self
.
eNBIPAddress
==
''
or
self
.
eNBUserName
==
''
or
self
.
eNBPassword
==
''
:
Usage
()
sys
.
exit
(
'Insufficient Parameter'
)
...
...
@@ -2055,6 +2065,16 @@ class SSHConnection():
self
.
htmlFile
.
write
(
' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID </td>
\n
'
)
self
.
htmlFile
.
write
(
' <td>'
+
self
.
eNBCommitID
+
'</td>
\n
'
)
self
.
htmlFile
.
write
(
' </tr>
\n
'
)
if
self
.
eNB_AllowMerge
!=
''
:
commit_message
=
subprocess
.
check_output
(
"git log -n1 --pretty=format:
\"
%s
\"
"
+
self
.
eNBCommitID
,
shell
=
True
,
universal_newlines
=
True
)
commit_message
=
commit_message
.
strip
()
self
.
htmlFile
.
write
(
' <tr>
\n
'
)
if
(
self
.
eNB_AllowMerge
):
self
.
htmlFile
.
write
(
' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-comment"></span> Source Commit Message </td>
\n
'
)
else
:
self
.
htmlFile
.
write
(
' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-comment"></span> Commit Message </td>
\n
'
)
self
.
htmlFile
.
write
(
' <td>'
+
commit_message
+
'</td>
\n
'
)
self
.
htmlFile
.
write
(
' </tr>
\n
'
)
if
(
self
.
eNB_AllowMerge
):
self
.
htmlFile
.
write
(
' <tr>
\n
'
)
self
.
htmlFile
.
write
(
' <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-log-in"></span> Target Branch </td>
\n
'
)
...
...
ci-scripts/runTestOnVM.sh
View file @
544d80c4
...
...
@@ -317,11 +317,18 @@ function install_epc_on_vm {
echo
"############################################################"
echo
"Creating test EPC VM (
$LOC_EPC_VM_NAME
) on Ubuntu Cloud Image base"
echo
"############################################################"
acquire_vm_create_lock
uvt-kvm create
$LOC_EPC_VM_NAME
release
=
xenial
--unsafe-caching
echo
"Waiting for VM to be started"
uvt-kvm
wait
$LOC_EPC_VM_NAME
--insecure
release_vm_create_lock
else
echo
"Waiting for VM to be started"
uvt-kvm
wait
$LOC_EPC_VM_NAME
--insecure
fi
uvt-kvm
wait
$LOC_EPC_VM_NAME
--insecure
local
LOC_EPC_VM_IP_ADDR
=
`
uvt-kvm ip
$LOC_EPC_VM_NAME
`
echo
"
$LOC_EPC_VM_NAME
has for IP addr =
$LOC_EPC_VM_IP_ADDR
"
scp
-o
StrictHostKeyChecking
=
no /etc/apt/apt.conf.d/01proxy ubuntu@
$LOC_EPC_VM_IP_ADDR
:/home/ubuntu
...
...
common/utils/T/tracer/gui/notify.c
View file @
544d80c4
...
...
@@ -46,7 +46,7 @@ void unregister_notifier(gui *_g, unsigned long notifier_id) {
if
(
g
->
notifiers
[
i
].
id
==
notifier_id
)
break
;
if
(
i
==
g
->
notifiers_count
)
ERR
(
"%s:%d: notifier_id %l
d
not found
\n
"
,
__FILE__
,
__LINE__
,
notifier_id
);
ERR
(
"%s:%d: notifier_id %l
u
not found
\n
"
,
__FILE__
,
__LINE__
,
notifier_id
);
free
(
g
->
notifiers
[
i
].
notification
);
memmove
(
g
->
notifiers
+
i
,
g
->
notifiers
+
i
+
1
,
...
...
common/utils/T/tracer/textlog.c
View file @
544d80c4
...
...
@@ -195,5 +195,8 @@ int main(int n, char **v)
handle_event
(
h
,
e
);
}
free
(
on_off_name
);
free
(
on_off_action
);
return
0
;
}
common/utils/T/tracer/utils.c
View file @
544d80c4
...
...
@@ -273,6 +273,6 @@ void PUTX2(OBUF *o, int i) {
void
PUTUL
(
OBUF
*
o
,
unsigned
long
l
)
{
char
s
[
128
];
sprintf
(
s
,
"%l
d
"
,
l
);
sprintf
(
s
,
"%l
u
"
,
l
);
PUTS
(
o
,
s
);
}
openair1/PHY/TOOLS/lte_phy_scope_tm4.c
View file @
544d80c4
...
...
@@ -812,9 +812,6 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
free
(
bit1
);
free
(
bit_pdcch
);
free
(
llr_pdcch
);
for
(
arx
=
0
;
arx
<
nb_antennas_rx
;
arx
++
)
{
free
(
chest_t_abs
[
arx
]);
}
//This is done to avoid plotting old data when TB0 is disabled, and TB1 is mapped onto CW0
/*if (phy_vars_ue->transmission_mode[eNB_id]==3 && phy_vars_ue->transmission_mode[eNB_id]==4){
...
...
openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
View file @
544d80c4
This source diff could not be displayed because it is too large. You can
view the blob
instead.
openair2/LAYER2/MAC/eNB_scheduler_fairRR.c
View file @
544d80c4
...
...
@@ -295,7 +295,8 @@ void dlsch_scheduler_pre_ue_select_fairRR(
CC_id
,
UE_id
,
subframeP
,
S_DL_NONE
);
S_DL_NONE
,
rnti
);
end_flag
[
CC_id
]
=
1
;
break
;
}
...
...
@@ -418,7 +419,8 @@ void dlsch_scheduler_pre_ue_select_fairRR(
CC_id
,
UE_id
,
subframeP
,
S_DL_NONE
);
S_DL_NONE
,
rnti
);
end_flag
[
CC_id
]
=
1
;
break
;
}
...
...
@@ -541,7 +543,8 @@ void dlsch_scheduler_pre_ue_select_fairRR(
CC_id
,
UE_id
,
subframeP
,
S_DL_NONE
);
S_DL_NONE
,
rnti
);
end_flag
[
CC_id
]
=
1
;
break
;
}
...
...
@@ -810,7 +813,8 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
unsigned
char
ta_len
=
0
;
unsigned
char
sdu_lcids
[
NB_RB_MAX
],
lcid
,
offset
,
num_sdus
=
0
;
uint16_t
nb_rb
,
nb_rb_temp
,
nb_available_rb
;
uint16_t
TBS
,
j
,
sdu_lengths
[
NB_RB_MAX
],
rnti
,
padding
=
0
,
post_padding
=
0
;
uint16_t
TBS
,
j
,
sdu_lengths
[
NB_RB_MAX
],
padding
=
0
,
post_padding
=
0
;
rnti_t
rnti
=
0
;
unsigned
char
dlsch_buffer
[
MAX_DLSCH_PAYLOAD_BYTES
];
unsigned
char
round
=
0
;
unsigned
char
harq_pid
=
0
;
...
...
@@ -1216,8 +1220,11 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
}
add_ue_dlsch_info
(
module_idP
,
CC_id
,
UE_id
,
subframeP
,
S_DL_SCHEDULED
);
CC_id
,
UE_id
,
subframeP
,
S_DL_SCHEDULED
,
rnti
);
//eNB_UE_stats->dlsch_trials[round]++;
UE_list
->
eNB_UE_stats
[
CC_id
][
UE_id
].
num_retransmission
+=
1
;
...
...
@@ -1679,10 +1686,10 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
if
(
opt_enabled
==
1
)
{
trace_pdu
(
DIRECTION_DOWNLINK
,
(
uint8_t
*
)
UE_list
->
DLSCH_pdu
[
CC_id
][
0
][
UE_id
].
payload
[
0
],
TBS
,
module_idP
,
WS_RA_RNTI
,
UE_RNTI
(
module_idP
,
UE_id
),
TBS
,
module_idP
,
WS_RA_RNTI
,
UE_RNTI
(
module_idP
,
UE_id
),
eNB
->
frame
,
eNB
->
subframe
,
0
,
0
);
LOG_D
(
OPT
,
"[eNB %d][DLSCH] CC_id %d Frame %d rnti %x with size %d
\n
"
,
module_idP
,
CC_id
,
frameP
,
UE_RNTI
(
module_idP
,
UE_id
),
TBS
);
module_idP
,
CC_id
,
frameP
,
UE_RNTI
(
module_idP
,
UE_id
),
TBS
);
}
T
(
T_ENB_MAC_UE_DL_PDU_WITH_DATA
,
T_INT
(
module_idP
),
T_INT
(
CC_id
),
T_INT
(
rnti
),
T_INT
(
frameP
),
T_INT
(
subframeP
),
...
...
@@ -1692,7 +1699,8 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
CC_id
,
UE_id
,
subframeP
,
S_DL_SCHEDULED
);
S_DL_SCHEDULED
,
rnti
);
// store stats
eNB
->
eNB_stats
[
CC_id
].
dlsch_bytes_tx
+=
sdu_length_total
;
eNB
->
eNB_stats
[
CC_id
].
dlsch_pdus_tx
+=
1
;
...
...
openair2/LAYER2/MAC/eNB_scheduler_primitives.c
View file @
544d80c4
This diff is collapsed.
Click to expand it.
openair2/LAYER2/MAC/mac_proto.h
View file @
544d80c4
...
...
@@ -441,7 +441,7 @@ void init_ue_sched_info(void);
void
add_ue_ulsch_info
(
module_id_t
module_idP
,
int
CC_id
,
int
UE_id
,
sub_frame_t
subframe
,
UE_ULSCH_STATUS
status
);
void
add_ue_dlsch_info
(
module_id_t
module_idP
,
int
CC_id
,
int
UE_id
,
sub_frame_t
subframe
,
UE_DLSCH_STATUS
status
);
sub_frame_t
subframe
,
UE_DLSCH_STATUS
status
,
rnti_t
rnti
);
int
find_UE_id
(
module_id_t
module_idP
,
rnti_t
rnti
);
int
find_RA_id
(
module_id_t
mod_idP
,
int
CC_idP
,
rnti_t
rntiP
);
rnti_t
UE_RNTI
(
module_id_t
module_idP
,
int
UE_id
);
...
...
@@ -1209,7 +1209,6 @@ void fill_nfapi_dlsch_config(eNB_MAC_INST * eNB,
void
fill_nfapi_harq_information
(
module_id_t
module_idP
,
int
CC_idP
,
uint16_t
rntiP
,
uint16_t
absSFP
,
nfapi_ul_config_harq_information
*
harq_information
,
uint8_t
cce_idxP
);
...
...
@@ -1223,7 +1222,8 @@ void fill_nfapi_ulsch_harq_information(module_id_t module_idP,
uint16_t
fill_nfapi_uci_acknak
(
module_id_t
module_idP
,
int
CC_idP
,
uint16_t
rntiP
,
uint16_t
absSFP
,
uint8_t
cce_idxP
);
uint16_t
absSFP
,
uint8_t
cce_idxP
);
void
fill_nfapi_dl_dci_1A
(
nfapi_dl_config_request_pdu_t
*
dl_config_pdu
,
uint8_t
aggregation_level
,
...
...
openair2/LAYER2/MAC/pre_processor.c
View file @
544d80c4
...
...
@@ -460,7 +460,12 @@ void decode_slice_positioning(module_id_t Mod_idP,
// This fuction sorts the UE in order their dlsch buffer and CQI
void
sort_UEs
(
module_id_t
Mod_idP
,
int
slice_idx
,
int
frameP
,
sub_frame_t
subframeP
)
{
void
sort_UEs
(
module_id_t
Mod_idP
,
int
slice_idx
,
int
frameP
,
sub_frame_t
subframeP
)
{
int
i
;
int
list
[
MAX_MOBILES_PER_ENB
];
int
list_size
=
0
;
...
...
@@ -468,16 +473,13 @@ void sort_UEs(module_id_t Mod_idP, int slice_idx, int frameP, sub_frame_t subfra
UE_list_t
*
UE_list
=
&
RC
.
mac
[
Mod_idP
]
->
UE_list
;
for
(
i
=
0
;
i
<
MAX_MOBILES_PER_ENB
;
i
++
)
{
if
(
UE_list
->
active
[
i
]
==
FALSE
)
continue
;
if
(
UE_RNTI
(
Mod_idP
,
i
)
==
NOT_A_RNTI
)
continue
;
if
(
UE_list
->
UE_sched_ctrl
[
i
].
ul_out_of_sync
==
1
)
continue
;
if
(
!
ue_dl_slice_membership
(
Mod_idP
,
i
,
slice_idx
))
continue
;
list
[
list_size
]
=
i
;
list_size
++
;
if
(
UE_list
->
active
[
i
]
==
TRUE
&&
UE_RNTI
(
Mod_idP
,
i
)
!=
NOT_A_RNTI
&&
UE_list
->
UE_sched_ctrl
[
i
].
ul_out_of_sync
!=
1
&&
ue_dl_slice_membership
(
Mod_idP
,
i
,
slice_idx
))
{
list
[
list_size
++
]
=
i
;
}
}
decode_sorting_policy
(
Mod_idP
,
slice_idx
);
...
...
@@ -1170,12 +1172,15 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
uint8_t
CC_id
;
uint16_t
i
,
j
;
int
min_rb_unit
[
NFAPI_CC_MAX
];
slice_info_t
*
sli
=
&
RC
.
mac
[
Mod_id
]
->
slice_info
;
eNB_MAC_INST
*
eNB
=
RC
.
mac
[
Mod_id
];
slice_info_t
*
sli
=
&
eNB
->
slice_info
;
uint16_t
(
*
nb_rbs_required
)[
MAX_MOBILES_PER_ENB
]
=
sli
->
pre_processor_results
[
slice_idx
].
nb_rbs_required
;
uint16_t
(
*
nb_rbs_accounted
)[
MAX_MOBILES_PER_ENB
]
=
sli
->
pre_processor_results
[
slice_idx
].
nb_rbs_accounted
;
uint16_t
(
*
nb_rbs_remaining
)[
MAX_MOBILES_PER_ENB
]
=
sli
->
pre_processor_results
[
slice_idx
].
nb_rbs_remaining
;
uint8_t
(
*
MIMO_mode_indicator
)[
N_RBG_MAX
]
=
sli
->
pre_processor_results
[
slice_idx
].
MIMO_mode_indicator
;
UE_list_t
*
UE_list
=
&
RC
.
mac
[
Mod_id
]
->
UE_list
;
UE_list_t
*
UE_list
=
&
eNB
->
UE_list
;
UE_sched_ctrl
*
ue_sched_ctl
;
// int rrc_status = RRC_IDLE;
#ifdef TM5
...
...
@@ -1191,7 +1196,10 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
// Initialize scheduling information for all active UEs
memset
(
&
sli
->
pre_processor_results
[
slice_idx
],
0
,
sizeof
(
sli
->
pre_processor_results
[
slice_idx
]));
// FIXME: After the memset above, some of the resets in reset() are redundant
dlsch_scheduler_pre_processor_reset
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
,
dlsch_scheduler_pre_processor_reset
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
,
min_rb_unit
,
nb_rbs_required
,
rballoc_sub
,
...
...
@@ -1199,20 +1207,38 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
mbsfn_flag
);
// FIXME: Not sure if useful
// STATUS
// Store the DLSCH buffer for each logical channel
store_dlsch_buffer
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
);
store_dlsch_buffer
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
);
// Calculate the number of RBs required by each UE on the basis of logical channel's buffer
assign_rbs_required
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
,
nb_rbs_required
,
min_rb_unit
);
assign_rbs_required
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
,
nb_rbs_required
,
min_rb_unit
);
// Sorts the user on the basis of dlsch logical channel buffer and CQI
sort_UEs
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
);
sort_UEs
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
);
// ACCOUNTING
// This procedure decides the number of RBs to allocate
dlsch_scheduler_pre_processor_accounting
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
,
dlsch_scheduler_pre_processor_accounting
(
Mod_id
,
slice_idx
,
frameP
,
subframeP
,
min_rb_unit
,
nb_rbs_required
,
nb_rbs_accounted
);
// POSITIONING
// This procedure does the main allocation of the RBs
dlsch_scheduler_pre_processor_positioning
(
Mod_id
,
slice_idx
,
dlsch_scheduler_pre_processor_positioning
(
Mod_id
,
slice_idx
,
min_rb_unit
,
nb_rbs_required
,
nb_rbs_accounted
,
...
...
@@ -1222,8 +1248,9 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
// SHARING
// If there are available RBs left in the slice, allocate them to the highest priority UEs
if
(
RC
.
mac
[
Mod_id
]
->
slice_info
.
intraslice_share_active
)
{
dlsch_scheduler_pre_processor_intraslice_sharing
(
Mod_id
,
slice_idx
,
if
(
eNB
->
slice_info
.
intraslice_share_active
)
{
dlsch_scheduler_pre_processor_intraslice_sharing
(
Mod_id
,
slice_idx
,
min_rb_unit
,
nb_rbs_required
,
nb_rbs_accounted
,
...
...
@@ -1236,7 +1263,7 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
// This has to be revisited!!!!
for
(
CC_id
=
0
;
CC_id
<
RC
.
nb_mac_CC
[
Mod_id
];
CC_id
++
)
{
COMMON_channels_t
*
cc
=
&
RC
.
mac
[
Mod_id
]
->
common_channels
[
CC_id
];
COMMON_channels_t
*
cc
=
&
eNB
->
common_channels
[
CC_id
];
int
N_RBG
=
to_rbg
(
cc
->
mib
->
message
.
dl_Bandwidth
);
i1
=
0
;
i2
=
0
;
...
...
@@ -1244,35 +1271,25 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
for
(
j
=
0
;
j
<
N_RBG
;
j
++
)
{
if
(
MIMO_mode_indicator
[
CC_id
][
j
]
==
2
)
{
i1
=
i1
+
1
;
i1
++
;
}
else
if
(
MIMO_mode_indicator
[
CC_id
][
j
]
==
1
)
{
i2
=
i2
+
1
;
i2
++
;
}
else
if
(
MIMO_mode_indicator
[
CC_id
][
j
]
==
0
)
{
i3
=
i3
+
1
;
i3
++
;
}
}
if
((
i1
<
N_RBG
)
&&
(
i2
>
0
)
&&
(
i3
==
0
))
{
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_SUMIMO_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_SUMIMO_transmissions
+
1
;
if
(
i1
<
N_RBG
)
{
if
(
i2
>
0
&&
i3
==
0
)
{
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_SUMIMO_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_SUMIMO_transmissions
+
1
;
}
else
if
(
i3
>
0
)
{
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_MUMIMO_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_MUMIMO_transmissions
+
1
;
}
if
(
i3
==
N_RBG
&&
i1
==
0
&&
i2
==
0
)
{
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
FULL_MUMIMO_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
FULL_MUMIMO_transmissions
+
1
;
}
else
if
(
i3
==
N_RBG
&&
i1
==
0
&&
i2
==
0
)
{
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
FULL_MUMIMO_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
FULL_MUMIMO_transmissions
+
1
;
}
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_total_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_total_transmissions
+
1
;
if
((
i1
<
N_RBG
)
&&
(
i3
>
0
))
{
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_MUMIMO_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_MUMIMO_transmissions
+
1
;
}
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_total_transmissions
=
PHY_vars_eNB_g
[
Mod_id
][
CC_id
]
->
check_for_total_transmissions
+
1
;
}
#endif
...
...
@@ -1283,22 +1300,30 @@ dlsch_scheduler_pre_processor(module_id_t Mod_id,
for
(
i
=
0
;
i
<
UE_num_active_CC
(
UE_list
,
UE_id
);
i
++
)
{
CC_id
=
UE_list
->
ordered_CCids
[
i
][
UE_id
];
//PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].dl_pow_off = dl_pow_off[UE_id];
COMMON_channels_t
*
cc
=
&
RC
.
mac
[
Mod_id
]
->
common_channels
[
CC_id
];
COMMON_channels_t
*
cc
=
&
eNB
->
common_channels
[
CC_id
];
int
N_RBG
=
to_rbg
(
cc
->
mib
->
message
.
dl_Bandwidth
);
if
(
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]
>
0
)
{
LOG_D
(
MAC
,
"******************DL Scheduling Information for UE%d ************************
\n
"
,
UE_id
);
LOG_D
(
MAC
,
"dl power offset UE%d = %d
\n
"
,
UE_id
,
ue_sched_ctl
->
dl_pow_off
[
CC_id
]);
LOG_D
(
MAC
,
"***********RB Alloc for every subband for UE%d ***********
\n
"
,
UE_id
);
LOG_D
(
MAC
,
"******************DL Scheduling Information for UE%d ************************
\n
"
,
UE_id
);
LOG_D
(
MAC
,
"dl power offset UE%d = %d
\n
"
,
UE_id
,
ue_sched_ctl
->
dl_pow_off
[
CC_id
]);
LOG_D
(
MAC
,
"***********RB Alloc for every subband for UE%d ***********
\n
"
,
UE_id
);
for
(
j
=
0
;
j
<
N_RBG
;
j
++
)
{
//PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].rballoc_sub[UE_id] = rballoc_sub_UE[CC_id][UE_id][UE_id];
LOG_D
(
MAC
,
"RB Alloc for UE%d and Subband%d = %d
\n
"
,
UE_id
,
j
,
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
j
]);
LOG_D
(
MAC
,
"RB Alloc for UE%d and Subband%d = %d
\n
"
,
UE_id
,
j
,
ue_sched_ctl
->
rballoc_sub_UE
[
CC_id
][
j
]);
}
//PHY_vars_eNB_g[Mod_id]->mu_mimo_mode[UE_id].pre_nb_available_rbs = pre_nb_available_rbs[CC_id][UE_id];
LOG_D
(
MAC
,
"[eNB %d][SLICE %d]Total RBs allocated for UE%d = %d
\n
"
,
Mod_id
,
RC
.
mac
[
Mod_id
]
->
slice_info
.
dl
[
slice_idx
].
id
,
UE_id
,
Mod_id
,
eNB
->
slice_info
.
dl
[
slice_idx
].
id
,
UE_id
,
ue_sched_ctl
->
pre_nb_available_rbs
[
CC_id
]);
}
}
...
...
openair3/S1AP/s1ap_eNB_trace.c
View file @
544d80c4
...
...
@@ -107,7 +107,7 @@ int s1ap_eNB_handle_trace_start(uint32_t assoc_id,
{
S1AP_TraceStart_t
*
container
;
S1AP_TraceStartIEs_t
*
ie
;
struct
s1ap_eNB_ue_context_s
*
ue_desc_p
;
struct
s1ap_eNB_ue_context_s
*
ue_desc_p
=
NULL
;
struct
s1ap_eNB_mme_data_s
*
mme_ref_p
;
DevAssert
(
pdu
!=
NULL
);
...
...
openair3/TEST/EPC_TEST/generate_scenario.c
View file @
544d80c4
...
...
@@ -270,7 +270,7 @@ static void enb_config_display(void)
printf
(
" ENB CONFIG FILE CONTENT LOADED:
\n
"
);
printf
(
"----------------------------------------------------------------------
\n
"
);
for
(
i
=
0
;
i
<
g_enb_properties
.
number
;
i
++
)
{
printf
(
"ENB CONFIG for instance %
u
:
\n\n
"
,
i
);
printf
(
"ENB CONFIG for instance %
d
:
\n\n
"
,
i
);
printf
(
"
\t
eNB name:
\t
%s
\n
"
,
g_enb_properties
.
properties
[
i
]
->
eNB_name
);
printf
(
"
\t
eNB ID:
\t
%"
PRIu32
"
\n
"
,
g_enb_properties
.
properties
[
i
]
->
eNB_id
);
printf
(
"
\t
Cell type:
\t
%s
\n
"
,
g_enb_properties
.
properties
[
i
]
->
cell_type
==
CELL_MACRO_ENB
?
"CELL_MACRO_ENB"
:
"CELL_HOME_ENB"
);
...
...
openair3/TEST/EPC_TEST/play_scenario.c
View file @
544d80c4
...
...
@@ -1103,7 +1103,7 @@ et_config_parse_opt_line (
fprintf
(
stderr
,
"Please provide a valid -D/--delay-on-exit argument, %s is not a valid value
\n
"
,
delay_on_exit
);
exit
(
1
);
}
printf
(
"Delay on exit is %
u
\n
"
,
delay_on_exit
);
printf
(
"Delay on exit is %
d
\n
"
,
(
int
)
delay_on_exit
);
}
break
;
...
...
targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
View file @
544d80c4
...
...
@@ -28,7 +28,12 @@
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <uhd/version.hpp>
#if UHD_VERSION < 3110000
#include <uhd/utils/thread_priority.hpp>
#else
#include <uhd/utils/thread.hpp>
#endif
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/version.hpp>
#include <boost/lexical_cast.hpp>
...
...
@@ -183,7 +188,7 @@ static int sync_to_gps(openair0_device *device) {
num_gps_locked
++
;
std
::
cout
<<
boost
::
format
(
"GPS Locked
\n
"
);
}
else
{
std
::
cerr
<<
"WARNING: GPS not locked - time will not be accurate until locked"
<<
std
::
endl
;
LOG_W
(
HW
,
"WARNING: GPS not locked - time will not be accurate until locked
\n
"
)
;
}
//Set to GPS time
...
...
@@ -724,6 +729,7 @@ void *freq_thread(void *arg) {
usrp_state_t
*
s
=
(
usrp_state_t
*
)
device
->
priv
;
s
->
usrp
->
set_tx_freq
(
device
->
openair0_cfg
[
0
].
tx_freq
[
0
]);
s
->
usrp
->
set_rx_freq
(
device
->
openair0_cfg
[
0
].
rx_freq
[
0
]);
return
NULL
;
}
/*! \brief Set frequencies (TX/RX). Spawns a thread to handle the frequency change to not block the calling thread
* \param device the hardware to use
...
...
@@ -1073,16 +1079,16 @@ extern "C" {
uhd
::
device_addrs_t
device_adds
=
uhd
::
device
::
find
(
args
);
if
(
device_adds
.
size
()
==
0
)
{
std
::
cerr
<<
"No USRP Device Found. "
<<
std
::
endl
;
LOG_E
(
HW
,
"No USRP Device Found.
\n
"
)
;
free
(
s
);
return
-
1
;
}
else
if
(
device_adds
.
size
()
>
1
)
{
std
::
cerr
<<
"More than one USRP Device Found. Please specify device more precisely in config file."
<<
std
::
endl
;
LOG_E
(
HW
,
"More than one USRP Device Found. Please specify device more precisely in config file.
\n
"
)
;
free
(
s
);
return
-
1
;
}
std
::
cerr
<<
"Found USRP "
<<
device_adds
[
0
].
get
(
"type"
)
<<
"
\n
"
;
LOG_I
(
HW
,
"Found USRP %s
\n
"
,
device_adds
[
0
].
get
(
"type"
).
c_str
())
;
double
usrp_master_clock
;
if
(
device_adds
[
0
].
get
(
"type"
)
==
"b200"
)
{
...
...
@@ -1090,7 +1096,7 @@ extern "C" {
device
->
type
=
USRP_B200_DEV
;
usrp_master_clock
=
30.72e6
;
args
+=
boost
::
str
(
boost
::
format
(
",master_clock_rate=%f"
)
%
usrp_master_clock
);
args
+=
",num_send_frames=256,num_recv_frames=256, send_frame_size=
15360, recv_frame_size=1536
0"
;
args
+=
",num_send_frames=256,num_recv_frames=256, send_frame_size=
7680, recv_frame_size=768
0"
;
}
if
(
device_adds
[
0
].
get
(
"type"
)
==
"n3xx"
)
{
...
...
@@ -1287,8 +1293,9 @@ extern "C" {
samples
/=
10000
;
LOG_I
(
PHY
,
"RF board max packet size %u, size for 100µs jitter %d
\n
"
,
max
,
samples
);
if
(
samples
<
max
)
if
(
samples
<
max
)
{
stream_args_rx
.
args
[
"spp"
]
=
str
(
boost
::
format
(
"%d"
)
%
samples
);
}
LOG_I
(
PHY
,
"rx_max_num_samps %zu
\n
"
,
s
->
usrp
->
get_rx_stream
(
stream_args_rx
)
->
get_max_num_samps
());
...
...
targets/RT/USER/lte-ru.c
View file @
544d80c4
/*******************************************************************************
OpenAirInterface
Copyright(c) 1999 - 2014 Eurecom
OpenAirInterface is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenAirInterface is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenAirInterface.The full GNU General Public License is
included in this distribution in the file called "COPYING". If not,
see <http://www.gnu.org/licenses/>.
Contact Information
OpenAirInterface Admin: openair_admin@eurecom.fr
OpenAirInterface Tech : openair_tech@eurecom.fr
OpenAirInterface Dev : openair4g-devel@lists.eurecom.fr
Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
*******************************************************************************/
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file lte-enb.c
* \brief Top-level threads for eNodeB
...
...
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