streamline embms parameters and fix MCS selection

master
Andre Puschmann 6 years ago
parent c4bc151e14
commit e60a4490d2

@ -142,6 +142,18 @@ enable = false
pusch_max_mcs = 16 pusch_max_mcs = 16
nof_ctrl_symbols = 3 nof_ctrl_symbols = 3
#####################################################################
# eMBMS configuration options
#
# enable: Enable MBMS transmission in the eNB
# m1u_multiaddr: Multicast addres the M1-U socket will register to
# m1u_if_addr: Address of the inteferface the M1-U interface will listen for multicast packets.
#
#####################################################################
#enable = false
#m1u_multiaddr = 239.255.0.1
#m1u_if_addr = 127.0.1.201
##################################################################### #####################################################################
# Expert configuration options # Expert configuration options
# #
@ -156,9 +168,6 @@ nof_ctrl_symbols = 3
# link_failure_nof_err: Number of PUSCH failures after which a radio-link failure is triggered. # link_failure_nof_err: Number of PUSCH failures after which a radio-link failure is triggered.
# a link failure is when SNR<0 and CRC=KO # a link failure is when SNR<0 and CRC=KO
# max_prach_offset_us: Maximum allowed RACH offset (in us) # max_prach_offset_us: Maximum allowed RACH offset (in us)
# enable_mbsfn: Enable MBMS transmission in the eNB
# m1u_multiaddr: Multicast addres the M1-U socket will register to
# m1u_if_addr: Address of the inteferface the M1-U interface will listen for multicast packets.
# eea_pref_list: Ordered preference list for the selection of encryption algorithm (EEA) (default: EEA0, EEA2, EEA1). # eea_pref_list: Ordered preference list for the selection of encryption algorithm (EEA) (default: EEA0, EEA2, EEA1).
# eia_pref_list: Ordered preference list for the selection of integrity algorithm (EIA) (default: EIA2, EIA1, EIA0). # eia_pref_list: Ordered preference list for the selection of integrity algorithm (EIA) (default: EIA2, EIA1, EIA0).
# #
@ -175,8 +184,5 @@ nof_ctrl_symbols = 3
#link_failure_nof_err = 50 #link_failure_nof_err = 50
#rrc_inactivity_timer = 60000 #rrc_inactivity_timer = 60000
#max_prach_offset_us = 30 #max_prach_offset_us = 30
#enable_mbsfn = false
#m1u_multiaddr = 239.255.0.1
#m1u_if_addr = 127.0.1.201
#eea_pref_list = EEA0, EEA2, EEA1 #eea_pref_list = EEA0, EEA2, EEA1
#eia_pref_list = EIA2, EIA1, EIA0 #eia_pref_list = EIA2, EIA1, EIA0

@ -92,10 +92,7 @@ struct general_args_t {
float metrics_period_secs; float metrics_period_secs;
bool metrics_csv_enable; bool metrics_csv_enable;
std::string metrics_csv_filename; std::string metrics_csv_filename;
bool enable_mbsfn;
bool print_buffer_state; bool print_buffer_state;
std::string m1u_multiaddr;
std::string m1u_if_addr;
std::string eia_pref_list; std::string eia_pref_list;
std::string eea_pref_list; std::string eea_pref_list;
}; };

@ -130,10 +130,10 @@ private:
phy_interface_stack_lte::phy_cfg_mbsfn_t mbsfn; phy_interface_stack_lte::phy_cfg_mbsfn_t mbsfn;
bool sib13_configured; bool sib13_configured;
bool mcch_configured; bool mcch_configured;
uint8_t mch_table[40]; uint8_t mch_table[40] = {};
uint8_t mcch_table[10]; uint8_t mcch_table[10] = {};
uint32_t mch_period_stop; uint32_t mch_period_stop;
uint8_t mch_sf_idx_lut[10]; uint8_t mch_sf_idx_lut[10] = {};
bool is_mch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti); bool is_mch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti);
bool is_mcch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti); bool is_mcch_subframe(srslte_mbsfn_cfg_t* cfg, uint32_t phy_tti);

