/*! \file i460_mux.h
 * ITU-T I.460 sub-channel multiplexer + demultiplexer */
/*
 * (C) 2020 by Harald Welte <laforge@gnumonks.org>
 *
 * SPDX-License-Identifier: GPL-2.0+
 *
 *  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.
 */

#pragma once
#include <stdint.h>
#include <osmocom/core/bits.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/msgb.h>

/* I.460 sub-slot rate */
enum osmo_i460_rate {
	OSMO_I460_RATE_NONE,		/* disabled */
	OSMO_I460_RATE_64k,
	OSMO_I460_RATE_32k,
	OSMO_I460_RATE_16k,
	OSMO_I460_RATE_8k,
};

typedef void (*out_cb_bits_t)(void *user_data, const ubit_t *bits, unsigned int num_bits);
typedef void (*out_cb_bytes_t)(void *user_data, const uint8_t *bytes, unsigned int num_bytes);

struct osmo_i460_subchan_demux {
	/*! bit-buffer for output bits */
	uint8_t *out_bitbuf;
	/*! size of out_bitbuf in bytes */
	unsigned int out_bitbuf_size;
	/*! offset of next bit to be written in out_bitbuf */
	unsigned int out_idx;
	/*! callback to be called once we have received out_bitbuf_size bits */
	out_cb_bits_t out_cb_bits;
	out_cb_bytes_t out_cb_bytes;
	void *user_data;
};

struct osmo_i460_subchan_mux {
	/*! list of to-be-transmitted message buffers */
	struct llist_head tx_queue;
};

struct osmo_i460_subchan {
	enum osmo_i460_rate rate;		/* 8/16/32/64k */
	uint8_t bit_offset;		/* bit offset inside each byte of the B-channel */
	struct osmo_i460_subchan_demux demux;
	struct osmo_i460_subchan_mux mux;
};

struct osmo_i460_timeslot {
	struct osmo_i460_subchan schan[8];
};

/*! description of a sub-channel; passed by caller */
struct osmo_i460_schan_desc {
	enum osmo_i460_rate rate;
	uint8_t bit_offset;
	struct {
		/* size (in bits) of the internal buffer; determines granularity */
		size_t num_bits;
		/*! call-back function called whenever we received num_bits */
		out_cb_bits_t out_cb_bits;
		/*! out_cb_bytes call-back function called whenever we received num_bits.
		 * The user is usually expected to provide either out_cb_bits or out_cb_bytes.  If only
		 * out_cb_bits is provided, output data will always be provided as unpacked bits;  if only
		 * out_cb_bytes is provided, output data will always be provided as packet bits (bytes).  If
		 * both are provided, it is up to the I.460 multiplex to decide if it calls either of the two,
		 * depending on what can be provided without extra conversion. */
		out_cb_bytes_t out_cb_bytes;
		/* opaque user data pointer to pass to out_cb */
		void *user_data;
	} demux;
};

void osmo_i460_demux_in(struct osmo_i460_timeslot *ts, const uint8_t *data, size_t data_len);

void osmo_i460_mux_enqueue(struct osmo_i460_subchan *schan, struct msgb *msg);
int osmo_i460_mux_out(struct osmo_i460_timeslot *ts, uint8_t *out, size_t out_len);

void osmo_i460_ts_init(struct osmo_i460_timeslot *ts);

struct osmo_i460_subchan *
osmo_i460_subchan_add(void *ctx, struct osmo_i460_timeslot *ts, const struct osmo_i460_schan_desc *chd);

void osmo_i460_subchan_del(struct osmo_i460_subchan *schan);

/*! @} */
