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>