[PATCH] osmo-pcu[master]: egprs: Use RLC/MAC headers from libosmocore

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

Tom Tsou gerrit-no-reply at lists.osmocom.org
Tue Jul 12 00:23:30 UTC 2016


Review at  https://gerrit.osmocom.org/495

egprs: Use RLC/MAC headers from libosmocore

EGPRS Type 1, 2, and 3 headers are used by OsmoPCU and OsmoBTS.
Move the header definitions to libosmocore to be shared by both
packages.

Modify the struct variable naming to use *_hi/*_lo instead of
*_a/*_b in order to be consistent with existing naming used in
libosmocore.

Change-Id: I98687ad981d27502aec42729611937ba1caf207c
---
M src/decoding.cpp
M src/encoding.cpp
M src/rlc.h
3 files changed, 31 insertions(+), 125 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/95/495/1

diff --git a/src/decoding.cpp b/src/decoding.cpp
index 7865be0..7c00ff7 100644
--- a/src/decoding.cpp
+++ b/src/decoding.cpp
@@ -24,6 +24,7 @@
 extern "C" {
 #include <osmocom/core/utils.h>
 #include <osmocom/core/bitcomp.h>
+#include <osmocom/gprs/protocol/gsm_04_60.h>
 }
 
 #include <arpa/inet.h>
@@ -381,13 +382,13 @@
 	egprs3 = static_cast < struct gprs_rlc_ul_header_egprs_3 * >
 			((void *)data);
 
-	cps    = (egprs3->cps_a << 0)  | (egprs3->cps_b << 2);
+	cps    = (egprs3->cps_hi << 0)  | (egprs3->cps_lo << 2);
 	gprs_rlc_mcs_cps_decode(cps, cs, &punct, &punct2, &with_padding);
 	gprs_rlc_data_info_init_ul(rlc, cs, with_padding);
 
 	rlc->r      = egprs3->r;
 	rlc->si     = egprs3->si;
-	rlc->tfi    = (egprs3->tfi_a << 0)  | (egprs3->tfi_b << 2);
+	rlc->tfi    = (egprs3->tfi_hi << 0)  | (egprs3->tfi_lo << 2);
 	rlc->cps    = cps;
 	rlc->rsb    = egprs3->rsb;
 
@@ -396,7 +397,7 @@
 	rlc->block_info[0].pi  = egprs3->pi;
 	rlc->block_info[0].spb = egprs3->spb;
 	rlc->block_info[0].bsn =
-			(egprs3->bsn1_a << 0) | (egprs3->bsn1_b << 5);
+			(egprs3->bsn1_hi << 0) | (egprs3->bsn1_lo << 5);
 
 	cur_bit += rlc->data_offs_bits[0] - 2;
 	offs = rlc->data_offs_bits[0] / 8;
@@ -423,13 +424,13 @@
 	egprs2 = static_cast < struct gprs_rlc_ul_header_egprs_2 * >
 			((void *)data);
 
-	cps    = (egprs2->cps_a << 0)  | (egprs2->cps_b << 2);
+	cps    = (egprs2->cps_hi << 0)  | (egprs2->cps_lo << 2);
 	gprs_rlc_mcs_cps_decode(cps, cs, &punct, &punct2, &with_padding);
 	gprs_rlc_data_info_init_ul(rlc, cs, with_padding);
 
 	rlc->r      = egprs2->r;
 	rlc->si     = egprs2->si;
-	rlc->tfi    = (egprs2->tfi_a << 0)  | (egprs2->tfi_b << 2);
+	rlc->tfi    = (egprs2->tfi_hi << 0)  | (egprs2->tfi_lo << 2);
 	rlc->cps    = cps;
 	rlc->rsb    = egprs2->rsb;
 
@@ -437,7 +438,7 @@
 	rlc->block_info[0].cv  = egprs2->cv;
 	rlc->block_info[0].pi  = egprs2->pi;
 	rlc->block_info[0].bsn =
-		(egprs2->bsn1_a << 0) | (egprs2->bsn1_b << 5);
+		(egprs2->bsn1_hi << 0) | (egprs2->bsn1_lo << 5);
 
 	cur_bit += rlc->data_offs_bits[0] - 2;
 
@@ -471,14 +472,14 @@
 
 	rlc->r      = egprs1->r;
 	rlc->si     = egprs1->si;
-	rlc->tfi    = (egprs1->tfi_a << 0)  | (egprs1->tfi_b << 2);
+	rlc->tfi    = (egprs1->tfi_hi << 0)  | (egprs1->tfi_lo << 2);
 	rlc->cps    = egprs1->cps;
 	rlc->rsb    = egprs1->rsb;
 	rlc->num_data_blocks = 2;
 	rlc->block_info[0].cv  = egprs1->cv;
 	rlc->block_info[0].pi  = egprs1->pi;
 	rlc->block_info[0].bsn =
-			(egprs1->bsn1_a << 0) | (egprs1->bsn1_b << 5);
+			(egprs1->bsn1_hi << 0) | (egprs1->bsn1_lo << 5);
 
 	cur_bit += rlc->data_offs_bits[0] - 2;
 	offs = rlc->data_offs_bits[0] / 8;
@@ -492,7 +493,7 @@
 	rlc->block_info[1].cv  = egprs1->cv;
 	rlc->block_info[1].pi  = egprs1->pi;
 	rlc->block_info[1].bsn = rlc->block_info[0].bsn +
-		((egprs1->bsn2_a << 0) | (egprs1->bsn2_b << 2));
+		((egprs1->bsn2_hi << 0) | (egprs1->bsn2_lo << 2));
 	rlc->block_info[1].bsn = rlc->block_info[1].bsn &  (RLC_EGPRS_SNS - 1);
 
 	if ((rlc->block_info[1].bsn != rlc->block_info[0].bsn) &&
diff --git a/src/encoding.cpp b/src/encoding.cpp
index e174c80..9f3b31d 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -25,6 +25,10 @@
 #include <tbf.h>
 #include <gprs_debug.h>
 
+extern "C" {
+#include <osmocom/gprs/protocol/gsm_04_60.h>
+}
+
 #include <errno.h>
 #include <string.h>
 
@@ -745,20 +749,20 @@
 		egprs1->usf    = rlc->usf;
 		egprs1->es_p   = rlc->es_p;
 		egprs1->rrbp   = rlc->rrbp;
-		egprs1->tfi_a  = rlc->tfi >> 0; /* 1 bit LSB */
-		egprs1->tfi_b  = rlc->tfi >> 1; /* 4 bits */
+		egprs1->tfi_hi = rlc->tfi >> 0; /* 1 bit LSB */
+		egprs1->tfi_lo = rlc->tfi >> 1; /* 4 bits */
 		egprs1->pr     = rlc->pr;
 		egprs1->cps    = rlc->cps;
 
