From bf26934e131229423934557f6ba5cd4a37dd353f Mon Sep 17 00:00:00 2001 From: Andre Puschmann Date: Thu, 8 Feb 2018 17:50:19 +0100 Subject: [PATCH] rlc_am: print error but don't exit on buffer allocation errors --- lib/include/srslte/upper/rlc_am.h | 2 +- lib/src/upper/rlc_am.cc | 44 +++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/include/srslte/upper/rlc_am.h b/lib/include/srslte/upper/rlc_am.h index 5a93750a4..2311b23cb 100644 --- a/lib/include/srslte/upper/rlc_am.h +++ b/lib/include/srslte/upper/rlc_am.h @@ -40,7 +40,7 @@ namespace srslte { - +#undef RLC_AM_BUFFER_DEBUG struct rlc_amd_rx_pdu_t{ rlc_amd_pdu_header_t header; diff --git a/lib/src/upper/rlc_am.cc b/lib/src/upper/rlc_am.cc index d71ade7ca..c5a495c32 100644 --- a/lib/src/upper/rlc_am.cc +++ b/lib/src/upper/rlc_am.cc @@ -680,6 +680,7 @@ int rlc_am::build_data_pdu(uint8_t *payload, uint32_t nof_bytes) byte_buffer_t *pdu = pool_allocate; if (!pdu) { +#ifdef RLC_AM_BUFFER_DEBUG log->console("Fatal Error: Could not allocate PDU in build_data_pdu()\n"); log->console("tx_window size: %d PDUs\n", tx_window.size()); log->console("vt_a = %d, vt_ms = %d, vt_s = %d, poll_sn = %d " @@ -692,6 +693,10 @@ int rlc_am::build_data_pdu(uint8_t *payload, uint32_t nof_bytes) log->console("tx_window - SN: %d\n", txit->first); } exit(-1); +#else + log->error("Fatal Error: Couldn't allocate PDU in build_data_pdu().\n"); + return 0; +#endif } rlc_amd_pdu_header_t header; header.dc = RLC_DC_FIELD_DATA_PDU; @@ -850,8 +855,13 @@ void rlc_am::handle_data_pdu(uint8_t *payload, uint32_t nof_bytes, rlc_amd_pdu_h rlc_amd_rx_pdu_t pdu; pdu.buf = pool_allocate; if (!pdu.buf) { - log->console("Fatal Error: Could not allocate PDU in handle_data_pdu()\n"); +#ifdef RLC_AM_BUFFER_DEBUG + log->console("Fatal Error: Couldn't allocate PDU in handle_data_pdu().\n"); exit(-1); +#else + log->error("Fatal Error: Couldn't allocate PDU in handle_data_pdu().\n"); + return; +#endif } memcpy(pdu.buf->msg, payload, nof_bytes); @@ -931,8 +941,13 @@ void rlc_am::handle_data_pdu_segment(uint8_t *payload, uint32_t nof_bytes, rlc_a rlc_amd_rx_pdu_t segment; segment.buf = pool_allocate; if (!segment.buf) { - log->console("Fatal Error: Could not allocate PDU in handle_data_pdu_segment()\n"); +#ifdef RLC_AM_BUFFER_DEBUG + log->console("Fatal Error: Couldn't allocate PDU in handle_data_pdu_segment().\n"); exit(-1); +#else + log->error("Fatal Error: Couldn't allocate PDU in handle_data_pdu_segment().\n"); + return; +#endif } memcpy(segment.buf->msg, payload, nof_bytes); @@ -1091,8 +1106,13 @@ void rlc_am::reassemble_rx_sdus() if(!rx_sdu) { rx_sdu = pool_allocate; if (!rx_sdu) { +#ifdef RLC_AM_BUFFER_DEBUG log->console("Fatal Error: Could not allocate PDU in reassemble_rx_sdus() (1)\n"); exit(-1); +#else + log->error("Fatal Error: Could not allocate PDU in reassemble_rx_sdus() (1)\n"); + return; +#endif } } // Iterate through rx_window, assembling and delivering SDUs @@ -1111,10 +1131,14 @@ void rlc_am::reassemble_rx_sdus() pdcp->write_pdu(lcid, rx_sdu); rx_sdu = pool_allocate; if (!rx_sdu) { +#ifdef RLC_AM_BUFFER_DEBUG log->console("Fatal Error: Could not allocate PDU in reassemble_rx_sdus() (2)\n"); - exit(-1); + exit(-1); +#else + log->error("Fatal Error: Could not allocate PDU in reassemble_rx_sdus() (2)\n"); + return; +#endif } - } // Handle last segment @@ -1127,8 +1151,13 @@ void rlc_am::reassemble_rx_sdus() pdcp->write_pdu(lcid, rx_sdu); rx_sdu = pool_allocate; if (!rx_sdu) { +#ifdef RLC_AM_BUFFER_DEBUG log->console("Fatal Error: Could not allocate PDU in reassemble_rx_sdus() (3)\n"); - exit(-1); + exit(-1); +#else + log->error("Fatal Error: Could not allocate PDU in reassemble_rx_sdus() (3)\n"); + return; +#endif } } @@ -1243,8 +1272,13 @@ bool rlc_am::add_segment_and_check(rlc_amd_rx_pdu_segments_t *pdu, rlc_amd_rx_pd // Copy data byte_buffer_t *full_pdu = pool_allocate; if (!full_pdu) { +#ifdef RLC_AM_BUFFER_DEBUG log->console("Fatal Error: Could not allocate PDU in add_segment_and_check()\n"); exit(-1); +#else + log->error("Fatal Error: Could not allocate PDU in add_segment_and_check()\n"); + return false; +#endif } for(it = pdu->segments.begin(); it != pdu->segments.end(); it++) { memcpy(&full_pdu->msg[full_pdu->N_bytes], it->buf->msg, it->buf->N_bytes);