/* Code to manage a subscriber's MSC-I role */
/*
 * (C) 2019 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
 * All Rights Reserved
 *
 * SPDX-License-Identifier: AGPL-3.0+
 *
 * Author: Neels Hofmeyr
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation; either version 3 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <osmocom/msc/gsm_data.h>
#include <osmocom/msc/msc_i.h>
#include <osmocom/msc/ran_msg.h>
#include <osmocom/msc/ran_conn.h>
#include <osmocom/msc/ran_peer.h>
#include <osmocom/msc/sccp_ran.h>
#include <osmocom/msc/msub.h>
#include <osmocom/msc/msc_a.h>
#include <osmocom/msc/call_leg.h>
#include <osmocom/msc/mncc_call.h>

static struct osmo_fsm msc_i_fsm;

struct ran_infra *msc_i_ran(struct msc_i *msc_i)
{
	OSMO_ASSERT(msc_i
		    && msc_i->ran_conn
		    && msc_i->ran_conn->ran_peer
		    && msc_i->ran_conn->ran_peer->sri
		    && msc_i->ran_conn->ran_peer->sri->ran);
	return msc_i->ran_conn->ran_peer->sri->ran;
}

static int msc_i_ran_enc(struct msc_i *msc_i, const struct ran_msg *ran_enc_msg)
{
	struct msgb *l3 = msc_role_ran_encode(msc_i->c.fi, ran_enc_msg);
	if (!l3)
		return -EIO;
	return msc_i_down_l2(msc_i, l3);
}

struct msc_i *msc_i_priv(struct osmo_fsm_inst *fi)
{
	OSMO_ASSERT(fi);
	OSMO_ASSERT(fi->fsm == &msc_i_fsm);
	OSMO_ASSERT(fi->priv);
	return fi->priv;
}

int msc_i_ready_decode_cb(struct osmo_fsm_inst *msc_i_fi, void *data, const struct ran_msg *msg)
{
	struct msc_i *msc_i = msc_i_priv(msc_i_fi);
	struct msc_a *msc_a = msub_msc_a(msc_i->c.msub);
	const struct an_apdu *an_apdu = data;
	uint32_t event;

	event = MSC_A_EV_FROM_I_PROCESS_ACCESS_SIGNALLING_REQUEST;

	switch (msg->msg_type) {
	case RAN_MSG_HANDOVER_REQUIRED:
		if (msc_a->c.remote_to) {
			/* We're already a remote MSC-B, this hence must be a "subsequent" handover.
			 * There is not much difference really from dispatching a Process Access Signalling Request,
			 * only that 3GPP TS 29.010 specifies the different message type. */
			event = MSC_A_EV_FROM_I_PREPARE_SUBSEQUENT_HANDOVER_REQUEST;
		}
		break;
	default:
		break;
	}

	return msub_role_dispatch(msc_i->c.msub, MSC_ROLE_A, event, an_apdu);
}

void msc_i_fsm_ready(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
	struct msc_i *msc_i = msc_i_priv(fi);
	struct msc_a *msc_a = msub_msc_a(msc_i->c.msub);
	struct an_apdu *an_apdu;

	if (!msc_a) {
		LOG_MSC_I(msc_i, LOGL_ERROR, "No MSC-A role\n");
		return;
	}

	switch (event) {

	case MSC_EV_FROM_RAN_COMPLETE_LAYER_3:
		an_apdu = data;
		msub_role_dispatch(msc_i->c.msub, MSC_ROLE_A, MSC_A_EV_FROM_I_COMPLETE_LAYER_3, an_apdu);
		break;

	case MSC_EV_FROM_RAN_UP_L2:
		an_apdu = data;
		/* To send the correct event types like MSC_A_EV_FROM_I_PREPARE_SUBSEQUENT_HANDOVER_REQUEST and hence
		 * reflect the correct GSUP message type on an inter-MSC link, need to decode the message here. */
		msc_role_ran_decode(msc_i->c.fi, an_apdu, msc_i_ready_decode_cb, an_apdu);
		break;

	case MSC_EV_FROM_RAN_CONN_RELEASED:
		msc_i_cleared(msc_i);
		break;

	case MSC_EV_CALL_LEG_TERM:
		msc_i->inter_msc.call_leg = NULL;
		if (msc_i->inter_msc.mncc_forwarding_to_remote_cn)
			msc_i->inter_msc.mncc_forwarding_to_remote_cn->rtps = NULL;
		break;

	case MSC_MNCC_EV_CALL_ENDED:
		msc_i->inter_msc.mncc_forwarding_to_remote_cn = NULL;
		break;

	case MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST:
	case MSC_I_EV_FROM_A_PREPARE_SUBSEQUENT_HANDOVER_RESULT:
	case MSC_I_EV_FROM_A_PREPARE_SUBSEQUENT_HANDOVER_ERROR:
		an_apdu = data;
		if (an_apdu->an_proto != msc_i_ran(msc_i)->an_proto) {
			LOG_MSC_I(msc_i, LOGL_ERROR, "Mismatching AN-APDU proto: %s -- Dropping message\n",
				  an_proto_name(an_apdu->an_proto));
			msgb_free(an_apdu->msg);
			an_apdu->msg = NULL;
			return;
		}
		msc_i_down_l2(msc_i, an_apdu->msg);
		break;

	case MSC_I_EV_FROM_A_SEND_END_SIGNAL_RESPONSE:
		msc_i_clear(msc_i);
		break;

	default:
		OSMO_ASSERT(false);
	}
}

