/*
 * (C) 2013-2016 by Harald Welte <laforge@gnumonks.org>
 *
 * 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 <osmocom/core/utils.h>

#include "protocol/diag_log_gprs_mac.h"

struct value_string gprs_mac_mode_vals[] = {
	{ NULL_MODE,	"NULL" },
	{ IDLE_MODE,	"IDLE" },
	{ TRANSFER_MODE, "TRANSFER" },
	{ 0, NULL }
};

struct value_string gprs_mac_null_substate_vals[] = {
	{ NULL_INACTIVE, 		"INACTIVE" },
	{ NULL_GPRS_51_ACTIVE,		"GPRS_51_ACTIVE" },
	{ NULL_SUSPENDED,		"SUSPENDED" },
	{ NULL_SUSPEND_RESEL,		"SUSPEND_RESEL" },
	{ NULL_UPLINK_TBF_ESTAB,	"UL_TBF_EST" },
	{ NULL_UPLINK_SB_ESTAB,		"UL_SB_EST" },
	{ NULL_DOWNLINK_SB_ESTAB,	"DL_SB_EST" },
	{ NULL_UPLINK_TBF_ACCESS,	"UL_TBF_ACCESS" },
	{ NULL_DL_TBF_EST,		"DL_TBF_EST" },
	{ NULL_DTM_CONNECT_PENDING,	"DTM_CONN_PEND" },
	{ NULL_DTM_GTTP_UL_CON,		"DTM_GTTP_UL_ON" },
	{ NULL_RESET,			"RESET" },
	{ 0, NULL }
};

struct value_string gprs_mac_idle_substate_vals[] = {
	{ IDLE_PASSIVE,			"PASSIVE" },
	{ IDLE_UL_PACKET_ACCESS,	"PACKET_ACCESS" },
	{ IDLE_UL_ACCESS_QUEUED,	"ACCESS_QUEUED" },
	{ IDLE_UL_ACCESS_REJECT,	"ACCESS_REJECT" },
	{ IDLE_UL_1PHASE_ASS,		"1PHASE_ASS" },
	{ IDLE_UL_2PHASE_ASS,		"2PHASE_ASS" },
	{ IDLE_UL_1PHASE_CONT_RES,	"1PHASE_CONT_RES" },
	{ IDLE_DL_ASS,			"DL_ASS" },
	{ 0, NULL }
};

struct value_string gprs_mac_transfer_substate_vals[] = {
	{ TRANSFER_INACTIVE,		"INACTIVE" },
	{ TRANSFER_DL,			"DL" },
	{ TRANSFER_DL_REASSIGN,		"DL_REASSIGN" },
	{ TRANSFER_DL_WITH_DYNAMIC_ALLOC, "DL_WITH_DYNAMIC_ALLOC" },
	{ TRANSFER_DL_REASSIGN_DYNAMIC_ALLOC, "DL_REASSIGN_DYNAMIC_ALLOC" },
	{ TRANSFER_UL_DYNAMIC,		"UL_DYNAMIC" },
	{ TRANSFER_UL_DYNAMIC_REALLOC,	"UL_DYNAMIC_REALLOC" },
	{ TRANSFER_UL_DYNAMIC_DL_ASSIGN, "UL_DYNAMIC_DL_ASSIGN" },
	{ TRANSFER_UL_DYNAMIC_REALLOC_DL_ASSIGN, "UL_DYNAMIC_REALLOC_DL_ASSIGN" },
	{ TRANSFER_CONCURRENT_DYNAMIC_TRANSFER, "CONCURRENT_DYNAMIC_TRANSFER" },
	{ TRANSFER_CONCURRENT_DYNAMIC_DL_REASSIGN, "CONCURRENT_DYNAMIC_DL_REASSIGN" },
	{ TRANSFER_CONCURRENT_DYNAMIC_REALLOC,	"CONCURRENT_DYNAMIC_REALLOC" },
	{ TRANSFER_CONCURRENT_DL_REASSIGN_DYNAMIC_REALLOC, "CONCURRENT_DL_REASSIGN_DYNAMIC_REALLOC" },
	{ 0, NULL }
};

struct value_string gprs_mac_chan_type_vals[] = {
	{ PRACH_11BIT_CHANNEL,	"PRACH_11BIT_CHANNEL" },
	{ PRACH_8BIT_CHANNEL,	"PRACH_8BIT_CHANNEL" },
	{ PACCH_RRBP_CHANNEL,	"PACCH_RRBP_CHANNEL" },
	{ UL_PACCH_CHANNEL, 	"UL_PACCH_CHANNEL" },
	{ PCCCH_CHANNEL,	"PCCCH_CHANNEL" },
	{ PBCCH_CHANNEL,	"PBCCH_CHANNEL" },
	{ DL_PACCH_CHANNEL,	"DL_PACCH_CHANNEL" },
	{ 0, NULL }
};

struct value_string gprs_mac_msg_type_vals[] = {
	{ PACKET_CELL_CHANGE_FAILURE,		"PACKET_CELL_CHANGE_FAILURE" },
	{ PACKET_CONTROL_ACKNOWLEDGE,		"PACKET_CONTROL_ACKNOWLEDGE" },
	{ PACKET_DOWNLINK_ACK_NACK,		"PACKET_DOWNLINK_ACK_NACK" },
	{ PACKET_UPLK_DUMMY_CNTRL_BLK,		"PACKET_UPLK_DUMMY_CNTRL_BLK" },
	{ PACKET_MEASUREMENT_REPORT,		"PACKET_MEASUREMENT_REPORT" },
	{ PACKET_RESOURCE_REQUEST,		"PACKET_RESOURCE_REQUEST" },
	{ PACKET_MOBILE_TBF_STATUS,		"PACKET_MOBILE_TBF_STATUS" },
	{ PACKET_PSI_STATUS,			"PACKET_PSI_STATUS" },
	{ EGPRS_PACKET_DOWNLINK_ACK_NACK,	"EGPRS_PACKET_DOWNLINK_ACK_NACK" },
	{ PACKET_PAUSE,				"PACKET_PAUSE" },
	{ PACKET_ENHANCED_MEASUREMENT_REPORT,	"PACKET_ENHANCED_MEASUREMENT_REPORT" },
	{ ADDITIONAL_MS_RAC,			"ADDITIONAL_MS_RAC" },
	{ PACKET_CELL_CHANGE_NOTIFICATION,	"PACKET_CELL_CHANGE_NOTIFICATION" },
	{ PACKET_SI_STATUS,			"PACKET_SI_STATUS" },
	{ PACKET_CS_REQUEST,			"PACKET_CS_REQUEST" },
	{ PACKET_CHANNEL_REQUEST,		"PACKET_CHANNEL_REQUEST" },
	{ 0, NULL }
};
