/* BSSGP per-BVC Finite State Machine */

/* (C) 2020 Harald Welte <laforge@gnumonks.org>
 *
 * All Rights Reserved
 *
 * 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, see <http://www.gnu.org/licenses/>.
 *
 */

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

#include <osmocom/core/fsm.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/tdef.h>

#include <osmocom/gsm/gsm48.h>
#include <osmocom/gsm/tlv.h>

#include <osmocom/gprs/gprs_msgb.h>
#include <osmocom/gprs/gprs_bssgp.h>
#include <osmocom/gprs/gprs_bssgp2.h>
#include <osmocom/gprs/bssgp_bvc_fsm.h>

#include "common_vty.h"

#define S(x)	(1 << (x))

/* TODO: Those are not made cofnigurable via a VTY yet */
struct osmo_tdef bssgp_bvc_fsm_tdefs[] = {
	{
		.T = 1,
		.default_val = 5,
		.min_val = 1,
		.max_val = 30,
		.unit = OSMO_TDEF_S,
		.desc = "Guards the BSSGP BVC (un)blocking procedure",
	}, {
		.T = 2,
		.default_val = 10,
		.min_val = 1,
		.max_val = 120,
		.unit = OSMO_TDEF_S,
		.desc = "Guards the BSSGP BVC reset procedure",
	}, {
		.T = 3,
		.default_val = 500,
		.min_val = 100,
		.max_val = 10000,
		.unit = OSMO_TDEF_MS,
		.desc = "Guards the BSSGP SUSPEND procedure",
	}, {
		.T = 4,
		.default_val = 500,
		.min_val = 100,
		.max_val = 10000,
		.unit = OSMO_TDEF_MS,
		.desc = "Guards the BSSGP RESUME procedure",
	}, {
		.T = 5,
		.default_val = 15,
		.min_val = 1,
		.max_val = 30,
		.unit = OSMO_TDEF_S,
		.desc = "Guards the BSSGP Radio Access Capability Update procedure",
	},
	{}
};

#define T1	1
#define T2	2

/* We cannot use osmo_tdef_fsm_* as it makes hard-coded assumptions that
 * each new/target state will always use the same timer and timeout - or
 * a timeout at all */
#define T1_SECS	osmo_tdef_get(bssgp_bvc_fsm_tdefs, 1, OSMO_TDEF_S, 5)
#define T2_SECS	osmo_tdef_get(bssgp_bvc_fsm_tdefs, 2, OSMO_TDEF_S, 10)

/* forward declaration */
static struct osmo_fsm bssgp_bvc_fsm;

static const struct value_string ptp_bvc_event_names[] = {
	{ BSSGP_BVCFSM_E_RX_BLOCK, "RX-BVC-BLOCK" },
	{ BSSGP_BVCFSM_E_RX_BLOCK_ACK, "RX-BVC-BLOCK-ACK" },
	{ BSSGP_BVCFSM_E_RX_UNBLOCK, "RX-BVC-UNBLOCK" },
	{ BSSGP_BVCFSM_E_RX_UNBLOCK_ACK, "RX-BVC-UNBLOCK-ACK" },
	{ BSSGP_BVCFSM_E_RX_RESET, "RX-BVC-RESET" },
	{ BSSGP_BVCFSM_E_RX_RESET_ACK, "RX-BVC-RESET-ACK" },
	{ BSSGP_BVCFSM_E_RX_FC_BVC, "RX-FLOW-CONTROL-BVC" },
	{ BSSGP_BVCFSM_E_RX_FC_BVC_ACK, "RX-FLOW-CONTROL-BVC-ACK" },
	{ BSSGP_BVCFSM_E_REQ_BLOCK, "REQ-BLOCK" },
	{ BSSGP_BVCFSM_E_REQ_UNBLOCK, "REQ-UNBLOCK" },
	{ BSSGP_BVCFSM_E_REQ_RESET, "REQ-RESET" },
	{ BSSGP_BVCFSM_E_REQ_FC_BVC, "REQ-FLOW-CONTROL-BVC" },
	{ 0, NULL }
};

struct bvc_fsm_priv {
	/* NS-instance; defining the scope for NSEI below */
	struct gprs_ns2_inst *nsi;

	/* NSEI of the underlying NS Entity */
	uint16_t nsei;