void msc_i_fsm_clearing_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
{
	struct msc_i *msc_i = msc_i_priv(fi);
	struct ran_msg msg = {
		.msg_type = RAN_MSG_CLEAR_COMMAND,
		/* Concerning CSFB (Circuit-Switched FallBack from LTE), for a final Clear Command that might indicate
		 * CSFB, the MSC-A has to send the Clear Command. This Clear Command is about detaching an MSC-I when a
		 * new MSC-I has shown up after an inter-BSC or inter-MSC Handover succeeded. So never CSFB here. */
	};
	msc_i_ran_enc(msc_i, &msg);
}

int msc_i_clearing_decode_cb(struct osmo_fsm_inst *msc_i_fi, void *data, const struct ran_msg *msg)
{
	struct msc_i *msc_i = msc_i_fi->priv;

	switch (msg->msg_type) {

	case RAN_MSG_CLEAR_COMPLETE:
		switch (msc_i->c.fi->state) {
		case MSC_I_ST_CLEARING:
			osmo_fsm_inst_state_chg(msc_i->c.fi, MSC_I_ST_CLEARED, 0, 0);
			return 0;
		case MSC_I_ST_CLEARED:
			return 0;
		default:
			LOG_MSC_I(msc_i, LOGL_ERROR, "Received Clear Complete, but did not send Clear Command\n");
			{
				struct msc_a *msc_a = msub_msc_a(msc_i->c.msub);
				if (msc_a)
					osmo_fsm_inst_dispatch(msc_a->c.fi, MSC_A_EV_MO_CLOSE, NULL);
			}
			return 0;
		}

	default:
		LOG_MSC_I(msc_i, LOGL_ERROR, "Message not handled: %s\n", ran_msg_type_name(msg->msg_type));
		return -ENOTSUP;
	}
}

void msc_i_fsm_clearing(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
	struct msc_i *msc_i = msc_i_priv(fi);
	struct an_apdu *an_apdu;

	/* We expect a Clear Complete and nothing else. */
	switch (event) {
	case MSC_EV_FROM_RAN_UP_L2:
		an_apdu = data;
		msc_role_ran_decode(msc_i->c.fi, an_apdu, msc_i_clearing_decode_cb, NULL);
		return;

	case MSC_EV_FROM_RAN_CONN_RELEASED:
		msc_i_cleared(msc_i);
		return;

	case MSC_EV_CALL_LEG_TERM:
		msc_i->inter_msc.call_leg = NULL;
		if (msc_i->inter_msc.mncc_forwarding_to_remote_cn)
			msc_i->inter_msc.mncc_forwarding_to_remote_cn->rtps = NULL;
		break;

	case MSC_MNCC_EV_CALL_ENDED:
		msc_i->inter_msc.mncc_forwarding_to_remote_cn = NULL;
		break;
	}
}

void msc_i_fsm_cleared_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
{
	osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REGULAR, fi);
}

void msc_i_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)
{
	struct msc_i *msc_i = msc_i_priv(fi);

	call_leg_release(msc_i->inter_msc.call_leg);
	mncc_call_release(msc_i->inter_msc.mncc_forwarding_to_remote_cn);

	if (msc_i->ran_conn)
		ran_conn_msc_role_gone(msc_i->ran_conn, msc_i->c.fi);
}

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

static const struct osmo_fsm_state msc_i_fsm_states[] = {
	[MSC_I_ST_READY] = {
		.name = "READY",
		.action = msc_i_fsm_ready,
		.in_event_mask = 0
			| S(MSC_EV_FROM_RAN_COMPLETE_LAYER_3)
			| S(MSC_EV_FROM_RAN_UP_L2)
			| S(MSC_EV_FROM_RAN_CONN_RELEASED)
			| S(MSC_EV_CALL_LEG_TERM)
			| S(MSC_MNCC_EV_CALL_ENDED)
			| S(MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST)
			| S(MSC_I_EV_FROM_A_PREPARE_SUBSEQUENT_HANDOVER_RESULT)
			| S(MSC_I_EV_FROM_A_PREPARE_SUBSEQUENT_HANDOVER_ERROR)
			| S(MSC_I_EV_FROM_A_SEND_END_SIGNAL_RESPONSE)
			,
		.out_state_mask = 0
			| S(MSC_I_ST_CLEARING)
			| S(MSC_I_ST_CLEARED)
			,
	},
	[MSC_I_ST_CLEARING] = {
		.name = "CLEARING",
		.onenter = msc_i_fsm_clearing_onenter,
		.action = msc_i_fsm_clearing,
		.in_event_mask = 0
			| S(MSC_EV_FROM_RAN_UP_L2)
			| S(MSC_EV_FROM_RAN_CONN_RELEASED)
			| S(MSC_EV_CALL_LEG_TERM)
			| S(MSC_MNCC_EV_CALL_ENDED)
			,
		.out_state_mask = 0
			| S(MSC_I_ST_CLEARED)
			,
	},
	[MSC_I_ST_CLEARED] = {
		.name = "CLEARED",
		.onenter = msc_i_fsm_cleared_onenter,
	},
};

