/* GSM BSC Radio Link Layer API
 * 3GPP TS 08.58 version 8.6.0 Release 1999 / ETSI TS 100 596 V8.6.0 */

/* (C) 2009 by Harald Welte <laforge@gnumonks.org>
 *
 * 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 <errno.h>

#include <openbsc/debug.h>
#include <osmocore/talloc.h>
#include <osmocore/timer.h>
#include <osmocore/linuxlist.h>
#include <openbsc/bsc_rll.h>
#include <openbsc/gsm_data.h>
#include <openbsc/chan_alloc.h>
#include <openbsc/abis_rsl.h>
#include <openbsc/signal.h>

struct bsc_rll_req {
	struct llist_head list;
	struct timer_list timer;

	struct gsm_lchan *lchan;
	u_int8_t link_id;

	void (*cb)(struct gsm_lchan *lchan, u_int8_t link_id,
		   void *data, enum bsc_rllr_ind);
	void *data;
};

/* we only compare C1, C2 and SAPI */
#define LINKID_MASK	0xC7

static LLIST_HEAD(bsc_rll_reqs);

static void complete_rllr(struct bsc_rll_req *rllr, enum bsc_rllr_ind type)
{
	struct gsm_subscriber_connection *conn;

	conn = &rllr->lchan->conn;
	llist_del(&rllr->list);
	rllr->cb(rllr->lchan, rllr->link_id, rllr->data, type);
	talloc_free(rllr);
}

static void timer_cb(void *_rllr)
{
	struct bsc_rll_req *rllr = _rllr;

	complete_rllr(rllr, BSC_RLLR_IND_TIMEOUT);
}

/* establish a RLL connection with given SAPI / priority */
int rll_establish(struct gsm_lchan *lchan, u_int8_t sapi,
		  void (*cb)(struct gsm_lchan *, u_int8_t, void *,
			     enum bsc_rllr_ind),
		  void *data)
{
	struct gsm_subscriber_connection *conn;
	struct bsc_rll_req *rllr = talloc_zero(tall_bsc_ctx, struct bsc_rll_req);
	u_int8_t link_id;
	if (!rllr)
		return -ENOMEM;

	link_id = sapi;

	/* If we are a TCH and not in signalling mode, we need to
	 * indicate that the new RLL connection is to be made on the SACCH */
	if ((lchan->type == GSM_LCHAN_TCH_F ||
	     lchan->type == GSM_LCHAN_TCH_H) && sapi != 0)
		link_id |= 0x40;

	conn = &lchan->conn;
	rllr->lchan = lchan;
	rllr->link_id = link_id;
	rllr->cb = cb;
	rllr->data = data;

	llist_add(&rllr->list, &bsc_rll_reqs);

	rllr->timer.cb = &timer_cb;
	rllr->timer.data = rllr;

	bsc_schedule_timer(&rllr->timer, 10, 0);

	/* send the RSL RLL ESTablish REQuest */
	return rsl_establish_request(rllr->lchan, rllr->link_id);
}

/* Called from RSL code in case we have received an indication regarding
 * any RLL link */
void rll_indication(struct gsm_lchan *lchan, u_int8_t link_id, u_int8_t type)
{
	struct bsc_rll_req *rllr, *rllr2;

	llist_for_each_entry_safe(rllr, rllr2, &bsc_rll_reqs, list) {
		if (rllr->lchan == lchan &&
		    (rllr->link_id & LINKID_MASK) == (link_id & LINKID_MASK)) {
			bsc_del_timer(&rllr->timer);
			complete_rllr(rllr, type);
			return;
		}
	}
}

static int rll_lchan_signal(unsigned int subsys, unsigned int signal,
			    void *handler_data, void *signal_data)
{
	struct challoc_signal_data *challoc;
	struct bsc_rll_req *rllr, *rllr2;

	if (subsys != SS_CHALLOC || signal != S_CHALLOC_FREED)
		return 0;

	challoc = (struct challoc_signal_data *) signal_data;

	llist_for_each_entry_safe(rllr, rllr2, &bsc_rll_reqs, list) {
		if (rllr->lchan == challoc->lchan) {
			bsc_del_timer(&rllr->timer);
			complete_rllr(rllr, BSC_RLLR_IND_ERR_IND);
		}
	}

	return 0;
}

static __attribute__((constructor)) void on_dso_load_rll(void)
{
	register_signal_handler(SS_CHALLOC, rll_lchan_signal, NULL);
}
