This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Max gerrit-no-reply at lists.osmocom.orgMax has uploaded this change for review. ( https://gerrit.osmocom.org/13067 Change subject: Move blocks/bits size computation to C file ...................................................................... Move blocks/bits size computation to C file Move functions which compute number of blocks or bits depending on header type into C file to simplify further modifications and testing. Change-Id: Id0873f85e1f16a72e17e7fbc4ad76b194917067f --- M debian/copyright M src/Makefile.am A src/coding_scheme.c M src/coding_scheme.h M src/decoding.cpp M src/encoding.cpp M src/gprs_bssgp_pcu.cpp M src/gprs_coding_scheme.cpp M src/gprs_coding_scheme.h M src/rlc.cpp M src/tbf_dl.cpp M tests/edge/EdgeTest.cpp 12 files changed, 125 insertions(+), 99 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/67/13067/1 diff --git a/debian/copyright b/debian/copyright index 853cd6e..39e810c 100644 --- a/debian/copyright +++ b/debian/copyright @@ -13,6 +13,8 @@ Files: src/gprs_ms_storage.h src/gprs_ms_storage.cpp src/gprs_ms.h + src/coding_scheme.c + src/coding_scheme.h src/gprs_coding_scheme.cpp src/gprs_coding_scheme.h src/cxx_linuxlist.h diff --git a/src/Makefile.am b/src/Makefile.am index eb4a2bb..51b047e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -63,6 +63,7 @@ rlc.cpp \ osmobts_sock.cpp \ gprs_codel.c \ + coding_scheme.c \ gprs_coding_scheme.cpp \ egprs_rlc_compression.cpp diff --git a/src/coding_scheme.c b/src/coding_scheme.c new file mode 100644 index 0000000..91ece40 --- /dev/null +++ b/src/coding_scheme.c @@ -0,0 +1,61 @@ +/* coding_scheme.c + * + * Copyright (C) 2019 by sysmocom s.f.m.c. GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include <stdint.h> +#include <stdbool.h> + +#include <osmocom/core/utils.h> + +#include "coding_scheme.h" + +static struct { + struct { + uint8_t data_header_bits; + } uplink, downlink; + uint8_t data_block_header_bits; + uint8_t num_blocks; + const char *name; +} hdr_type_info[NUM_HEADER_TYPES] = { + { { 0 }, { 0 }, 0, 0, "INVALID" }, + { { 1 * 8 + 0 }, { 1 * 8 + 0 }, 0, 0, "CONTROL" }, + { { 3 * 8 + 0 }, { 3 * 8 + 0 }, 0, 1, "GPRS_DATA" }, + { { 5 * 8 + 6 }, { 5 * 8 + 0 }, 2, 2, "EGPRS_DATA_TYPE1" }, + { { 4 * 8 + 5 }, { 3 * 8 + 4 }, 2, 1, "EGPRS_DATA_TYPE2" }, + { { 3 * 8 + 7 }, { 3 * 8 + 7 }, 2, 1, "EGPRS_DATA_TYPE3" }, +}; + +uint8_t numDataBlocks(enum HeaderType ht) +{ + return hdr_type_info[ht].num_blocks; +} + +uint8_t numDataHeaderBitsUL(enum HeaderType ht) +{ + return hdr_type_info[ht].uplink.data_header_bits; +} + +uint8_t numDataHeaderBitsDL(enum HeaderType ht) +{ + return hdr_type_info[ht].downlink.data_header_bits; +} + +uint8_t numDataBlockHeaderBits(enum HeaderType ht) +{ + return hdr_type_info[ht].data_block_header_bits; +} diff --git a/src/coding_scheme.h b/src/coding_scheme.h index 3705ea4..b7093d1 100644 --- a/src/coding_scheme.h +++ b/src/coding_scheme.h @@ -27,3 +27,20 @@ MCS1, MCS2, MCS3, MCS4, MCS5, MCS6, MCS7, MCS8, MCS9, NUM_SCHEMES }; + +enum HeaderType { + HEADER_INVALID, + HEADER_GPRS_CONTROL, + HEADER_GPRS_DATA, + HEADER_EGPRS_DATA_TYPE_1, + HEADER_EGPRS_DATA_TYPE_2, + HEADER_EGPRS_DATA_TYPE_3, + NUM_HEADER_TYPES +}; + +enum HeaderType headerTypeData(enum CodingScheme mcs); + +uint8_t numDataBlocks(enum HeaderType ht); +uint8_t numDataHeaderBitsUL(enum HeaderType ht); +uint8_t numDataHeaderBitsDL(enum HeaderType ht); +uint8_t numDataBlockHeaderBits(enum HeaderType ht); diff --git a/src/decoding.cpp b/src/decoding.cpp index 0dbb10a..3410291 100644 --- a/src/decoding.cpp +++ b/src/decoding.cpp @@ -355,16 +355,16 @@ { unsigned int cur_bit = 0; switch(cs.headerTypeData()) { - case GprsCodingScheme::HEADER_GPRS_DATA : + case HEADER_GPRS_DATA : cur_bit = rlc_parse_ul_data_header_gprs(rlc, data, cs); break; - case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3 : + case HEADER_EGPRS_DATA_TYPE_3 : cur_bit = rlc_parse_ul_data_header_egprs_type_3(rlc, data, cs); break; - case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2 : + case HEADER_EGPRS_DATA_TYPE_2 : cur_bit = rlc_parse_ul_data_header_egprs_type_2(rlc, data, cs); break; - case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1 : + case HEADER_EGPRS_DATA_TYPE_1 : cur_bit = rlc_parse_ul_data_header_egprs_type_1(rlc, data, cs); break; default: diff --git a/src/encoding.cpp b/src/encoding.cpp index 4c8cdb0..4a57ce3 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -1104,7 +1104,7 @@ unsigned int bsn_delta; switch(cs.headerTypeData()) { - case GprsCodingScheme::HEADER_GPRS_DATA: + case HEADER_GPRS_DATA: gprs = static_cast<struct rlc_dl_header *> ((void *)data); @@ -1120,7 +1120,7 @@ gprs->bsn = rlc->block_info[0].bsn; break; - case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1: + case HEADER_EGPRS_DATA_TYPE_1: egprs1 = static_cast<struct gprs_rlc_dl_header_egprs_1 *> ((void *)data); @@ -1159,7 +1159,7 @@ data[offs] = (data[offs] & 0b11110011) | e_fbi_header; break; - case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2: + case HEADER_EGPRS_DATA_TYPE_2: egprs2 = static_cast<struct gprs_rlc_dl_header_egprs_2 *> ((void *)data); @@ -1183,7 +1183,7 @@ data[offs] = (data[offs] & 0b11001111) | e_fbi_header; break; - case GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3: + case HEADER_EGPRS_DATA_TYPE_3: egprs3 = static_cast<struct gprs_rlc_dl_header_egprs_3 *> ((void *)data); diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp index f63fac3..ae2ab7c 100644 --- a/src/gprs_bssgp_pcu.cpp +++ b/src/gprs_bssgp_pcu.cpp @@ -26,6 +26,7 @@ #include <tbf.h> #include <gprs_coding_scheme.h> #include <pdch.h> +#include "coding_scheme.h" #define BSSGP_TIMER_T1 30 /* Guards the (un)blocking procedures */ #define BSSGP_TIMER_T2 30 /* Guards the reset procedure */ @@ -607,7 +608,7 @@ static uint32_t gprs_bssgp_max_leak_rate(GprsCodingScheme cs, int num_pdch) { - int bytes_per_rlc_block = cs.maxDataBlockBytes() * cs.numDataBlocks(); + int bytes_per_rlc_block = cs.maxDataBlockBytes() * numDataBlocks(cs.headerTypeData()); /* n byte payload per 20ms */ return bytes_per_rlc_block * (1000 / 20) * num_pdch; diff --git a/src/gprs_coding_scheme.cpp b/src/gprs_coding_scheme.cpp index 1231f0e..d7934ec 100644 --- a/src/gprs_coding_scheme.cpp +++ b/src/gprs_coding_scheme.cpp @@ -75,55 +75,39 @@ uint8_t data_bytes; uint8_t optional_padding_bits; const char *name; - GprsCodingScheme::HeaderType data_hdr; + enum HeaderType data_hdr; GprsCodingScheme::Family family; } mcs_info[NUM_SCHEMES] = { {{0, 0}, {0, 0}, 0, 0, "UNKNOWN", - GprsCodingScheme::HEADER_INVALID, GprsCodingScheme::FAMILY_INVALID}, + HEADER_INVALID, GprsCodingScheme::FAMILY_INVALID}, {{23, 0}, {23, 0}, 20, 0, "CS-1", - GprsCodingScheme::HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, + HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, {{33, 7}, {33, 7}, 30, 0, "CS-2", - GprsCodingScheme::HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, + HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, {{39, 3}, {39, 3}, 36, 0, "CS-3", - GprsCodingScheme::HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, + HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, {{53, 7}, {53, 7}, 50, 0, "CS-4", - GprsCodingScheme::HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, + HEADER_GPRS_DATA, GprsCodingScheme::FAMILY_INVALID}, {{26, 1}, {26, 1}, 22, 0, "MCS-1", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_C}, + HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_C}, {{32, 1}, {32, 1}, 28, 0, "MCS-2", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_B}, + HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_B}, {{41, 1}, {41, 1}, 37, 48, "MCS-3", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_A}, + HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_A}, {{48, 1}, {48, 1}, 44, 0, "MCS-4", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_C}, + HEADER_EGPRS_DATA_TYPE_3, GprsCodingScheme::FAMILY_C}, {{60, 7}, {59, 6}, 56, 0, "MCS-5", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2, GprsCodingScheme::FAMILY_B}, + HEADER_EGPRS_DATA_TYPE_2, GprsCodingScheme::FAMILY_B}, {{78, 7}, {77, 6}, 74, 48, "MCS-6", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2, GprsCodingScheme::FAMILY_A}, + HEADER_EGPRS_DATA_TYPE_2, GprsCodingScheme::FAMILY_A}, {{118, 2}, {117, 4}, 56, 0, "MCS-7", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1, GprsCodingScheme::FAMILY_B}, + HEADER_EGPRS_DATA_TYPE_1, GprsCodingScheme::FAMILY_B}, {{142, 2}, {141, 4}, 68, 0, "MCS-8", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1, GprsCodingScheme::FAMILY_A}, + HEADER_EGPRS_DATA_TYPE_1, GprsCodingScheme::FAMILY_A}, {{154, 2}, {153, 4}, 74, 0, "MCS-9", - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1, GprsCodingScheme::FAMILY_A}, -}; - -static struct { - struct { - uint8_t data_header_bits; - } uplink, downlink; - uint8_t data_block_header_bits; - uint8_t num_blocks; - const char *name; -} hdr_type_info[GprsCodingScheme::NUM_HEADER_TYPES] = { - {{0}, {0}, 0, 0, "INVALID"}, - {{1*8 + 0}, {1*8 + 0}, 0, 0, "CONTROL"}, - {{3*8 + 0}, {3*8 + 0}, 0, 1, "GPRS_DATA"}, - {{5*8 + 6}, {5*8 + 0}, 2, 2, "EGPRS_DATA_TYPE1"}, - {{4*8 + 5}, {3*8 + 4}, 2, 1, "EGPRS_DATA_TYPE2"}, - {{3*8 + 7}, {3*8 + 7}, 2, 1, "EGPRS_DATA_TYPE3"}, + HEADER_EGPRS_DATA_TYPE_1, GprsCodingScheme::FAMILY_A}, }; GprsCodingScheme GprsCodingScheme::getBySizeUL(unsigned size) @@ -203,32 +187,12 @@ return mcs_info[m_scheme].optional_padding_bits; } -uint8_t GprsCodingScheme::numDataBlocks() const -{ - return hdr_type_info[headerTypeData()].num_blocks; -} - -uint8_t GprsCodingScheme::numDataHeaderBitsUL() const -{ - return hdr_type_info[headerTypeData()].uplink.data_header_bits; -} - -uint8_t GprsCodingScheme::numDataHeaderBitsDL() const -{ - return hdr_type_info[headerTypeData()].downlink.data_header_bits; -} - -uint8_t GprsCodingScheme::numDataBlockHeaderBits() const -{ - return hdr_type_info[headerTypeData()].data_block_header_bits; -} - const char *GprsCodingScheme::name() const { return mcs_info[m_scheme].name; } -GprsCodingScheme::HeaderType GprsCodingScheme::headerTypeData() const +enum HeaderType GprsCodingScheme::headerTypeData() const { return mcs_info[m_scheme].data_hdr; } @@ -315,11 +279,6 @@ return family() == o.family(); } -bool GprsCodingScheme::isCombinable(GprsCodingScheme o) const -{ - return numDataBlocks() == o.numDataBlocks(); -} - void GprsCodingScheme::decToSingleBlock(bool *needStuffing) { switch (m_scheme) { diff --git a/src/gprs_coding_scheme.h b/src/gprs_coding_scheme.h index 89054f5..8715f16 100644 --- a/src/gprs_coding_scheme.h +++ b/src/gprs_coding_scheme.h @@ -40,16 +40,6 @@ EGPRS, }; - enum HeaderType { - HEADER_INVALID, - HEADER_GPRS_CONTROL, - HEADER_GPRS_DATA, - HEADER_EGPRS_DATA_TYPE_1, - HEADER_EGPRS_DATA_TYPE_2, - HEADER_EGPRS_DATA_TYPE_3, - NUM_HEADER_TYPES - }; - enum Family { FAMILY_INVALID, FAMILY_A, @@ -74,7 +64,6 @@ bool isCompatible(Mode mode) const; bool isCompatible(GprsCodingScheme o) const; bool isFamilyCompatible(GprsCodingScheme o) const; - bool isCombinable(GprsCodingScheme o) const; void inc(Mode mode); void dec(Mode mode); @@ -91,13 +80,9 @@ uint8_t spareBitsUL() const; uint8_t spareBitsDL() const; uint8_t maxDataBlockBytes() const; - uint8_t numDataBlocks() const; - uint8_t numDataHeaderBitsUL() const; - uint8_t numDataHeaderBitsDL() const; - uint8_t numDataBlockHeaderBits() const; uint8_t optionalPaddingBits() const; const char *name() const; - HeaderType headerTypeData() const; + enum HeaderType headerTypeData() const; HeaderType headerTypeControl() const; Family family() const; @@ -142,7 +127,7 @@ return (isGprs() && o.isGprs()) || (isEgprs() && o.isEgprs()); } -inline GprsCodingScheme::HeaderType GprsCodingScheme::headerTypeControl() const +inline enum HeaderType GprsCodingScheme::headerTypeControl() const { return HEADER_GPRS_CONTROL; } diff --git a/src/rlc.cpp b/src/rlc.cpp index 323fde4..b08ad48 100644 --- a/src/rlc.cpp +++ b/src/rlc.cpp @@ -336,7 +336,7 @@ rlc->es_p = 0; rlc->rrbp = 0; rlc->pr = 0; - rlc->num_data_blocks = cs.numDataBlocks(); + rlc->num_data_blocks = numDataBlocks(cs.headerTypeData()); rlc->with_padding = with_padding; OSMO_ASSERT(rlc->num_data_blocks <= ARRAY_SIZE(rlc->block_info)); @@ -347,7 +347,7 @@ rlc->data_offs_bits[i] = header_bits + padding_bits + - (i+1) * cs.numDataBlockHeaderBits() + + (i+1) * numDataBlockHeaderBits(cs.headerTypeData()) + i * 8 * rlc->block_info[0].data_len; } } @@ -356,7 +356,7 @@ GprsCodingScheme cs, bool with_padding, const unsigned int spb) { return gprs_rlc_data_header_init(rlc, cs, with_padding, - cs.numDataHeaderBitsDL(), spb); + numDataHeaderBitsDL(cs.headerTypeData()), spb); } void gprs_rlc_data_info_init_ul(struct gprs_rlc_data_info *rlc, @@ -367,7 +367,7 @@ * for both DL and UL */ return gprs_rlc_data_header_init(rlc, cs, with_padding, - cs.numDataHeaderBitsUL(), 0); + numDataHeaderBitsUL(cs.headerTypeData()), 0); } void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi, diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index 7b0052f..bebeb2a 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -457,7 +457,7 @@ bts->rlc_resent(); } - *may_combine = m_rlc.block(bsn)->cs_current_trans.numDataBlocks() > 1; + *may_combine = numDataBlocks(m_rlc.block(bsn)->cs_current_trans.headerTypeData()) > 1; return bsn; } @@ -1259,7 +1259,7 @@ * MCS4: second segment starts at 44/2 = 22 */ if (cs_current_trans.headerTypeData() == - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3) { + HEADER_EGPRS_DATA_TYPE_3) { if (*block_status_dl == EGPRS_RESEG_FIRST_SEG_SENT) { switch (CodingScheme(cs_init)) { case MCS6 : @@ -1287,9 +1287,9 @@ } return EGPRS_RESEG_SECOND_SEG_SENT; } else if ((cs_init.headerTypeData() == - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1) || + HEADER_EGPRS_DATA_TYPE_1) || (cs_init.headerTypeData() == - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2)) { + HEADER_EGPRS_DATA_TYPE_2)) { return EGPRS_RESEG_FIRST_SEG_SENT; } else if ((CodingScheme(cs_init) == MCS4) && @@ -1327,7 +1327,7 @@ /* Table 10.4.8b.1 of 44.060 */ if (cs_current_trans.headerTypeData() == - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_3) { + HEADER_EGPRS_DATA_TYPE_3) { /* * if we are sending the second segment the spb should be 3 * other wise it should be 2 @@ -1338,9 +1338,9 @@ bts->spb_downlink_second_segment(); return EGPRS_RLCMAC_DL_SEC_SEG; } else if ((cs_init.headerTypeData() == - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1) || + HEADER_EGPRS_DATA_TYPE_1) || (cs_init.headerTypeData() == - GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2)) { + HEADER_EGPRS_DATA_TYPE_2)) { bts->spb_downlink_first_segment(); return EGPRS_RLCMAC_DL_FIRST_SEG; } else if ((CodingScheme(cs_init) == diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp index 9f19872..c381d99 100644 --- a/tests/edge/EdgeTest.cpp +++ b/tests/edge/EdgeTest.cpp @@ -71,8 +71,8 @@ OSMO_ASSERT(expected_size == cs.sizeDL()); /* Check data block sizes */ - OSMO_ASSERT(cs.maxDataBlockBytes() * cs.numDataBlocks() < cs.maxBytesDL()); - OSMO_ASSERT(cs.maxDataBlockBytes() * cs.numDataBlocks() < cs.maxBytesUL()); + OSMO_ASSERT(cs.maxDataBlockBytes() * numDataBlocks(cs.headerTypeData()) < cs.maxBytesDL()); + OSMO_ASSERT(cs.maxDataBlockBytes() * numDataBlocks(cs.headerTypeData()) < cs.maxBytesUL()); /* Check inc/dec */ new_cs = cs; @@ -160,9 +160,9 @@ /* Check header types */ OSMO_ASSERT(current_cs.headerTypeData() == - GprsCodingScheme::HEADER_GPRS_DATA); + HEADER_GPRS_DATA); OSMO_ASSERT(current_cs.headerTypeControl() == - GprsCodingScheme::HEADER_GPRS_CONTROL); + HEADER_GPRS_CONTROL); check_coding_scheme(current_cs, GprsCodingScheme::GPRS); } @@ -1094,7 +1094,7 @@ test_block[cs.maxDataBlockBytes()-1] = pattern ^ 0xff; for (block_idx = 0; - block_idx < cs.numDataBlocks(); + block_idx < numDataBlocks(cs.headerTypeData()); block_idx++) { struct gprs_rlc_data_info rlc; -- To view, visit https://gerrit.osmocom.org/13067 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-pcu Gerrit-Branch: master Gerrit-MessageType: newchange Gerrit-Change-Id: Id0873f85e1f16a72e17e7fbc4ad76b194917067f Gerrit-Change-Number: 13067 Gerrit-PatchSet: 1 Gerrit-Owner: Max <msuraev at sysmocom.de> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190226/8fab8318/attachment.htm>