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