/*
 * (C) 2013 by Andreas Eversberg <jolly@eversberg.eu>
 * (C) 2015 by Alexander Chemeris <Alexander.Chemeris@fairwaves.co>
 * (C) 2016 by Tom Tsou <tom.tsou@ettus.com>
 *
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

#include <osmocom/core/bits.h>
#include <osmocom/core/conv.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/crcgen.h>
#include <osmocom/core/endian.h>

#include <osmocom/gprs/protocol/gsm_04_60.h>
#include <osmocom/gprs/gprs_rlc.h>

#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <osmocom/gsm/gsm0503.h>
#include <osmocom/codec/codec.h>

#include <osmocom/coding/gsm0503_interleaving.h>
#include <osmocom/coding/gsm0503_mapping.h>
#include <osmocom/coding/gsm0503_tables.h>
#include <osmocom/coding/gsm0503_coding.h>
#include <osmocom/coding/gsm0503_parity.h>

/*
 * EGPRS coding limits
 */

/* Max header size with parity bits */
#define EGPRS_HDR_UPP_MAX	54

/* Max encoded header size */
#define EGPRS_HDR_C_MAX		162

/* Max punctured header size */
#define EGPRS_HDR_HC_MAX	160

/* Max data block size with parity bits */
#define EGPRS_DATA_U_MAX	612

/* Max encoded data block size */
#define EGPRS_DATA_C_MAX	1836

/* Max single block punctured data size */
#define EGPRS_DATA_DC_MAX	1248

/* Dual block punctured data size */
#define EGPRS_DATA_C1		612
#define EGPRS_DATA_C2		EGPRS_DATA_C1

/* TS 101318 Chapter 5.1: 260 bits + 4bit sig */
#define GSM_FR_BYTES	33
/* TS 101318 Chapter 5.2: 112 bits, no sig */
#define GSM_HR_BYTES	14
/* TS 101318 Chapter 5.3: 244 bits + 4bit sig */
#define GSM_EFR_BYTES	31

union gprs_rlc_ul_hdr_egprs {
	struct gprs_rlc_ul_header_egprs_1 type1;
	struct gprs_rlc_ul_header_egprs_2 type2;
	struct gprs_rlc_ul_header_egprs_3 type3;
};

union gprs_rlc_dl_hdr_egprs {
	struct gprs_rlc_dl_header_egprs_1 type1;
	struct gprs_rlc_dl_header_egprs_2 type2;
	struct gprs_rlc_dl_header_egprs_3 type3;
};

struct gsm0503_mcs_code {
	uint8_t mcs;
	uint8_t usf_len;

	/* Header coding */
	uint8_t hdr_len;
	uint8_t hdr_code_len;
	uint8_t hdr_punc_len;
	const struct osmo_conv_code *hdr_conv;
	const uint8_t *hdr_punc;

	/* Data coding */
	uint16_t data_len;
	uint16_t data_code_len;
	uint16_t data_punc_len;
	const struct osmo_conv_code *data_conv;
	const uint8_t *data_punc[3];
};

/*
 * EGPRS UL coding parameters
 */
