/** * * \section COPYRIGHT * * Copyright 2013-2020 Software Radio Systems Limited * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the distribution. * */ #ifndef SRSENB_MAC_NR_H #define SRSENB_MAC_NR_H #include "srslte/common/block_queue.h" #include "srslte/common/logmap.h" #include "srslte/common/mac_nr_pcap.h" #include "srslte/mac/mac_nr_pdu.h" #include "srsenb/hdr/stack/enb_stack_base.h" #include "srslte/interfaces/enb_metrics_interface.h" #include "srslte/interfaces/gnb_interfaces.h" namespace srsenb { struct mac_nr_args_t { srsenb::pcap_args_t pcap; // params for the dummy user srsenb::sched_interface::sched_args_t sched; uint16_t rnti; uint32_t drb_lcid; // Add args std::string log_level; uint32_t log_hex_limit; uint32_t tb_size = 64; }; class mac_nr final : public mac_interface_phy_nr, public mac_interface_rrc_nr, public mac_interface_rlc_nr { public: mac_nr(); ~mac_nr(); int init(const mac_nr_args_t& args_, phy_interface_stack_nr* phy, stack_interface_mac* stack_, rlc_interface_mac_nr* rlc_, rrc_interface_mac_nr* rrc_); void stop(); void get_metrics(srsenb::mac_metrics_t& metrics); // MAC interface for RRC int cell_cfg(srsenb::sched_interface::cell_cfg_t* cell_cfg); int read_pdu_bcch_bch(uint8_t* payload); // MAC interface for RLC // TODO: int rlc_buffer_state(uint16_t rnti, uint32_t lc_id, uint32_t tx_queue, uint32_t retx_queue) { return 0; } // Interface for PHY int sf_indication(const uint32_t tti); int rx_data_indication(stack_interface_phy_nr::rx_data_ind_t& grant); void process_pdus(); private: void get_dl_config(const uint32_t tti, phy_interface_stack_nr::dl_config_request_t& config_request, phy_interface_stack_nr::tx_request_t& tx_request); // PDU processing int handle_pdu(srslte::unique_byte_buffer_t pdu); // Interaction with other components phy_interface_stack_nr* phy_h = nullptr; stack_interface_mac* stack_h = nullptr; rlc_interface_mac_nr* rlc_h = nullptr; rrc_interface_mac_nr* rrc_h = nullptr; std::unique_ptr pcap = nullptr; srslte::log_ref log_h; srslte::byte_buffer_pool* pool = nullptr; mac_nr_args_t args = {}; bool started = false; srsenb::sched_interface::cell_cfg_t cfg = {}; // BCH buffers struct sib_info_t { uint32_t index; uint32_t periodicity; srslte::unique_byte_buffer_t payload; }; std::vector bcch_dlsch_payload; srslte::unique_byte_buffer_t bcch_bch_payload = nullptr; // UE-specific buffer srslte::mac_nr_sch_pdu ue_tx_pdu; std::vector ue_tx_buffer; srslte::block_queue ue_rx_pdu_queue; ///< currently only DCH PDUs supported (add BCH, PCH, etc) srslte::unique_byte_buffer_t ue_rlc_buffer; srslte::mac_nr_sch_pdu ue_rx_pdu; }; } // namespace srsenb #endif // SRSENB_MAC_NR_H