blob: 4a99bb11b3ca4597bbda9b1467eb6be9e011e539 [file] [log] [blame]
Harald Welte4bfdfe72009-06-10 23:11:52 +08001/* GSM Mobile Radio Interface Layer 3 messages on the A-bis interface
2 * 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>
31
Sylvain Munaut98b53cb2010-12-01 22:38:51 +010032struct gsm_network;
Harald Welte29b64e92010-12-23 01:07:46 +010033struct msgb;
Sylvain Munaut98b53cb2010-12-01 22:38:51 +010034
35
Harald Welte4bfdfe72009-06-10 23:11:52 +080036/* One end of a call */
37struct gsm_call {
38 struct llist_head entry;
39
40 /* network handle */
41 void *net;
42
43 /* the 'local' transaction */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +010044 uint32_t callref;
Harald Welte4bfdfe72009-06-10 23:11:52 +080045 /* the 'remote' transaction */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +010046 uint32_t remote_ref;
Harald Welte4bfdfe72009-06-10 23:11:52 +080047};
48
49#define MNCC_SETUP_REQ 0x0101
50#define MNCC_SETUP_IND 0x0102
51#define MNCC_SETUP_RSP 0x0103
52#define MNCC_SETUP_CNF 0x0104
53#define MNCC_SETUP_COMPL_REQ 0x0105
54#define MNCC_SETUP_COMPL_IND 0x0106
55/* MNCC_REJ_* is perfomed via MNCC_REL_* */
56#define MNCC_CALL_CONF_IND 0x0107
57#define MNCC_CALL_PROC_REQ 0x0108
58#define MNCC_PROGRESS_REQ 0x0109
59#define MNCC_ALERT_REQ 0x010a
60#define MNCC_ALERT_IND 0x010b
61#define MNCC_NOTIFY_REQ 0x010c
62#define MNCC_NOTIFY_IND 0x010d
63#define MNCC_DISC_REQ 0x010e
64#define MNCC_DISC_IND 0x010f
65#define MNCC_REL_REQ 0x0110
66#define MNCC_REL_IND 0x0111
67#define MNCC_REL_CNF 0x0112
68#define MNCC_FACILITY_REQ 0x0113
69#define MNCC_FACILITY_IND 0x0114
70#define MNCC_START_DTMF_IND 0x0115
71#define MNCC_START_DTMF_RSP 0x0116
72#define MNCC_START_DTMF_REJ 0x0117
73#define MNCC_STOP_DTMF_IND 0x0118
74#define MNCC_STOP_DTMF_RSP 0x0119
75#define MNCC_MODIFY_REQ 0x011a
76#define MNCC_MODIFY_IND 0x011b
77#define MNCC_MODIFY_RSP 0x011c
78#define MNCC_MODIFY_CNF 0x011d
79#define MNCC_MODIFY_REJ 0x011e
80#define MNCC_HOLD_IND 0x011f
81#define MNCC_HOLD_CNF 0x0120
82#define MNCC_HOLD_REJ 0x0121
83#define MNCC_RETRIEVE_IND 0x0122
84#define MNCC_RETRIEVE_CNF 0x0123
85#define MNCC_RETRIEVE_REJ 0x0124
86#define MNCC_USERINFO_REQ 0x0125
87#define MNCC_USERINFO_IND 0x0126
88#define MNCC_REJ_REQ 0x0127
89#define MNCC_REJ_IND 0x0128
90
91#define MNCC_BRIDGE 0x0200
92#define MNCC_FRAME_RECV 0x0201
93#define MNCC_FRAME_DROP 0x0202
94#define MNCC_LCHAN_MODIFY 0x0203
95
Harald Welteda7ab742009-12-19 22:23:05 +010096#define GSM_TCHF_FRAME 0x0300
Harald Welteaca8f152009-12-19 23:06:41 +010097#define GSM_TCHF_FRAME_EFR 0x0301
Harald Welte4bfdfe72009-06-10 23:11:52 +080098
Holger Hans Peter Freyther347e7ba2011-10-21 14:12:46 +020099#define MNCC_SOCKET_HELLO 0x0400
100
Harald Welte4bfdfe72009-06-10 23:11:52 +0800101#define GSM_MAX_FACILITY 128
102#define GSM_MAX_SSVERSION 128
103#define GSM_MAX_USERUSER 128
104
105#define MNCC_F_BEARER_CAP 0x0001
106#define MNCC_F_CALLED 0x0002
107#define MNCC_F_CALLING 0x0004
108#define MNCC_F_REDIRECTING 0x0008
109#define MNCC_F_CONNECTED 0x0010
110#define MNCC_F_CAUSE 0x0020
111#define MNCC_F_USERUSER 0x0040
112#define MNCC_F_PROGRESS 0x0080
113#define MNCC_F_EMERGENCY 0x0100
114#define MNCC_F_FACILITY 0x0200
115#define MNCC_F_SSVERSION 0x0400
116#define MNCC_F_CCCAP 0x0800
117#define MNCC_F_KEYPAD 0x1000
118#define MNCC_F_SIGNAL 0x2000
119
Harald Welte4bfdfe72009-06-10 23:11:52 +0800120struct gsm_mncc {
121 /* context based information */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +0100122 uint32_t msg_type;
123 uint32_t callref;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800124
125 /* which fields are present */
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +0100126 uint32_t fields;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800127
128 /* data derived informations (MNCC_F_ based) */
129 struct gsm_mncc_bearer_cap bearer_cap;
130 struct gsm_mncc_number called;
131 struct gsm_mncc_number calling;
132 struct gsm_mncc_number redirecting;
133 struct gsm_mncc_number connected;
134 struct gsm_mncc_cause cause;
135 struct gsm_mncc_progress progress;
136 struct gsm_mncc_useruser useruser;
137 struct gsm_mncc_facility facility;
138 struct gsm_mncc_cccap cccap;
139 struct gsm_mncc_ssversion ssversion;
140 struct {
141 int sup;
142 int inv;
143 } clir;
144 int signal;
145
146 /* data derived information, not MNCC_F based */
147 int keypad;
148 int more;
149 int notify; /* 0..127 */
150 int emergency;
Andreas Eversbergc079be42009-06-15 23:22:09 +0200151 char imsi[16];
Harald Welte4bfdfe72009-06-10 23:11:52 +0800152
Harald Welteab386e62011-09-01 18:18:43 +0200153 unsigned char lchan_type;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800154 unsigned char lchan_mode;
155};
156
Harald Welteda7ab742009-12-19 22:23:05 +0100157struct gsm_data_frame {
Holger Hans Peter Freyther59234a32011-01-06 14:42:15 +0100158 uint32_t msg_type;
159 uint32_t callref;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800160 unsigned char data[0];
161};
162
Holger Hans Peter Freyther9e7837a2012-01-15 00:38:35 +0100163#define MNCC_SOCK_VERSION 2
Holger Hans Peter Freyther347e7ba2011-10-21 14:12:46 +0200164struct gsm_mncc_hello {
165 uint32_t msg_type;
166 uint32_t version;
Holger Hans Peter Freyther9e7837a2012-01-15 00:38:35 +0100167
168 /* send the sizes of the structs */
169 uint32_t mncc_size;
170 uint32_t data_frame_size;
171
172 /* send some offsets */
173 uint32_t called_offset;
174 uint32_t signal_offset;
175 uint32_t emergency_offset;
176 uint32_t lchan_type_offset;
Holger Hans Peter Freyther347e7ba2011-10-21 14:12:46 +0200177};
178
Harald Welte4bfdfe72009-06-10 23:11:52 +0800179char *get_mncc_name(int value);
Harald Welte4bfdfe72009-06-10 23:11:52 +0800180void mncc_set_cause(struct gsm_mncc *data, int loc, int val);
Harald Weltefea236e2010-12-23 00:13:47 +0100181void cc_tx_to_mncc(struct gsm_network *net, struct msgb *msg);
Harald Welte4bfdfe72009-06-10 23:11:52 +0800182
Harald Welteea057d92010-12-23 01:26:29 +0100183/* input from CC code into mncc_builtin */
184int int_mncc_recv(struct gsm_network *net, struct msgb *msg);
185
186/* input from CC code into mncc_sock */
Holger Hans Peter Freyther1cc71842011-01-06 14:13:44 +0100187int mncc_sock_from_cc(struct gsm_network *net, struct msgb *msg);
Harald Welteea057d92010-12-23 01:26:29 +0100188
Harald Welte4d54d0b2011-02-19 16:48:17 +0100189int mncc_sock_init(struct gsm_network *gsmnet);
190
Harald Welte4bfdfe72009-06-10 23:11:52 +0800191#endif