	/* BVCI of this BVC */
	uint16_t bvci;

	/* are we the SGSN (true) or the BSS (false) */
	bool role_sgsn;

	/* BSS side: are we locally marked blocked? */
	bool locally_blocked;
	uint8_t block_cause;

	/* cause value of the last outbound BVC-RESET (for re-transmissions) */
	uint8_t last_reset_cause;

	struct {
		/* Bit 0..7: Features; Bit 8..15: Extended Features */
		uint32_t advertised;
		uint32_t received;
		uint32_t negotiated;
		/* only used if BSSGP_XFEAT_GBIT is negotiated */
		enum bssgp_fc_granularity fc_granularity;
	} features;

	/* Cell Identification used by BSS when
	 * transmitting BVC-RESET / BVC-RESET-ACK, or those received
	 * from BSS in SGSN role */
	struct gprs_ra_id ra_id;
	uint16_t cell_id;

	/* call-backs provided by the user */
	const struct bssgp_bvc_fsm_ops *ops;
	/* private data pointer passed to each call-back invocation */
	void *ops_priv;
};

static int fi_tx_ptp(struct osmo_fsm_inst *fi, struct msgb *msg)
{
	struct bssgp_normal_hdr *bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg);
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);

	LOGPFSM(fi, "Tx BSSGP %s\n", osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, bgph->pdu_type));

	return bssgp2_nsi_tx_ptp(bfp->nsi, bfp->nsei, bfp->bvci, msg, 0);
}

static int fi_tx_sig(struct osmo_fsm_inst *fi, struct msgb *msg)
{
	struct bssgp_normal_hdr *bgph = (struct bssgp_normal_hdr *) msgb_bssgph(msg);
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);

	LOGPFSM(fi, "Tx BSSGP %s\n", osmo_tlv_prot_msg_name(&osmo_pdef_bssgp, bgph->pdu_type));

	return bssgp2_nsi_tx_sig(bfp->nsi, bfp->nsei, msg, 0);
}

/* helper function to transmit BVC-RESET with right combination of conditional/optional IEs */
static void _tx_bvc_reset(struct osmo_fsm_inst *fi, uint8_t cause)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	const uint8_t *features = NULL;
	const uint8_t *features_ext = NULL;
	uint8_t _features[2] = {
		(bfp->features.advertised >> 0) & 0xff,
		(bfp->features.advertised >> 8) & 0xff,
	};
	struct msgb *tx;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);

	/* transmit BVC-RESET to peer; RA-ID only present for PTP from BSS */
	if (bfp->bvci == 0) {
		features = &_features[0];
		features_ext = &_features[1];
	}
	tx = bssgp2_enc_bvc_reset(bfp->bvci, cause,
				  bfp->bvci && !bfp->role_sgsn ? &bfp->ra_id : NULL,
				  bfp->cell_id, features, features_ext);
	fi_tx_sig(fi, tx);
}

/* helper function to transmit BVC-RESET-ACK with right combination of conditional/optional IEs */
static void _tx_bvc_reset_ack(struct osmo_fsm_inst *fi)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	const uint8_t *features = NULL;
	const uint8_t *features_ext = NULL;
	uint8_t _features[2] = {
		(bfp->features.advertised >> 0) & 0xff,
		(bfp->features.advertised >> 8) & 0xff,
	};
	struct msgb *tx;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);

	/* transmit BVC-RESET-ACK to peer; RA-ID only present for PTP from BSS -> SGSN */
	if (bfp->bvci == 0) {
		features = &_features[0];
		features_ext = &_features[1];
	}
	tx = bssgp2_enc_bvc_reset_ack(bfp->bvci, bfp->bvci && !bfp->role_sgsn ? &bfp->ra_id : NULL,
				     bfp->cell_id, features, features_ext);
	fi_tx_sig(fi, tx);
}

