Change in libosmo-abis[master]: trau_frame: Add 16k HR + OAM encoding/decoding; add AMR encoding

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

laforge gerrit-no-reply at lists.osmocom.org
Sun May 10 19:04:47 UTC 2020


laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-abis/+/18181 )


Change subject: trau_frame: Add 16k HR + OAM encoding/decoding; add AMR encoding
......................................................................

trau_frame: Add 16k HR + OAM encoding/decoding; add AMR encoding

Change-Id: I589a0e97e48e7f89d9166793b9887462756e8f09
---
M include/osmocom/abis/trau_frame.h
M src/trau_frame.c
2 files changed, 157 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/81/18181/1

diff --git a/include/osmocom/abis/trau_frame.h b/include/osmocom/abis/trau_frame.h
index afcaaa4..0f3d1d2 100644
--- a/include/osmocom/abis/trau_frame.h
+++ b/include/osmocom/abis/trau_frame.h
@@ -52,13 +52,17 @@
 };
 
 #define TRAU_FT_FR_UP		0x02	/* 0 0 0 1 0 - 3.5.1.1.1 */
+#define TRAU_FT_HR_UP		0x03	/* 0 0 0 1 1 - TS 08.61 5.1.4.1.1 */
 #define TRAU_FT_FR_DOWN		0x1c	/* 1 1 1 0 0 - 3.5.1.1.1 */
+#define TRAU_FT_HR_DOWN		0x1d	/* 1 1 1 0 1 - TS 08.61 5.1.4.1.1 */
 #define TRAU_FT_EFR		0x1a	/* 1 1 0 1 0 - 3.5.1.1.1 */
 #define TRAU_FT_AMR		0x06	/* 0 0 1 1 0 - 3.5.1.2 */
 #define TRAU_FT_OM_UP		0x05	/* 0 0 1 0 1 - 3.5.2 */
 #define TRAU_FT_OM_DOWN		0x1b	/* 1 1 0 1 1 - 3.5.2 */
 #define TRAU_FT_DATA_UP		0x08	/* 0 1 0 0 0 - 3.5.3 */
+#define TRAU_FT_DATA_UP_HR	0x09	/* 0 1 0 0 1 - TS 08.61 5.1.4.2 */
 #define TRAU_FT_DATA_DOWN	0x16	/* 1 0 1 1 0 - 3.5.3 */
+#define TRAU_FT_DATA_DOWN_HR	0x17	/* 0 1 0 0 1 - TS 08.61 5.1.4.2 */
 #define TRAU_FT_D145_SYNC	0x14	/* 1 0 1 0 0 - 3.5.3 */
 #define TRAU_FT_EDATA		0x1f	/* 1 1 1 1 1 - 3.5.4 */
 #define TRAU_FT_IDLE_UP		0x10	/* 1 0 0 0 0 - 3.5.5 */
diff --git a/src/trau_frame.c b/src/trau_frame.c
index 981c2cf..2f0e9da 100644
--- a/src/trau_frame.c
+++ b/src/trau_frame.c
@@ -1,6 +1,6 @@
 /* TRAU frame handling according to GSM TS 08.60 */
 
-/* (C) 2009 by Harald Welte <laforge at gnumonks.org>
+/* (C) 2009,2020 by Harald Welte <laforge at gnumonks.org>
  * All Rights Reserved
  *
  * SPDX-License-Identifier: AGPL-3.0+
@@ -94,6 +94,25 @@
 	memcpy(fr->d_bits + d_idx, trau_bits + 305, 11);
 }
 
+/* Decode according to 3.2 */
+static void decode_oam(struct decoded_trau_frame *fr, const ubit_t *trau_bits)
+{
+	int i, d_idx;
+
+	/* C1 .. C15 */
+	memcpy(fr->c_bits+0, trau_bits+17, 15);
+
+	/* D1 .. D255 */
+	for (i = 33, d_idx = 0; i < 312; i += 16, d_idx += 15)
+		memcpy(fr->d_bits + d_idx, trau_bits+i+1, 15);
+	/* D256 .. D264 */
+	memcpy(fr->d_bits+d_idx, trau_bits+305, 9);
+
+	/* S1 .. S6 */
+	memcpy(fr->s_bits, trau_bits+314, 6);
+}
+
+/* Decode according to 3.3.2 */
 static void decode_data(struct decoded_trau_frame *fr, const ubit_t *trau_bits)
 {
 	/* C1 .. C15 */
@@ -102,6 +121,39 @@
 	memcpy(fr->d_bits, trau_bits+32, 288);
 }
 
