[MERGED] libosmocore[master]: Add osmo_gprs_{ul, dl}_block_size_{bits, bytes} functions

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/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Wed Aug 9 20:39:12 UTC 2017


Harald Welte has submitted this change and it was merged.

Change subject: Add osmo_gprs_{ul,dl}_block_size_{bits,bytes} functions
......................................................................


Add osmo_gprs_{ul,dl}_block_size_{bits,bytes} functions

Those functions can be used to look up the size of (E)GPRS blocks.

Change-Id: I05ff75ef7dfae639886bbd09fe35f03a8af9d988
---
M include/osmocom/gprs/gprs_rlc.h
M src/gsm/gprs_rlc.c
M src/gsm/libosmogsm.map
3 files changed, 121 insertions(+), 0 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/include/osmocom/gprs/gprs_rlc.h b/include/osmocom/gprs/gprs_rlc.h
index 05d3de6..b74f9e4 100644
--- a/include/osmocom/gprs/gprs_rlc.h
+++ b/include/osmocom/gprs/gprs_rlc.h
@@ -26,4 +26,29 @@
         EGPRS_HDR_TYPE3,
 };
 
+enum osmo_gprs_cs {
+	OSMO_GPRS_CS_NONE,
+	OSMO_GPRS_CS1,
+	OSMO_GPRS_CS2,
+	OSMO_GPRS_CS3,
+	OSMO_GPRS_CS4,
+	OSMO_GPRS_MCS1,
+	OSMO_GPRS_MCS2,
+	OSMO_GPRS_MCS3,
+	OSMO_GPRS_MCS4,
+	OSMO_GPRS_MCS5,
+	OSMO_GPRS_MCS6,
+	OSMO_GPRS_MCS7,
+	OSMO_GPRS_MCS8,
+	OSMO_GPRS_MCS9,
+	_NUM_OSMO_GPRS_CS
+};
+
 int egprs_get_cps(struct egprs_cps *cps, uint8_t type, uint8_t bits);
+
+int osmo_gprs_ul_block_size_bits(enum osmo_gprs_cs cs);
+int osmo_gprs_dl_block_size_bits(enum osmo_gprs_cs cs);
+int osmo_gprs_ul_block_size_bytes(enum osmo_gprs_cs cs);
+int osmo_gprs_dl_block_size_bytes(enum osmo_gprs_cs cs);
+enum osmo_gprs_cs osmo_gprs_ul_cs_by_block_bytes(uint8_t block_size);
+enum osmo_gprs_cs osmo_gprs_dl_cs_by_block_bytes(uint8_t block_size);
diff --git a/src/gsm/gprs_rlc.c b/src/gsm/gprs_rlc.c
index b213b26..d2c05b7 100644
--- a/src/gsm/gprs_rlc.c
+++ b/src/gsm/gprs_rlc.c
@@ -5,6 +5,7 @@
 #include <errno.h>
 #include <string.h>
 
+#include <osmocom/core/utils.h>
 #include <osmocom/gprs/gprs_rlc.h>
 #include <osmocom/coding/gsm0503_coding.h>
 #include <osmocom/gprs/protocol/gsm_04_60.h>
@@ -109,3 +110,92 @@
 
 	return 0;
 }
