/** * Copyright 2013-2021 Software Radio Systems Limited * * This file is part of srsLTE. * * srsLTE is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * srsLTE 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 Affero General Public License for more details. * * A copy of the GNU Affero General Public License can be found in * the LICENSE file in the top-level directory of this distribution * and at http://www.gnu.org/licenses/. * */ #ifndef SRSUE_MUX_BASE_H #define SRSUE_MUX_BASE_H #include "srsran/interfaces/mac_interface_types.h" namespace srsue { /** * @brief Common base class for UE MUX unit for 4G and 5G RAT * */ class mux_base { public: int setup_lcid(const srsran::logical_channel_config_t& config) { if (has_logical_channel(config.lcid)) { // update settings for (auto& channel : logical_channels) { if (channel.lcid == config.lcid) { channel = config; break; } } // warn user if there is another LCID with same prio for (auto& channel : logical_channels) { if (channel.priority == config.priority && channel.lcid != config.lcid) { srslog::fetch_basic_logger("MAC").error("LCID %d and %d have same priority.", channel.lcid, config.lcid); return SRSRAN_ERROR; } } } else { // add new entry logical_channels.push_back(config); } // sort according to priority (increasing is lower priority) std::sort(logical_channels.begin(), logical_channels.end(), priority_compare); return SRSRAN_SUCCESS; } void print_logical_channel_state(const std::string& info) { std::string logline = info; for (auto& channel : logical_channels) { logline += "\n"; logline += "- lcid="; logline += std::to_string(channel.lcid); logline += ", lcg="; logline += std::to_string(channel.lcg); logline += ", prio="; logline += std::to_string(channel.priority); logline += ", Bj="; logline += std::to_string(channel.Bj); logline += ", PBR="; logline += std::to_string(channel.PBR); logline += ", BSD="; logline += std::to_string(channel.BSD); logline += ", buffer_len="; logline += std::to_string(channel.buffer_len); logline += ", sched_len="; logline += std::to_string(channel.sched_len); } srslog::fetch_basic_logger("MAC").debug("%s", logline.c_str()); } protected: static bool priority_compare(const srsran::logical_channel_config_t& u1, const srsran::logical_channel_config_t& u2) { return u1.priority <= u2.priority; } bool has_logical_channel(const uint32_t& lcid) { for (auto& channel : logical_channels) { if (channel.lcid == lcid) { return true; } } return false; } std::vector logical_channels; }; } // namespace srsue #endif // SRSUE_MUX_BASE_H