-		egprs1->bsn1_a = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */
-		egprs1->bsn1_b = rlc->block_info[0].bsn >> 2; /* 8 bits */
-		egprs1->bsn1_c = rlc->block_info[0].bsn >> 10; /* 1 bit */
+		egprs1->bsn1_hi  = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */
+		egprs1->bsn1_mid = rlc->block_info[0].bsn >> 2; /* 8 bits */
+		egprs1->bsn1_lo  = rlc->block_info[0].bsn >> 10; /* 1 bit */
 
 		bsn_delta = (rlc->block_info[1].bsn - rlc->block_info[0].bsn) &
 			(RLC_EGPRS_SNS - 1);
 
-		egprs1->bsn2_a = bsn_delta >> 0; /* 7 bits LSB */
-		egprs1->bsn2_b = bsn_delta >> 7; /* 3 bits */
+		egprs1->bsn2_hi = bsn_delta >> 0; /* 7 bits LSB */
+		egprs1->bsn2_lo = bsn_delta >> 7; /* 3 bits */
 
 		/* first FBI/E header */
 		e_fbi_header   = rlc->block_info[0].e       ? 0x01 : 0;
@@ -784,14 +788,14 @@
 		egprs2->usf    = rlc->usf;
 		egprs2->es_p   = rlc->es_p;
 		egprs2->rrbp   = rlc->rrbp;
-		egprs2->tfi_a  = rlc->tfi >> 0; /* 1 bit LSB */
-		egprs2->tfi_b  = rlc->tfi >> 1; /* 4 bits */
+		egprs2->tfi_hi = rlc->tfi >> 0; /* 1 bit LSB */
+		egprs2->tfi_lo = rlc->tfi >> 1; /* 4 bits */
 		egprs2->pr     = rlc->pr;
 		egprs2->cps    = rlc->cps;
 
-		egprs2->bsn1_a = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */
-		egprs2->bsn1_b = rlc->block_info[0].bsn >> 2; /* 8 bits */
-		egprs2->bsn1_c = rlc->block_info[0].bsn >> 10; /* 1 bit */
+		egprs2->bsn1_hi  = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */
+		egprs2->bsn1_mid = rlc->block_info[0].bsn >> 2; /* 8 bits */
+		egprs2->bsn1_lo  = rlc->block_info[0].bsn >> 10; /* 1 bit */
 
 		e_fbi_header   = rlc->block_info[0].e       ? 0x01 : 0;
 		e_fbi_header  |= rlc->block_info[0].cv == 0 ? 0x02 : 0; /* FBI */
@@ -808,14 +812,14 @@
 		egprs3->usf    = rlc->usf;
 		egprs3->es_p   = rlc->es_p;
 		egprs3->rrbp   = rlc->rrbp;