+
+struct gprs_cs_desc {
+	struct {
+		uint8_t bytes;
+		uint8_t bits;
+	} uplink, downlink;
+};
+
+const struct gprs_cs_desc gprs_cs_desc[_NUM_OSMO_GPRS_CS] = {
+	[OSMO_GPRS_CS1]		= { {23, 0},	{23, 0} },
+	[OSMO_GPRS_CS2]		= { {33, 7},	{33, 7} },
+	[OSMO_GPRS_CS3]		= { {39, 3},	{39, 3} },
+	[OSMO_GPRS_CS4]		= { {53, 7}, 	{53, 7} },
+
+	[OSMO_GPRS_MCS1]	= { {26, 1}, 	{26, 1} },
+	[OSMO_GPRS_MCS2]	= { {32, 1}, 	{32, 1} },
+	[OSMO_GPRS_MCS3]	= { {41, 1}, 	{41, 1} },
+	[OSMO_GPRS_MCS4]	= { {48, 1}, 	{48, 1} },
+
+	[OSMO_GPRS_MCS5]	= { {60, 7}, 	{59, 6} },
+	[OSMO_GPRS_MCS6]	= { {78, 7}, 	{77, 6} },
+	[OSMO_GPRS_MCS7]	= { {118, 2}, 	{117, 4} },
+	[OSMO_GPRS_MCS8]	= { {142, 2}, 	{141, 4} },
+	[OSMO_GPRS_MCS9]	= { {154, 2}, 	{153, 4} },
+};
+
+/*! Return size of (E)GPRS uplink block for given coding scheme in bits */
+int osmo_gprs_ul_block_size_bits(enum osmo_gprs_cs cs)
+{
+	if (cs >= ARRAY_SIZE(gprs_cs_desc))
+		return -EINVAL;
+	return gprs_cs_desc[cs].uplink.bytes * 8 + gprs_cs_desc[cs].uplink.bits;
+}
+
+/*! Return size of (E)GPRS downlink block for given coding scheme in bits */
+int osmo_gprs_dl_block_size_bits(enum osmo_gprs_cs cs)
+{
+	if (cs >= ARRAY_SIZE(gprs_cs_desc))
+		return -EINVAL;
+	return gprs_cs_desc[cs].downlink.bytes * 8 + gprs_cs_desc[cs].downlink.bits;
+}
+
+/*! Return size of (E)GPRS uplink block for given coding scheme in bytes */
+int osmo_gprs_ul_block_size_bytes(enum osmo_gprs_cs cs)
+{
+	int rc;
+	if (cs >= ARRAY_SIZE(gprs_cs_desc))
+		return -EINVAL;
+	rc = gprs_cs_desc[cs].uplink.bytes;
+	if (gprs_cs_desc[cs].uplink.bits)
+		rc++;
+	return rc;
+}
+
+/*! Return size of (E)GPRS downlink block for given coding scheme in bytes */
+int osmo_gprs_dl_block_size_bytes(enum osmo_gprs_cs cs)
+{
+	int rc;
+	if (cs >= ARRAY_SIZE(gprs_cs_desc))
+		return -EINVAL;
+	rc = gprs_cs_desc[cs].downlink.bytes;
+	if (gprs_cs_desc[cs].downlink.bits)
+		rc++;
+	return rc;
+}
+
+/*! Return coding scheme for given (E)GPRS uplink block size */
+enum osmo_gprs_cs osmo_gprs_ul_cs_by_block_bytes(uint8_t block_size)
+{
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(gprs_cs_desc); i++) {
+		if (block_size == osmo_gprs_ul_block_size_bytes(i))
+			return i;
+	}
+	return OSMO_GPRS_CS_NONE;
+}
+
+/*! Return coding scheme for given (E)GPRS downlink block size */
+enum osmo_gprs_cs osmo_gprs_dl_cs_by_block_bytes(uint8_t block_size)
+{
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(gprs_cs_desc); i++) {
+		if (block_size == osmo_gprs_dl_block_size_bytes(i))
+			return i;
+	}
+	return OSMO_GPRS_CS_NONE;
+}
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index 714cb25..066f410 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -65,6 +65,12 @@
 gprs_msgt_gmm_names;
 
 egprs_get_cps;
+osmo_gprs_ul_block_size_bits;
+osmo_gprs_dl_block_size_bits;
+osmo_gprs_ul_block_size_bytes;
+osmo_gprs_dl_block_size_bytes;
+osmo_gprs_ul_cs_by_block_bytes;
+osmo_gprs_dl_cs_by_block_bytes;
 
 gsm48_gmm_cause_names;
 gsm48_gsm_cause_names;

-- 
To view, visit https://gerrit.osmocom.org/3454
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I05ff75ef7dfae639886bbd09fe35f03a8af9d988
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list