mirror of https://github.com/PentHertz/srsLTE.git
A bit of code cleanup
This commit is contained in:
parent
4f6fafb66d
commit
d8436ea2fc
|
@ -23,10 +23,22 @@
|
||||||
* and at http://www.gnu.org/licenses/.
|
* and at http://www.gnu.org/licenses/.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#ifndef S1AP_H
|
||||||
|
#define S1AP_H
|
||||||
|
|
||||||
#include "srslte/asn1/liblte_s1ap.h"
|
#include "srslte/asn1/liblte_s1ap.h"
|
||||||
#include "srslte/common/common.h"
|
#include "srslte/common/common.h"
|
||||||
#include "srslte/common/log.h"
|
#include "srslte/common/log.h"
|
||||||
|
|
||||||
|
#include <strings.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/sctp.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "mme/s1ap_mngmt_proc.h"
|
||||||
|
|
||||||
namespace srsepc{
|
namespace srsepc{
|
||||||
|
|
||||||
const uint16_t S1MME_PORT = 36412;
|
const uint16_t S1MME_PORT = 36412;
|
||||||
|
@ -54,28 +66,34 @@ public:
|
||||||
|
|
||||||
bool handle_s1ap_rx_pdu(srslte::byte_buffer_t *pdu, struct sctp_sndrcvinfo *enb_sri);
|
bool handle_s1ap_rx_pdu(srslte::byte_buffer_t *pdu, struct sctp_sndrcvinfo *enb_sri);
|
||||||
|
|
||||||
bool handle_initiatingmessage(LIBLTE_S1AP_INITIATINGMESSAGE_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri);
|
bool handle_initiating_message(LIBLTE_S1AP_INITIATINGMESSAGE_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri);
|
||||||
|
|
||||||
bool handle_s1setuprequest(LIBLTE_S1AP_MESSAGE_S1SETUPREQUEST_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri);
|
bool handle_s1_setup_request(LIBLTE_S1AP_MESSAGE_S1SETUPREQUEST_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri);
|
||||||
|
|
||||||
bool send_s1setupfailure(struct sctp_sndrcvinfo *enb_sri);
|
bool send_s1_setup_failure(struct sctp_sndrcvinfo *enb_sri);
|
||||||
|
|
||||||
bool send_s1setupresponse(struct sctp_sndrcvinfo *enb_sri);
|
bool send_s1_setup_response(struct sctp_sndrcvinfo *enb_sri);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t m_mme_code;
|
uint8_t m_mme_code;
|
||||||
uint16_t m_mme_group;
|
uint16_t m_mme_group;
|
||||||
uint16_t m_tac; // 16-bit tac
|
uint16_t m_tac; // 16-bit tac
|
||||||
uint16_t m_mcc; // BCD-coded with 0xF filler
|
uint16_t m_mcc; // BCD-coded with 0xF filler
|
||||||
uint16_t m_mnc; // BCD-coded with 0xF filler
|
uint16_t m_mnc; // BCD-coded with 0xF filler
|
||||||
|
uint32_t m_plmn;
|
||||||
|
|
||||||
std::string m_mme_bind_addr;
|
std::string m_mme_bind_addr;
|
||||||
std::string m_mme_name;
|
std::string m_mme_name;
|
||||||
|
|
||||||
srslte::log *m_s1ap_log;
|
srslte::log *m_s1ap_log;
|
||||||
|
|
||||||
int m_s1mme;
|
int m_s1mme;
|
||||||
|
s1ap_mngmt_proc m_s1ap_mngmt_proc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} //namespace srsepc
|
} //namespace srsepc
|
||||||
|
|
||||||
|
#endif //S1AP_H
|
||||||
|
|
|
@ -77,7 +77,7 @@ mme::init(all_args_t* args)
|
||||||
m_logger = &m_logger_stdout;
|
m_logger = &m_logger_stdout;
|
||||||
} else {
|
} else {
|
||||||
m_logger_file.init(args->log_args.filename);
|
m_logger_file.init(args->log_args.filename);
|
||||||
m_logger_file.log("\n\n");
|
m_logger_file.log("\n--- Software Radio Systems MME log ---\n\n");
|
||||||
m_logger = &m_logger_file;
|
m_logger = &m_logger_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,10 +85,11 @@ mme::init(all_args_t* args)
|
||||||
m_s1ap_log.set_level(srslte::LOG_LEVEL_DEBUG);
|
m_s1ap_log.set_level(srslte::LOG_LEVEL_DEBUG);
|
||||||
m_s1ap_log.set_hex_limit(32);
|
m_s1ap_log.set_hex_limit(32);
|
||||||
if(m_s1ap.init(args->s1ap_args, &m_s1ap_log)){
|
if(m_s1ap.init(args->s1ap_args, &m_s1ap_log)){
|
||||||
std::cout << "Error initializing MME S1APP" << std::endl;
|
m_s1ap_log.error("Error initializing MME S1APP\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
m_s1ap_log.console("Initialized MME\n");
|
m_s1ap_log.info("Initialized S1-MME\n");
|
||||||
|
m_s1ap_log.console("Initialized S1-MME\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,23 +132,22 @@ mme::run_thread()
|
||||||
int s1mme = m_s1ap.get_s1_mme();
|
int s1mme = m_s1ap.get_s1_mme();
|
||||||
while(m_running)
|
while(m_running)
|
||||||
{
|
{
|
||||||
//std::cout << "Waiting for SCTP Msg " << std::endl;
|
m_s1ap_log.debug("Waiting for SCTP Msg\n");
|
||||||
m_s1ap_log.debug("Waiting for SCTP Msg");
|
|
||||||
pdu->reset();
|
pdu->reset();
|
||||||
rd_sz = sctp_recvmsg(s1mme, pdu->msg, sz,(struct sockaddr*) &enb_addr, &fromlen, &sri, &msg_flags);
|
rd_sz = sctp_recvmsg(s1mme, pdu->msg, sz,(struct sockaddr*) &enb_addr, &fromlen, &sri, &msg_flags);
|
||||||
if (rd_sz == -1 && errno != EAGAIN){
|
if (rd_sz == -1 && errno != EAGAIN){
|
||||||
m_s1ap_log.error("Error reading from SCTP socket: %s", strerror(errno));
|
m_s1ap_log.error("Error reading from SCTP socket: %s", strerror(errno));
|
||||||
}
|
}
|
||||||
else if (rd_sz == -1 && errno == EAGAIN){
|
else if (rd_sz == -1 && errno == EAGAIN){
|
||||||
m_s1ap_log("Socket timeout reached");
|
m_s1ap_log.debug("Socket timeout reached");
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
pdu->N_bytes = rd_sz;
|
pdu->N_bytes = rd_sz;
|
||||||
m_s1ap_log("Received S1AP msg. Size: %d", pdu->N_bytes);
|
m_s1ap_log.info("Received S1AP msg. Size: %d\n", pdu->N_bytes);
|
||||||
m_s1ap.handle_s1ap_rx_pdu(pdu,&sri);
|
m_s1ap.handle_s1ap_rx_pdu(pdu,&sri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
} //namespace srsepe<
|
} //namespace srsepc
|
||||||
|
|
|
@ -26,14 +26,6 @@
|
||||||
|
|
||||||
#include <iostream> //TODO Remove
|
#include <iostream> //TODO Remove
|
||||||
|
|
||||||
#include <strings.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/sctp.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
//#include "srslte/upper/s1ap_common.h"
|
|
||||||
#include "srslte/common/bcd_helpers.h"
|
#include "srslte/common/bcd_helpers.h"
|
||||||
#include "mme/s1ap.h"
|
#include "mme/s1ap.h"
|
||||||
|
|
||||||
|
@ -59,11 +51,12 @@ s1ap::init(s1ap_args_t s1ap_args, srslte::log *s1ap_log)
|
||||||
m_mme_bind_addr = s1ap_args.mme_bind_addr;
|
m_mme_bind_addr = s1ap_args.mme_bind_addr;
|
||||||
m_mme_name = std::string("srsmme0");
|
m_mme_name = std::string("srsmme0");
|
||||||
|
|
||||||
|
srslte::s1ap_mccmnc_to_plmn(m_mcc, m_mnc, &m_plmn);
|
||||||
|
|
||||||
m_s1ap_log = s1ap_log;
|
m_s1ap_log = s1ap_log;
|
||||||
|
|
||||||
m_s1mme = enb_listen();
|
m_s1mme = enb_listen();
|
||||||
|
|
||||||
m_s1ap_log->console("Initialized S1-APP\n");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,18 +102,19 @@ s1ap::enb_listen()
|
||||||
bzero(&s1mme_addr, sizeof(s1mme_addr));
|
bzero(&s1mme_addr, sizeof(s1mme_addr));
|
||||||
s1mme_addr.sin_family = AF_INET;
|
s1mme_addr.sin_family = AF_INET;
|
||||||
inet_pton(AF_INET, m_mme_bind_addr.c_str(), &(s1mme_addr.sin_addr) );
|
inet_pton(AF_INET, m_mme_bind_addr.c_str(), &(s1mme_addr.sin_addr) );
|
||||||
//s1mme_addr.sin_addr.s_addr = htonl(INADDR_ANY); //TODO this should use the bindx information
|
|
||||||
s1mme_addr.sin_port = htons(S1MME_PORT);
|
s1mme_addr.sin_port = htons(S1MME_PORT);
|
||||||
err = bind(sock_fd, (struct sockaddr*) &s1mme_addr, sizeof (s1mme_addr));
|
err = bind(sock_fd, (struct sockaddr*) &s1mme_addr, sizeof (s1mme_addr));
|
||||||
if (err != 0){
|
if (err != 0){
|
||||||
std::cout << "Error binding SCTP socket" << std::endl;
|
m_s1ap_log->error("Error binding SCTP socket\n");
|
||||||
|
m_s1ap_log->console("Error binding SCTP socket\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Listen for connections
|
//Listen for connections
|
||||||
err = listen(sock_fd,SOMAXCONN);
|
err = listen(sock_fd,SOMAXCONN);
|
||||||
if (err != 0){
|
if (err != 0){
|
||||||
std::cout << "Error in SCTP socket listen" << std::endl;
|
m_s1ap_log->error("Error in SCTP socket listen\n");
|
||||||
|
m_s1ap_log->console("Error in SCTP socket listen\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,14 +127,14 @@ s1ap::handle_s1ap_rx_pdu(srslte::byte_buffer_t *pdu, struct sctp_sndrcvinfo *enb
|
||||||
LIBLTE_S1AP_S1AP_PDU_STRUCT rx_pdu;
|
LIBLTE_S1AP_S1AP_PDU_STRUCT rx_pdu;
|
||||||
|
|
||||||
if(liblte_s1ap_unpack_s1ap_pdu((LIBLTE_BYTE_MSG_STRUCT*)pdu, &rx_pdu) != LIBLTE_SUCCESS) {
|
if(liblte_s1ap_unpack_s1ap_pdu((LIBLTE_BYTE_MSG_STRUCT*)pdu, &rx_pdu) != LIBLTE_SUCCESS) {
|
||||||
m_s1ap_log->console("Failed to unpack received PDU\n");
|
m_s1ap_log->error("Failed to unpack received PDU\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(rx_pdu.choice_type) {
|
switch(rx_pdu.choice_type) {
|
||||||
case LIBLTE_S1AP_S1AP_PDU_CHOICE_INITIATINGMESSAGE:
|
case LIBLTE_S1AP_S1AP_PDU_CHOICE_INITIATINGMESSAGE:
|
||||||
m_s1ap_log->console("Received initiating PDU\n");
|
m_s1ap_log->console("Received initiating PDU\n");
|
||||||
return handle_initiatingmessage(&rx_pdu.choice.initiatingMessage, enb_sri);
|
return handle_initiating_message(&rx_pdu.choice.initiatingMessage, enb_sri);
|
||||||
break;
|
break;
|
||||||
case LIBLTE_S1AP_S1AP_PDU_CHOICE_SUCCESSFULOUTCOME:
|
case LIBLTE_S1AP_S1AP_PDU_CHOICE_SUCCESSFULOUTCOME:
|
||||||
m_s1ap_log->console("Received Succeseful Outcome PDU\n");
|
m_s1ap_log->console("Received Succeseful Outcome PDU\n");
|
||||||
|
@ -160,21 +154,20 @@ s1ap::handle_s1ap_rx_pdu(srslte::byte_buffer_t *pdu, struct sctp_sndrcvinfo *enb
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
s1ap::handle_initiatingmessage(LIBLTE_S1AP_INITIATINGMESSAGE_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri)
|
s1ap::handle_initiating_message(LIBLTE_S1AP_INITIATINGMESSAGE_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri)
|
||||||
{
|
{
|
||||||
switch(msg->choice_type) {
|
switch(msg->choice_type) {
|
||||||
case LIBLTE_S1AP_INITIATINGMESSAGE_CHOICE_S1SETUPREQUEST:
|
case LIBLTE_S1AP_INITIATINGMESSAGE_CHOICE_S1SETUPREQUEST:
|
||||||
std::cout << "Received S1 Setup Request." << std::endl;
|
m_s1ap_log->info("Received S1 Setup Request.\n");
|
||||||
return handle_s1setuprequest(&msg->choice.S1SetupRequest, enb_sri);
|
return handle_s1_setup_request(&msg->choice.S1SetupRequest, enb_sri);
|
||||||
default:
|
default:
|
||||||
std::cout << "Unhandled intiating message" << std::cout;
|
m_s1ap_log->error("Unhandled intiating message: %s\n", liblte_s1ap_initiatingmessage_choice_text[msg->choice_type]);
|
||||||
//s1ap_log->error("Unhandled intiating message: %s\n", liblte_s1ap_initiatingmessage_choice_text[msg->choice_type]);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
s1ap::handle_s1setuprequest(LIBLTE_S1AP_MESSAGE_S1SETUPREQUEST_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri)
|
s1ap::handle_s1_setup_request(LIBLTE_S1AP_MESSAGE_S1SETUPREQUEST_STRUCT *msg, struct sctp_sndrcvinfo *enb_sri)
|
||||||
{
|
{
|
||||||
|
|
||||||
uint8_t enb_name[150];
|
uint8_t enb_name[150];
|
||||||
|
@ -184,8 +177,21 @@ s1ap::handle_s1setuprequest(LIBLTE_S1AP_MESSAGE_S1SETUPREQUEST_STRUCT *msg, stru
|
||||||
uint16_t mcc, mnc;
|
uint16_t mcc, mnc;
|
||||||
uint16_t tac, bplmn;
|
uint16_t tac, bplmn;
|
||||||
uint32_t bplmns[32];
|
uint32_t bplmns[32];
|
||||||
|
enb_ctx_t enb_ctx;
|
||||||
|
|
||||||
|
if(!m_s1ap_mngmt_proc.unpack_s1_setup_request(msg, &enb_ctx)){
|
||||||
|
m_s1ap_log->error("Malformed S1 Setup Request\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(enb_ctx.enb_name_present){
|
||||||
|
m_s1ap_log->console("S1 Setup request from eNB %s\n", enb_ctx.enb_name);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
m_s1ap_log->console("S1 Setup request from eNB id \n");
|
||||||
|
}
|
||||||
//eNB Name
|
//eNB Name
|
||||||
|
/*
|
||||||
if(msg->eNBname_present)
|
if(msg->eNBname_present)
|
||||||
{
|
{
|
||||||
bzero(enb_name,sizeof(enb_name));
|
bzero(enb_name,sizeof(enb_name));
|
||||||
|
@ -233,14 +239,22 @@ s1ap::handle_s1setuprequest(LIBLTE_S1AP_MESSAGE_S1SETUPREQUEST_STRUCT *msg, stru
|
||||||
//Default Paging DRX
|
//Default Paging DRX
|
||||||
LIBLTE_S1AP_PAGINGDRX_ENUM drx = msg->DefaultPagingDRX.e;
|
LIBLTE_S1AP_PAGINGDRX_ENUM drx = msg->DefaultPagingDRX.e;
|
||||||
std::cout << "Default Paging DRX" << drx << std::endl;
|
std::cout << "Default Paging DRX" << drx << std::endl;
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
if(plmn!=m_plmn){
|
||||||
|
send_s1_setup_failure(enb_sri);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
send_s1_setup_response(enb_sri);
|
||||||
|
}
|
||||||
|
*/
|
||||||
//send_s1setupfailure(enb_sri);
|
//send_s1setupfailure(enb_sri);
|
||||||
send_s1setupresponse(enb_sri);
|
//send_s1setupresponse(enb_sri);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
s1ap::send_s1setupfailure(struct sctp_sndrcvinfo *enb_sri)
|
s1ap::send_s1_setup_failure(struct sctp_sndrcvinfo *enb_sri)
|
||||||
{
|
{
|
||||||
srslte::byte_buffer_t msg;
|
srslte::byte_buffer_t msg;
|
||||||
LIBLTE_S1AP_S1AP_PDU_STRUCT pdu;
|
LIBLTE_S1AP_S1AP_PDU_STRUCT pdu;
|
||||||
|
@ -276,7 +290,7 @@ s1ap::send_s1setupfailure(struct sctp_sndrcvinfo *enb_sri)
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
s1ap::send_s1setupresponse(struct sctp_sndrcvinfo *enb_sri)
|
s1ap::send_s1_setup_response(struct sctp_sndrcvinfo *enb_sri)
|
||||||
{
|
{
|
||||||
srslte::byte_buffer_t msg;
|
srslte::byte_buffer_t msg;
|
||||||
LIBLTE_S1AP_S1AP_PDU_STRUCT pdu;
|
LIBLTE_S1AP_S1AP_PDU_STRUCT pdu;
|
||||||
|
@ -340,12 +354,4 @@ s1ap::send_s1setupresponse(struct sctp_sndrcvinfo *enb_sri)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
bool
|
|
||||||
s1ap::setup_enb_ctx()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
} //namespace srsepc
|
} //namespace srsepc
|
||||||
|
|
Loading…
Reference in New Issue