/* helper function to transmit BVC-STATUS with right combination of conditional/optional IEs */
static void _tx_status(struct osmo_fsm_inst *fi, enum gprs_bssgp_cause cause, const struct msgb *rx)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	struct msgb *tx;
	uint16_t *bvci = NULL;

	/* GSM 08.18, 10.4.14.1: The BVCI must be included if (and only if) the
	 * cause is either "BVCI blocked" or "BVCI unknown" */
	if (cause == BSSGP_CAUSE_UNKNOWN_BVCI || cause == BSSGP_CAUSE_BVCI_BLOCKED)
		bvci = &bfp->bvci;

	tx = bssgp2_enc_status(cause, bvci, rx);

	if (msgb_bvci(rx) == 0)
		fi_tx_sig(fi, tx);
	else
		fi_tx_ptp(fi, tx);
}

/* Update the features by bit-wise AND of advertised + received features */
static void update_negotiated_features(struct osmo_fsm_inst *fi, const struct tlv_parsed *tp)
{
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);

	bfp->features.received = 0;

	if (TLVP_PRES_LEN(tp, BSSGP_IE_FEATURE_BITMAP, 1))
		bfp->features.received |= *TLVP_VAL(tp, BSSGP_IE_FEATURE_BITMAP);

	if (TLVP_PRES_LEN(tp, BSSGP_IE_EXT_FEATURE_BITMAP, 1))
		bfp->features.received |= (*TLVP_VAL(tp, BSSGP_IE_EXT_FEATURE_BITMAP) << 8);

	bfp->features.negotiated = bfp->features.advertised & bfp->features.received;

	LOGPFSML(fi, LOGL_NOTICE, "Updating features: Advertised 0x%04x, Received 0x%04x, Negotiated 0x%04x\n",
		 bfp->features.advertised, bfp->features.received, bfp->features.negotiated);
}

/* "tail" of each onenter() handler: Calling the state change notification call-back */
static void _onenter_tail(struct osmo_fsm_inst *fi, uint32_t prev_state)
{
	struct bvc_fsm_priv *bfp = fi->priv;

	if (prev_state == fi->state)
		return;

	if (bfp->ops && bfp->ops->state_chg_notification)
		bfp->ops->state_chg_notification(bfp->nsei, bfp->bvci, prev_state, fi->state, bfp->ops_priv);
}

static void bssgp_bvc_fsm_null(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
	/* we don't really expect anything in this state; all handled via allstate */
	OSMO_ASSERT(0);
}

static void bssgp_bvc_fsm_blocked_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	/* signaling BVC can never be blocked */
	OSMO_ASSERT(bfp->bvci != 0);
	_onenter_tail(fi, prev_state);
}

static void bssgp_bvc_fsm_blocked(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	struct msgb *rx = NULL, *tx;
	const struct tlv_parsed *tp = NULL;
	uint8_t cause;

	switch (event) {
	case BSSGP_BVCFSM_E_RX_BLOCK_ACK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		/* If a BVC-BLOCK-ACK PDU is received by a BSS for the signalling BVC, the PDU is ignored. */
		if (bfp->bvci == 0) {
			LOGPFSML(fi, LOGL_ERROR, "Rx BVC-BLOCK-ACK on BVCI=0 is illegal\n");
			if (!bfp->role_sgsn)
				break;
			_tx_status(fi, BSSGP_CAUSE_SEM_INCORR_PDU, rx);
			break;
		}
		/* stop T1 timer */
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_BLOCKED, 0, 0);
		break;
	case BSSGP_BVCFSM_E_RX_BLOCK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		cause = *TLVP_VAL(tp, BSSGP_IE_CAUSE);
		LOGPFSML(fi, LOGL_NOTICE, "Rx BVC-BLOCK (cause=%s)\n", bssgp_cause_str(cause));
		/* If a BVC-BLOCK PDU is received by an SGSN for a blocked BVC, a BVC-BLOCK-ACK
		 * PDU shall be returned. */
		if (bfp->role_sgsn) {
			/* If a BVC-BLOCK PDU is received by an SGSN for
			 * the signalling BVC, the PDU is ignored */
			if (bfp->bvci == 0)
				break;
			tx = bssgp2_enc_bvc_block_ack(bfp->bvci);
			fi_tx_sig(fi, tx);
		}
		break;
	case BSSGP_BVCFSM_E_RX_UNBLOCK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		LOGPFSML(fi, LOGL_NOTICE, "Rx BVC-UNBLOCK\n");
		if (bfp->bvci == 0) {
			LOGPFSML(fi, LOGL_ERROR, "Rx BVC-UNBLOCK on BVCI=0 is illegal\n");
			/* If BVC-UNBLOCK PDU is received by an SGSN for the signalling BVC, the PDU is ignored.*/
			if (bfp->role_sgsn)
				break;
			_tx_status(fi, BSSGP_CAUSE_SEM_INCORR_PDU, rx);
			break;
		}
		if (!bfp->role_sgsn) {
			LOGPFSML(fi, LOGL_ERROR, "Rx BVC-UNBLOCK on BSS is illegal\n");
			_tx_status(fi, BSSGP_CAUSE_SEM_INCORR_PDU, rx);
			break;
		}
		tx = bssgp2_enc_bvc_unblock_ack(bfp->bvci);
		fi_tx_sig(fi, tx);
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_UNBLOCKED, T1_SECS, T1);
		break;
	case BSSGP_BVCFSM_E_REQ_UNBLOCK:
		if (bfp->role_sgsn) {
			LOGPFSML(fi, LOGL_ERROR, "SGSN side cannot initiate BVC unblock\n");
			break;
		}
		if (bfp->bvci == 0) {
			LOGPFSML(fi, LOGL_ERROR, "BVCI 0 cannot be unblocked\n");
			break;
		}
		bfp->locally_blocked = false;
		tx = bssgp2_enc_bvc_unblock(bfp->bvci);
		fi_tx_sig(fi, tx);
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_UNBLOCKED, 0, 0);
		break;
	}
}