struct gsm0503_mcs_code gsm0503_mcs_ul_codes[EGPRS_NUM_MCS] = {
	{
		.mcs = EGPRS_MCS0,
	},
	{
		.mcs = EGPRS_MCS1,
		.hdr_len = 31,
		.hdr_code_len = 117,
		.hdr_punc_len = 80,
		.hdr_conv = &gsm0503_mcs1_ul_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_ul_hdr,

		.data_len = 178,
		.data_code_len = 588,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs1,
		.data_punc = {
			gsm0503_puncture_mcs1_p1,
			gsm0503_puncture_mcs1_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS2,
		.hdr_len = 31,
		.hdr_code_len = 117,
		.hdr_punc_len = 80,
		.hdr_conv = &gsm0503_mcs1_ul_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_ul_hdr,

		.data_len = 226,
		.data_code_len = 732,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs2,
		.data_punc = {
			gsm0503_puncture_mcs2_p1,
			gsm0503_puncture_mcs2_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS3,
		.hdr_len = 31,
		.hdr_code_len = 117,
		.hdr_punc_len = 80,
		.hdr_conv = &gsm0503_mcs1_ul_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_ul_hdr,

		.data_len = 298,
		.data_code_len = 948,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs3,
		.data_punc = {
			gsm0503_puncture_mcs3_p1,
			gsm0503_puncture_mcs3_p2,
			gsm0503_puncture_mcs3_p3,
		},
	},
	{
		.mcs = EGPRS_MCS4,
		.hdr_len = 31,
		.hdr_code_len = 117,
		.hdr_punc_len = 80,
		.hdr_conv = &gsm0503_mcs1_ul_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_ul_hdr,

		.data_len = 354,
		.data_code_len = 1116,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs4,
		.data_punc = {
			gsm0503_puncture_mcs4_p1,
			gsm0503_puncture_mcs4_p2,
			gsm0503_puncture_mcs4_p3,
		},
	},
	{
		.mcs = EGPRS_MCS5,
		.hdr_len = 37,
		.hdr_code_len = 135,
		.hdr_punc_len = 136,
		.hdr_conv = &gsm0503_mcs5_ul_hdr,
		.hdr_punc = NULL,

		.data_len = 450,
		.data_code_len = 1404,
		.data_punc_len = 1248,
		.data_conv = &gsm0503_mcs5,
		.data_punc = {
			gsm0503_puncture_mcs5_p1,
			gsm0503_puncture_mcs5_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS6,
		.hdr_len = 37,
		.hdr_code_len = 135,
		.hdr_punc_len = 136,
		.hdr_conv = &gsm0503_mcs5_ul_hdr,
		.hdr_punc = NULL,

		.data_len = 594,
		.data_code_len = 1836,
		.data_punc_len = 1248,
		.data_conv = &gsm0503_mcs6,
		.data_punc = {
			gsm0503_puncture_mcs6_p1,
			gsm0503_puncture_mcs6_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS7,
		.hdr_len = 46,
		.hdr_code_len = 162,
		.hdr_punc_len = 160,
		.hdr_conv = &gsm0503_mcs7_ul_hdr,
		.hdr_punc = gsm0503_puncture_mcs7_ul_hdr,

		.data_len = 900,
		.data_code_len = 1404,
		.data_punc_len = 612,
		.data_conv = &gsm0503_mcs7,
		.data_punc = {
			gsm0503_puncture_mcs7_p1,
			gsm0503_puncture_mcs7_p2,
			gsm0503_puncture_mcs7_p3,
		}
	},
	{
		.mcs = EGPRS_MCS8,
		.hdr_len = 46,
		.hdr_code_len = 162,
		.hdr_punc_len = 160,
		.hdr_conv = &gsm0503_mcs7_ul_hdr,
		.hdr_punc = gsm0503_puncture_mcs7_ul_hdr,

		.data_len = 1092,
		.data_code_len = 1692,
		.data_punc_len = 612,
		.data_conv = &gsm0503_mcs8,
		.data_punc = {
			gsm0503_puncture_mcs8_p1,
			gsm0503_puncture_mcs8_p2,
			gsm0503_puncture_mcs8_p3,
		}
	},
	{
		.mcs = EGPRS_MCS9,
		.hdr_len = 46,
		.hdr_code_len = 162,
		.hdr_punc_len = 160,
		.hdr_conv = &gsm0503_mcs7_ul_hdr,
		.hdr_punc = gsm0503_puncture_mcs7_ul_hdr,

		.data_len = 1188,
		.data_code_len = 1836,
		.data_punc_len = 612,
		.data_conv = &gsm0503_mcs9,
		.data_punc = {
			gsm0503_puncture_mcs9_p1,
			gsm0503_puncture_mcs9_p2,
			gsm0503_puncture_mcs9_p3,
		}
	},
};

/*
 * EGPRS DL coding parameters
 */
struct gsm0503_mcs_code gsm0503_mcs_dl_codes[EGPRS_NUM_MCS] = {
	{
		.mcs = EGPRS_MCS0,
	},
	{
		.mcs = EGPRS_MCS1,
		.usf_len = 3,
		.hdr_len = 28,
		.hdr_code_len = 108,
		.hdr_punc_len = 68,
		.hdr_conv = &gsm0503_mcs1_dl_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_dl_hdr,

		.data_len = 178,
		.data_code_len = 588,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs1,
		.data_punc = {
			gsm0503_puncture_mcs1_p1,
			gsm0503_puncture_mcs1_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS2,
		.usf_len = 3,
		.hdr_len = 28,
		.hdr_code_len = 108,
		.hdr_punc_len = 68,
		.hdr_conv = &gsm0503_mcs1_dl_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_dl_hdr,

		.data_len = 226,
		.data_code_len = 732,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs2,
		.data_punc = {
			gsm0503_puncture_mcs2_p1,
			gsm0503_puncture_mcs2_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS3,
		.usf_len = 3,
		.hdr_len = 28,
		.hdr_code_len = 108,
		.hdr_punc_len = 68,
		.hdr_conv = &gsm0503_mcs1_dl_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_dl_hdr,

		.data_len = 298,
		.data_code_len = 948,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs3,
		.data_punc = {
			gsm0503_puncture_mcs3_p1,
			gsm0503_puncture_mcs3_p2,
			gsm0503_puncture_mcs3_p3,
		},
	},
	{
		.mcs = EGPRS_MCS4,
		.usf_len = 3,
		.hdr_len = 28,
		.hdr_code_len = 108,
		.hdr_punc_len = 68,
		.hdr_conv = &gsm0503_mcs1_dl_hdr,
		.hdr_punc = gsm0503_puncture_mcs1_dl_hdr,

		.data_len = 354,
		.data_code_len = 1116,
		.data_punc_len = 372,
		.data_conv = &gsm0503_mcs4,
		.data_punc = {
			gsm0503_puncture_mcs4_p1,
			gsm0503_puncture_mcs4_p2,
			gsm0503_puncture_mcs4_p3,
		},
	},
	{
		.mcs = EGPRS_MCS5,
		.usf_len = 3,
		.hdr_len = 25,
		.hdr_code_len = 99,
		.hdr_punc_len = 100,
		.hdr_conv = &gsm0503_mcs5_dl_hdr,
		.hdr_punc = NULL,

		.data_len = 450,
		.data_code_len = 1404,
		.data_punc_len = 1248,
		.data_conv = &gsm0503_mcs5,
		.data_punc = {
			gsm0503_puncture_mcs5_p1,
			gsm0503_puncture_mcs5_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS6,
		.usf_len = 3,
		.hdr_len = 25,
		.hdr_code_len = 99,
		.hdr_punc_len = 100,
		.hdr_conv = &gsm0503_mcs5_dl_hdr,
		.hdr_punc = NULL,

		.data_len = 594,
		.data_code_len = 1836,
		.data_punc_len = 1248,
		.data_conv = &gsm0503_mcs6,
		.data_punc = {
			gsm0503_puncture_mcs6_p1,
			gsm0503_puncture_mcs6_p2,
			NULL,
		},
	},
	{
		.mcs = EGPRS_MCS7,
		.usf_len = 3,
		.hdr_len = 37,
		.hdr_code_len = 135,
		.hdr_punc_len = 124,
		.hdr_conv = &gsm0503_mcs7_dl_hdr,
		.hdr_punc = gsm0503_puncture_mcs7_dl_hdr,

		.data_len = 900,
		.data_code_len = 1404,
		.data_punc_len = 612,
		.data_conv = &gsm0503_mcs7,
		.data_punc = {
			gsm0503_puncture_mcs7_p1,
			gsm0503_puncture_mcs7_p2,
			gsm0503_puncture_mcs7_p3,
		}
	},
	{
		.mcs = EGPRS_MCS8,
		.usf_len = 3,
		.hdr_len = 37,
		.hdr_code_len = 135,
		.hdr_punc_len = 124,
		.hdr_conv = &gsm0503_mcs7_dl_hdr,
		.hdr_punc = gsm0503_puncture_mcs7_dl_hdr,

		.data_len = 1092,
		.data_code_len = 1692,
		.data_punc_len = 612,
		.data_conv = &gsm0503_mcs8,
		.data_punc = {
			gsm0503_puncture_mcs8_p1,
			gsm0503_puncture_mcs8_p2,
			gsm0503_puncture_mcs8_p3,
		}
	},
	{
		.mcs = EGPRS_MCS9,
		.usf_len = 3,
		.hdr_len = 37,
		.hdr_code_len = 135,
		.hdr_punc_len = 124,
		.hdr_conv = &gsm0503_mcs7_dl_hdr,
		.hdr_punc = gsm0503_puncture_mcs7_dl_hdr,

		.data_len = 1188,
		.data_code_len = 1836,
		.data_punc_len = 612,
		.data_conv = &gsm0503_mcs9,
		.data_punc = {
			gsm0503_puncture_mcs9_p1,
			gsm0503_puncture_mcs9_p2,
			gsm0503_puncture_mcs9_p3,
		}
	},
};

static int osmo_conv_decode_ber(const struct osmo_conv_code *code,
	const sbit_t *input, ubit_t *output,
	int *n_errors, int *n_bits_total)
{
	int res, i, coded_len;
	ubit_t recoded[EGPRS_DATA_C_MAX];

	res = osmo_conv_decode(code, input, output);

	if (n_bits_total || n_errors) {
		coded_len = osmo_conv_encode(code, output, recoded);
		OSMO_ASSERT(sizeof(recoded) / sizeof(recoded[0]) >= coded_len);
	}

	/* Count bit errors */
	if (n_errors) {
		*n_errors = 0;
		for (i = 0; i < coded_len; i++) {
			if (!((recoded[i] && input[i] < 0) ||
					(!recoded[i] && input[i] > 0)) )
						*n_errors += 1;
		}
	}

	if (n_bits_total)
		*n_bits_total = coded_len;

	return res;
}

static int _xcch_decode_cB(uint8_t *l2_data, sbit_t *cB,
	int *n_errors, int *n_bits_total)
{
	ubit_t conv[224];
	int rv;

	osmo_conv_decode_ber(&gsm0503_xcch, cB,
		conv, n_errors, n_bits_total);

	rv = osmo_crc64gen_check_bits(&gsm0503_fire_crc40,
		conv, 184, conv + 184);
	if (rv)
		return -1;

	osmo_ubit2pbit_ext(l2_data, 0, conv, 0, 184, 1);

	return 0;
}

static int _xcch_encode_cB(ubit_t *cB, uint8_t *l2_data)
{
	ubit_t conv[224];

	osmo_pbit2ubit_ext(conv, 0, l2_data, 0, 184, 1);

	osmo_crc64gen_set_bits(&gsm0503_fire_crc40, conv, 184, conv + 184);

	osmo_conv_encode(&gsm0503_xcch, conv, cB);

	return 0;
}

/*
 * GSM xCCH block transcoding
 */
int gsm0503_xcch_decode(uint8_t *l2_data, sbit_t *bursts,
	int *n_errors, int *n_bits_total)
{
	sbit_t iB[456], cB[456];
	int i;

	for (i = 0; i < 4; i++)
		gsm0503_xcch_burst_unmap(&iB[i * 114], &bursts[i * 116], NULL, NULL);

	gsm0503_xcch_deinterleave(cB, iB);

	return _xcch_decode_cB(l2_data, cB, n_errors, n_bits_total);
}

int gsm0503_xcch_encode(ubit_t *bursts, uint8_t *l2_data)
{
	ubit_t iB[456], cB[456], hl = 1, hn = 1;
	int i;

	_xcch_encode_cB(cB, l2_data);

	gsm0503_xcch_interleave(cB, iB);

	for (i = 0; i < 4; i++)
		gsm0503_xcch_burst_map(&iB[i * 114], &bursts[i * 116], &hl, &hn);

	return 0;
}

/*
 * EGPRS PDTCH UL block decoding
 */

/*
 * Type 3 - MCS-1,2,3,4
 * Unmapping and deinterleaving
 */
static int egprs_type3_unmap(const sbit_t *bursts, sbit_t *hc, sbit_t *dc)
{
	int i;
	sbit_t iB[456], q[8];

	for (i = 0; i < 4; i++) {
		gsm0503_xcch_burst_unmap(&iB[i * 114], &bursts[i * 116],
			q + i * 2, q + i * 2 + 1);
	}

	gsm0503_mcs1_ul_deinterleave(hc, dc, iB);

	return 0;
}

/*
 * Type 2 - MCS-5,6
 * Unmapping and deinterleaving
 */
static int egprs_type2_unmap(const sbit_t *bursts, sbit_t *hc, sbit_t *dc)
{
	int i;
	sbit_t burst[348];
	sbit_t hi[EGPRS_HDR_HC_MAX];
	sbit_t di[EGPRS_DATA_DC_MAX];

	for (i = 0; i < 4; i++) {
		memcpy(burst, &bursts[i * 348], 348);

		gsm0503_mcs5_burst_swap(burst);
		gsm0503_mcs5_ul_burst_unmap(di, burst, hi, i);
	}

	gsm0503_mcs5_ul_deinterleave(hc, dc, hi, di);

	return 0;
}

/*
 * Type 1 - MCS-7,8,9
 * Unmapping and deinterleaving - Note that MCS-7 interleaver is unique
 */
static int egprs_type1_unmap(const sbit_t *bursts, sbit_t *hc,
	sbit_t *c1, sbit_t *c2, int msc)
{
	int i;
	sbit_t burst[348];
	sbit_t hi[EGPRS_HDR_HC_MAX];
	sbit_t di[EGPRS_DATA_C1 * 2];

	for (i = 0; i < 4; i++) {
		memcpy(burst, &bursts[i * 348], 348);

		gsm0503_mcs5_burst_swap(burst);
		gsm0503_mcs7_ul_burst_unmap(di, burst, hi, i);
	}

	if (msc == EGPRS_MCS7)
		gsm0503_mcs7_ul_deinterleave(hc, c1, c2, hi, di);
	else
		gsm0503_mcs8_ul_deinterleave(hc, c1, c2, hi, di);

	return 0;
}

/*
 * Decode EGPRS UL header section
 *
 * 1. Depuncture
 * 2. Convolutional decoding
 * 3. CRC check
 */
static int _egprs_decode_hdr(const sbit_t *hc, int mcs,
	union gprs_rlc_ul_hdr_egprs *hdr)
{
	sbit_t C[EGPRS_HDR_C_MAX];
	ubit_t upp[EGPRS_HDR_UPP_MAX];
	int i, j, rc;
	struct gsm0503_mcs_code *code;

	code = &gsm0503_mcs_ul_codes[mcs];

	/* Skip depuncturing on MCS-5,6 header */
	if ((mcs == EGPRS_MCS5) || (mcs == EGPRS_MCS6)) {
		memcpy(C, hc, code->hdr_code_len);
		goto hdr_conv_decode;
	}

	if (!code->hdr_punc) {
		/* Invalid MCS-X header puncture matrix */
		return -1;
	}

	i = code->hdr_code_len - 1;
	j = code->hdr_punc_len - 1;

	for (; i >= 0; i--) {
		if (!code->hdr_punc[i])
			C[i] = hc[j--];
		else
			C[i] = 0;
	}

hdr_conv_decode:
	osmo_conv_decode_ber(code->hdr_conv, C, upp, NULL, NULL);
	rc = osmo_crc8gen_check_bits(&gsm0503_mcs_crc8_hdr, upp,
		code->hdr_len, upp + code->hdr_len);
	if (rc)
		return -1;

	osmo_ubit2pbit_ext((pbit_t *) hdr, 0, upp, 0, code->hdr_len, 1);

	return 0;
}

/*
 * Blind MCS header decoding based on burst length and CRC validation.
 * Ignore 'q' value coding identification. This approach provides
 * the strongest chance of header recovery.
 */
static int egprs_decode_hdr(union gprs_rlc_ul_hdr_egprs *hdr,
	const sbit_t *bursts, uint16_t nbits)
{
	int rc;
	sbit_t hc[EGPRS_HDR_HC_MAX];

	if (nbits == GSM0503_GPRS_BURSTS_NBITS) {
		/* MCS-1,2,3,4 */
		egprs_type3_unmap(bursts, hc, NULL);
		rc = _egprs_decode_hdr(hc, EGPRS_MCS1, hdr);
		if (!rc)
			return EGPRS_HDR_TYPE3;
	} else if (nbits == GSM0503_EGPRS_BURSTS_NBITS) {
		/* MCS-5,6 */
		egprs_type2_unmap(bursts, hc, NULL);
		rc = _egprs_decode_hdr(hc, EGPRS_MCS5, hdr);
		if (!rc)
			return EGPRS_HDR_TYPE2;

		/* MCS-7,8,9 */
		egprs_type1_unmap(bursts, hc, NULL, NULL, EGPRS_MCS7);
		rc = _egprs_decode_hdr(hc, EGPRS_MCS7, hdr);
		if (!rc)
			return EGPRS_HDR_TYPE1;
	}

	return -1;
}

/*
 * Parse EGPRS UL header for coding and puncturing scheme (CPS)
 *
 * Type 1 - MCS-7,8,9
 * Type 2 - MCS-5,6
 * Type 3 - MCS-1,2,3,4
 */
static int egprs_parse_ul_cps(struct egprs_cps *cps,
	union gprs_rlc_ul_hdr_egprs *hdr, int type)
{
	uint8_t bits;

	switch (type) {
	case EGPRS_HDR_TYPE1:
		bits = hdr->type1.cps;
		break;
	case EGPRS_HDR_TYPE2:
		bits = (hdr->type2.cps_lo << 2) | hdr->type2.cps_hi;
		break;
	case EGPRS_HDR_TYPE3:
		bits = (hdr->type3.cps_lo << 2) | hdr->type3.cps_hi;
		break;
	default:
		return -1;
	}

	return egprs_get_cps(cps, type, bits);
}

/*
 * Decode EGPRS UL data section
 *
 * 1. Depuncture
 * 2. Convolutional decoding
 * 3. CRC check
 * 4. Block combining (MCS-7,8,9 only)
 */
static int egprs_decode_data(uint8_t *l2_data, sbit_t *c,
	int mcs, int p, int blk, int *n_errors, int *n_bits_total)
{
	ubit_t u[EGPRS_DATA_U_MAX];
	sbit_t C[EGPRS_DATA_C_MAX];

	int i, j, rc, data_len;
	struct gsm0503_mcs_code *code;

	if (blk && mcs < EGPRS_MCS7) {
		/* Invalid MCS-X block state */
		return -1;
	}

	code = &gsm0503_mcs_ul_codes[mcs];
	if (!code->data_punc[p]) {
		/* Invalid MCS-X data puncture matrix */
		return -1;
	}

	/*
	 * MCS-1,6 - single block processing
	 * MCS-7,9 - dual block processing
	 */
	if (mcs >= EGPRS_MCS7)
		data_len = code->data_len / 2;
	else
		data_len = code->data_len;

	i = code->data_code_len - 1;
	j = code->data_punc_len - 1;

	for (; i >= 0; i--) {
		if (!code->data_punc[p][i])
			C[i] = c[j--];
		else
			C[i] = 0;
	}

	osmo_conv_decode_ber(code->data_conv, C, u, n_errors, n_bits_total);
	rc = osmo_crc16gen_check_bits(&gsm0503_mcs_crc12, u,
		data_len, u + data_len);
	if (rc)
		return -1;

	/* Offsets output pointer on the second block of Type 1 MCS */
	osmo_ubit2pbit_ext(l2_data, code->hdr_len + blk * data_len,
		u, 0, data_len, 1);

	/* Return the number of bytes required for the bit message */
	return NUM_BYTES(code->hdr_len + code->data_len);
}

/*
 * Decode EGPRS UL message
 *
 * 1. Header section decoding
 * 2. Extract CPS settings
 * 3. Burst unmapping and deinterleaving
 * 4. Data section decoding
 */
int gsm0503_pdtch_egprs_decode(uint8_t *l2_data, sbit_t *bursts, uint16_t nbits,
	uint8_t *usf_p, int *n_errors, int *n_bits_total)
{
	sbit_t dc[EGPRS_DATA_DC_MAX];
	sbit_t c1[EGPRS_DATA_C1], c2[EGPRS_DATA_C2];
	int type, rc;
	struct egprs_cps cps;
	union gprs_rlc_ul_hdr_egprs *hdr;

	if ((nbits != GSM0503_GPRS_BURSTS_NBITS) &&
		(nbits != GSM0503_EGPRS_BURSTS_NBITS)) {
		/* Invalid EGPRS bit length */
		return -1;
	}

	hdr = (union gprs_rlc_ul_hdr_egprs *) l2_data;
	type = egprs_decode_hdr(hdr, bursts, nbits);
	if (egprs_parse_ul_cps(&cps, hdr, type) < 0)
		return -1;

	switch (cps.mcs) {
	case EGPRS_MCS1:
	case EGPRS_MCS2:
	case EGPRS_MCS3:
	case EGPRS_MCS4:
		egprs_type3_unmap(bursts, NULL, dc);
		break;
	case EGPRS_MCS5:
	case EGPRS_MCS6:
		egprs_type2_unmap(bursts, NULL, dc);
		break;
	case EGPRS_MCS7:
	case EGPRS_MCS8:
	case EGPRS_MCS9:
		egprs_type1_unmap(bursts, NULL, c1, c2, cps.mcs);
		break;
	default:
		/* Invalid MCS-X */
		return -1;
	}

	/* Decode MCS-X block, where X = cps.mcs */
	if (cps.mcs < EGPRS_MCS7) {
		rc = egprs_decode_data(l2_data, dc, cps.mcs, cps.p[0],
			0, n_errors, n_bits_total);
		if (rc < 0)
			return -1;
	} else {
		/* MCS-7,8,9 block 1 */
		rc = egprs_decode_data(l2_data, c1, cps.mcs, cps.p[0],
			0, n_errors, n_bits_total);
		if (rc < 0)
			return -1;

		/* MCS-7,8,9 block 2 */
		rc = egprs_decode_data(l2_data, c2, cps.mcs, cps.p[1],
			1, n_errors, n_bits_total);
		if (rc < 0)
			return -1;
	}

	return rc;
}

/*
 * GSM PDTCH block transcoding
 */

int gsm0503_pdtch_decode(uint8_t *l2_data, sbit_t *bursts, uint8_t *usf_p,
	int *n_errors, int *n_bits_total)
{
	sbit_t iB[456], cB[676], hl_hn[8];
	ubit_t conv[456];
	int i, j, k, rv, best = 0, cs = 0, usf = 0; /* make GCC happy */

	for (i = 0; i < 4; i++)
		gsm0503_xcch_burst_unmap(&iB[i * 114], &bursts[i * 116],
			hl_hn + i * 2, hl_hn + i * 2 + 1);

	for (i = 0; i < 4; i++) {
		for (j = 0, k = 0; j < 8; j++)
			k += abs(((int)gsm0503_pdtch_hl_hn_sbit[i][j]) - ((int)hl_hn[j]));

		if (i == 0 || k < best) {
			best = k;
			cs = i + 1;
		}
	}

	gsm0503_xcch_deinterleave(cB, iB);

	switch (cs) {
	case 1:
		osmo_conv_decode_ber(&gsm0503_xcch, cB,
			conv, n_errors, n_bits_total);

		rv = osmo_crc64gen_check_bits(&gsm0503_fire_crc40,
			conv, 184, conv + 184);
		if (rv)
			return -1;

		osmo_ubit2pbit_ext(l2_data, 0, conv, 0, 184, 1);

		return 23;
	case 2:
		for (i = 587, j = 455; i >= 0; i--) {
			if (!gsm0503_puncture_cs2[i])
				cB[i] = cB[j--];
			else
				cB[i] = 0;
		}

		osmo_conv_decode_ber(&gsm0503_cs2_np, cB,
			conv, n_errors, n_bits_total);

		for (i = 0; i < 8; i++) {
			for (j = 0, k = 0; j < 6; j++)
				k += abs(((int)gsm0503_usf2six[i][j]) - ((int)conv[j]));

			if (i == 0 || k < best) {
				best = k;
				usf = i;
			}
		}

		conv[3] = usf & 1;
		conv[4] = (usf >> 1) & 1;
		conv[5] = (usf >> 2) & 1;
		if (usf_p)
			*usf_p = usf;

		rv = osmo_crc16gen_check_bits(&gsm0503_cs234_crc16,
			conv + 3, 271, conv + 3 + 271);
		if (rv)
			return -1;

		osmo_ubit2pbit_ext(l2_data, 0, conv, 3, 271, 1);

		return 34;
	case 3:
		for (i = 675, j = 455; i >= 0; i--) {
			if (!gsm0503_puncture_cs3[i])
				cB[i] = cB[j--];
			else
				cB[i] = 0;
		}

		osmo_conv_decode_ber(&gsm0503_cs3_np, cB,
			conv, n_errors, n_bits_total);

		for (i = 0; i < 8; i++) {
			for (j = 0, k = 0; j < 6; j++)
				k += abs(((int)gsm0503_usf2six[i][j]) - ((int)conv[j]));

			if (i == 0 || k < best) {
				best = k;
				usf = i;
			}
		}

		conv[3] = usf & 1;
		conv[4] = (usf >> 1) & 1;
		conv[5] = (usf >> 2) & 1;
		if (usf_p)
			*usf_p = usf;

		rv = osmo_crc16gen_check_bits(&gsm0503_cs234_crc16,
			conv + 3, 315, conv + 3 + 315);
		if (rv)
			return -1;

		osmo_ubit2pbit_ext(l2_data, 0, conv, 3, 315, 1);

		return 40;
	case 4:
		for (i = 12; i < 456; i++)
			conv[i] = (cB[i] < 0) ? 1 : 0;

		for (i = 0; i < 8; i++) {
			for (j = 0, k = 0; j < 12; j++)
				k += abs(((int)gsm0503_usf2twelve_sbit[i][j]) - ((int)cB[j]));

			if (i == 0 || k < best) {
				best = k;
				usf = i;
			}
		}

		conv[9] = usf & 1;
		conv[10] = (usf >> 1) & 1;
		conv[11] = (usf >> 2) & 1;
		if (usf_p)
			*usf_p = usf;

		rv = osmo_crc16gen_check_bits(&gsm0503_cs234_crc16,
			conv + 9, 431, conv + 9 + 431);
		if (rv) {
			*n_bits_total = 456 - 12;
			*n_errors = *n_bits_total;
			return -1;
		}

		*n_bits_total = 456 - 12;
		*n_errors = 0;

		osmo_ubit2pbit_ext(l2_data, 0, conv, 9, 431, 1);

		return 54;
	default:
		*n_bits_total = 0;
		*n_errors = 0;
		break;
	}

	return -1;
}

/*
 * EGPRS PDTCH UL block encoding
 */
static int egprs_type3_map(ubit_t *bursts, ubit_t *hc, ubit_t *dc, int usf)
{
	int i;
	ubit_t iB[456];
	const ubit_t *hl_hn = gsm0503_pdtch_hl_hn_ubit[3];

	gsm0503_mcs1_dl_interleave(gsm0503_usf2six[usf], hc, dc, iB);

	for (i = 0; i < 4; i++) {
		gsm0503_xcch_burst_map(&iB[i * 114], &bursts[i * 116],
			hl_hn + i * 2, hl_hn + i * 2 + 1);
	}

	return 0;
}

static int egprs_type2_map(ubit_t *bursts, ubit_t *hc, ubit_t *dc, int usf)
{
	int i;
	const ubit_t *up;
	ubit_t hi[EGPRS_HDR_HC_MAX];
	ubit_t di[EGPRS_DATA_DC_MAX];

	gsm0503_mcs5_dl_interleave(hc, dc, hi, di);
	up = gsm0503_mcs5_usf_precode_table[usf];

	for (i = 0; i < 4; i++) {
		gsm0503_mcs5_dl_burst_map(di, &bursts[i * 348], hi, up, i);
		gsm0503_mcs5_burst_swap((sbit_t *) &bursts[i * 348]);
	}

	return 0;
}

static int egprs_type1_map(ubit_t *bursts, ubit_t *hc,
	ubit_t *c1, ubit_t *c2, int usf, int mcs)
{
	int i;
	const ubit_t *up;
	ubit_t hi[EGPRS_HDR_HC_MAX];
	ubit_t di[EGPRS_DATA_C1 * 2];

	if (mcs == EGPRS_MCS7)
		gsm0503_mcs7_dl_interleave(hc, c1, c2, hi, di);
	else
		gsm0503_mcs8_dl_interleave(hc, c1, c2, hi, di);

	up = gsm0503_mcs5_usf_precode_table[usf];

	for (i = 0; i < 4; i++) {
		gsm0503_mcs7_dl_burst_map(di, &bursts[i * 348], hi, up, i);
		gsm0503_mcs5_burst_swap((sbit_t *) &bursts[i * 348]);
	}

	return 0;
}

static int egprs_encode_hdr(ubit_t *hc, uint8_t *l2_data, int mcs)
{
	int i, j;
	ubit_t upp[EGPRS_HDR_UPP_MAX], C[EGPRS_HDR_C_MAX];
	struct gsm0503_mcs_code *code;

	code = &gsm0503_mcs_dl_codes[mcs];

	osmo_pbit2ubit_ext(upp, 0, l2_data, code->usf_len, code->hdr_len, 1);
	osmo_crc8gen_set_bits(&gsm0503_mcs_crc8_hdr, upp,
		code->hdr_len, upp + code->hdr_len);

	osmo_conv_encode(code->hdr_conv, upp, C);

	/* MCS-5,6 header direct puncture instead of table */
	if ((mcs == EGPRS_MCS5) || (mcs == EGPRS_MCS6)) {
		memcpy(hc, C, code->hdr_code_len);
		hc[99] = hc[98];
		return 0;
	}

	if (!code->hdr_punc) {
		/* Invalid MCS-X header puncture matrix */
		return -1;
	}

	for (i = 0, j = 0; i < code->hdr_code_len; i++) {
		if (!code->hdr_punc[i])
			hc[j++] = C[i];
	}

	return 0;
}

static int egprs_encode_data(ubit_t *c, uint8_t *l2_data,
	int mcs, int p, int blk)
{
	int i, j, data_len;
	ubit_t u[EGPRS_DATA_U_MAX], C[EGPRS_DATA_C_MAX];
	struct gsm0503_mcs_code *code;

	code = &gsm0503_mcs_dl_codes[mcs];

	/*
	 * Dual block   - MCS-7,8,9
	 * Single block - MCS-1,2,3,4,5,6
	 */
	if (mcs >= EGPRS_MCS7)
		data_len = code->data_len / 2;
	else
		data_len = code->data_len;

	osmo_pbit2ubit_ext(u, 0, l2_data,
		code->usf_len + code->hdr_len + blk * data_len, data_len, 1);

	osmo_crc16gen_set_bits(&gsm0503_mcs_crc12, u, data_len, u + data_len);

	osmo_conv_encode(code->data_conv, u, C);

	if (!code->data_punc[p]) {
		/* Invalid MCS-X data puncture matrix */
		return -1;
	}

	for (i = 0, j = 0; i < code->data_code_len; i++) {
		if (!code->data_punc[p][i])
			c[j++] = C[i];
	}

	return 0;
}

/*
 * Parse EGPRS DL header for coding and puncturing scheme (CPS)
 *
 * Type 1 - MCS-7,8,9
 * Type 2 - MCS-5,6
 * Type 3 - MCS-1,2,3,4
 */
static int egprs_parse_dl_cps(struct egprs_cps *cps,
	union gprs_rlc_dl_hdr_egprs *hdr, int type)
{
	uint8_t bits;

	switch (type) {
	case EGPRS_HDR_TYPE1:
		bits = hdr->type1.cps;
		break;
	case EGPRS_HDR_TYPE2:
		bits = hdr->type2.cps;
		break;
	case EGPRS_HDR_TYPE3:
		bits = hdr->type3.cps;
		break;
	default:
		return -1;
	}

	return egprs_get_cps(cps, type, bits);
}

/*
 * EGPRS DL message encoding
 */
int gsm0503_pdtch_egprs_encode(ubit_t *bursts,
	uint8_t *l2_data, uint8_t l2_len)
{
	ubit_t hc[EGPRS_DATA_C_MAX], dc[EGPRS_DATA_DC_MAX];
	ubit_t c1[EGPRS_DATA_C1], c2[EGPRS_DATA_C2];
	uint8_t mcs;
	struct egprs_cps cps;
	union gprs_rlc_dl_hdr_egprs *hdr;

	switch (l2_len) {
	case 27:
		mcs = EGPRS_MCS1;
		break;
	case 33:
		mcs = EGPRS_MCS2;
		break;
	case 42:
		mcs = EGPRS_MCS3;
		break;
	case 49:
		mcs = EGPRS_MCS4;
		break;
	case 60:
		mcs = EGPRS_MCS5;
		break;
	case 78:
		mcs = EGPRS_MCS6;
		break;
	case 118:
		mcs = EGPRS_MCS7;
		break;
	case 142:
		mcs = EGPRS_MCS8;
		break;
	case 154:
		mcs = EGPRS_MCS9;
		break;
	default:
		return -1;
	}

	/* Read header for USF and puncturing matrix selection. */
	hdr = (union gprs_rlc_dl_hdr_egprs *) l2_data;

	switch (mcs) {
	case EGPRS_MCS1:
	case EGPRS_MCS2:
	case EGPRS_MCS3:
	case EGPRS_MCS4:
		/* Check for valid CPS and matching MCS to message size */
		if ((egprs_parse_dl_cps(&cps, hdr, EGPRS_HDR_TYPE3) < 0) ||
			(cps.mcs != mcs))
			goto bad_header;

		egprs_encode_hdr(hc, l2_data, mcs);
		egprs_encode_data(dc, l2_data, mcs, cps.p[0], 0);
		egprs_type3_map(bursts, hc, dc, hdr->type3.usf);
		break;
	case EGPRS_MCS5:
	case EGPRS_MCS6:
		if ((egprs_parse_dl_cps(&cps, hdr, EGPRS_HDR_TYPE2) < 0) ||
			(cps.mcs != mcs))
			goto bad_header;

		egprs_encode_hdr(hc, l2_data, mcs);
		egprs_encode_data(dc, l2_data, mcs, cps.p[0], 0);
		egprs_type2_map(bursts, hc, dc, hdr->type2.usf);
		break;
	case EGPRS_MCS7:
	case EGPRS_MCS8:
	case EGPRS_MCS9:
		if ((egprs_parse_dl_cps(&cps, hdr, EGPRS_HDR_TYPE1) < 0) ||
			(cps.mcs != mcs))
			goto bad_header;

		egprs_encode_hdr(hc, l2_data, mcs);
		egprs_encode_data(c1, l2_data, mcs, cps.p[0], 0);
		egprs_encode_data(c2, l2_data, mcs, cps.p[1], 1);
		egprs_type1_map(bursts, hc, c1, c2, hdr->type1.usf, mcs);
		break;
	}

	return mcs >= EGPRS_MCS5 ?
		GSM0503_EGPRS_BURSTS_NBITS : GSM0503_GPRS_BURSTS_NBITS;

bad_header:
	/* Invalid EGPRS MCS-X header */
	return -1;
}

int gsm0503_pdtch_encode(ubit_t *bursts, uint8_t *l2_data, uint8_t l2_len)
{
	ubit_t iB[456], cB[676];
	const ubit_t *hl_hn;
	ubit_t conv[334];
	int i, j, usf;

	switch (l2_len) {
	case 23:
		osmo_pbit2ubit_ext(conv, 0, l2_data, 0, 184, 1);

		osmo_crc64gen_set_bits(&gsm0503_fire_crc40, conv, 184, conv + 184);

		osmo_conv_encode(&gsm0503_xcch, conv, cB);

		hl_hn = gsm0503_pdtch_hl_hn_ubit[0];

		break;
	case 34:
		osmo_pbit2ubit_ext(conv, 3, l2_data, 0, 271, 1);
		usf = l2_data[0] & 0x7;

		osmo_crc16gen_set_bits(&gsm0503_cs234_crc16, conv + 3,
			271, conv + 3 + 271);

		memcpy(conv, gsm0503_usf2six[usf], 6);

		osmo_conv_encode(&gsm0503_cs2_np, conv, cB);

		for (i = 0, j = 0; i < 588; i++)
			if (!gsm0503_puncture_cs2[i])
				cB[j++] = cB[i];

		hl_hn = gsm0503_pdtch_hl_hn_ubit[1];

		break;
	case 40:
		osmo_pbit2ubit_ext(conv, 3, l2_data, 0, 315, 1);
		usf = l2_data[0] & 0x7;

		osmo_crc16gen_set_bits(&gsm0503_cs234_crc16, conv + 3,
			315, conv + 3 + 315);

		memcpy(conv, gsm0503_usf2six[usf], 6);

		osmo_conv_encode(&gsm0503_cs3_np, conv, cB);

		for (i = 0, j = 0; i < 676; i++)
			if (!gsm0503_puncture_cs3[i])
				cB[j++] = cB[i];

		hl_hn = gsm0503_pdtch_hl_hn_ubit[2];

		break;
	case 54:
		osmo_pbit2ubit_ext(cB, 9, l2_data, 0, 431, 1);
		usf = l2_data[0] & 0x7;

		osmo_crc16gen_set_bits(&gsm0503_cs234_crc16, cB + 9,
			431, cB + 9 + 431);

		memcpy(cB, gsm0503_usf2twelve_ubit[usf], 12);

		hl_hn = gsm0503_pdtch_hl_hn_ubit[3];

		break;
	default:
		return -1;
	}

	gsm0503_xcch_interleave(cB, iB);

	for (i = 0; i < 4; i++) {
		gsm0503_xcch_burst_map(&iB[i * 114], &bursts[i * 116],
			hl_hn + i * 2, hl_hn + i * 2 + 1);
	}

	return GSM0503_GPRS_BURSTS_NBITS;
}

/*
 * GSM TCH/F FR/EFR transcoding
 */

static void tch_fr_reassemble(uint8_t *tch_data,
	ubit_t *b_bits, int net_order)
{
	int i, j, k, l, o;

	tch_data[0] = 0xd << 4;
	memset(tch_data + 1, 0, 32);

	if (net_order) {
		for (i = 0, j = 4; i < 260; i++, j++)
			tch_data[j >> 3] |= (b_bits[i] << (7 - (j & 7)));

		return;
	}

	/* reassemble d-bits */
	i = 0; /* counts bits */
	j = 4; /* counts output bits */
	k = gsm0503_gsm_fr_map[0]-1; /* current number bit in element */
	l = 0; /* counts element bits */
	o = 0; /* offset input bits */
	while (i < 260) {
		tch_data[j >> 3] |= (b_bits[k + o] << (7 - (j & 7)));
		if (--k < 0) {
			o += gsm0503_gsm_fr_map[l];
			k = gsm0503_gsm_fr_map[++l]-1;
		}
		i++;
		j++;
	}
}

static void tch_fr_disassemble(ubit_t *b_bits,
	uint8_t *tch_data, int net_order)
{
	int i, j, k, l, o;

	if (net_order) {
		for (i = 0, j = 4; i < 260; i++, j++)
			b_bits[i] = (tch_data[j >> 3] >> (7 - (j & 7))) & 1;

		return;
	}

	i = 0; /* counts bits */
	j = 4; /* counts input bits */
	k = gsm0503_gsm_fr_map[0] - 1; /* current number bit in element */
	l = 0; /* counts element bits */
	o = 0; /* offset output bits */
	while (i < 260) {
		b_bits[k + o] = (tch_data[j >> 3] >> (7 - (j & 7))) & 1;
		if (--k < 0) {
			o += gsm0503_gsm_fr_map[l];
			k = gsm0503_gsm_fr_map[++l] - 1;
		}
		i++;
		j++;
	}
}

static void tch_hr_reassemble(uint8_t *tch_data, ubit_t *b_bits)
{
	int i, j;

	tch_data[0] = 0x00; /* F = 0, FT = 000 */
	memset(tch_data + 1, 0, 14);

	for (i = 0, j = 8; i < 112; i++, j++)
		tch_data[j >> 3] |= (b_bits[i] << (7 - (j & 7)));
}

static void tch_hr_disassemble(ubit_t *b_bits, uint8_t *tch_data)
{
	int i, j;

	for (i = 0, j = 8; i < 112; i++, j++)
		b_bits[i] = (tch_data[j >> 3] >> (7 - (j & 7))) & 1;
}

static void tch_efr_reassemble(uint8_t *tch_data, ubit_t *b_bits)
{
	int i, j;

	tch_data[0] = 0xc << 4;
	memset(tch_data + 1, 0, 30);

	for (i = 0, j = 4; i < 244; i++, j++)
		tch_data[j >> 3] |= (b_bits[i] << (7 - (j & 7)));
}

static void tch_efr_disassemble(ubit_t *b_bits, uint8_t *tch_data)
{
	int i, j;

	for (i = 0, j = 4; i < 244; i++, j++)
		b_bits[i] = (tch_data[j >> 3] >> (7 - (j & 7))) & 1;
}

static void tch_amr_reassemble(uint8_t *tch_data, ubit_t *d_bits, int len)
{
	int i, j;

	memset(tch_data, 0, (len + 7) >> 3);

	for (i = 0, j = 0; i < len; i++, j++)
		tch_data[j >> 3] |= (d_bits[i] << (7 - (j & 7)));
}

static void tch_amr_disassemble(ubit_t *d_bits, uint8_t *tch_data, int len)
{
	int i, j;

	for (i = 0, j = 0; i < len; i++, j++)
		d_bits[i] = (tch_data[j >> 3] >> (7 - (j & 7))) & 1;
}

static void tch_fr_d_to_b(ubit_t *b_bits, ubit_t *d_bits)
{
	int i;

	for (i = 0; i < 260; i++)
		b_bits[gsm610_bitorder[i]] = d_bits[i];
}

static void tch_fr_b_to_d(ubit_t *d_bits, ubit_t *b_bits)
{
	int i;

	for (i = 0; i < 260; i++)
		d_bits[i] = b_bits[gsm610_bitorder[i]];
}

static void tch_hr_d_to_b(ubit_t *b_bits, ubit_t *d_bits)
{
	int i;

	const uint16_t *map;

	if (!d_bits[93] && !d_bits[94])
		map = gsm620_unvoiced_bitorder;
	else
		map = gsm620_voiced_bitorder;

	for (i = 0; i < 112; i++)
		b_bits[map[i]] = d_bits[i];
}

static void tch_hr_b_to_d(ubit_t *d_bits, ubit_t *b_bits)
{
	int i;
	const uint16_t *map;

	if (!b_bits[34] && !b_bits[35])
		map = gsm620_unvoiced_bitorder;
	else
		map = gsm620_voiced_bitorder;

	for (i = 0; i < 112; i++)
		d_bits[i] = b_bits[map[i]];
}

static void tch_efr_d_to_w(ubit_t *b_bits, ubit_t *d_bits)
{
	int i;

	for (i = 0; i < 260; i++)
		b_bits[gsm660_bitorder[i]] = d_bits[i];
}

static void tch_efr_w_to_d(ubit_t *d_bits, ubit_t *b_bits)
{
	int i;

	for (i = 0; i < 260; i++)
		d_bits[i] = b_bits[gsm660_bitorder[i]];
}

static void tch_efr_protected(ubit_t *s_bits, ubit_t *b_bits)
{
	int i;

	for (i = 0; i < 65; i++)
		b_bits[i] = s_bits[gsm0503_gsm_efr_protected_bits[i] - 1];
}

static void tch_fr_unreorder(ubit_t *d, ubit_t *p, ubit_t *u)
{
	int i;

	for (i = 0; i < 91; i++) {
		d[i << 1] = u[i];
		d[(i << 1) + 1] = u[184 - i];
	}

	for (i = 0; i < 3; i++)
		p[i] = u[91 + i];
}

static void tch_fr_reorder(ubit_t *u, ubit_t *d, ubit_t *p)
{
	int i;

	for (i = 0; i < 91; i++) {
		u[i] = d[i << 1];
		u[184 - i] = d[(i << 1) + 1];
	}

	for (i = 0; i < 3; i++)
		u[91 + i] = p[i];
}

static void tch_hr_unreorder(ubit_t *d, ubit_t *p, ubit_t *u)
{
	memcpy(d, u, 95);
	memcpy(p, u + 95, 3);
}

static void tch_hr_reorder(ubit_t *u, ubit_t *d, ubit_t *p)
{
	memcpy(u, d, 95);
	memcpy(u + 95, p, 3);
}

static void tch_efr_reorder(ubit_t *w, ubit_t *s, ubit_t *p)
{
	memcpy(w, s, 71);
	w[71] = w[72] = s[69];
	memcpy(w + 73, s + 71, 50);
	w[123] = w[124] = s[119];
	memcpy(w + 125, s + 121, 53);
	w[178] = w[179] = s[172];
	memcpy(w + 180, s + 174, 50);
	w[230] = w[231] = s[222];
	memcpy(w + 232, s + 224, 20);
	memcpy(w + 252, p, 8);
}

static void tch_efr_unreorder(ubit_t *s, ubit_t *p, ubit_t *w)
{
	int sum;

	memcpy(s, w, 71);
	sum = s[69] + w[71] + w[72];
	s[69] = (sum > 2);
	memcpy(s + 71, w + 73, 50);
	sum = s[119] + w[123] + w[124];
	s[119] = (sum > 2);
	memcpy(s + 121, w + 125, 53);
	sum = s[172] + w[178] + w[179];
	s[172] = (sum > 2);
	memcpy(s + 174, w + 180, 50);
	sum = s[220] + w[230] + w[231];
	s[222] = (sum > 2);
	memcpy(s + 224, w + 232, 20);
	memcpy(p, w + 252, 8);
}

static void tch_amr_merge(ubit_t *u, ubit_t *d, ubit_t *p, int len, int prot)
{
	memcpy(u, d, prot);
	memcpy(u + prot, p, 6);
	memcpy(u + prot + 6, d + prot, len - prot);
}

static void tch_amr_unmerge(ubit_t *d, ubit_t *p,
	ubit_t *u, int len, int prot)
{
	memcpy(d, u, prot);
	memcpy(p, u + prot, 6);
	memcpy(d + prot, u + prot + 6, len - prot);
}

int gsm0503_tch_fr_decode(uint8_t *tch_data, sbit_t *bursts,
	int net_order, int efr, int *n_errors, int *n_bits_total)
{
	sbit_t iB[912], cB[456], h;
	ubit_t conv[185], s[244], w[260], b[65], d[260], p[8];
	int i, rv, len, steal = 0;

	for (i = 0; i < 8; i++) {
		gsm0503_tch_burst_unmap(&iB[i * 114],
			&bursts[i * 116], &h, i >> 2);
		steal -= h;
	}

	gsm0503_tch_fr_deinterleave(cB, iB);

	if (steal > 0) {
		rv = _xcch_decode_cB(tch_data, cB, n_errors, n_bits_total);
		if (rv) {
			/* Error decoding FACCH frame */
			return -1;
		}

		return 23;
	}

	osmo_conv_decode_ber(&gsm0503_tch_fr, cB, conv, n_errors, n_bits_total);

	tch_fr_unreorder(d, p, conv);

	for (i = 0; i < 78; i++)
		d[i + 182] = (cB[i + 378] < 0) ? 1 : 0;

	rv = osmo_crc8gen_check_bits(&gsm0503_tch_fr_crc3, d, 50, p);
	if (rv) {
		/* Error checking CRC8 for the FR part of an EFR/FR frame */
		return -1;
	}

	if (efr) {
		tch_efr_d_to_w(w, d);

		tch_efr_unreorder(s, p, w);

		tch_efr_protected(s, b);

		rv = osmo_crc8gen_check_bits(&gsm0503_tch_efr_crc8, b, 65, p);
		if (rv) {
			/* Error checking CRC8 for the EFR part of an EFR frame */
			return -1;
		}

		tch_efr_reassemble(tch_data, s);

		len = GSM_EFR_BYTES;
	} else {
		tch_fr_d_to_b(w, d);

		tch_fr_reassemble(tch_data, w, net_order);

		len = GSM_FR_BYTES;
	}

	return len;
}

int gsm0503_tch_fr_encode(ubit_t *bursts, uint8_t *tch_data,
	int len, int net_order)
{
	ubit_t iB[912], cB[456], h;
	ubit_t conv[185], w[260], b[65], s[244], d[260], p[8];
	int i;

	switch (len) {
	case GSM_EFR_BYTES: /* TCH EFR */

		tch_efr_disassemble(s, tch_data);

		tch_efr_protected(s, b);

		osmo_crc8gen_set_bits(&gsm0503_tch_efr_crc8, b, 65, p);

		tch_efr_reorder(w, s, p);

		tch_efr_w_to_d(d, w);

		goto coding_efr_fr;
	case GSM_FR_BYTES: /* TCH FR */
		tch_fr_disassemble(w, tch_data, net_order);

		tch_fr_b_to_d(d, w);

coding_efr_fr:
		osmo_crc8gen_set_bits(&gsm0503_tch_fr_crc3, d, 50, p);

		tch_fr_reorder(conv, d, p);

		memcpy(cB + 378, d + 182, 78);

		osmo_conv_encode(&gsm0503_tch_fr, conv, cB);

		h = 0;

		break;
	case GSM_MACBLOCK_LEN: /* FACCH */
		_xcch_encode_cB(cB, tch_data);

		h = 1;

		break;
	default:
		return -1;
	}

	gsm0503_tch_fr_interleave(cB, iB);

	for (i = 0; i < 8; i++) {
		gsm0503_tch_burst_map(&iB[i * 114],
			&bursts[i * 116], &h, i >> 2);
	}

	return 0;
}

int gsm0503_tch_hr_decode(uint8_t *tch_data, sbit_t *bursts, int odd,
	int *n_errors, int *n_bits_total)
{
	sbit_t iB[912], cB[456], h;
	ubit_t conv[98], b[112], d[112], p[3];
	int i, rv, steal = 0;

	/* Only unmap the stealing bits */
	if (!odd) {
		for (i = 0; i < 4; i++) {
			gsm0503_tch_burst_unmap(NULL, &bursts[i * 116], &h, 0);
			steal -= h;
		}

		for (i = 2; i < 5; i++) {
			gsm0503_tch_burst_unmap(NULL, &bursts[i * 116], &h, 1);
			steal -= h;
		}
	}

	/* If we found a stole FACCH, but only at correct alignment */
	if (steal > 0) {
		for (i = 0; i < 6; i++) {
			gsm0503_tch_burst_unmap(&iB[i * 114],
				&bursts[i * 116], NULL, i >> 2);
		}

		for (i = 2; i < 4; i++) {
			gsm0503_tch_burst_unmap(&iB[i * 114 + 456],
				&bursts[i * 116], NULL, 1);
		}

		gsm0503_tch_fr_deinterleave(cB, iB);

		rv = _xcch_decode_cB(tch_data, cB, n_errors, n_bits_total);
		if (rv) {
			/* Error decoding FACCH frame */
			return -1;
		}

		return GSM_MACBLOCK_LEN;
	}

	for (i = 0; i < 4; i++) {
		gsm0503_tch_burst_unmap(&iB[i * 114],
			&bursts[i * 116], NULL, i >> 1);
	}

	gsm0503_tch_hr_deinterleave(cB, iB);

	osmo_conv_decode_ber(&gsm0503_tch_hr, cB, conv, n_errors, n_bits_total);

	tch_hr_unreorder(d, p, conv);

	for (i = 0; i < 17; i++)
		d[i + 95] = (cB[i + 211] < 0) ? 1 : 0;

	rv = osmo_crc8gen_check_bits(&gsm0503_tch_fr_crc3, d + 73, 22, p);
	if (rv) {
		/* Error checking CRC8 for an HR frame */
		return -1;
	}

	tch_hr_d_to_b(b, d);

	tch_hr_reassemble(tch_data, b);

	return 15;
}

int gsm0503_tch_hr_encode(ubit_t *bursts, uint8_t *tch_data, int len)
{
	ubit_t iB[912], cB[456], h;
	ubit_t conv[98], b[112], d[112], p[3];
	int i;

	switch (len) {
	case 15: /* TCH HR */
		tch_hr_disassemble(b, tch_data);

		tch_hr_b_to_d(d, b);

		osmo_crc8gen_set_bits(&gsm0503_tch_fr_crc3, d + 73, 22, p);

		tch_hr_reorder(conv, d, p);

		osmo_conv_encode(&gsm0503_tch_hr, conv, cB);

		memcpy(cB + 211, d + 95, 17);

		h = 0;

		gsm0503_tch_hr_interleave(cB, iB);

		for (i = 0; i < 4; i++) {
			gsm0503_tch_burst_map(&iB[i * 114],
				&bursts[i * 116], &h, i >> 1);
		}

		break;
	case GSM_MACBLOCK_LEN: /* FACCH */
		_xcch_encode_cB(cB, tch_data);

		h = 1;

		gsm0503_tch_fr_interleave(cB, iB);

		for (i = 0; i < 6; i++) {
			gsm0503_tch_burst_map(&iB[i * 114],
				&bursts[i * 116], &h, i >> 2);
		}

		for (i = 2; i < 4; i++) {
			gsm0503_tch_burst_map(&iB[i * 114 + 456],
				&bursts[i * 116], &h, 1);
		}

		break;
	default:
		return -1;
	}

	return 0;
}

int gsm0503_tch_afs_decode(uint8_t *tch_data, sbit_t *bursts,
	int codec_mode_req, uint8_t *codec, int codecs, uint8_t *ft,
	uint8_t *cmr, int *n_errors, int *n_bits_total)
{
	sbit_t iB[912], cB[456], h;
	ubit_t d[244], p[6], conv[250];
	int i, j, k, best = 0, rv, len, steal = 0, id = 0;
	*n_errors = 0; *n_bits_total = 0;

	for (i=0; i<8; i++) {
		gsm0503_tch_burst_unmap(&iB[i * 114], &bursts[i * 116], &h, i >> 2);
		steal -= h;
	}

	gsm0503_tch_fr_deinterleave(cB, iB);

	if (steal > 0) {
		rv = _xcch_decode_cB(tch_data, cB, n_errors, n_bits_total);
		if (rv) {
			/* Error decoding FACCH frame */
			return -1;
		}

		return GSM_MACBLOCK_LEN;
	}

	for (i = 0; i < 4; i++) {
		for (j = 0, k = 0; j < 8; j++)
			k += abs(((int)gsm0503_afs_ic_sbit[i][j]) - ((int)cB[j]));

		if (i == 0 || k < best) {
			best = k;
			id = i;
		}
	}

	/* Check if indicated codec fits into range of codecs */
	if (id >= codecs) {
		/* Codec mode out of range, return id */
		return id;
	}

	switch ((codec_mode_req) ? codec[*ft] : codec[id]) {
	case 7: /* TCH/AFS12.2 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_12_2, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 244, 81);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 81, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 12.2 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 244);

		len = 31;

		break;
	case 6: /* TCH/AFS10.2 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_10_2, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 204, 65);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 65, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 10.2 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 204);

		len = 26;

		break;
	case 5: /* TCH/AFS7.95 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_7_95, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 159, 75);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 75, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 7.95 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 159);

		len = 20;

		break;
	case 4: /* TCH/AFS7.4 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_7_4, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 148, 61);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 61, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 7.4 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 148);

		len = 19;

		break;
	case 3: /* TCH/AFS6.7 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_6_7, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 134, 55);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 55, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 6.7 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 134);

		len = 17;

		break;
	case 2: /* TCH/AFS5.9 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_5_9, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 118, 55);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 55, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 5.9 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 118);

		len = 15;

		break;
	case 1: /* TCH/AFS5.15 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_5_15, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 103, 49);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 49, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 5.15 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 103);

		len = 13;

		break;
	case 0: /* TCH/AFS4.75 */
		osmo_conv_decode_ber(&gsm0503_tch_afs_4_75, cB + 8,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 95, 39);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 39, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 4.75 frame */
			return -1;
		}

		tch_amr_reassemble(tch_data, d, 95);

		len = 12;

		break;
	default:
		/* Unknown frame type */
		*n_bits_total = 448;
		*n_errors = *n_bits_total;
		return -1;
	}

	/* Change codec request / indication, if frame is valid */
	if (codec_mode_req)
		*cmr = id;
	else
		*ft = id;

	return len;
}

int gsm0503_tch_afs_encode(ubit_t *bursts, uint8_t *tch_data, int len,
	int codec_mode_req, uint8_t *codec, int codecs, uint8_t ft,
	uint8_t cmr)
{
	ubit_t iB[912], cB[456], h;
	ubit_t d[244], p[6], conv[250];
	int i;
	uint8_t id;

	if (len == GSM_MACBLOCK_LEN) { /* FACCH */
		_xcch_encode_cB(cB, tch_data);

		h = 1;

		goto facch;
	}

	h = 0;

	if (codec_mode_req) {
		if (cmr >= codecs) {
			/* FIXME: CMR ID is not in codec list! */
			return -1;
		}
		id = cmr;
	} else {
		if (ft >= codecs) {
			/* FIXME: FT ID is not in codec list! */
			return -1;
		}
		id = ft;
	}

	switch (codec[ft]) {
	case 7: /* TCH/AFS12.2 */
		if (len != 31)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 244);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 81, p);

		tch_amr_merge(conv, d, p, 244, 81);

		osmo_conv_encode(&gsm0503_tch_afs_12_2, conv, cB + 8);

		break;
	case 6: /* TCH/AFS10.2 */
		if (len != 26)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 204);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 65, p);

		tch_amr_merge(conv, d, p, 204, 65);

		osmo_conv_encode(&gsm0503_tch_afs_10_2, conv, cB + 8);

		break;
	case 5: /* TCH/AFS7.95 */
		if (len != 20)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 159);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 75, p);

		tch_amr_merge(conv, d, p, 159, 75);

		osmo_conv_encode(&gsm0503_tch_afs_7_95, conv, cB + 8);

		break;
	case 4: /* TCH/AFS7.4 */
		if (len != 19)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 148);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 61, p);

		tch_amr_merge(conv, d, p, 148, 61);

		osmo_conv_encode(&gsm0503_tch_afs_7_4, conv, cB + 8);

		break;
	case 3: /* TCH/AFS6.7 */
		if (len != 17)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 134);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 55, p);

		tch_amr_merge(conv, d, p, 134, 55);

		osmo_conv_encode(&gsm0503_tch_afs_6_7, conv, cB + 8);

		break;
	case 2: /* TCH/AFS5.9 */
		if (len != 15)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 118);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 55, p);

		tch_amr_merge(conv, d, p, 118, 55);

		osmo_conv_encode(&gsm0503_tch_afs_5_9, conv, cB + 8);

		break;
	case 1: /* TCH/AFS5.15 */
		if (len != 13)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 103);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 49, p);

		tch_amr_merge(conv, d, p, 103, 49);

		osmo_conv_encode(&gsm0503_tch_afs_5_15, conv, cB + 8);

		break;
	case 0: /* TCH/AFS4.75 */
		if (len != 12)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 95);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 39, p);

		tch_amr_merge(conv, d, p, 95, 39);

		osmo_conv_encode(&gsm0503_tch_afs_4_75, conv, cB + 8);

		break;
	default:
		/* FIXME: FT %ft is not supported */
		return -1;
	}

	memcpy(cB, gsm0503_afs_ic_ubit[id], 8);

