blob: d258630c55feef1d9da0d7b3c9b6e4450e7d987b [file] [log] [blame]
Neels Hofmeyrc4628a32018-12-07 14:47:34 +01001/* GSM Mobile Radio Interface Layer 3 messages on the A-bis interface
Harald Welte4bfdfe72009-06-10 23:11:52 +08002 * 3GPP TS 04.08 version 7.21.0 Release 1998 / ETSI TS 100 940 V7.21.0 */
3
4/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
5 * (C) 2008, 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
6 *
7 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-01-01 15:25:50 +010010 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
Harald Welte4bfdfe72009-06-10 23:11:52 +080012 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte9af6ddf2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Harald Welte4bfdfe72009-06-10 23:11:52 +080018 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010019 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte4bfdfe72009-06-10 23:11:52 +080021 *
22 */
23
24#ifndef _MNCC_H
25#define _MNCC_H
26
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010027#include <osmocom/core/linuxlist.h>
28#include <osmocom/gsm/mncc.h>
Harald Welte4bfdfe72009-06-10 23:11:52 +080029
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +010030#include <stdint.h>
Pau Espin Pedroleeda9e12020-09-03 22:11:03 +020031#include <netinet/in.h>
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +010032
Sylvain Munaut98b53cb2010-12-01 22:38:51 +010033struct gsm_network;
Harald Welte29b64e92010-12-23 01:07:46 +010034struct msgb;
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010035struct gsm0808_channel_type;
Sylvain Munaut98b53cb2010-12-01 22:38:51 +010036
37
Harald Welte4bfdfe72009-06-10 23:11:52 +080038/* One end of a call */
39struct gsm_call {
40 struct llist_head entry;
41
42 /* network handle */
Max6b3cef02019-01-15 13:43:45 +010043 struct gsm_network *net;
Harald Welte4bfdfe72009-06-10 23:11:52 +080044
45 /* the 'local' transaction */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +010046 uint32_t callref;
Harald Welte4bfdfe72009-06-10 23:11:52 +080047 /* the 'remote' transaction */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +010048 uint32_t remote_ref;
Harald Welte4bfdfe72009-06-10 23:11:52 +080049};
50
51#define MNCC_SETUP_REQ 0x0101
52#define MNCC_SETUP_IND 0x0102
53#define MNCC_SETUP_RSP 0x0103
54#define MNCC_SETUP_CNF 0x0104
55#define MNCC_SETUP_COMPL_REQ 0x0105
56#define MNCC_SETUP_COMPL_IND 0x0106
Martin Hauke3f07dac2019-11-14 17:49:08 +010057/* MNCC_REJ_* is performed via MNCC_REL_* */
Harald Welte4bfdfe72009-06-10 23:11:52 +080058#define MNCC_CALL_CONF_IND 0x0107
59#define MNCC_CALL_PROC_REQ 0x0108
60#define MNCC_PROGRESS_REQ 0x0109
61#define MNCC_ALERT_REQ 0x010a
62#define MNCC_ALERT_IND 0x010b
63#define MNCC_NOTIFY_REQ 0x010c
64#define MNCC_NOTIFY_IND 0x010d
65#define MNCC_DISC_REQ 0x010e
66#define MNCC_DISC_IND 0x010f
67#define MNCC_REL_REQ 0x0110
68#define MNCC_REL_IND 0x0111
69#define MNCC_REL_CNF 0x0112
70#define MNCC_FACILITY_REQ 0x0113
71#define MNCC_FACILITY_IND 0x0114
72#define MNCC_START_DTMF_IND 0x0115
73#define MNCC_START_DTMF_RSP 0x0116
74#define MNCC_START_DTMF_REJ 0x0117
75#define MNCC_STOP_DTMF_IND 0x0118
76#define MNCC_STOP_DTMF_RSP 0x0119
77#define MNCC_MODIFY_REQ 0x011a
78#define MNCC_MODIFY_IND 0x011b
79#define MNCC_MODIFY_RSP 0x011c
80#define MNCC_MODIFY_CNF 0x011d
81#define MNCC_MODIFY_REJ 0x011e
82#define MNCC_HOLD_IND 0x011f
83#define MNCC_HOLD_CNF 0x0120
84#define MNCC_HOLD_REJ 0x0121
85#define MNCC_RETRIEVE_IND 0x0122
86#define MNCC_RETRIEVE_CNF 0x0123
87#define MNCC_RETRIEVE_REJ 0x0124
88#define MNCC_USERINFO_REQ 0x0125
89#define MNCC_USERINFO_IND 0x0126
90#define MNCC_REJ_REQ 0x0127
91#define MNCC_REJ_IND 0x0128
92
93#define MNCC_BRIDGE 0x0200
94#define MNCC_FRAME_RECV 0x0201
95#define MNCC_FRAME_DROP 0x0202
96#define MNCC_LCHAN_MODIFY 0x0203
Holger Hans Peter Freytherffbf45e2015-07-14 16:03:41 +020097#define MNCC_RTP_CREATE 0x0204
98#define MNCC_RTP_CONNECT 0x0205
99#define MNCC_RTP_FREE 0x0206
Harald Welte4bfdfe72009-06-10 23:11:52 +0800100
Harald Welteda7ab742009-12-19 22:23:05 +0100101#define GSM_TCHF_FRAME 0x0300
Harald Welteaca8f152009-12-19 23:06:41 +0100102#define GSM_TCHF_FRAME_EFR 0x0301
Andreas Eversbergf78fc4e2014-01-31 09:02:01 +0100103#define GSM_TCHH_FRAME 0x0302
104#define GSM_TCH_FRAME_AMR 0x0303
105#define GSM_BAD_FRAME 0x03ff
Harald Welte4bfdfe72009-06-10 23:11:52 +0800106
Holger Hans Peter Freyther347e7ba2011-10-21 14:12:46 +0200107#define MNCC_SOCKET_HELLO 0x0400
108
Harald Welte4bfdfe72009-06-10 23:11:52 +0800109#define GSM_MAX_FACILITY 128
110#define GSM_MAX_SSVERSION 128
111#define GSM_MAX_USERUSER 128
112
113#define MNCC_F_BEARER_CAP 0x0001
114#define MNCC_F_CALLED 0x0002
115#define MNCC_F_CALLING 0x0004
116#define MNCC_F_REDIRECTING 0x0008
117#define MNCC_F_CONNECTED 0x0010
118#define MNCC_F_CAUSE 0x0020
119#define MNCC_F_USERUSER 0x0040
120#define MNCC_F_PROGRESS 0x0080
121#define MNCC_F_EMERGENCY 0x0100
122#define MNCC_F_FACILITY 0x0200
123#define MNCC_F_SSVERSION 0x0400
124#define MNCC_F_CCCAP 0x0800
125#define MNCC_F_KEYPAD 0x1000
126#define MNCC_F_SIGNAL 0x2000
Vadim Yanitskiyc6921e52021-10-27 17:05:55 +0300127#define MNCC_F_GCR 0x4000
Andreas Eversberg934f43b2023-12-19 12:56:20 +0100128#define MNCC_F_HIGHL_COMPAT 0x8000
129#define MNCC_F_LOWL_COMPAT 0x10000
Harald Welte4bfdfe72009-06-10 23:11:52 +0800130
Vadim Yanitskiy8e15c792022-10-03 15:41:15 +0700131/* UPDATEME when adding new MNCC_F_* entries above */
Andreas Eversberg934f43b2023-12-19 12:56:20 +0100132#define MNCC_F_ALL 0x1ffff
133
134#define GSM_MAX_LOWL_COMPAT 16 /* (18 with TLV) */
135#define GSM_MAX_HIGHL_COMPAT 3 /* (5 with TLV) */
Vadim Yanitskiy8e15c792022-10-03 15:41:15 +0700136
Harald Welte4bfdfe72009-06-10 23:11:52 +0800137struct gsm_mncc {
138 /* context based information */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +0100139 uint32_t msg_type;
140 uint32_t callref;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800141
142 /* which fields are present */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +0100143 uint32_t fields;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800144
Martin Hauke3f07dac2019-11-14 17:49:08 +0100145 /* data derived information (MNCC_F_ based) */
Harald Welte4bfdfe72009-06-10 23:11:52 +0800146 struct gsm_mncc_bearer_cap bearer_cap;
147 struct gsm_mncc_number called;
148 struct gsm_mncc_number calling;
149 struct gsm_mncc_number redirecting;
150 struct gsm_mncc_number connected;
151 struct gsm_mncc_cause cause;
152 struct gsm_mncc_progress progress;
153 struct gsm_mncc_useruser useruser;
154 struct gsm_mncc_facility facility;
155 struct gsm_mncc_cccap cccap;
156 struct gsm_mncc_ssversion ssversion;
157 struct {
158 int sup;
159 int inv;
160 } clir;
161 int signal;
162
163 /* data derived information, not MNCC_F based */
164 int keypad;
165 int more;
166 int notify; /* 0..127 */
167 int emergency;
Andreas Eversbergc079be42009-06-15 23:22:09 +0200168 char imsi[16];
Philipp Maierfe6acd62017-12-05 13:02:37 +0100169
170 unsigned char lchan_type;
171 unsigned char lchan_mode;
Vadim Yanitskiyc6921e52021-10-27 17:05:55 +0300172
173 /* Global Call Reference (encoded as per 3GPP TS 29.205) */
174 uint8_t gcr[16];
175
Neels Hofmeyrb4552052019-10-21 03:00:26 +0200176 /* A buffer to contain SDP ('\0' terminated) */
177 char sdp[1024];
Andreas Eversberg934f43b2023-12-19 12:56:20 +0100178
179 /* Additional information that extends current socket interface version. */
180
181 /* The content requals of Low Layer compatibility IE, described in 3GPP TS 24.008 §10.5.4.18. */
182 struct gsm_mncc_lowl_compat {
183 uint8_t len;
184 uint8_t compat[GSM_MAX_LOWL_COMPAT];
185 } llc;
186
187 /* The content requals of High Layer compatibility IE, described in 3GPP TS 24.008 §10.5.4.16. */
188 struct gsm_mncc_highl_compat {
189 uint8_t len;
190 uint8_t compat[GSM_MAX_HIGHL_COMPAT];
191 } hlc;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800192};
193
Harald Welteda7ab742009-12-19 22:23:05 +0100194struct gsm_data_frame {
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +0100195 uint32_t msg_type;
196 uint32_t callref;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800197 unsigned char data[0];
198};
199
Keith Whytea1a70be2021-05-16 02:59:52 +0200200#define MNCC_SOCK_VERSION 8
Holger Hans Peter Freyther347e7ba2011-10-21 14:12:46 +0200201struct gsm_mncc_hello {
202 uint32_t msg_type;
203 uint32_t version;
Holger Hans Peter Freyther9e7837a2012-01-15 00:38:35 +0100204
205 /* send the sizes of the structs */
206 uint32_t mncc_size;
207 uint32_t data_frame_size;
208
209 /* send some offsets */
210 uint32_t called_offset;
211 uint32_t signal_offset;
212 uint32_t emergency_offset;
Philipp Maierfe6acd62017-12-05 13:02:37 +0100213 uint32_t lchan_type_offset;
Holger Hans Peter Freyther347e7ba2011-10-21 14:12:46 +0200214};
215
Holger Hans Peter Freytherffbf45e2015-07-14 16:03:41 +0200216struct gsm_mncc_rtp {
217 uint32_t msg_type;
218 uint32_t callref;
Pau Espin Pedroleeda9e12020-09-03 22:11:03 +0200219 struct sockaddr_storage addr;
Holger Hans Peter Freytherffbf45e2015-07-14 16:03:41 +0200220 uint32_t payload_type;
221 uint32_t payload_msg_type;
Neels Hofmeyrb4552052019-10-21 03:00:26 +0200222 char sdp[1024];
Holger Hans Peter Freytherffbf45e2015-07-14 16:03:41 +0200223};
224
Harald Welte53d51f52015-12-03 14:59:04 +0100225struct gsm_mncc_bridge {
226 uint32_t msg_type;
227 uint32_t callref[2];
228};
229
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100230union mncc_msg {
231 uint32_t msg_type;
232 struct gsm_mncc signal;
233 struct gsm_mncc_hello hello;
234 struct gsm_data_frame data_frame;
235 struct gsm_mncc_rtp rtp;
236 struct gsm_mncc_bridge bridge;
237};
238
Harald Welteda8a19f2015-12-03 14:35:05 +0100239const char *get_mncc_name(int value);
Harald Welte4bfdfe72009-06-10 23:11:52 +0800240void mncc_set_cause(struct gsm_mncc *data, int loc, int val);
Harald Welte4bfdfe72009-06-10 23:11:52 +0800241
Harald Welteea057d92010-12-23 01:26:29 +0100242/* input from CC code into mncc_builtin */
243int int_mncc_recv(struct gsm_network *net, struct msgb *msg);
244
245/* input from CC code into mncc_sock */
Holger Hans Peter Freyther1cc71842011-01-06 14:13:44 +0100246int mncc_sock_from_cc(struct gsm_network *net, struct msgb *msg);
Harald Welteea057d92010-12-23 01:26:29 +0100247
Neels Hofmeyr0ade6322016-02-23 14:55:17 +0100248int mncc_sock_init(struct gsm_network *net, const char *sock_path);
Harald Welte4d54d0b2011-02-19 16:48:17 +0100249
Andreas Eversberg9acbe4c2013-03-11 08:12:43 +0100250#define mncc_is_data_frame(msg_type) \
251 (msg_type == GSM_TCHF_FRAME \
252 || msg_type == GSM_TCHF_FRAME_EFR \
253 || msg_type == GSM_TCHH_FRAME \
254 || msg_type == GSM_TCH_FRAME_AMR \
255 || msg_type == GSM_BAD_FRAME)
256
Harald Welte57184292018-01-22 01:49:02 +0100257int mncc_prim_check(const struct gsm_mncc *mncc_prim, unsigned int len);
Neels Hofmeyrb4552052019-10-21 03:00:26 +0200258int mncc_check_sdp_termination(const char *label, const struct gsm_mncc *mncc, unsigned int len, const char *sdp);
Andreas Eversberg9acbe4c2013-03-11 08:12:43 +0100259
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100260int mncc_bearer_cap_to_channel_type(struct gsm0808_channel_type *ct, const struct gsm_mncc_bearer_cap *bc);
261
Harald Welte4bfdfe72009-06-10 23:11:52 +0800262#endif