@ -32,10 +32,10 @@ typedef struct {
} pcap_args_t; } pcap_args_t;
typedef struct { typedef struct {
bool enable_mbsfn; bool enable;
std::string m1u_multiaddr; std::string m1u_multiaddr;
std::string m1u_if_addr; std::string m1u_if_addr;
} stack_expert_args_t; } embms_args_t;
typedef struct { typedef struct {
std::string mac_level; std::string mac_level;
@ -58,7 +58,7 @@ typedef struct {
s1ap_args_t s1ap; s1ap_args_t s1ap;
pcap_args_t pcap; pcap_args_t pcap;
stack_log_args_t log; stack_log_args_t log;
stack_expert_args_t expert; embms_args_t embms;
} stack_args_t; } stack_args_t;
struct stack_metrics_t; struct stack_metrics_t;

@ -194,7 +194,7 @@ int enb::parse_args(const all_args_t& args_)
} }
rrc_cfg.inactivity_timeout_ms = args.general.rrc_inactivity_timer; rrc_cfg.inactivity_timeout_ms = args.general.rrc_inactivity_timer;
rrc_cfg.enable_mbsfn = args.general.enable_mbsfn; rrc_cfg.enable_mbsfn = args.stack.embms.enable;
// Check number of control symbols // Check number of control symbols
if (cell_cfg.nof_prb < 50 && args.stack.mac.sched.nof_ctrl_symbols != 3) { if (cell_cfg.nof_prb < 50 && args.stack.mac.sched.nof_ctrl_symbols != 3) {

@ -661,7 +661,7 @@ int enb::parse_sibs(all_args_t* args, rrc_cfg_t* rrc_cfg, phy_cfg_t* phy_config_
} }
// Update MBSFN list counter. Only 1 supported // Update MBSFN list counter. Only 1 supported
if (not args->general.enable_mbsfn) { if (not args->stack.embms.enable) {
sib2->mbsfn_sf_cfg_list_present = false; sib2->mbsfn_sf_cfg_list_present = false;
sib2->mbsfn_sf_cfg_list.resize(0); sib2->mbsfn_sf_cfg_list.resize(0);
} else { } else {

@ -145,12 +145,14 @@ void parse_args(all_args_t *args, int argc, char* argv[]) {
("expert.equalizer_mode", bpo::value<string>(&args->phy.equalizer_mode)->default_value("mmse"), "Equalizer mode") ("expert.equalizer_mode", bpo::value<string>(&args->phy.equalizer_mode)->default_value("mmse"), "Equalizer mode")
("expert.estimator_fil_w", bpo::value<float>(&args->phy.estimator_fil_w)->default_value(0.1), "Chooses the coefficients for the 3-tap channel estimator centered filter.") ("expert.estimator_fil_w", bpo::value<float>(&args->phy.estimator_fil_w)->default_value(0.1), "Chooses the coefficients for the 3-tap channel estimator centered filter.")
("expert.rrc_inactivity_timer", bpo::value<uint32_t>(&args->general.rrc_inactivity_timer)->default_value(60000), "Inactivity timer in ms") ("expert.rrc_inactivity_timer", bpo::value<uint32_t>(&args->general.rrc_inactivity_timer)->default_value(60000), "Inactivity timer in ms")
("expert.enable_mbsfn", bpo::value<bool>(&args->general.enable_mbsfn)->default_value(false), "Enables MBMS in the eNB")
("expert.print_buffer_state", bpo::value<bool>(&args->general.print_buffer_state)->default_value(false), "Prints on the console the buffer state every 10 seconds") ("expert.print_buffer_state", bpo::value<bool>(&args->general.print_buffer_state)->default_value(false), "Prints on the console the buffer state every 10 seconds")
("expert.m1u_multiaddr", bpo::value<string>(&args->general.m1u_multiaddr)->default_value("239.255.0.1"), "M1-U Multicast address the eNB joins.")
("expert.m1u_if_addr", bpo::value<string>(&args->general.m1u_if_addr)->default_value("127.0.1.201"), "IP address of the interface the eNB will listen for M1-U traffic.")
("expert.eea_pref_list", bpo::value<string>(&args->general.eea_pref_list)->default_value("EEA0, EEA2, EEA1"), "Ordered preference list for the selection of encryption algorithm (EEA) (default: EEA0, EEA2, EEA1).") ("expert.eea_pref_list", bpo::value<string>(&args->general.eea_pref_list)->default_value("EEA0, EEA2, EEA1"), "Ordered preference list for the selection of encryption algorithm (EEA) (default: EEA0, EEA2, EEA1).")
("expert.eia_pref_list", bpo::value<string>(&args->general.eia_pref_list)->default_value("EIA2, EIA1, EIA0"), "Ordered preference list for the selection of integrity algorithm (EIA) (default: EIA2, EIA1, EIA0).") ("expert.eia_pref_list", bpo::value<string>(&args->general.eia_pref_list)->default_value("EIA2, EIA1, EIA0"), "Ordered preference list for the selection of integrity algorithm (EIA) (default: EIA2, EIA1, EIA0).")
// eMBMS section
("embms.enable", bpo::value<bool>(&args->stack.embms.enable)->default_value(false), "Enables MBMS in the eNB")
("embms.m1u_multiaddr", bpo::value<string>(&args->stack.embms.m1u_multiaddr)->default_value("239.255.0.1"), "M1-U Multicast address the eNB joins.")
("embms.m1u_if_addr", bpo::value<string>(&args->stack.embms.m1u_if_addr)->default_value("127.0.1.201"), "IP address of the interface the eNB will listen for M1-U traffic.")
; ;
// Positional options - config file location // Positional options - config file location
@ -261,7 +263,7 @@ void parse_args(all_args_t *args, int argc, char* argv[]) {
exit(1); exit(1);
} }
} }
if (args->general.enable_mbsfn) { if (args->stack.embms.enable) {
if (args->stack.mac.sched.nof_ctrl_symbols == 3) { if (args->stack.mac.sched.nof_ctrl_symbols == 3) {
fprintf(stderr, fprintf(stderr,
"nof_ctrl_symbols = %d, While using MBMS, please set number of control symbols to either 1 or 2, " "nof_ctrl_symbols = %d, While using MBMS, please set number of control symbols to either 1 or 2, "

@ -264,6 +264,9 @@ void phy::configure_mbsfn(sib_type2_s* sib2, sib_type13_r9_s* sib13, mcch_msg_s
} }
phy_rrc_config.mbsfn.mbsfn_subfr_cnfg = sib2->mbsfn_sf_cfg_list[0]; phy_rrc_config.mbsfn.mbsfn_subfr_cnfg = sib2->mbsfn_sf_cfg_list[0];
} }
} else {
fprintf(stderr, "SIB2 has no MBSFN subframe config specified\n");
return;
} }
phy_rrc_config.mbsfn.mbsfn_notification_cnfg = sib13->notif_cfg_r9; phy_rrc_config.mbsfn.mbsfn_notification_cnfg = sib13->notif_cfg_r9;

@ -264,12 +264,15 @@ void phy_common::build_mch_table()
ZERO_OBJECT(mcch_table); ZERO_OBJECT(mcch_table);
// 40 element table represents 4 frames (40 subframes) // 40 element table represents 4 frames (40 subframes)
uint32_t nof_sfs = 10; uint32_t nof_sfs = 0;
if (mbsfn.mbsfn_subfr_cnfg.sf_alloc.type().value == mbsfn_sf_cfg_s::sf_alloc_c_::types::one_frame) { if (mbsfn.mbsfn_subfr_cnfg.sf_alloc.type().value == mbsfn_sf_cfg_s::sf_alloc_c_::types::one_frame) {
generate_mch_table(&mch_table[0], (uint32_t)mbsfn.mbsfn_subfr_cnfg.sf_alloc.one_frame().to_number(), 1); generate_mch_table(&mch_table[0], (uint32_t)mbsfn.mbsfn_subfr_cnfg.sf_alloc.one_frame().to_number(), 1);
} else { nof_sfs = 10;
} else if (mbsfn.mbsfn_subfr_cnfg.sf_alloc.type().value == mbsfn_sf_cfg_s::sf_alloc_c_::types::four_frames) {
generate_mch_table(&mch_table[0], (uint32_t)mbsfn.mbsfn_subfr_cnfg.sf_alloc.four_frames().to_number(), 4); generate_mch_table(&mch_table[0], (uint32_t)mbsfn.mbsfn_subfr_cnfg.sf_alloc.four_frames().to_number(), 4);
nof_sfs = 40; nof_sfs = 40;
} else {
fprintf(stderr, "No valid SF alloc\n");
} }
// Debug // Debug
std::stringstream ss; std::stringstream ss;

@ -121,11 +121,11 @@ int enb_stack_lte::init(const stack_args_t& args_, const rrc_cfg_t& rrc_cfg_)
s1ap.init(args.s1ap, &rrc, &s1ap_log); s1ap.init(args.s1ap, &rrc, &s1ap_log);
gtpu.init(args.s1ap.gtp_bind_addr, gtpu.init(args.s1ap.gtp_bind_addr,
args.s1ap.mme_addr, args.s1ap.mme_addr,
args.expert.m1u_multiaddr, args.embms.m1u_multiaddr,
args.expert.m1u_if_addr, args.embms.m1u_if_addr,
&pdcp, &pdcp,
&gtpu_log, &gtpu_log,
args.expert.enable_mbsfn); args.embms.enable);
started = true; started = true;

@ -672,7 +672,7 @@ void mac::build_mch_sched(uint32_t tbs)
int last_mtch_stop = 0; int last_mtch_stop = 0;
if (total_bytes_to_tx >= total_space_avail_bytes) { if (total_bytes_to_tx > 0 && total_bytes_to_tx >= total_space_avail_bytes) {
for(uint32_t i = 0; i < mch.num_mtch_sched;i++){ for(uint32_t i = 0; i < mch.num_mtch_sched;i++){
double ratio = mch.mtch_sched[i].lcid_buffer_size/total_bytes_to_tx; double ratio = mch.mtch_sched[i].lcid_buffer_size/total_bytes_to_tx;
float assigned_sfs = floor(sfs_per_sched_period*ratio); float assigned_sfs = floor(sfs_per_sched_period*ratio);
@ -690,16 +690,14 @@ void mac::build_mch_sched(uint32_t tbs)
int mac::get_mch_sched(uint32_t tti, bool is_mcch, dl_sched_t* dl_sched_res) int mac::get_mch_sched(uint32_t tti, bool is_mcch, dl_sched_t* dl_sched_res)
{ {
log_h->step(tti); log_h->step(tti);
srslte_ra_tb_t mcs; srslte_ra_tb_t mcs = {};
srslte_ra_tb_t mcs_data; srslte_ra_tb_t mcs_data = {};
mcs.mcs_idx = this->sib13.mbsfn_area_info_list_r9[0].mcch_cfg_r9.sig_mcs_r9; mcs.mcs_idx = this->sib13.mbsfn_area_info_list_r9[0].mcch_cfg_r9.sig_mcs_r9.to_number();
mcs_data.mcs_idx = this->mcch.msg.c1().mbsfn_area_cfg_r9().pmch_info_list_r9[0].pmch_cfg_r9.data_mcs_r9; mcs_data.mcs_idx = this->mcch.msg.c1().mbsfn_area_cfg_r9().pmch_info_list_r9[0].pmch_cfg_r9.data_mcs_r9;
srslte_dl_fill_ra_mcs(&mcs, 0, this->cell_config.cell.nof_prb, false); srslte_dl_fill_ra_mcs(&mcs, 0, this->cell_config.cell.nof_prb, false);
srslte_dl_fill_ra_mcs(&mcs_data, 0, this->cell_config.cell.nof_prb, false); srslte_dl_fill_ra_mcs(&mcs_data, 0, this->cell_config.cell.nof_prb, false);
if (is_mcch) { if (is_mcch) {
build_mch_sched(mcs_data.tbs); build_mch_sched(mcs_data.tbs);
mch.mcch_payload = mcch_payload_buffer; mch.mcch_payload = mcch_payload_buffer;
mch.current_sf_allocation_num = 1; mch.current_sf_allocation_num = 1;

Loading…
Cancel
Save