const struct value_string msc_i_fsm_event_names[] = {
	OSMO_VALUE_STRING(MSC_REMOTE_EV_RX_GSUP),
	OSMO_VALUE_STRING(MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE),
	OSMO_VALUE_STRING(MSC_EV_CALL_LEG_RTP_COMPLETE),
	OSMO_VALUE_STRING(MSC_EV_CALL_LEG_TERM),
	OSMO_VALUE_STRING(MSC_MNCC_EV_NEED_LOCAL_RTP),
	OSMO_VALUE_STRING(MSC_MNCC_EV_CALL_PROCEEDING),
	OSMO_VALUE_STRING(MSC_MNCC_EV_CALL_COMPLETE),
	OSMO_VALUE_STRING(MSC_MNCC_EV_CALL_ENDED),

	OSMO_VALUE_STRING(MSC_EV_FROM_RAN_COMPLETE_LAYER_3),
	OSMO_VALUE_STRING(MSC_EV_FROM_RAN_UP_L2),
	OSMO_VALUE_STRING(MSC_EV_FROM_RAN_CONN_RELEASED),

	OSMO_VALUE_STRING(MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST),
	OSMO_VALUE_STRING(MSC_I_EV_FROM_A_PREPARE_SUBSEQUENT_HANDOVER_RESULT),
	OSMO_VALUE_STRING(MSC_I_EV_FROM_A_PREPARE_SUBSEQUENT_HANDOVER_ERROR),
	OSMO_VALUE_STRING(MSC_I_EV_FROM_A_SEND_END_SIGNAL_RESPONSE),
	{}
};

static struct osmo_fsm msc_i_fsm = {
	.name = "msc_i",
	.states = msc_i_fsm_states,
	.num_states = ARRAY_SIZE(msc_i_fsm_states),
	.log_subsys = DMSC,
	.event_names = msc_i_fsm_event_names,
	.cleanup = msc_i_fsm_cleanup,
};

static __attribute__((constructor)) void msc_i_fsm_init(void)
{
	OSMO_ASSERT(osmo_fsm_register(&msc_i_fsm) == 0);
}

/* Send connection-oriented L3 message to RAN peer (MSC->[BSC|RNC]) */
int msc_i_down_l2(struct msc_i *msc_i, struct msgb *l3)
{
	int rc;
	if (!msc_i->ran_conn) {
		LOG_MSC_I(msc_i, LOGL_ERROR, "Cannot Tx L2 message: no RAN conn\n");
		return -EIO;
	}

	rc = ran_conn_down_l2_co(msc_i->ran_conn, l3, false);
	if (rc)
		LOG_MSC_I(msc_i, LOGL_ERROR, "Failed to transfer message down to subscriber (rc=%d)\n", rc);
	return rc;
}

struct gsm_network *msc_i_net(const struct msc_i *msc_i)
{
	return msub_net(msc_i->c.msub);
}

struct vlr_subscr *msc_i_vsub(const struct msc_i *msc_i)
{
	if (!msc_i)
		return NULL;
	return msub_vsub(msc_i->c.msub);
}

struct msc_i *msc_i_alloc(struct msub *msub, struct ran_infra *ran)
{
	return msub_role_alloc(msub, MSC_ROLE_I, &msc_i_fsm, struct msc_i, ran);
}

/* Send Clear Command and wait for Clear Complete autonomously. "Normally", the MSC-A handles Clear Command and receives
 * Clear Complete, and then terminates MSC-I directly. This is useful to replace an MSC-I with another MSC-I during
 * Handover. */
void msc_i_clear(struct msc_i *msc_i)
{
	if (!msc_i)
		return;
	/* sanity timeout */
	osmo_fsm_inst_state_chg(msc_i->c.fi, MSC_I_ST_CLEARING, 60, 0);
}

void msc_i_cleared(struct msc_i *msc_i)
{
	if (!msc_i)
		return;
	osmo_fsm_inst_state_chg(msc_i->c.fi, MSC_I_ST_CLEARED, 0, 0);
}

void msc_i_set_ran_conn(struct msc_i *msc_i, struct ran_conn *new_conn)
{
	struct ran_conn *old_conn = msc_i->ran_conn;

	if (old_conn == new_conn)
		return;

	msc_i->ran_conn = NULL;
	if (old_conn) {
		old_conn->msc_role = NULL;
		ran_conn_close(old_conn);
	}

	/* Taking a conn over from another MSC role? Make sure the other side forgets about it. */
	if (new_conn->msc_role)
		msc_role_forget_conn(new_conn->msc_role, new_conn);

	msc_i->ran_conn = new_conn;
	msc_i->ran_conn->msc_role = msc_i->c.fi;

	/* Add the RAN conn info to the msub logging */
	msub_update_id(msc_i->c.msub);
}