facch:
	gsm0503_tch_fr_interleave(cB, iB);

	for (i = 0; i < 8; i++) {
		gsm0503_tch_burst_map(&iB[i * 114],
			&bursts[i * 116], &h, i >> 2);
	}

	return 0;

invalid_length:
	/* FIXME: payload length %len does not comply with codec type %ft */
	return -1;
}

int gsm0503_tch_ahs_decode(uint8_t *tch_data, sbit_t *bursts, int odd,
	int codec_mode_req, uint8_t *codec, int codecs, uint8_t *ft,
	uint8_t *cmr, int *n_errors, int *n_bits_total)
{
	sbit_t iB[912], cB[456], h;
	ubit_t d[244], p[6], conv[135];
	int i, j, k, best = 0, rv, len, steal = 0, id = 0;

	/* only unmap the stealing bits */
	if (!odd) {
		for (i = 0; i < 4; i++) {
			gsm0503_tch_burst_unmap(NULL, &bursts[i * 116], &h, 0);
			steal -= h;
		}
		for (i = 2; i < 5; i++) {
			gsm0503_tch_burst_unmap(NULL, &bursts[i * 116], &h, 1);
			steal -= h;
		}
	}

	/* if we found a stole FACCH, but only at correct alignment */
	if (steal > 0) {
		for (i = 0; i < 6; i++) {
			gsm0503_tch_burst_unmap(&iB[i * 114],
				&bursts[i * 116], NULL, i >> 2);
		}

		for (i = 2; i < 4; i++) {
			gsm0503_tch_burst_unmap(&iB[i * 114 + 456],
				&bursts[i * 116], NULL, 1);
		}

		gsm0503_tch_fr_deinterleave(cB, iB);

		rv = _xcch_decode_cB(tch_data, cB, n_errors, n_bits_total);
		if (rv) {
			/* Error decoding FACCH frame */
			return -1;
		}

		return GSM_MACBLOCK_LEN;
	}

	for (i = 0; i < 4; i++) {
		gsm0503_tch_burst_unmap(&iB[i * 114],
			&bursts[i * 116], NULL, i >> 1);
	}

	gsm0503_tch_hr_deinterleave(cB, iB);

	for (i = 0; i < 4; i++) {
		for (j = 0, k = 0; j < 4; j++)
			k += abs(((int)gsm0503_ahs_ic_sbit[i][j]) - ((int)cB[j]));

		if (i == 0 || k < best) {
			best = k;
			id = i;
		}
	}

	/* Check if indicated codec fits into range of codecs */
	if (id >= codecs) {
		/* Codec mode out of range, return id */
		return id;
	}

	switch ((codec_mode_req) ? codec[*ft] : codec[id]) {
	case 5: /* TCH/AHS7.95 */
		osmo_conv_decode_ber(&gsm0503_tch_ahs_7_95, cB + 4,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 123, 67);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 67, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 7.95 frame */
			return -1;
		}

		for (i = 0; i < 36; i++)
			d[i + 123] = (cB[i + 192] < 0) ? 1 : 0;

		tch_amr_reassemble(tch_data, d, 159);

		len = 20;

		break;
	case 4: /* TCH/AHS7.4 */
		osmo_conv_decode_ber(&gsm0503_tch_ahs_7_4, cB + 4,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 120, 61);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 61, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 7.4 frame */
			return -1;
		}

		for (i = 0; i < 28; i++)
			d[i + 120] = (cB[i + 200] < 0) ? 1 : 0;

		tch_amr_reassemble(tch_data, d, 148);

		len = 19;

		break;
	case 3: /* TCH/AHS6.7 */
		osmo_conv_decode_ber(&gsm0503_tch_ahs_6_7, cB + 4,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 110, 55);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 55, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 6.7 frame */
			return -1;
		}

		for (i = 0; i < 24; i++)
			d[i + 110] = (cB[i + 204] < 0) ? 1 : 0;

		tch_amr_reassemble(tch_data, d, 134);

		len = 17;

		break;
	case 2: /* TCH/AHS5.9 */
		osmo_conv_decode_ber(&gsm0503_tch_ahs_5_9, cB + 4,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 102, 55);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 55, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 5.9 frame */
			return -1;
		}

		for (i = 0; i < 16; i++)
			d[i + 102] = (cB[i + 212] < 0) ? 1 : 0;

		tch_amr_reassemble(tch_data, d, 118);

		len = 15;

		break;
	case 1: /* TCH/AHS5.15 */
		osmo_conv_decode_ber(&gsm0503_tch_ahs_5_15, cB + 4,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 91, 49);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 49, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 5.15 frame */
			return -1;
		}

		for (i = 0; i < 12; i++)
			d[i + 91] = (cB[i + 216] < 0) ? 1 : 0;

		tch_amr_reassemble(tch_data, d, 103);

		len = 13;

		break;
	case 0: /* TCH/AHS4.75 */
		osmo_conv_decode_ber(&gsm0503_tch_ahs_4_75, cB + 4,
			conv, n_errors, n_bits_total);

		tch_amr_unmerge(d, p, conv, 83, 39);

		rv = osmo_crc8gen_check_bits(&gsm0503_amr_crc6, d, 39, p);
		if (rv) {
			/* Error checking CRC8 for an AMR 4.75 frame */
			return -1;
		}

		for (i = 0; i < 12; i++)
			d[i + 83] = (cB[i + 216] < 0) ? 1 : 0;

		tch_amr_reassemble(tch_data, d, 95);

		len = 12;

		break;
	default:
		/* Unknown frame type */
		*n_bits_total = 159;
		*n_errors = *n_bits_total;
		return -1;
	}

	/* Change codec request / indication, if frame is valid */
	if (codec_mode_req)
		*cmr = id;
	else
		*ft = id;

	return len;
}