/* Waiting for RESET-ACK: Receive PDUs but don't transmit */
static void bssgp_bvc_fsm_wait_reset_ack(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	const struct tlv_parsed *tp = NULL;
	struct msgb *rx = NULL, *tx;

	switch (event) {
	case BSSGP_BVCFSM_E_RX_RESET_ACK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		if (bfp->bvci == 0)
			update_negotiated_features(fi, tp);
		if (bfp->role_sgsn && bfp->bvci != 0)
			bfp->cell_id = bssgp_parse_cell_id(&bfp->ra_id, TLVP_VAL(tp, BSSGP_IE_CELL_ID));
		if (!bfp->role_sgsn && bfp->bvci != 0 && bfp->locally_blocked) {
			/* initiate the blocking procedure */
			/* transmit BVC-BLOCK, transition to BLOCKED state and start re-transmit timer */
			tx = bssgp2_enc_bvc_block(bfp->bvci, bfp->block_cause);
			fi_tx_sig(fi, tx);
			osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_BLOCKED, T1_SECS, T1);
		} else
			osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_UNBLOCKED, 0, 0);
		break;
	}
}

static void bssgp_bvc_fsm_unblocked(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
	struct bssgp2_flow_ctrl rx_fc, *tx_fc;
	struct bvc_fsm_priv *bfp = fi->priv;
	const struct tlv_parsed *tp = NULL;
	struct msgb *rx = NULL, *tx;
	int rc;

	switch (event) {
	case BSSGP_BVCFSM_E_RX_UNBLOCK_ACK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		/* If BVC-UNBLOCK-ACK PDU is received by an BSS for the signalling BVC, the PDU is ignored. */
		LOGPFSML(fi, LOGL_ERROR, "Rx BVC-UNBLOCK-ACK on BVCI=0 is illegal\n");
		if (bfp->bvci == 0) {
			if (!bfp->role_sgsn)
				break;
			_tx_status(fi, BSSGP_CAUSE_SEM_INCORR_PDU, rx);
			break;
		}
		/* stop T1 timer */
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_UNBLOCKED, 0, 0);
		break;
	case BSSGP_BVCFSM_E_RX_UNBLOCK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		/* If a BVC-UNBLOCK PDU is received by an SGSN for a blocked BVC, a BVC-UNBLOCK-ACK
		 * PDU shall be returned. */
		if (bfp->role_sgsn) {
			/* If a BVC-UNBLOCK PDU is received by an SGSN for
			 * the signalling BVC, the PDU is ignored */
			if (bfp->bvci == 0)
				break;
			bssgp_tx_simple_bvci(BSSGP_PDUT_BVC_UNBLOCK_ACK, bfp->nsei, bfp->bvci, 0);
		}
		break;
	case BSSGP_BVCFSM_E_RX_BLOCK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		LOGPFSML(fi, LOGL_NOTICE, "Rx BVC-BLOCK (cause=%s)\n",
			 bssgp_cause_str(*TLVP_VAL(tp, BSSGP_IE_CAUSE)));
		/* If a BVC-BLOCK PDU is received by an SGSN for the signalling BVC, the PDU is ignored */
		if (bfp->bvci == 0) {
			LOGPFSML(fi, LOGL_ERROR, "Rx BVC-BLOCK on BVCI=0 is illegal\n");
			if (bfp->role_sgsn)
				break;
			_tx_status(fi, BSSGP_CAUSE_SEM_INCORR_PDU, rx);
			break;
		}
		if (!bfp->role_sgsn) {
			LOGPFSML(fi, LOGL_ERROR, "Rx BVC-BLOCK on BSS is illegal\n");
			_tx_status(fi, BSSGP_CAUSE_SEM_INCORR_PDU, rx);
			break;
		}
		/* transmit BVC-BLOCK-ACK, transition to BLOCKED state */
		tx = bssgp2_enc_bvc_block_ack(bfp->bvci);
		fi_tx_sig(fi, tx);
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_BLOCKED, 0, 0);
		break;
	case BSSGP_BVCFSM_E_REQ_BLOCK:
		if (bfp->role_sgsn) {
			LOGPFSML(fi, LOGL_ERROR, "SGSN may not initiate BVC-BLOCK\n");
			break;
		}
		if (bfp->bvci == 0) {
			LOGPFSML(fi, LOGL_ERROR, "BVCI 0 cannot be blocked\n");
			break;
		}
		bfp->locally_blocked = true;
		bfp->block_cause = *(uint8_t *)data;
		/* transmit BVC-BLOCK, transition to BLOCKED state and start re-transmit timer */
		tx = bssgp2_enc_bvc_block(bfp->bvci, bfp->block_cause);
		fi_tx_sig(fi, tx);
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_BLOCKED, T1_SECS, T1);
		break;
	case BSSGP_BVCFSM_E_RX_FC_BVC:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		/* we assume osmo_tlv_prot_* has been used before calling here to ensure this */
		OSMO_ASSERT(bfp->role_sgsn);
		rc = bssgp2_dec_fc_bvc(&rx_fc, tp);
		if (rc < 0) {
			_tx_status(fi, BSSGP_CAUSE_SEM_INCORR_PDU, rx);
			break;
		}
		if (bfp->ops->rx_fc_bvc)
			bfp->ops->rx_fc_bvc(bfp->nsei, bfp->bvci, &rx_fc, bfp->ops_priv);
		tx = bssgp2_enc_fc_bvc_ack(rx_fc.tag);
		fi_tx_ptp(fi, tx);
		break;
	case BSSGP_BVCFSM_E_RX_FC_BVC_ACK:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		/* we assume osmo_tlv_prot_* has been used before calling here to ensure this */
		OSMO_ASSERT(!bfp->role_sgsn);
		break;
	case BSSGP_BVCFSM_E_REQ_FC_BVC:
		tx_fc = data;
		tx = bssgp2_enc_fc_bvc(tx_fc, bfp->features.negotiated & (BSSGP_XFEAT_GBIT << 8) ?
					&bfp->features.fc_granularity : NULL);
		fi_tx_ptp(fi, tx);
		break;
	}
}

