/*
 * FST module implementation
 * Copyright (c) 2014, Qualcomm Atheros, Inc.
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

#include "utils/includes.h"
#include "utils/common.h"
#include "common/defs.h"
#include "fst_ctrl_defs.h"
#include "fst_ctrl_aux.h"


static const char *session_event_names[] = {
	[EVENT_FST_ESTABLISHED] FST_PVAL_EVT_TYPE_ESTABLISHED,
	[EVENT_FST_SETUP] FST_PVAL_EVT_TYPE_SETUP,
	[EVENT_FST_SESSION_STATE_CHANGED] FST_PVAL_EVT_TYPE_SESSION_STATE,
};

static const char *reason_names[] = {
	[REASON_TEARDOWN] FST_CS_PVAL_REASON_TEARDOWN,
	[REASON_SETUP] FST_CS_PVAL_REASON_SETUP,
	[REASON_SWITCH] FST_CS_PVAL_REASON_SWITCH,
	[REASON_STT] FST_CS_PVAL_REASON_STT,
	[REASON_REJECT] FST_CS_PVAL_REASON_REJECT,
	[REASON_ERROR_PARAMS] FST_CS_PVAL_REASON_ERROR_PARAMS,
	[REASON_RESET] FST_CS_PVAL_REASON_RESET,
	[REASON_DETACH_IFACE] FST_CS_PVAL_REASON_DETACH_IFACE,
};

static const char *session_state_names[] = {
	[FST_SESSION_STATE_INITIAL] FST_CS_PVAL_STATE_INITIAL,
	[FST_SESSION_STATE_SETUP_COMPLETION] FST_CS_PVAL_STATE_SETUP_COMPLETION,
	[FST_SESSION_STATE_TRANSITION_DONE] FST_CS_PVAL_STATE_TRANSITION_DONE,
	[FST_SESSION_STATE_TRANSITION_CONFIRMED]
	FST_CS_PVAL_STATE_TRANSITION_CONFIRMED,
};


/* helpers */
const char * fst_get_str_name(unsigned index, const char *names[],
			      size_t names_size)
{
	if (index >= names_size || !names[index])
		return FST_NAME_UNKNOWN;
	return names[index];
}


const char * fst_session_event_type_name(enum fst_event_type event)
{
	return fst_get_str_name(event, session_event_names,
				ARRAY_SIZE(session_event_names));
}


const char * fst_reason_name(enum fst_reason reason)
{
	return fst_get_str_name(reason, reason_names, ARRAY_SIZE(reason_names));
}


const char * fst_session_state_name(enum fst_session_state state)
{
	return fst_get_str_name(state, session_state_names,
				ARRAY_SIZE(session_state_names));
}