int gsm0503_tch_ahs_encode(ubit_t *bursts, uint8_t *tch_data, int len,
	int codec_mode_req, uint8_t *codec, int codecs, uint8_t ft,
	uint8_t cmr)
{
	ubit_t iB[912], cB[456], h;
	ubit_t d[244], p[6], conv[135];
	int i;
	uint8_t id;

	if (len == GSM_MACBLOCK_LEN) { /* FACCH */
		_xcch_encode_cB(cB, tch_data);

		h = 1;

		gsm0503_tch_fr_interleave(cB, iB);

		for (i = 0; i < 6; i++)
			gsm0503_tch_burst_map(&iB[i * 114], &bursts[i * 116],
				&h, i >> 2);
		for (i = 2; i < 4; i++)
			gsm0503_tch_burst_map(&iB[i * 114 + 456],
				&bursts[i * 116], &h, 1);

		return 0;
	}

	h = 0;

	if (codec_mode_req) {
		if (cmr >= codecs) {
			/* FIXME: CMR ID %d not in codec list */
			return -1;
		}
		id = cmr;
	} else {
		if (ft >= codecs) {
			/* FIXME: FT ID %d not in codec list */
			return -1;
		}
		id = ft;
	}

	switch (codec[ft]) {
	case 5: /* TCH/AHS7.95 */
		if (len != 20)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 159);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 67, p);

		tch_amr_merge(conv, d, p, 123, 67);

		osmo_conv_encode(&gsm0503_tch_ahs_7_95, conv, cB + 4);

		memcpy(cB + 192, d + 123, 36);

		break;
	case 4: /* TCH/AHS7.4 */
		if (len != 19)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 148);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 61, p);

		tch_amr_merge(conv, d, p, 120, 61);

		osmo_conv_encode(&gsm0503_tch_ahs_7_4, conv, cB + 4);

		memcpy(cB + 200, d + 120, 28);

		break;
	case 3: /* TCH/AHS6.7 */
		if (len != 17)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 134);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 55, p);

		tch_amr_merge(conv, d, p, 110, 55);

		osmo_conv_encode(&gsm0503_tch_ahs_6_7, conv, cB + 4);

		memcpy(cB + 204, d + 110, 24);

		break;
	case 2: /* TCH/AHS5.9 */
		if (len != 15)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 118);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 55, p);

		tch_amr_merge(conv, d, p, 102, 55);

		osmo_conv_encode(&gsm0503_tch_ahs_5_9, conv, cB + 4);

		memcpy(cB + 212, d + 102, 16);

		break;
	case 1: /* TCH/AHS5.15 */
		if (len != 13)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 103);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 49, p);

		tch_amr_merge(conv, d, p, 91, 49);

		osmo_conv_encode(&gsm0503_tch_ahs_5_15, conv, cB + 4);

		memcpy(cB + 216, d + 91, 12);

		break;
	case 0: /* TCH/AHS4.75 */
		if (len != 12)
			goto invalid_length;

		tch_amr_disassemble(d, tch_data, 95);

		osmo_crc8gen_set_bits(&gsm0503_amr_crc6, d, 39, p);

		tch_amr_merge(conv, d, p, 83, 39);

		osmo_conv_encode(&gsm0503_tch_ahs_4_75, conv, cB + 4);

		memcpy(cB + 216, d + 83, 12);

		break;
	default:
		/* FIXME: FT %ft is not supported */
		return -1;
	}

	memcpy(cB, gsm0503_afs_ic_ubit[id], 4);

	gsm0503_tch_hr_interleave(cB, iB);

	for (i = 0; i < 4; i++)
		gsm0503_tch_burst_map(&iB[i * 114], &bursts[i * 116], &h, i >> 1);

	return 0;

