aboutsummaryrefslogtreecommitdiffstats
path: root/include/osmocom/gsm/protocol/gsm_44_068.h
blob: 3a33c1631c486570643bd4b3969493dfcef4b034 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#pragma once
#include <stdint.h>
#include <osmocom/core/utils.h>

/* 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+
 */

/* 9 Information Element Identifiers */
enum osmo_gsm44068_iei {
	OSMO_GSM44068_IEI_MOBILE_IDENTITY		= 0x17,
	OSMO_GSM44068_IEI_USER_USER			= 0x7E,
	OSMO_GSM44068_IEI_CALL_STATE			= 0xA0,
	OSMO_GSM44068_IEI_STATE_ATTRIBUTES		= 0xB0,
	OSMO_GSM44068_IEI_TALKER_PRIORITY		= 0xC0,
	OSMO_GSM44068_IEI_SMS_INDICATIONS		= 0xD0,
};

/* 9.3 Message Type */
enum osmo_gsm44068_msg_type {
	OSMO_GSM44068_MSGT_IMMEDIATE_SETUP		= 0x31,
	OSMO_GSM44068_MSGT_SETUP			= 0x32,
	OSMO_GSM44068_MSGT_CONNECT			= 0x33,
	OSMO_GSM44068_MSGT_TERMINATION			= 0x34,
	OSMO_GSM44068_MSGT_TERMINATION_REQUEST		= 0x35,
	OSMO_GSM44068_MSGT_TERMINATION_REJECT		= 0x36,
	OSMO_GSM44068_MSGT_STATUS			= 0x38,
	OSMO_GSM44068_MSGT_GET_STATUS			= 0x39,
	OSMO_GSM44068_MSGT_SET_PARAMETER		= 0x3a,
	OSMO_GSM44068_MSGT_IMMEDIATE_SETUP_2		= 0x3b,
};

/* Table 9.2 priority */
enum osmo_gsm44068_priority_level {
	OSMO_GSM44068_PRIO_LEVEL_4			= 0x1,
	OSMO_GSM44068_PRIO_LEVEL_3			= 0x2,
	OSMO_GSM44068_PRIO_LEVEL_2			= 0x3,
	OSMO_GSM44068_PRIO_LEVEL_1			= 0x4,
	OSMO_GSM44068_PRIO_LEVEL_0			= 0x5,
	OSMO_GSM44068_PRIO_LEVEL_B			= 0x6,
	OSMO_GSM44068_PRIO_LEVEL_A			= 0x7,
};

/* 9.4.2 Call State */
enum osmo_gsm44068_call_state {
	OSMO_GSM44068_CSTATE_U0				= 0x0,
	OSMO_GSM44068_CSTATE_U1				= 0x1,
	OSMO_GSM44068_CSTATE_U2sl_U2			= 0x2,
	OSMO_GSM44068_CSTATE_U3				= 0x3,
	OSMO_GSM44068_CSTATE_U4				= 0x4,
	OSMO_GSM44068_CSTATE_U5				= 0x5,
	OSMO_GSM44068_CSTATE_U0p			= 0x6,
	OSMO_GSM44068_CSTATE_U2wr_U6			= 0x7,
	OSMO_GSM44068_CSTATE_U2r			= 0x8,
	OSMO_GSM44068_CSTATE_U2ws			= 0x9,
	OSMO_GSM44068_CSTATE_U2sr			= 0xa,
	OSMO_GSM44068_CSTATE_U2nc			= 0xb,
};

/* 9.4.3 Cause */
enum osmo_gsm44068_cause {
	OSMO_GSM44068_CAUSE_ILLEGAL_MS			= 0x03,
	OSMO_GSM44068_CAUSE_IMEI_NOT_ACCEPTED		= 0x05,
	OSMO_GSM44068_CAUSE_ILLEGAL_ME			= 0x06,
	OSMO_GSM44068_CAUSE_SERVICE_NOT_AUTHORIZED	= 0x08,
	OSMO_GSM44068_CAUSE_APP_NOT_SUPPORTED_ON_PROTO	= 0x09,
	OSMO_GSM44068_CAUSE_RR_CONNECTION_ABORTED	= 0x0a,
	OSMO_GSM44068_CAUSE_NORMAL_CALL_CLEARING	= 0x10,
	OSMO_GSM44068_CAUSE_NETWORK_FAILURE		= 0x11,
	OSMO_GSM44068_CAUSE_BUSY			= 0x14,
	OSMO_GSM44068_CAUSE_CONGESTION			= 0x16,
	OSMO_GSM44068_CAUSE_USER_NOT_ORIGINATOR		= 0x17,
	OSMO_GSM44068_CAUSE_NET_WANTS_TO_MAINTAIN_CALL	= 0x18,
	OSMO_GSM44068_CAUSE_RESPONSE_TO_GET_STATUS	= 0x1e,
	OSMO_GSM44068_CAUSE_SERVICE_OPTION_NOT_SUBSCR	= 0x20,
	OSMO_GSM44068_CAUSE_REQUESTED_SERVICE_NOT_SUB	= 0x21,
	OSMO_GSM44068_CAUSE_SERVICE_OPTION_OOO		= 0x22,
	OSMO_GSM44068_CAUSE_CALL_CANNOT_BE_IDENTIFIED	= 0x26,
	OSMO_GSM44068_CAUSE_RETRY_UPON_ENTRY_NEW_CALL	= 0x30, /* up to 0x3f */
	OSMO_GSM44068_CAUSE_INVALID_TRANSACTION_ID	= 0x51,
	OSMO_GSM44068_CAUSE_SEMANTICALLY_INCORRECT_MSG	= 0x5f,
	OSMO_GSM44068_CAUSE_INVALID_MANDATORY_INFO	= 0x60,
	OSMO_GSM44068_CAUSE_MESSAGE_TYPE_NON_EXISTENT	= 0x61,
	OSMO_GSM44068_CAUSE_MESSAGE_TYPE_NOT_COMPAT	= 0x62,
	OSMO_GSM44068_CAUSE_IE_NON_EXISTENT		= 0x63,
	OSMO_GSM44068_CAUSE_IE_NOT_COMPAT		= 0x64,
	OSMO_GSM44068_CAUSE_PROTOCOL_ERROR		= 0x70,
};

/* 9.4.4 Originator Indication */
#define OSMO_GSM44068_OI_MS_IS_ORIGINATOR		0x01

/* 9.4.7 State Attributes */
#define OSMO_GSM44068_DA_DOWNLINK_ATTACHED		0x08
#define OSMO_GSM44068_UA_UPLINK_ATTACHED		0x04
#define OSMO_GSM44068_COMM_T				0x02

/* 9.4.9 Talker Priority */
enum osmo_gsm44068_talker_priority {
	OSMO_GSM44068_PRIO_NORMAL			= 0x0,
	OSMO_GSM44068_PRIO_PRIVILEGED			= 0x1,
	OSMO_GSM44068_PRIO_EMERGENCY			= 0x2,
};

/* 9.4.10 SMS Indications */
#define OSMO_GSM44068_DC_DATA_CONFIDENTALLY_RQD		0x02
#define OSMO_GSM44068_GP_GUARANTEED_PRIVACY_RQD		0x01

extern const struct value_string osmo_gsm44068_msg_type_names[];
extern const struct value_string osmo_gsm44068_priority_level_names[];
extern const struct value_string osmo_gsm44068_cause_names[];
extern const struct value_string osmo_gsm44068_call_state_names[];
extern const struct value_string osmo_gsm44068_talker_priority_names[];

extern const struct tlv_definition osmo_gsm44068_att_tlvdef;