static void bssgp_bvc_fsm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	uint8_t cause;
	const struct tlv_parsed *tp = NULL;
	struct msgb *rx = NULL;

	switch (event) {
	case BSSGP_BVCFSM_E_REQ_RESET:
		bfp->locally_blocked = false;
		cause = bfp->last_reset_cause = *(uint8_t *) data;
		_tx_bvc_reset(fi, cause);
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_WAIT_RESET_ACK, T2_SECS, T2);
#if 0 /* not sure if we really should notify the application if itself has requested the reset? */
		if (bfp->ops && bfp->ops->reset_notification)
			bfp->ops->reset_notification(bfp->nsei, bfp->bvci, NULL, 0, cause, bfp->ops_priv);
#endif
		break;
	case BSSGP_BVCFSM_E_RX_RESET:
		rx = data;
		tp = (const struct tlv_parsed *) msgb_bcid(rx);
		cause = *TLVP_VAL(tp, BSSGP_IE_CAUSE);
		if (bfp->role_sgsn && bfp->bvci != 0)
			bfp->cell_id = bssgp_parse_cell_id(&bfp->ra_id, TLVP_VAL(tp, BSSGP_IE_CELL_ID));
		LOGPFSML(fi, LOGL_NOTICE, "Rx BVC-RESET (cause=%s)\n", bssgp_cause_str(cause));
		if (bfp->bvci == 0)
			update_negotiated_features(fi, tp);
		_tx_bvc_reset_ack(fi);
		osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_UNBLOCKED, 0, 0);
		if (bfp->ops && bfp->ops->reset_notification) {
			bfp->ops->reset_notification(bfp->nsei, bfp->bvci, &bfp->ra_id, bfp->cell_id,
						     cause, bfp->ops_priv);
		}
		break;
	}
}

