blob: 2556b128d0238d7ac7e0c87c1b9fafad58f57245 [file] [log] [blame]
/* Group Call Control (GCC) is an ETSI/3GPP standard protocol used between
* MS (Mobile Station) and MSC (Mobile Switchting Center) in 2G/GSM-R network.
* It is specified in 3GPP TS 44.068.
*
* (C) 2023 by Sysmocom s.f.m.c. GmbH
* All Rights Reserved
*
* Author: Andreas Eversberg
*
* 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/>.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <stddef.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/gsm/protocol/gsm_44_068.h>
/***********************************************************************
* Protocol Definitions
***********************************************************************/
const struct value_string osmo_gsm44068_msg_type_names[] = {
{ OSMO_GSM44068_MSGT_IMMEDIATE_SETUP, "IMMEDIATE SETUP" },
{ OSMO_GSM44068_MSGT_SETUP, "SETUP" },
{ OSMO_GSM44068_MSGT_CONNECT, "CONNECT" },
{ OSMO_GSM44068_MSGT_TERMINATION, "TERMINATION" },
{ OSMO_GSM44068_MSGT_TERMINATION_REQUEST, "TERMINATION REQUEST" },
{ OSMO_GSM44068_MSGT_TERMINATION_REJECT, "TERMINATION REJECT" },
{ OSMO_GSM44068_MSGT_STATUS, "STATUS" },
{ OSMO_GSM44068_MSGT_GET_STATUS, "GET STATUS" },
{ OSMO_GSM44068_MSGT_SET_PARAMETER, "SET PARAMETER" },
{ OSMO_GSM44068_MSGT_IMMEDIATE_SETUP_2, "IMMEDIATE SETUP 2" },
{ 0, NULL }
};
const struct value_string osmo_gsm44068_priority_level_names[] = {
{ OSMO_GSM44068_PRIO_LEVEL_4, "priority level 4" },
{ OSMO_GSM44068_PRIO_LEVEL_3, "priority level 3" },
{ OSMO_GSM44068_PRIO_LEVEL_2, "priority level 2" },
{ OSMO_GSM44068_PRIO_LEVEL_1, "priority level 1" },
{ OSMO_GSM44068_PRIO_LEVEL_0, "priority level 0" },
{ OSMO_GSM44068_PRIO_LEVEL_B, "priority level B" },
{ OSMO_GSM44068_PRIO_LEVEL_A, "priority level A" },
{ 0, NULL }
};
const struct value_string osmo_gsm44068_cause_names[] = {
{ OSMO_GSM44068_CAUSE_ILLEGAL_MS, "Illegal MS" },
{ OSMO_GSM44068_CAUSE_IMEI_NOT_ACCEPTED, "IMEI not accepted" },
{ OSMO_GSM44068_CAUSE_ILLEGAL_ME, "Illegal ME" },
{ OSMO_GSM44068_CAUSE_SERVICE_NOT_AUTHORIZED, "Service not authorized" },
{ OSMO_GSM44068_CAUSE_APP_NOT_SUPPORTED_ON_PROTO, "Application not supported on the protocol" },
{ OSMO_GSM44068_CAUSE_RR_CONNECTION_ABORTED, "RR connection aborted" },
{ OSMO_GSM44068_CAUSE_NORMAL_CALL_CLEARING, "Normal call clearing" },
{ OSMO_GSM44068_CAUSE_NETWORK_FAILURE, "Network failure" },
{ OSMO_GSM44068_CAUSE_BUSY, "Busy" },
{ OSMO_GSM44068_CAUSE_CONGESTION, "Congestion" },
{ OSMO_GSM44068_CAUSE_USER_NOT_ORIGINATOR, "User not originator of call" },
{ OSMO_GSM44068_CAUSE_NET_WANTS_TO_MAINTAIN_CALL, "Network wants to maintain call" },
{ OSMO_GSM44068_CAUSE_RESPONSE_TO_GET_STATUS, "Response to GET STATUS" },
{ OSMO_GSM44068_CAUSE_SERVICE_OPTION_NOT_SUBSCR, "Service option not supported" },
{ OSMO_GSM44068_CAUSE_REQUESTED_SERVICE_NOT_SUB, "Requested service option not subscribed" },
{ OSMO_GSM44068_CAUSE_SERVICE_OPTION_OOO, "Service option temporarily out of order" },
{ OSMO_GSM44068_CAUSE_CALL_CANNOT_BE_IDENTIFIED, "Call cannot be identified" },
{ OSMO_GSM44068_CAUSE_RETRY_UPON_ENTRY_NEW_CALL, "retry upon entry into a new cell" },
{ OSMO_GSM44068_CAUSE_INVALID_TRANSACTION_ID, "Invalid transaction identifier value" },
{ OSMO_GSM44068_CAUSE_SEMANTICALLY_INCORRECT_MSG, "Semantically incorrect message" },
{ OSMO_GSM44068_CAUSE_INVALID_MANDATORY_INFO, "Invalid mandatory information" },
{ OSMO_GSM44068_CAUSE_MESSAGE_TYPE_NON_EXISTENT, "Message type non-existent or not implemented" },
{ OSMO_GSM44068_CAUSE_MESSAGE_TYPE_NOT_COMPAT, "Message type not compatible with the protocol state" },
{ OSMO_GSM44068_CAUSE_IE_NON_EXISTENT, "Information element non-existent or not implemented" },
{ OSMO_GSM44068_CAUSE_IE_NOT_COMPAT, "Message type not compatible with the protocol state" },
{ OSMO_GSM44068_CAUSE_PROTOCOL_ERROR, "Protocol error, unspecified" },
{ 0, NULL }
};
const struct value_string osmo_gsm44068_call_state_names[] = {
{ OSMO_GSM44068_CSTATE_U0, "U0" },
{ OSMO_GSM44068_CSTATE_U1, "U1" },
{ OSMO_GSM44068_CSTATE_U2sl_U2, "U2sl/U2" },
{ OSMO_GSM44068_CSTATE_U3, "U3" },
{ OSMO_GSM44068_CSTATE_U4, "U4" },
{ OSMO_GSM44068_CSTATE_U5, "U5" },
{ OSMO_GSM44068_CSTATE_U0p, "U0.p" },
{ OSMO_GSM44068_CSTATE_U2wr_U6, "U2wr/U6" },
{ OSMO_GSM44068_CSTATE_U2r, "U2r" },
{ OSMO_GSM44068_CSTATE_U2ws, "U2ws" },
{ OSMO_GSM44068_CSTATE_U2sr, "U2sr" },
{ OSMO_GSM44068_CSTATE_U2nc, "U2nc" },
{ 0, NULL }
};
const struct value_string osmo_gsm44068_talker_priority_names[] = {
{ OSMO_GSM44068_PRIO_NORMAL, "Normal" },
{ OSMO_GSM44068_PRIO_PRIVILEGED, "Privileged" },
{ OSMO_GSM44068_PRIO_EMERGENCY, "Emergency" },
{ 0, NULL }
};
const struct tlv_definition osmo_gsm44068_att_tlvdef = {
.def = {
[OSMO_GSM44068_IEI_MOBILE_IDENTITY] = { TLV_TYPE_TLV },
[OSMO_GSM44068_IEI_USER_USER] = { TLV_TYPE_TLV },
[OSMO_GSM44068_IEI_CALL_STATE] = { TLV_TYPE_SINGLE_TV },
[OSMO_GSM44068_IEI_STATE_ATTRIBUTES] = { TLV_TYPE_SINGLE_TV },
[OSMO_GSM44068_IEI_TALKER_PRIORITY] = { TLV_TYPE_SINGLE_TV },
[OSMO_GSM44068_IEI_SMS_INDICATIONS] = { TLV_TYPE_SINGLE_TV },
},
};