-		egprs3->tfi_a  = rlc->tfi >> 0; /* 1 bit LSB */
-		egprs3->tfi_b  = rlc->tfi >> 1; /* 4 bits */
+		egprs3->tfi_hi = rlc->tfi >> 0; /* 1 bit LSB */
+		egprs3->tfi_lo = rlc->tfi >> 1; /* 4 bits */
 		egprs3->pr     = rlc->pr;
 		egprs3->cps    = rlc->cps;
 
-		egprs3->bsn1_a = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */
-		egprs3->bsn1_b = rlc->block_info[0].bsn >> 2; /* 8 bits */
-		egprs3->bsn1_c = rlc->block_info[0].bsn >> 10; /* 1 bit */
+		egprs3->bsn1_hi  = rlc->block_info[0].bsn >> 0; /* 2 bits LSB */
+		egprs3->bsn1_mid = rlc->block_info[0].bsn >> 2; /* 8 bits */
+		egprs3->bsn1_lo  = rlc->block_info[0].bsn >> 10; /* 1 bit */
 
 		egprs3->spb    = rlc->block_info[0].spb;
 
diff --git a/src/rlc.h b/src/rlc.h
index ad10b3a..1a8b424 100644
--- a/src/rlc.h
+++ b/src/rlc.h
@@ -314,105 +314,6 @@
 	uint8_t	e:1,
 		 li:7;
 } __attribute__ ((packed));
-
-/* TS 44.060  10.3a.4.1.1 */
-struct gprs_rlc_ul_header_egprs_1 {
-	uint8_t r:1,
-		si:1,
-		cv:4,
-		tfi_a:2;
-	uint8_t tfi_b:3,
-		bsn1_a:5;
-	uint8_t bsn1_b:6,
-		bsn2_a:2;
-	uint8_t bsn2_b;
-	uint8_t cps:5,
-		rsb:1,
-		pi:1,
-		spare_a:1;
-	uint8_t spare_b:6,
-		dummy:2;
-} __attribute__ ((packed));
-
-/* TS 44.060  10.3a.4.2.1 */
-struct gprs_rlc_ul_header_egprs_2 {
-	uint8_t r:1,
-		si:1,
-		cv:4,
-		tfi_a:2;
-	uint8_t tfi_b:3,
-		bsn1_a:5;
-	uint8_t bsn1_b:6,
-		cps_a:2;
-	uint8_t cps_b:1,
-		rsb:1,
-		pi:1,
-		spare_a:5;
-	uint8_t spare_b:5,
-		dummy:3;
-} __attribute__ ((packed));
-
-/* TS 44.060  10.3a.4.3.1 */
-struct gprs_rlc_ul_header_egprs_3 {
-	uint8_t r:1,
-		si:1,
-		cv:4,
-		tfi_a:2;
-	uint8_t tfi_b:3,
-		bsn1_a:5;
-	uint8_t bsn1_b:6,
-		cps_a:2;
-	uint8_t cps_b:2,
-		spb:2,
-		rsb:1,
-		pi:1,
-		spare:1,
-		dummy:1;
-} __attribute__ ((packed));
-
-struct gprs_rlc_dl_header_egprs_1 {
-	uint8_t usf:3,
-		es_p:2,
-		rrbp:2,
-		tfi_a:1;
-	uint8_t tfi_b:4,
-		pr:2,
-		bsn1_a:2;
-	uint8_t bsn1_b:8;
-	uint8_t bsn1_c:1,
-		bsn2_a:7;
-	uint8_t bsn2_b:3,
-		cps:5;
-} __attribute__ ((packed));
-
-struct gprs_rlc_dl_header_egprs_2 {
-	uint8_t usf:3,
-		es_p:2,
-		rrbp:2,
-		tfi_a:1;
-	uint8_t tfi_b:4,
-		pr:2,
-		bsn1_a:2;
-	uint8_t bsn1_b:8;
-	uint8_t bsn1_c:1,
-		cps:3,
-		dummy:4;
-} __attribute__ ((packed));
-
-struct gprs_rlc_dl_header_egprs_3 {
-	uint8_t usf:3,
-		es_p:2,
-		rrbp:2,
-		tfi_a:1;
-	uint8_t tfi_b:4,
-		pr:2,
-		bsn1_a:2;
-	uint8_t bsn1_b:8;
-	uint8_t bsn1_c:1,
-		cps:4,
-		spb:2,
-		dummy:1;
-} __attribute__ ((packed));
 #else
 #  error "Only little endian headers are supported yet. TODO: add missing structs"
 #endif

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I98687ad981d27502aec42729611937ba1caf207c
Gerrit-PatchSet: 1
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Tom Tsou <tom at tsou.cc>



More information about the gerrit-log mailing list