static int bssgp_bvc_fsm_timer_cb(struct osmo_fsm_inst *fi)
{
	struct bvc_fsm_priv *bfp = fi->priv;
	struct msgb *tx;

	switch (fi->T) {
	case T1:
		switch (fi->state) {
		case BSSGP_BVCFSM_S_BLOCKED:
			/* re-transmit BVC-BLOCK */
			tx = bssgp2_enc_bvc_block(bfp->bvci, bfp->block_cause);
			fi_tx_sig(fi, tx);
			osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_BLOCKED, T1_SECS, T1);
			break;
		case BSSGP_BVCFSM_S_UNBLOCKED:
			/* re-transmit BVC-UNBLOCK */
			tx = bssgp2_enc_bvc_unblock(bfp->bvci);
			fi_tx_sig(fi, tx);
			osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_UNBLOCKED, T1_SECS, T1);
			break;
		}
		break;
	case T2:
		switch (fi->state) {
		case BSSGP_BVCFSM_S_WAIT_RESET_ACK:
			/* re-transmit BVC-RESET */
			_tx_bvc_reset(fi, bfp->last_reset_cause);
			osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_WAIT_RESET_ACK, T2_SECS, T2);
			break;
		case BSSGP_BVCFSM_S_UNBLOCKED:
			/* re-transmit BVC-RESET-ACK */
			_tx_bvc_reset_ack(fi);
			osmo_fsm_inst_state_chg(fi, BSSGP_BVCFSM_S_UNBLOCKED, T2_SECS, T2);
			break;
		}
		break;
	default:
		OSMO_ASSERT(0);
		break;
	}
	return 0;
}



static const struct osmo_fsm_state bssgp_bvc_fsm_states[] = {
	[BSSGP_BVCFSM_S_NULL] = {
		/* initial state from which we must do a RESET */
		.name = "NULL",
		.in_event_mask = 0,
		.out_state_mask = S(BSSGP_BVCFSM_S_WAIT_RESET_ACK) |
				  S(BSSGP_BVCFSM_S_UNBLOCKED),
		.action = bssgp_bvc_fsm_null,
	},
	[BSSGP_BVCFSM_S_BLOCKED] = {
		.name = "BLOCKED",
		.in_event_mask = S(BSSGP_BVCFSM_E_RX_UNBLOCK) |
				 S(BSSGP_BVCFSM_E_RX_BLOCK) |
				 S(BSSGP_BVCFSM_E_RX_BLOCK_ACK) |
				 S(BSSGP_BVCFSM_E_REQ_UNBLOCK),
		.out_state_mask = S(BSSGP_BVCFSM_S_WAIT_RESET_ACK) |
				  S(BSSGP_BVCFSM_S_UNBLOCKED) |
				  S(BSSGP_BVCFSM_S_BLOCKED),
		.action = bssgp_bvc_fsm_blocked,
		.onenter = bssgp_bvc_fsm_blocked_onenter,
	},
	[BSSGP_BVCFSM_S_WAIT_RESET_ACK]= {
		.name = "WAIT_RESET_ACK",
		.in_event_mask = S(BSSGP_BVCFSM_E_RX_RESET_ACK),
		.out_state_mask = S(BSSGP_BVCFSM_S_UNBLOCKED) |
				  S(BSSGP_BVCFSM_S_BLOCKED) |
				  S(BSSGP_BVCFSM_S_WAIT_RESET_ACK),
		.action = bssgp_bvc_fsm_wait_reset_ack,
		.onenter = _onenter_tail,
	},

	[BSSGP_BVCFSM_S_UNBLOCKED] = {
		.name = "UNBLOCKED",
		.in_event_mask = S(BSSGP_BVCFSM_E_RX_BLOCK) |
				 S(BSSGP_BVCFSM_E_RX_UNBLOCK) |
				 S(BSSGP_BVCFSM_E_RX_UNBLOCK_ACK) |
				 S(BSSGP_BVCFSM_E_REQ_BLOCK) |
				 S(BSSGP_BVCFSM_E_RX_FC_BVC) |
				 S(BSSGP_BVCFSM_E_RX_FC_BVC_ACK) |
				 S(BSSGP_BVCFSM_E_REQ_FC_BVC),
		.out_state_mask = S(BSSGP_BVCFSM_S_BLOCKED) |
				  S(BSSGP_BVCFSM_S_WAIT_RESET_ACK) |
				  S(BSSGP_BVCFSM_S_UNBLOCKED),
		.action = bssgp_bvc_fsm_unblocked,
		.onenter = _onenter_tail,
	},
};

