diff options
-rw-r--r-- | src/coding_scheme.c | 22 | ||||
-rw-r--r-- | src/coding_scheme.h | 5 | ||||
-rw-r--r-- | src/decoding.cpp | 2 | ||||
-rw-r--r-- | src/encoding.cpp | 4 | ||||
-rw-r--r-- | src/gprs_bssgp_pcu.cpp | 10 | ||||
-rw-r--r-- | src/gprs_coding_scheme.cpp | 34 | ||||
-rw-r--r-- | src/gprs_coding_scheme.h | 2 | ||||
-rw-r--r-- | src/gprs_ms.cpp | 15 | ||||
-rw-r--r-- | src/pcu_vty_functions.cpp | 11 | ||||
-rw-r--r-- | src/pdch.cpp | 11 | ||||
-rw-r--r-- | src/tbf_dl.cpp | 11 | ||||
-rw-r--r-- | src/tbf_ul.cpp | 9 | ||||
-rw-r--r-- | tests/edge/EdgeTest.cpp | 2 |
13 files changed, 84 insertions, 54 deletions
diff --git a/src/coding_scheme.c b/src/coding_scheme.c index a6f2905c..93278e7e 100644 --- a/src/coding_scheme.c +++ b/src/coding_scheme.c @@ -24,6 +24,28 @@ #include "coding_scheme.h" +const struct value_string mcs_names[] = { + { UNKNOWN, "UNKNOWN" }, + { CS1, "CS-1" }, + { CS2, "CS-2" }, + { CS3, "CS-3" }, + { CS4, "CS-4" }, + { MCS1, "MCS-1" }, + { MCS2, "MCS-2" }, + { MCS3, "MCS-3" }, + { MCS4, "MCS-4" }, + { MCS5, "MCS-5" }, + { MCS6, "MCS-6" }, + { MCS7, "MCS-7" }, + { MCS8, "MCS-8" }, + { MCS9, "MCS-9" }, + { 0, NULL } +}; + +const char *mcs_name(enum CodingScheme val) { + return get_value_string(mcs_names, val); +} + static struct { struct { uint8_t data_header_bits; diff --git a/src/coding_scheme.h b/src/coding_scheme.h index b0b85e34..1e8ca78f 100644 --- a/src/coding_scheme.h +++ b/src/coding_scheme.h @@ -19,6 +19,8 @@ #pragma once +#include <osmocom/core/utils.h> + enum CodingScheme { UNKNOWN, /* GPRS Coding Schemes: */ @@ -28,6 +30,9 @@ enum CodingScheme { NUM_SCHEMES }; +extern const struct value_string mcs_names[]; +const char *mcs_name(enum CodingScheme val); + enum HeaderType { HEADER_INVALID, HEADER_GPRS_CONTROL, diff --git a/src/decoding.cpp b/src/decoding.cpp index 3410291e..1473ff71 100644 --- a/src/decoding.cpp +++ b/src/decoding.cpp @@ -370,7 +370,7 @@ int Decoding::rlc_parse_ul_data_header(struct gprs_rlc_data_info *rlc, default: LOGP(DRLCMACDL, LOGL_ERROR, "Decoding of uplink %s data blocks not yet supported.\n", - cs.name()); + mcs_name(cs)); return -ENOTSUP; }; diff --git a/src/encoding.cpp b/src/encoding.cpp index 58df95f0..ad53b0bd 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -1227,7 +1227,7 @@ int Encoding::rlc_write_dl_data_header(const struct gprs_rlc_data_info *rlc, default: LOGP(DRLCMACDL, LOGL_ERROR, "Encoding of uplink %s data blocks not yet supported.\n", - cs.name()); + mcs_name(cs)); return -ENOTSUP; }; @@ -1616,7 +1616,7 @@ Encoding::AppendResult Encoding::rlc_data_to_dl_append( count_payload); LOGP(DRLCMACDL, LOGL_ERROR, "%s data block encoding not implemented\n", - cs.name()); + mcs_name(cs)); return AR_NEED_MORE_BLOCKS; } diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp index 7ac5ab16..9d02df6b 100644 --- a/src/gprs_bssgp_pcu.cpp +++ b/src/gprs_bssgp_pcu.cpp @@ -26,7 +26,11 @@ #include <tbf.h> #include <gprs_coding_scheme.h> #include <pdch.h> -#include "coding_scheme.h" + +extern "C" { + #include <osmocom/core/utils.h> + #include "coding_scheme.h" +} #define BSSGP_TIMER_T1 30 /* Guards the (un)blocking procedures */ #define BSSGP_TIMER_T2 30 /* Guards the reset procedure */ @@ -775,7 +779,7 @@ int gprs_bssgp_tx_fc_bvc(void) LOGP(DBSSGP, LOGL_DEBUG, "Computed BVC leak rate = %d, num_pdch = %d, cs = %s\n", - leak_rate, num_pdch, max_cs_dl.name()); + leak_rate, num_pdch, mcs_name(max_cs_dl)); }; if (ms_leak_rate == 0) { @@ -799,7 +803,7 @@ int gprs_bssgp_tx_fc_bvc(void) LOGP(DBSSGP, LOGL_DEBUG, "Computed MS default leak rate = %d, ms_num_pdch = %d, " "cs = %s\n", - ms_leak_rate, ms_num_pdch, max_cs_dl.name()); + ms_leak_rate, ms_num_pdch, mcs_name(max_cs_dl)); }; /* TODO: Force leak_rate to 0 on buffer bloat */ diff --git a/src/gprs_coding_scheme.cpp b/src/gprs_coding_scheme.cpp index 0616a49c..53b3b073 100644 --- a/src/gprs_coding_scheme.cpp +++ b/src/gprs_coding_scheme.cpp @@ -81,39 +81,38 @@ static struct { } uplink, downlink; uint8_t data_bytes; uint8_t optional_padding_bits; - const char *name; enum HeaderType data_hdr; enum Family family; } mcs_info[NUM_SCHEMES] = { - {{0, 0}, {0, 0}, 0, 0, "UNKNOWN", + {{0, 0}, {0, 0}, 0, 0, HEADER_INVALID, FAMILY_INVALID}, - {{23, 0}, {23, 0}, 20, 0, "CS-1", + {{23, 0}, {23, 0}, 20, 0, HEADER_GPRS_DATA, FAMILY_INVALID}, - {{33, 7}, {33, 7}, 30, 0, "CS-2", + {{33, 7}, {33, 7}, 30, 0, HEADER_GPRS_DATA, FAMILY_INVALID}, - {{39, 3}, {39, 3}, 36, 0, "CS-3", + {{39, 3}, {39, 3}, 36, 0, HEADER_GPRS_DATA, FAMILY_INVALID}, - {{53, 7}, {53, 7}, 50, 0, "CS-4", + {{53, 7}, {53, 7}, 50, 0, HEADER_GPRS_DATA, FAMILY_INVALID}, - {{26, 1}, {26, 1}, 22, 0, "MCS-1", + {{26, 1}, {26, 1}, 22, 0, HEADER_EGPRS_DATA_TYPE_3, FAMILY_C}, - {{32, 1}, {32, 1}, 28, 0, "MCS-2", + {{32, 1}, {32, 1}, 28, 0, HEADER_EGPRS_DATA_TYPE_3, FAMILY_B}, - {{41, 1}, {41, 1}, 37, 48, "MCS-3", + {{41, 1}, {41, 1}, 37, 48, HEADER_EGPRS_DATA_TYPE_3, FAMILY_A}, - {{48, 1}, {48, 1}, 44, 0, "MCS-4", + {{48, 1}, {48, 1}, 44, 0, HEADER_EGPRS_DATA_TYPE_3, FAMILY_C}, - {{60, 7}, {59, 6}, 56, 0, "MCS-5", + {{60, 7}, {59, 6}, 56, 0, HEADER_EGPRS_DATA_TYPE_2, FAMILY_B}, - {{78, 7}, {77, 6}, 74, 48, "MCS-6", + {{78, 7}, {77, 6}, 74, 48, HEADER_EGPRS_DATA_TYPE_2, FAMILY_A}, - {{118, 2}, {117, 4}, 56, 0, "MCS-7", + {{118, 2}, {117, 4}, 56, 0, HEADER_EGPRS_DATA_TYPE_1, FAMILY_B}, - {{142, 2}, {141, 4}, 68, 0, "MCS-8", + {{142, 2}, {141, 4}, 68, 0, HEADER_EGPRS_DATA_TYPE_1, FAMILY_A}, - {{154, 2}, {153, 4}, 74, 0, "MCS-9", + {{154, 2}, {153, 4}, 74, 0, HEADER_EGPRS_DATA_TYPE_1, FAMILY_A}, }; @@ -194,11 +193,6 @@ uint8_t GprsCodingScheme::optionalPaddingBits() const return mcs_info[m_scheme].optional_padding_bits; } -const char *GprsCodingScheme::name() const -{ - return mcs_info[m_scheme].name; -} - enum HeaderType GprsCodingScheme::headerTypeData() const { return mcs_info[m_scheme].data_hdr; diff --git a/src/gprs_coding_scheme.h b/src/gprs_coding_scheme.h index 56ee0023..055c1664 100644 --- a/src/gprs_coding_scheme.h +++ b/src/gprs_coding_scheme.h @@ -74,7 +74,7 @@ public: uint8_t spareBitsDL() const; uint8_t maxDataBlockBytes() const; uint8_t optionalPaddingBits() const; - const char *name() const; + enum HeaderType headerTypeData() const; static GprsCodingScheme getBySizeUL(unsigned size); diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp index 77a8f2ea..3c283196 100644 --- a/src/gprs_ms.cpp +++ b/src/gprs_ms.cpp @@ -34,6 +34,7 @@ extern "C" { #include <osmocom/core/utils.h> #include <osmocom/gsm/protocol/gsm_04_08.h> #include <osmocom/core/logging.h> + #include "coding_scheme.h" } #define GPRS_CODEL_SLOW_INTERVAL_MS 4000 @@ -527,7 +528,7 @@ void GprsMs::update_error_rate(gprs_rlcmac_tbf *tbf, int error_rate) LOGP(DRLCMACDL, LOGL_INFO, "MS (IMSI %s): High error rate %d%%, " "reducing CS level to %s\n", - imsi(), error_rate, m_current_cs_dl.name()); + imsi(), error_rate, mcs_name(m_current_cs_dl)); m_last_cs_not_low = now; } } else if (error_rate < bts_data->cs_adj_lower_limit) { @@ -539,7 +540,7 @@ void GprsMs::update_error_rate(gprs_rlcmac_tbf *tbf, int error_rate) "MS (IMSI %s): Low error rate %d%%, " "increasing DL CS level to %s\n", imsi(), error_rate, - m_current_cs_dl.name()); + mcs_name(m_current_cs_dl)); m_last_cs_not_low = now; } else { LOGP(DRLCMACDL, LOGL_DEBUG, @@ -627,7 +628,7 @@ void GprsMs::update_cs_ul(const pcu_l1_meas *meas) if (!max_cs_ul) { LOGP(DRLCMACMEAS, LOGL_ERROR, "max_cs_ul cannot be derived (current UL CS: %s)\n", - m_current_cs_ul.name()); + mcs_name(m_current_cs_ul)); return; } @@ -636,14 +637,14 @@ void GprsMs::update_cs_ul(const pcu_l1_meas *meas) if (!m_current_cs_ul) { LOGP(DRLCMACMEAS, LOGL_ERROR, "Unable to update UL (M)CS because it's not set: %s\n", - m_current_cs_ul.name()); + mcs_name(m_current_cs_ul)); return; } if (!meas->have_link_qual) { LOGP(DRLCMACMEAS, LOGL_ERROR, "Unable to update UL (M)CS %s because we don't have link quality measurements.\n", - m_current_cs_ul.name()); + mcs_name(m_current_cs_ul)); return; } @@ -662,7 +663,7 @@ void GprsMs::update_cs_ul(const pcu_l1_meas *meas) } else { LOGP(DRLCMACMEAS, LOGL_ERROR, "Unable to update UL (M)CS because it's neither GPRS nor EDGE: %s\n", - m_current_cs_ul.name()); + mcs_name(m_current_cs_ul)); return; } @@ -682,7 +683,7 @@ void GprsMs::update_cs_ul(const pcu_l1_meas *meas) "modifying uplink CS level: %s -> %s\n", imsi(), meas->link_qual, old_link_qual, low, high, - m_current_cs_ul.name(), new_cs_ul.name()); + mcs_name(m_current_cs_ul), mcs_name(new_cs_ul)); m_current_cs_ul = new_cs_ul; } diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp index c71959d5..47a0559d 100644 --- a/src/pcu_vty_functions.cpp +++ b/src/pcu_vty_functions.cpp @@ -41,6 +41,7 @@ extern "C" { #include <osmocom/core/linuxlist.h> #include <osmocom/core/utils.h> #include <osmocom/vty/vty.h> + #include "coding_scheme.h" } static void tbf_print_vty_info(struct vty *vty, gprs_rlcmac_tbf *tbf) @@ -70,7 +71,7 @@ static void tbf_print_vty_info(struct vty *vty, gprs_rlcmac_tbf *tbf) } if (tbf->trx != NULL) vty_out(vty, " TRX_ID=%d", tbf->trx->trx_no); - vty_out(vty, " CS=%s", tbf->current_cs().name()); + vty_out(vty, " CS=%s", mcs_name(tbf->current_cs())); if (ul_tbf) { gprs_rlc_ul_window *win = ul_tbf->window(); @@ -127,8 +128,8 @@ int pcu_vty_show_ms_all(struct vty *vty, struct gprs_rlcmac_bts *bts_data) vty_out(vty, "MS TLLI=%08x, TA=%d, CS-UL=%s, CS-DL=%s, LLC=%zd, Cl=%d, E-Cl=%d," " TBF-UL=%s, TBF-DL=%s, IMSI=%s%s", ms->tlli(), - ms->ta(), ms->current_cs_ul().name(), - ms->current_cs_dl().name(), + ms->ta(), mcs_name(ms->current_cs_ul()), + mcs_name(ms->current_cs_dl()), ms->llc_queue()->size(), ms->ms_class(), ms->egprs_ms_class(), @@ -148,9 +149,9 @@ static int show_ms(struct vty *vty, GprsMs *ms) vty_out(vty, "MS TLLI=%08x, IMSI=%s%s", ms->tlli(), ms->imsi(), VTY_NEWLINE); vty_out(vty, " Timing advance (TA): %d%s", ms->ta(), VTY_NEWLINE); - vty_out(vty, " Coding scheme uplink: %s%s", ms->current_cs_ul().name(), + vty_out(vty, " Coding scheme uplink: %s%s", mcs_name(ms->current_cs_ul()), VTY_NEWLINE); - vty_out(vty, " Coding scheme downlink: %s%s", ms->current_cs_dl().name(), + vty_out(vty, " Coding scheme downlink: %s%s", mcs_name(ms->current_cs_dl()), VTY_NEWLINE); vty_out(vty, " Mode: %s%s", GprsCodingScheme::modeName(ms->mode()), VTY_NEWLINE); diff --git a/src/pdch.cpp b/src/pdch.cpp index 22a1605f..c6c677cf 100644 --- a/src/pdch.cpp +++ b/src/pdch.cpp @@ -43,6 +43,7 @@ extern "C" { #include <osmocom/core/gsmtap.h> #include <osmocom/core/logging.h> #include <osmocom/core/utils.h> + #include "coding_scheme.h" } #include <errno.h> @@ -738,7 +739,7 @@ int gprs_rlcmac_pdch::rcv_block(uint8_t *data, uint8_t len, uint32_t fn, bts()->rlc_ul_bytes(len); LOGP(DRLCMACUL, LOGL_DEBUG, "Got RLC block, coding scheme: %s, " - "length: %d (%d))\n", cs.name(), len, cs.usedSizeUL()); + "length: %d (%d))\n", mcs_name(cs), len, cs.usedSizeUL()); if (cs.isGprs()) return rcv_block_gprs(data, len, fn, meas, cs); @@ -748,7 +749,7 @@ int gprs_rlcmac_pdch::rcv_block(uint8_t *data, uint8_t len, uint32_t fn, bts()->decode_error(); LOGP(DRLCMACUL, LOGL_ERROR, "Unsupported coding scheme %s\n", - cs.name()); + mcs_name(cs)); return -EINVAL; } @@ -768,7 +769,7 @@ int gprs_rlcmac_pdch::rcv_data_block(uint8_t *data, uint8_t data_len, uint32_t f if (!bts()->bts_data()->egprs_enabled) { LOGP(DRLCMACUL, LOGL_ERROR, "Got %s RLC block but EGPRS is not enabled\n", - cs.name()); + mcs_name(cs)); return -EINVAL; } bts()->send_gsmtap(PCU_GSMTAP_C_UL_DATA_EGPRS, true, trx_no(), ts_no, GSMTAP_CHANNEL_PDTCH, fn, @@ -784,7 +785,7 @@ int gprs_rlcmac_pdch::rcv_data_block(uint8_t *data, uint8_t data_len, uint32_t f if (rc < 0) { LOGP(DRLCMACUL, LOGL_ERROR, "Got %s RLC block but header parsing has failed\n", - cs.name()); + mcs_name(cs)); bts()->decode_error(); return rc; } @@ -793,7 +794,7 @@ int gprs_rlcmac_pdch::rcv_data_block(uint8_t *data, uint8_t data_len, uint32_t f "Got %s RLC block: " "R=%d, SI=%d, TFI=%d, CPS=%d, RSB=%d, " "rc=%d\n", - cs.name(), + mcs_name(cs), rlc_dec.r, rlc_dec.si, rlc_dec.tfi, rlc_dec.cps, rlc_dec.rsb, rc); diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index 2f4781ca..38dab37e 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -46,6 +46,7 @@ extern "C" { #include <osmocom/core/utils.h> #include <osmocom/gsm/gsm_utils.h> #include <osmocom/gsm/protocol/gsm_04_08.h> + #include "coding_scheme.h" } #include <errno.h> @@ -429,7 +430,7 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn, new_cs = force_cs ? force_cs : current_cs(); LOGPTBFDL(this, LOGL_DEBUG, "Sending new block at BSN %d, CS=%s\n", - m_window.v_s(), new_cs.name()); + m_window.v_s(), mcs_name(new_cs)); bsn = create_new_bsn(fn, new_cs); } else if (!m_window.window_empty()) { @@ -443,7 +444,7 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn, /* Nothing left to send, create dummy LLC commands */ LOGPTBFDL(this, LOGL_DEBUG, "Sending new dummy block at BSN %d, CS=%s\n", - m_window.v_s(), current_cs().name()); + m_window.v_s(), mcs_name(current_cs())); bsn = create_new_bsn(fn, current_cs()); /* Don't send a second block, so don't set cs_current_trans */ } @@ -624,7 +625,7 @@ int gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, GprsCodingScheme cs) } while (ar == Encoding::AR_COMPLETED_SPACE_LEFT); LOGPTBFDL(this, LOGL_DEBUG, "data block (BSN %d, %s): %s\n", - bsn, rlc_data->cs_last.name(), + bsn, mcs_name(rlc_data->cs_last), osmo_hexdump(rlc_data->block, block_data_len)); /* raise send state and set ack state array */ m_window.m_v_b.mark_unacked(bsn); @@ -867,7 +868,7 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block( Encoding::rlc_write_dl_data_header(&rlc, msg_data); LOGPTBFDL(this, LOGL_DEBUG, "msg block (BSN %d, %s%s): %s\n", - index, cs.name(), + index, mcs_name(cs), need_padding ? ", padded" : "", msgb_hexdump(dl_msg)); @@ -1281,7 +1282,7 @@ enum egprs_rlc_dl_reseg_bsn_state "FIXME: Software error: hit invalid condition. " "headerType(%d) blockstatus(%d) cs(%s) PLEASE FIX!\n", cs_current_trans.headerTypeData(), - *block_status_dl, cs_init.name()); + *block_status_dl, mcs_name(cs_init)); break; } diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp index bc36733e..0bf57654 100644 --- a/src/tbf_ul.cpp +++ b/src/tbf_ul.cpp @@ -43,6 +43,7 @@ extern "C" { #include <osmocom/gprs/gprs_bssgp_bss.h> #include <osmocom/gprs/protocol/gsm_08_18.h> #include <osmocom/gsm/tlv.h> + #include "coding_scheme.h" } #include <errno.h> @@ -212,7 +213,7 @@ int gprs_rlcmac_ul_tbf::rcv_data_block_acknowledged( LOGPTBFUL(this, LOGL_DEBUG, "Got %s RLC data block: CV=%d, BSN=%d, SPB=%d, PI=%d, E=%d, TI=%d, bitoffs=%d\n", - rlc->cs.name(), + mcs_name(rlc->cs), rdbi->cv, rdbi->bsn, rdbi->spb, rdbi->pi, rdbi->e, rdbi->ti, rlc->data_offs_bits[block_idx]); @@ -278,7 +279,7 @@ int gprs_rlcmac_ul_tbf::rcv_data_block_acknowledged( bts->decode_error(); LOGPTBFUL(this, LOGL_NOTICE, "Failed to decode TLLI of %s UL DATA TFI=%d.\n", - rlc->cs.name(), rlc->tfi); + mcs_name(rlc->cs), rlc->tfi); m_window.invalidate_bsn(rdbi->bsn); continue; } @@ -479,7 +480,7 @@ egprs_rlc_ul_reseg_bsn_state gprs_rlcmac_ul_tbf::handle_egprs_ul_spb( LOGPTBFUL(this, LOGL_DEBUG, "Got SPB(%d) cs(%s) data block with BSN (%d), TFI(%d).\n", - rdbi->spb, rlc->cs.name(), rdbi->bsn, rlc->tfi); + rdbi->spb, mcs_name(rlc->cs), rdbi->bsn, rlc->tfi); egprs_rlc_ul_reseg_bsn_state assemble_status = EGPRS_RESEG_INVALID; @@ -517,7 +518,7 @@ egprs_rlc_ul_reseg_bsn_state gprs_rlcmac_ul_tbf::handle_egprs_ul_spb( default: LOGPTBFUL(this, LOGL_ERROR, "cs(%s) Error in Upgrading to higher MCS\n", - rlc->cs.name()); + mcs_name(rlc->cs)); break; } } diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp index 23abadab..41a11159 100644 --- a/tests/edge/EdgeTest.cpp +++ b/tests/edge/EdgeTest.cpp @@ -1118,7 +1118,7 @@ static void test_rlc_unaligned_copy() fprintf(stderr, "Encoded message block, %s, idx %d, " "pattern %02x: %s\n", - rlc.cs.name(), block_idx, pattern, + mcs_name(rlc.cs), block_idx, pattern, osmo_hexdump(bits, cs.sizeDL())); Decoding::rlc_copy_to_aligned_buffer( |