From 0e135adc6f3ac769ecffe5148a5e09f02bb546ae Mon Sep 17 00:00:00 2001 From: Pedro Alvarez Date: Tue, 3 Jul 2018 14:30:20 +0100 Subject: [PATCH] Starting to change gtpu_read_header and gtpu_write_header to lib. --- lib/include/srslte/upper/gtpu.h | 5 +- lib/src/upper/gtpu.cc | 14 ++--- srsenb/hdr/upper/gtpu.h | 31 +++-------- srsenb/src/upper/gtpu.cc | 92 +++++---------------------------- 4 files changed, 31 insertions(+), 111 deletions(-) diff --git a/lib/include/srslte/upper/gtpu.h b/lib/include/srslte/upper/gtpu.h index 3cd8a1202..24b9c5c41 100644 --- a/lib/include/srslte/upper/gtpu.h +++ b/lib/include/srslte/upper/gtpu.h @@ -29,6 +29,7 @@ #include #include "srslte/common/common.h" +#include "srslte/common/log.h" namespace srslte { @@ -58,8 +59,8 @@ typedef struct{ }gtpu_header_t; -bool gtpu_read_header(srslte::byte_buffer_t *pdu, gtpu_header_t *header); -bool gtpu_write_header(gtpu_header_t *header, srslte::byte_buffer_t *pdu); +bool gtpu_read_header(srslte::byte_buffer_t *pdu, gtpu_header_t *header, srslte::log *gtpu_log); +bool gtpu_write_header(gtpu_header_t *header, srslte::byte_buffer_t *pdu, srslte::log *gtpu_log); inline void uint8_to_uint32(uint8_t *buf, uint32_t *i) { diff --git a/lib/src/upper/gtpu.cc b/lib/src/upper/gtpu.cc index 668af8915..a8046aa4d 100644 --- a/lib/src/upper/gtpu.cc +++ b/lib/src/upper/gtpu.cc @@ -35,18 +35,18 @@ namespace srslte { * Ref: 3GPP TS 29.281 v10.1.0 Section 5 ***************************************************************************/ -bool gtpu_write_header(gtpu_header_t *header, srslte::byte_buffer_t *pdu) +bool gtpu_write_header(gtpu_header_t *header, srslte::byte_buffer_t *pdu, srslte::log *gtpu_log) { if(header->flags != 0x30) { - //gtpu_log->error("gtpu_write_header - Unhandled header flags: 0x%x\n", header->flags); + gtpu_log->error("gtpu_write_header - Unhandled header flags: 0x%x\n", header->flags); return false; } if(header->message_type != 0xFF) { - //gtpu_log->error("gtpu_write_header - Unhandled message type: 0x%x\n", header->message_type); + gtpu_log->error("gtpu_write_header - Unhandled message type: 0x%x\n", header->message_type); return false; } if(pdu->get_headroom() < GTPU_HEADER_LEN) { - //gtpu_log->error("gtpu_write_header - No room in PDU for header\n"); + gtpu_log->error("gtpu_write_header - No room in PDU for header\n"); return false; } @@ -66,7 +66,7 @@ bool gtpu_write_header(gtpu_header_t *header, srslte::byte_buffer_t *pdu) return true; } -bool gtpu_read_header(srslte::byte_buffer_t *pdu, gtpu_header_t *header) +bool gtpu_read_header(srslte::byte_buffer_t *pdu, gtpu_header_t *header, srslte::log *gtpu_log) { uint8_t *ptr = pdu->msg; @@ -82,11 +82,11 @@ bool gtpu_read_header(srslte::byte_buffer_t *pdu, gtpu_header_t *header) uint8_to_uint32(ptr, &header->teid); if(header->flags != 0x30) { - //gtpu_log->error("gtpu_read_header - Unhandled header flags: 0x%x\n", header->flags); + gtpu_log->error("gtpu_read_header - Unhandled header flags: 0x%x\n", header->flags); return false; } if(header->message_type != 0xFF) { - //gtpu_log->error("gtpu_read_header - Unhandled message type: 0x%x\n", header->message_type); + gtpu_log->error("gtpu_read_header - Unhandled message type: 0x%x\n", header->message_type); return false; } diff --git a/srsenb/hdr/upper/gtpu.h b/srsenb/hdr/upper/gtpu.h index 1a8d6daaa..4dc05585d 100644 --- a/srsenb/hdr/upper/gtpu.h +++ b/srsenb/hdr/upper/gtpu.h @@ -58,33 +58,25 @@ namespace srsenb { #define GTPU_HEADER_LEN 8 -typedef struct{ - uint8_t flags; // Only support 0x30 - v1, PT1 (GTP), no other flags - uint8_t message_type; // Only support 0xFF - T-PDU type - uint16_t length; - uint32_t teid; -}gtpu_header_t; - - class gtpu :public gtpu_interface_rrc ,public gtpu_interface_pdcp ,public thread { -public: - +public: + gtpu(); - + bool init(std::string gtp_bind_addr_, std::string mme_addr_, pdcp_interface_gtpu *pdcp_, srslte::log *gtpu_log_, bool enable_mbsfn = false); void stop(); - + // gtpu_interface_rrc void add_bearer(uint16_t rnti, uint32_t lcid, uint32_t addr, uint32_t teid_out, uint32_t *teid_in); void rem_bearer(uint16_t rnti, uint32_t lcid); void rem_user(uint16_t rnti); - + // gtpu_interface_pdcp - void write_pdu(uint16_t rnti, uint32_t lcid, srslte::byte_buffer_t *pdu); + void write_pdu(uint16_t rnti, uint32_t lcid, srslte::byte_buffer_t *pdu); private: static const int THREAD_PRIO = 65; @@ -92,8 +84,6 @@ private: srslte::byte_buffer_pool *pool; bool running; bool run_enable; - - bool enable_mbsfn; std::string gtp_bind_addr; @@ -141,14 +131,7 @@ private: //Threading void run_thread(); - pthread_mutex_t mutex; - - /**************************************************************************** - * Header pack/unpack helper functions - * Ref: 3GPP TS 29.281 v10.1.0 Section 5 - ***************************************************************************/ - bool gtpu_write_header(gtpu_header_t *header, srslte::byte_buffer_t *pdu); - bool gtpu_read_header(srslte::byte_buffer_t *pdu, gtpu_header_t *header); + pthread_mutex_t mutex; /**************************************************************************** * TEID to RNIT/LCID helper functions diff --git a/srsenb/src/upper/gtpu.cc b/srsenb/src/upper/gtpu.cc index 83280e3c3..0f8bc3325 100644 --- a/srsenb/src/upper/gtpu.cc +++ b/srsenb/src/upper/gtpu.cc @@ -23,7 +23,7 @@ * and at http://www.gnu.org/licenses/. * */ - +#include "srslte/upper/gtpu.h" #include "srsenb/hdr/upper/gtpu.h" #include #include @@ -31,13 +31,12 @@ #include using namespace srslte; - namespace srsenb { - - gtpu::gtpu():mchthread() - { - } - + +gtpu::gtpu():mchthread() +{ +} + bool gtpu::init(std::string gtp_bind_addr_, std::string mme_addr_, srsenb::pdcp_interface_gtpu* pdcp_, srslte::log* gtpu_log_, bool enable_mbsfn) { pdcp = pdcp_; @@ -45,8 +44,8 @@ bool gtpu::init(std::string gtp_bind_addr_, std::string mme_addr_, srsenb::pdcp_ gtp_bind_addr = gtp_bind_addr_; mme_addr = mme_addr_; - pthread_mutex_init(&mutex, NULL); - + pthread_mutex_init(&mutex, NULL); + pool = byte_buffer_pool::get_instance(); // Set up sink socket @@ -106,11 +105,11 @@ bool gtpu::init(std::string gtp_bind_addr_, std::string mme_addr_, srsenb::pdcp_ void gtpu::stop() { - + if(enable_mbsfn){ mchthread.stop(); } - + if (run_enable) { run_enable = false; // Wait thread to exit gracefully otherwise might leave a mutex locked @@ -124,7 +123,7 @@ void gtpu::stop() } wait_thread_finish(); } - + if (snk_fd) { close(snk_fd); } @@ -148,7 +147,7 @@ void gtpu::write_pdu(uint16_t rnti, uint32_t lcid, srslte::byte_buffer_t* pdu) servaddr.sin_addr.s_addr = htonl(rnti_bearers[rnti].spgw_addrs[lcid]); servaddr.sin_port = htons(GTPU_PORT); - gtpu_write_header(&header, pdu); + gtpu_write_header(&header, pdu, gtpu_log); if (sendto(snk_fd, pdu->msg, pdu->N_bytes, MSG_EOR, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in))<0) { perror("sendto"); } @@ -230,7 +229,7 @@ void gtpu::run_thread() pdu->N_bytes = (uint32_t) n; gtpu_header_t header; - gtpu_read_header(pdu, &header); + gtpu_read_header(pdu, &header,gtpu_log); uint16_t rnti = 0; uint16_t lcid = 0; @@ -265,69 +264,6 @@ void gtpu::run_thread() running = false; } -/**************************************************************************** -* Header pack/unpack helper functions -* Ref: 3GPP TS 29.281 v10.1.0 Section 5 -***************************************************************************/ - -bool gtpu::gtpu_write_header(gtpu_header_t *header, srslte::byte_buffer_t *pdu) -{ - if(header->flags != 0x30) { - gtpu_log->error("gtpu_write_header - Unhandled header flags: 0x%x\n", header->flags); - return false; - } - if(header->message_type != 0xFF) { - gtpu_log->error("gtpu_write_header - Unhandled message type: 0x%x\n", header->message_type); - return false; - } - if(pdu->get_headroom() < GTPU_HEADER_LEN) { - gtpu_log->error("gtpu_write_header - No room in PDU for header\n"); - return false; - } - - pdu->msg -= GTPU_HEADER_LEN; - pdu->N_bytes += GTPU_HEADER_LEN; - - uint8_t *ptr = pdu->msg; - - *ptr = header->flags; - ptr++; - *ptr = header->message_type; - ptr++; - uint16_to_uint8(header->length, ptr); - ptr += 2; - uint32_to_uint8(header->teid, ptr); - - return true; -} - -bool gtpu::gtpu_read_header(srslte::byte_buffer_t *pdu, gtpu_header_t *header) -{ - uint8_t *ptr = pdu->msg; - - pdu->msg += GTPU_HEADER_LEN; - pdu->N_bytes -= GTPU_HEADER_LEN; - - header->flags = *ptr; - ptr++; - header->message_type = *ptr; - ptr++; - uint8_to_uint16(ptr, &header->length); - ptr += 2; - uint8_to_uint32(ptr, &header->teid); - - if(header->flags != 0x30) { - gtpu_log->error("gtpu_read_header - Unhandled header flags: 0x%x\n", header->flags); - return false; - } - if(header->message_type != 0xFF) { - gtpu_log->error("gtpu_read_header - Unhandled message type: 0x%x\n", header->message_type); - return false; - } - - return true; -} - /**************************************************************************** * TEID to RNIT/LCID helper functions ***************************************************************************/ @@ -429,7 +365,7 @@ void gtpu::mch_thread::run_thread() pdu->N_bytes = (uint32_t) n; gtpu_header_t header; - gtpu_read_header(pdu, &header); + gtpu_read_header(pdu, &header, gtpu_log); pdcp->write_sdu(SRSLTE_MRNTI, lcid, pdu); do {