static struct osmo_fsm bssgp_bvc_fsm = {
	.name = "BSSGP-BVC",
	.states = bssgp_bvc_fsm_states,
	.num_states = ARRAY_SIZE(bssgp_bvc_fsm_states),
	.allstate_event_mask = S(BSSGP_BVCFSM_E_REQ_RESET) |
			       S(BSSGP_BVCFSM_E_RX_RESET),
	.allstate_action = bssgp_bvc_fsm_allstate,
	.timer_cb = bssgp_bvc_fsm_timer_cb,
	.log_subsys = DLBSSGP,
	.event_names = ptp_bvc_event_names,
};

static struct osmo_fsm_inst *
_bvc_fsm_alloc(void *ctx, struct gprs_ns2_inst *nsi, bool role_sgsn, uint16_t nsei, uint16_t bvci)
{
	struct osmo_fsm_inst *fi;
	struct bvc_fsm_priv *bfp;
	char idbuf[64];

	/* TODO: encode our role in the id string? */
	snprintf(idbuf, sizeof(idbuf), "NSE%05u-BVC%05u", nsei, bvci);

	fi = osmo_fsm_inst_alloc(&bssgp_bvc_fsm, ctx, NULL, LOGL_INFO, idbuf);
	if (!fi)
		return NULL;

	bfp = talloc_zero(fi, struct bvc_fsm_priv);
	if (!bfp) {
		osmo_fsm_inst_free(fi);
		return NULL;
	}
	fi->priv = bfp;

	bfp->nsi = nsi;
	bfp->role_sgsn = role_sgsn;
	bfp->nsei = nsei;
	bfp->bvci = bvci;

	return fi;
}

/*! Allocate a SIGNALING-BVC FSM for the BSS role (facing a remote SGSN).
 *  \param[in] ctx talloc context from which to allocate
 *  \param[in] nsi NS Instance on which this BVC operates
 *  \param[in] nsei NS Entity Identifier on which this BVC operates
 *  \param[in] features Feature [byte 0] and Extended Feature [byte 1] bitmap
 *  \returns newly-allocated FSM Instance; NULL in case of error */
struct osmo_fsm_inst *
bssgp_bvc_fsm_alloc_sig_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features)
{
	struct osmo_fsm_inst *fi = _bvc_fsm_alloc(ctx, nsi, false, nsei, 0);
	struct bvc_fsm_priv *bfp;

	if (!fi)
		return NULL;

	bfp = fi->priv;
	bfp->features.advertised = features;

	return fi;
}

/*! Allocate a PTP-BVC FSM for the BSS role (facing a remote SGSN).
 *  \param[in] ctx talloc context from which to allocate
 *  \param[in] nsi NS Instance on which this BVC operates
 *  \param[in] nsei NS Entity Identifier on which this BVC operates
 *  \param[in] bvci BVCI of this FSM
 *  \param[in] ra_id Routing Area Identity of the cell (reported to SGSN)
 *  \param[in] cell_id Cell Identifier of the cell (reported to SGSN)
 *  \returns newly-allocated FSM Instance; NULL in case of error */
