/** * * \section COPYRIGHT * * Copyright 2013-2021 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 SRSEPC_S1AP_H #define SRSEPC_S1AP_H #include "mme_gtpc.h" #include "nas.h" #include "s1ap_ctx_mngmt_proc.h" #include "s1ap_erab_mngmt_proc.h" #include "s1ap_mngmt_proc.h" #include "s1ap_nas_transport.h" #include "s1ap_paging.h" #include "srsepc/hdr/hss/hss.h" #include "srsran/asn1/gtpc.h" #include "srsran/asn1/liblte_mme.h" #include "srsran/asn1/s1ap.h" #include "srsran/common/common.h" #include "srsran/common/s1ap_pcap.h" #include "srsran/common/standard_streams.h" #include "srsran/interfaces/epc_interfaces.h" #include "srsran/srslog/srslog.h" #include #include #include #include #include #include #include #include namespace srsepc { const uint16_t S1MME_PORT = 36412; using s1ap_pdu_t = asn1::s1ap::s1ap_pdu_c; class s1ap : public s1ap_interface_nas, public s1ap_interface_gtpc, public s1ap_interface_mme { public: static s1ap* get_instance(); static void cleanup(); int enb_listen(); int init(const s1ap_args_t& s1ap_args); void stop(); int get_s1_mme(); void delete_enb_ctx(int32_t assoc_id); bool s1ap_tx_pdu(const s1ap_pdu_t& pdu, struct sctp_sndrcvinfo* enb_sri); void handle_s1ap_rx_pdu(srsran::byte_buffer_t* pdu, struct sctp_sndrcvinfo* enb_sri); void handle_initiating_message(const asn1::s1ap::init_msg_s& msg, struct sctp_sndrcvinfo* enb_sri); void handle_successful_outcome(const asn1::s1ap::successful_outcome_s& msg); void activate_eps_bearer(uint64_t imsi, uint8_t ebi); void print_enb_ctx_info(const std::string& prefix, const enb_ctx_t& enb_ctx); uint32_t get_plmn(); uint16_t get_tac(); uint32_t get_next_mme_ue_s1ap_id(); enb_ctx_t* find_enb_ctx(uint16_t enb_id); void add_new_enb_ctx(const enb_ctx_t& enb_ctx, const struct sctp_sndrcvinfo* enb_sri); void get_enb_ctx(uint16_t sctp_stream); bool add_nas_ctx_to_imsi_map(nas* nas_ctx); bool add_nas_ctx_to_mme_ue_s1ap_id_map(nas* nas_ctx); bool add_ue_to_enb_set(int32_t enb_assoc, uint32_t mme_ue_s1ap_id); virtual nas* find_nas_ctx_from_imsi(uint64_t imsi); nas* find_nas_ctx_from_mme_ue_s1ap_id(uint32_t mme_ue_s1ap_id); bool release_ue_ecm_ctx(uint32_t mme_ue_s1ap_id); void release_ues_ecm_ctx_in_enb(int32_t enb_assoc); virtual bool delete_ue_ctx(uint64_t imsi); uint32_t allocate_m_tmsi(uint64_t imsi); virtual uint64_t find_imsi_from_m_tmsi(uint32_t m_tmsi); s1ap_args_t m_s1ap_args; srslog::basic_logger& m_logger = srslog::fetch_basic_logger("S1AP"); s1ap_mngmt_proc* m_s1ap_mngmt_proc; s1ap_nas_transport* m_s1ap_nas_transport; s1ap_ctx_mngmt_proc* m_s1ap_ctx_mngmt_proc; s1ap_erab_mngmt_proc* m_s1ap_erab_mngmt_proc; s1ap_paging* m_s1ap_paging; std::map m_tmsi_to_imsi; std::map m_active_enbs; // Interfaces virtual bool send_initial_context_setup_request(uint64_t imsi, uint16_t erab_to_setup); virtual bool send_ue_context_release_command(uint32_t mme_ue_s1ap_id); virtual bool send_erab_release_command(uint32_t enb_ue_s1ap_id, uint32_t mme_ue_s1ap_id, std::vector erabs_to_release, struct sctp_sndrcvinfo enb_sri); virtual bool send_erab_modify_request(uint32_t enb_ue_s1ap_id, uint32_t mme_ue_s1ap_id, std::map erabs_to_be_modified, srsran::byte_buffer_t* nas_msg, struct sctp_sndrcvinfo enb_sri); virtual bool send_downlink_nas_transport(uint32_t enb_ue_s1ap_id, uint32_t mme_ue_s1ap_id, srsran::byte_buffer_t* nas_msg, struct sctp_sndrcvinfo enb_sri); virtual bool send_paging(uint64_t imsi, uint16_t erab_to_setup); virtual bool expire_nas_timer(enum nas_timer_type type, uint64_t imsi); private: s1ap(); virtual ~s1ap(); static s1ap* m_instance; uint32_t m_plmn; hss_interface_nas* m_hss; int m_s1mme; std::map m_sctp_to_enb_id; std::map > m_enb_assoc_to_ue_ids; std::map m_imsi_to_nas_ctx; std::map m_mme_ue_s1ap_id_to_nas_ctx; uint32_t m_next_mme_ue_s1ap_id; uint32_t m_next_m_tmsi; // GTP-C Interface mme_gtpc* m_mme_gtpc; // PCAP bool m_pcap_enable; srsran::s1ap_pcap m_pcap; }; inline uint32_t s1ap::get_plmn() { return m_plmn; } inline uint16_t s1ap::get_tac() { return m_s1ap_args.tac; } } // namespace srsepc #endif // SRSEPC_S1AP_H