+/* Decode according to TS 08.61 section 5.1.1.1 */
+static void decode_hr(struct decoded_trau_frame *fr, const ubit_t *trau_bits)
+{
+	int  d_idx = 0;
+
+	/* C1 .. C15 */
+	memcpy(fr->c_bits+0, trau_bits+17, 15);
+	/* C16 .. C21 */
+	memcpy(fr->c_bits+15, trau_bits+310, 6);
+	/* T1 .. T4 */
+	memcpy(fr->t_bits+0, trau_bits+316, 4);
+
+	/* D1 .. D14 */
+	memcpy(fr->d_bits+d_idx, trau_bits+34, 14); d_idx += 14;
+	/* D15 .. D29 */
+	memcpy(fr->d_bits+d_idx, trau_bits+49, 15); d_idx += 15;
+	/* D30 .. D44 */
+	memcpy(fr->d_bits+d_idx, trau_bits+65, 15); d_idx += 15;
+	/* D45 .. D56 */
+	memcpy(fr->d_bits+d_idx, trau_bits+84, 12); d_idx += 12;
+	/* D57 .. D71 */
+	memcpy(fr->d_bits+d_idx, trau_bits+97, 15); d_idx += 15;
+	/* D72 .. D86 */
+	memcpy(fr->d_bits+d_idx, trau_bits+113, 15); d_idx += 15;
+	/* D87 .. D101 */
+	memcpy(fr->d_bits+d_idx, trau_bits+129, 15); d_idx += 15;
+	/* D102 .. D112 */
+	memcpy(fr->d_bits+d_idx, trau_bits+145, 11); d_idx += 11;
+
+	/* FIXME: UFI */
+	/* FIXME: CRC */
+}
+
 int decode_trau_frame(struct decoded_trau_frame *fr, const ubit_t *trau_bits)
 {
 	ubit_t cbits5 = get_bits(trau_bits, 17, 5);
@@ -123,6 +175,12 @@
 		break;
 	case TRAU_FT_OM_UP:
 	case TRAU_FT_OM_DOWN:
+		decode_oam(fr, trau_bits);
+		break;
+	case TRAU_FT_HR_UP:
+	case TRAU_FT_HR_DOWN:
+		decode_hr(fr, trau_bits);
+		break;
 	case TRAU_FT_D145_SYNC:
 	case TRAU_FT_EDATA:
 		LOGP(DLMUX, LOGL_NOTICE, "can't decode unimplemented TRAU "
@@ -235,6 +293,92 @@
 	memcpy(trau_bits+316, fr->t_bits+0, 4);
 }
 
+/* TS 08.60 Section 3.1.2 */
+static void encode_amr(ubit_t *trau_bits, const struct decoded_trau_frame *fr)
+{
+	int i, d_idx;
+
+	trau_bits[16] = 1;
+	/* C1 .. C15 */
+	memcpy(trau_bits+17, fr->c_bits+0, 15);
+
+	trau_bits[32] = 1;
+	/* C16 .. C25 */
+	memcpy(trau_bits+33, fr->c_bits+15, 10);
+	/* D1 .. D5 */
+	memcpy(trau_bits+43, fr->d_bits+0, 5);
+
+	/* D6 .. D256 */
+	for (i = 48, d_idx = 5; i <= 315; i += 16, d_idx += 15) {
+		trau_bits[i] = 1;
+		memcpy(trau_bits+i+1, fr->d_bits + d_idx, 15);
+	}
+
+	/* FIXME: handle timing adjustment */
+
+	/* T1 .. T4 */
+	memcpy(trau_bits+316, fr->t_bits+0, 4);
+
+}
+
+/* TS 08.60 Section 3.2 */
+static void encode_oam(ubit_t *trau_bits, const struct decoded_trau_frame *fr)
+{
+	int i, d_idx;
+
+	trau_bits[16] = 1;
+	/* C1 .. C15 */
+	memcpy(trau_bits+17, fr->c_bits+0, 15);
+
+	/* D1 .. D255 */
+	for (i = 32, d_idx = 0; i < 304; i+= 16, d_idx += 15) {
+		trau_bits[i] = 1;
+		memcpy(trau_bits+i+1, fr->d_bits + d_idx, 15);
+	}
+	/* D256 .. D264 */
+	memcpy(trau_bits+305, fr->d_bits+256, 9);
+
+	/* S1 .. S6 */
+	memcpy(trau_bits+314, fr->s_bits, 6);
+}
+
+/* TS 08.61 Section 5.1.1.1 */
+static void encode_hr(ubit_t *trau_bits, const struct decoded_trau_frame *fr)
+{
+	int d_idx = 0;
+
+	trau_bits[16] = 1;
+
+	/* C1 .. C15 */
+	memcpy(trau_bits+17, fr->c_bits+0, 15);
+
+	/* FIXME: UFI */
+
+	/* D1 .. D14 */
+	memcpy(trau_bits+4*8+2, fr->d_bits+d_idx, 14); d_idx += 14;
+	/* D15 .. D29 */
+	memcpy(trau_bits+6*8+1, fr->d_bits+d_idx, 15); d_idx += 15;
+	/* D30 .. D44 */
+	memcpy(trau_bits+8*8+1, fr->d_bits+d_idx, 15); d_idx += 15;
+	/* FIXME: CRC */
+	/* D45 .. D56 */
+	memcpy(trau_bits+10*8+4, fr->d_bits+d_idx, 12); d_idx += 12;
+	/* D57 .. D71 */
+	memcpy(trau_bits+12*8+1, fr->d_bits+d_idx, 15); d_idx += 15;
+	/* D72 .. D86 */
+	memcpy(trau_bits+14*8+1, fr->d_bits+d_idx, 15); d_idx += 15;
+	/* D87 .. D101 */
+	memcpy(trau_bits+16*8+1, fr->d_bits+d_idx, 15); d_idx += 15;
+	/* D102 .. D112 */
+	memcpy(trau_bits+18*8+1, fr->d_bits+d_idx, 11); d_idx += 11;
+
+	memset(trau_bits+19*8+4, 0x01, 4+18*8+6);
+	/* C16 .. C21 */
+	memcpy(trau_bits+38*8+6, fr->c_bits+15, 6);
+	/* T1 .. T4 */
+	memcpy(trau_bits+39*8+4, fr->t_bits+0, 4);
+}
+
 static void encode_data(ubit_t *trau_bits, const struct decoded_trau_frame *fr)
 {
 	trau_bits[16] = 1;
@@ -269,8 +413,16 @@
 		encode_data(trau_bits, fr);
 		break;
 	case TRAU_FT_AMR:
+		encode_amr(trau_bits, fr);
+		break;
 	case TRAU_FT_OM_UP:
 	case TRAU_FT_OM_DOWN:
+		encode_oam(trau_bits, fr);
+		break;
+	case TRAU_FT_HR_UP:
+	case TRAU_FT_HR_DOWN:
+		encode_hr(trau_bits, fr);
+		break;
 	case TRAU_FT_D145_SYNC:
 	case TRAU_FT_EDATA:
 		LOGP(DLMUX, LOGL_NOTICE, "unimplemented TRAU Frame Type "

-- 
To view, visit https://gerrit.osmocom.org/c/libosmo-abis/+/18181
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmo-abis
Gerrit-Branch: master
Gerrit-Change-Id: I589a0e97e48e7f89d9166793b9887462756e8f09
Gerrit-Change-Number: 18181
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200510/ca4c0a3b/attachment.htm>


More information about the gerrit-log mailing list