struct osmo_fsm_inst *
bssgp_bvc_fsm_alloc_ptp_bss(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei,
			    uint16_t bvci, const struct gprs_ra_id *ra_id, uint16_t cell_id)
{
	struct osmo_fsm_inst *fi;
	struct bvc_fsm_priv *bfp;

	OSMO_ASSERT(bvci >= 2);
	OSMO_ASSERT(ra_id);

	fi = _bvc_fsm_alloc(ctx, nsi, false, nsei, bvci);
	if (!fi)
		return NULL;

	bfp = fi->priv;
	bfp->ra_id = *ra_id;
	bfp->cell_id = cell_id;

	return fi;
}

/*! Allocate a SIGNALING-BVC FSM for the SGSN role (facing a remote BSS).
 *  \param[in] ctx talloc context from which to allocate
 *  \param[in] nsi NS Instance on which this BVC operates
 *  \param[in] nsei NS Entity Identifier on which this BVC operates
 *  \param[in] features Feature [byte 0] and Extended Feature [byte 1] bitmap
 *  \returns newly-allocated FSM Instance; NULL in case of error */
struct osmo_fsm_inst *
bssgp_bvc_fsm_alloc_sig_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint32_t features)
{
	struct osmo_fsm_inst *fi = _bvc_fsm_alloc(ctx, nsi, true, nsei, 0);
	struct bvc_fsm_priv *bfp;

	if (!fi)
		return NULL;

	bfp = fi->priv;
	bfp->features.advertised = features;

	return fi;
}

/*! Allocate a PTP-BVC FSM for the SGSN role (facing a remote BSS).
 *  \param[in] ctx talloc context from which to allocate
 *  \param[in] nsi NS Instance on which this BVC operates
 *  \param[in] nsei NS Entity Identifier on which this BVC operates
 *  \param[in] bvci BVCI of this FSM
 *  \returns newly-allocated FSM Instance; NULL in case of error */
struct osmo_fsm_inst *
bssgp_bvc_fsm_alloc_ptp_sgsn(void *ctx, struct gprs_ns2_inst *nsi, uint16_t nsei, uint16_t bvci)
{
	struct osmo_fsm_inst *fi;

	OSMO_ASSERT(bvci >= 2);

	fi = _bvc_fsm_alloc(ctx, nsi, true, nsei, bvci);
	if (!fi)
		return NULL;

	return fi;
}

/*! Set the 'operations' callbacks + private data.
 *  \param[in] fi FSM instance for which the data shall be set
 *  \param[in] ops BSSGP BVC FSM operations (call-back functions) to register
 *  \param[in] ops_priv opaque/private data pointer passed through to call-backs */
void bssgp_bvc_fsm_set_ops(struct osmo_fsm_inst *fi, const struct bssgp_bvc_fsm_ops *ops, void *ops_priv)
{
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);

	bfp->ops = ops;
	bfp->ops_priv = ops_priv;
}

/*! Return if the given BVC FSM is in UNBLOCKED state. */
bool bssgp_bvc_fsm_is_unblocked(struct osmo_fsm_inst *fi)
{
	return fi->state == BSSGP_BVCFSM_S_UNBLOCKED;
}

/*! Determine the cause value why given BVC FSM is blocked. */
uint8_t bssgp_bvc_fsm_get_block_cause(struct osmo_fsm_inst *fi)
{
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);
	return bfp->block_cause;
}

/*! Return the advertised features / extended features. */
uint32_t bssgp_bvc_get_features_advertised(struct osmo_fsm_inst *fi)
{
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);
	return bfp->features.advertised;
}

/*! Return the received features / extended features. */
uint32_t bssgp_bvc_get_features_received(struct osmo_fsm_inst *fi)
{
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);
	return bfp->features.received;
}

/*! Return the negotiated features / extended features. */
uint32_t bssgp_bvc_get_features_negotiated(struct osmo_fsm_inst *fi)
{
	struct bvc_fsm_priv *bfp = fi->priv;

	OSMO_ASSERT(fi->fsm == &bssgp_bvc_fsm);
	return bfp->features.negotiated;
}

static __attribute__((constructor)) void on_dso_load_bvc_fsm(void)
{
	OSMO_ASSERT(osmo_fsm_register(&bssgp_bvc_fsm) == 0);
}