invalid_length:
	/* FIXME: payload length %len does not comply with codec type %ft */
	return -1;
}

/*
 * GSM RACH transcoding
 */

/*
 * GSM RACH apply BSIC to parity
 *
 * p(j) = p(j) xor b(j)     j = 0, ..., 5
 * b(0) = MSB of PLMN colour code
 * b(5) = LSB of BS colour code
 */
static int rach_apply_bsic(ubit_t *d, uint8_t bsic)
{
	int i;

	/* Apply it */
	for (i = 0; i < 6; i++)
		d[8 + i] ^= ((bsic >> (5 - i)) & 1);

	return 0;
}

int gsm0503_rach_decode(uint8_t *ra, sbit_t *burst, uint8_t bsic)
{
	ubit_t conv[14];
	int rv;

	osmo_conv_decode(&gsm0503_rach, burst, conv);

	rach_apply_bsic(conv, bsic);

	rv = osmo_crc8gen_check_bits(&gsm0503_rach_crc6, conv, 8, conv + 8);
	if (rv)
		return -1;

	osmo_ubit2pbit_ext(ra, 0, conv, 0, 8, 1);

	return 0;
}

int gsm0503_rach_encode(ubit_t *burst, uint8_t *ra, uint8_t bsic)
{
	ubit_t conv[14];

	osmo_pbit2ubit_ext(conv, 0, ra, 0, 8, 1);

	osmo_crc8gen_set_bits(&gsm0503_rach_crc6, conv, 8, conv + 8);

	rach_apply_bsic(conv, bsic);

	osmo_conv_encode(&gsm0503_rach, conv, burst);

	return 0;
}

/*
 * GSM SCH transcoding
 */
int gsm0503_sch_decode(uint8_t *sb_info, sbit_t *burst)
{
	ubit_t conv[35];
	int rv;

	osmo_conv_decode(&gsm0503_sch, burst, conv);

	rv = osmo_crc16gen_check_bits(&gsm0503_sch_crc10, conv, 25, conv + 25);
	if (rv)
		return -1;

	osmo_ubit2pbit_ext(sb_info, 0, conv, 0, 25, 1);

	return 0;
}

int gsm0503_sch_encode(ubit_t *burst, uint8_t *sb_info)
{
	ubit_t conv[35];

	osmo_pbit2ubit_ext(conv, 0, sb_info, 0, 25, 1);

	osmo_crc16gen_set_bits(&gsm0503_sch_crc10, conv, 25, conv + 25);

	osmo_conv_encode(&gsm0503_sch, conv, burst);

	return 0;
}
