blob: 491cca12a6235aacbc1b060cf079f2196da639b7 [file] [log] [blame]
Harald Welte52b1f982008-12-23 20:25:15 +00001#ifndef _GSM_DATA_H
2#define _GSM_DATA_H
3
4#include <sys/types.h>
5
Harald Welte4bfdfe72009-06-10 23:11:52 +08006enum gsm_phys_chan_config {
7 GSM_PCHAN_NONE,
8 GSM_PCHAN_CCCH,
9 GSM_PCHAN_CCCH_SDCCH4,
10 GSM_PCHAN_TCH_F,
11 GSM_PCHAN_TCH_H,
12 GSM_PCHAN_SDCCH8_SACCH8C,
Harald Weltea1499d02009-10-24 10:25:50 +020013 GSM_PCHAN_PDCH, /* GPRS PDCH */
14 GSM_PCHAN_TCH_F_PDCH, /* TCH/F if used, PDCH otherwise */
Harald Welte4bfdfe72009-06-10 23:11:52 +080015 GSM_PCHAN_UNKNOWN,
16};
17
18enum gsm_chan_t {
19 GSM_LCHAN_NONE,
20 GSM_LCHAN_SDCCH,
21 GSM_LCHAN_TCH_F,
22 GSM_LCHAN_TCH_H,
23 GSM_LCHAN_UNKNOWN,
24};
25
Harald Welteeab84a12009-12-13 10:53:12 +010026/* RRLP mode of operation */
27enum rrlp_mode {
28 RRLP_MODE_NONE,
29 RRLP_MODE_MS_BASED,
30 RRLP_MODE_MS_PREF,
31 RRLP_MODE_ASS_PREF,
32};
Harald Welte4bfdfe72009-06-10 23:11:52 +080033
34/* Channel Request reason */
35enum gsm_chreq_reason_t {
36 GSM_CHREQ_REASON_EMERG,
37 GSM_CHREQ_REASON_PAG,
38 GSM_CHREQ_REASON_CALL,
39 GSM_CHREQ_REASON_LOCATION_UPD,
40 GSM_CHREQ_REASON_OTHER,
41};
42
Harald Weltedfe6c7d2010-02-20 16:24:02 +010043#include <osmocore/timer.h>
Holger Freyther1adb4ff2009-02-04 00:04:52 +000044#include <openbsc/gsm_04_08.h>
Harald Welte9943c5b2009-07-29 15:41:29 +020045#include <openbsc/abis_rsl.h>
Harald Welte7401ae62010-06-15 16:44:12 +020046#include <openbsc/system_information.h>
Harald Welte4bfdfe72009-06-10 23:11:52 +080047#include <openbsc/mncc.h>
Harald Weltedfe6c7d2010-02-20 16:24:02 +010048#include <osmocore/tlv.h>
49#include <osmocore/bitvec.h>
50#include <osmocore/statistics.h>
51#include <osmocore/gsm_utils.h>
52#include <osmocore/utils.h>
Harald Welte8470bf22008-12-25 23:28:35 +000053
Harald Welte85770c72009-01-18 17:47:32 +000054#define TRX_NR_TS 8
Harald Welte8470bf22008-12-25 23:28:35 +000055#define TS_MAX_LCHAN 8
Harald Welte52b1f982008-12-23 20:25:15 +000056
57#define HARDCODED_ARFCN 123
Harald Welte02b0e092009-02-28 13:11:07 +000058#define HARDCODED_TSC 7
Harald Welte78f2f502009-05-23 16:56:52 +000059#define HARDCODED_BSIC 0x3f /* NCC = 7 / BCC = 7 */
Harald Welte52b1f982008-12-23 20:25:15 +000060
Harald Welte63589be2009-08-06 17:38:10 +020061/* for multi-drop config */
62#define HARDCODED_BTS0_TS 1
63#define HARDCODED_BTS1_TS 6
64#define HARDCODED_BTS2_TS 11
65
Harald Welte8e1e3ee2009-02-01 13:32:45 +000066enum gsm_hooks {
67 GSM_HOOK_NM_SWLOAD,
Harald Welte0932d1e2009-02-16 22:53:52 +000068 GSM_HOOK_RR_PAGING,
Sylvain Munaut30a15382009-12-24 00:27:26 +010069 GSM_HOOK_RR_SECURITY,
Harald Welte0932d1e2009-02-16 22:53:52 +000070};
71
72enum gsm_paging_event {
73 GSM_PAGING_SUCCEEDED,
74 GSM_PAGING_EXPIRED,
Holger Freyther85a7b362009-04-18 13:48:55 +020075 GSM_PAGING_OOM,
Harald Welte8e1e3ee2009-02-01 13:32:45 +000076};
77
Harald Welte4511d892010-04-18 15:51:20 +020078enum bts_gprs_mode {
79 BTS_GPRS_NONE = 0,
80 BTS_GPRS_GPRS = 1,
81 BTS_GPRS_EGPRS = 2,
82};
83
Harald Welte0809d792010-04-30 14:36:25 +020084/* the data structure stored in msgb->cb for openbsc apps */
85struct openbsc_msgb_cb {
Harald Weltefd3fa1d2010-05-02 09:50:42 +020086 unsigned char *bssgph;
87 unsigned char *llch;
Harald Welte44f1c272010-04-30 19:54:29 +020088
Harald Welte11d7c102010-05-02 11:54:55 +020089 /* Cell Identifier */
90 unsigned char *bssgp_cell_id;
91
Harald Weltee6afd602010-05-02 11:19:37 +020092 /* Identifiers of a BTS, equal to 'struct bssgp_bts_ctx' */
Harald Welte44f1c272010-04-30 19:54:29 +020093 u_int16_t nsei;
94 u_int16_t bvci;
95
Harald Weltee6afd602010-05-02 11:19:37 +020096 /* Identifier of a MS (inside BTS), equal to 'struct sgsn_mm_ctx' */
Harald Welte0809d792010-04-30 14:36:25 +020097 u_int32_t tlli;
Harald Welte44f1c272010-04-30 19:54:29 +020098} __attribute__((packed));
Harald Welte0809d792010-04-30 14:36:25 +020099#define OBSC_MSGB_CB(__msgb) ((struct openbsc_msgb_cb *)&((__msgb)->cb[0]))
Harald Welte943c5bc2010-04-30 16:33:12 +0200100#define msgb_tlli(__x) OBSC_MSGB_CB(__x)->tlli
Harald Welte44f1c272010-04-30 19:54:29 +0200101#define msgb_nsei(__x) OBSC_MSGB_CB(__x)->nsei
102#define msgb_bvci(__x) OBSC_MSGB_CB(__x)->bvci
Harald Weltefd3fa1d2010-05-02 09:50:42 +0200103#define msgb_gmmh(__x) (__x)->l3h
104#define msgb_bssgph(__x) OBSC_MSGB_CB(__x)->bssgph
Harald Welte721961c2010-05-02 21:29:36 +0200105#define msgb_bssgp_len(__x) ((__x)->tail - (uint8_t *)msgb_bssgph(__x))
Harald Welte11d7c102010-05-02 11:54:55 +0200106#define msgb_bcid(__x) OBSC_MSGB_CB(__x)->bssgp_cell_id
Harald Weltefd3fa1d2010-05-02 09:50:42 +0200107#define msgb_llch(__x) OBSC_MSGB_CB(__x)->llch
Harald Welte0809d792010-04-30 14:36:25 +0200108
Holger Hans Peter Freyther9c595b72010-06-15 11:20:52 +0800109#define OBSC_LINKID_CB(__msgb) (__msgb)->cb[3]
110
Sylvain Munaut30a15382009-12-24 00:27:26 +0100111enum gsm_security_event {
112 GSM_SECURITY_NOAVAIL,
113 GSM_SECURITY_AUTH_FAILED,
114 GSM_SECURITY_SUCCEEDED,
115};
116
Harald Welte8e1e3ee2009-02-01 13:32:45 +0000117struct msgb;
118typedef int gsm_cbfn(unsigned int hooknum,
119 unsigned int event,
120 struct msgb *msg,
121 void *data, void *param);
122
Sylvain Munaut47193072009-12-27 21:56:14 +0100123/* Real authentication information containing Ki */
124enum gsm_auth_algo {
125 AUTH_ALGO_NONE,
126 AUTH_ALGO_XOR,
127 AUTH_ALGO_COMP128v1,
128};
129
130struct gsm_auth_info {
131 enum gsm_auth_algo auth_algo;
132 unsigned int a3a8_ki_len;
133 u_int8_t a3a8_ki[16];
134};
135
136struct gsm_auth_tuple {
137 int use_count;
138 int key_seq;
139 u_int8_t rand[16];
140 u_int8_t sres[4];
141 u_int8_t kc[8];
142};
Sylvain Munautb48216f2010-06-09 12:45:37 +0200143#define GSM_KEY_SEQ_INVAL 7 /* GSM 04.08 - 10.5.1.2 */
Sylvain Munaut47193072009-12-27 21:56:14 +0100144
145
Harald Welte49f48b82009-02-17 15:29:33 +0000146struct gsm_lchan;
147struct gsm_subscriber;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800148struct gsm_mncc;
Harald Welte805f6442009-07-28 18:25:29 +0200149struct rtp_socket;
Holger Hans Peter Freytherabcddf12010-06-14 18:20:15 +0800150struct bsc_api;
Harald Welte49f48b82009-02-17 15:29:33 +0000151
Harald Weltebbcc7a52009-02-14 19:45:44 +0000152/* Network Management State */
153struct gsm_nm_state {
154 u_int8_t operational;
155 u_int8_t administrative;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000156 u_int8_t availability;
Harald Weltebbcc7a52009-02-14 19:45:44 +0000157};
Harald Weltebbcc7a52009-02-14 19:45:44 +0000158
Holger Freyther73487a22008-12-31 18:53:57 +0000159/*
160 * LOCATION UPDATING REQUEST state
161 *
162 * Our current operation is:
163 * - Get imei/tmsi
164 * - Accept/Reject according to global policy
165 */
166struct gsm_loc_updating_operation {
167 struct timer_list updating_timer;
Holger Hans Peter Freyther251aa912009-10-27 10:42:28 +0100168 unsigned int waiting_for_imsi : 1;
169 unsigned int waiting_for_imei : 1;
Sylvain Munaut2030a2a2010-06-10 13:36:59 +0200170 unsigned int key_seq : 4;
Holger Freyther73487a22008-12-31 18:53:57 +0000171};
172
Sylvain Munaut30a15382009-12-24 00:27:26 +0100173/*
174 * AUTHENTICATION/CIPHERING state
175 */
176struct gsm_security_operation {
177 struct gsm_auth_tuple atuple;
178 gsm_cbfn *cb;
179 void *cb_data;
180};
181
Harald Weltef7c28b02009-12-21 13:30:17 +0100182/* Maximum number of neighbor cells whose average we track */
183#define MAX_NEIGH_MEAS 10
184/* Maximum size of the averaging window for neighbor cells */
185#define MAX_WIN_NEIGH_AVG 10
186
187/* processed neighbor measurements for one cell */
188struct neigh_meas_proc {
189 u_int16_t arfcn;
190 u_int8_t bsic;
191 u_int8_t rxlev[MAX_WIN_NEIGH_AVG];
192 unsigned int rxlev_cnt;
193 u_int8_t last_seen_nr;
194};
195
Harald Welte08d91a52009-08-30 15:37:11 +0900196#define MAX_A5_KEY_LEN (128/8)
Sylvain Munaute824d9c2010-06-11 00:19:42 +0200197#define A38_XOR_MIN_KEY_LEN 12
198#define A38_XOR_MAX_KEY_LEN 16
Sylvain Munaut30a15382009-12-24 00:27:26 +0100199#define A38_COMP128_KEY_LEN 16
Harald Welte08d91a52009-08-30 15:37:11 +0900200#define RSL_ENC_ALG_A5(x) (x+1)
201
Holger Hans Peter Freyther5ba6f482009-10-28 14:23:39 +0100202/* is the data link established? who established it? */
203#define LCHAN_SAPI_UNUSED 0
204#define LCHAN_SAPI_MS 1
205#define LCHAN_SAPI_NET 2
206
Harald Welteb8bfc562009-12-21 13:27:11 +0100207/* state of a logical channel */
208enum gsm_lchan_state {
209 LCHAN_S_NONE, /* channel is not active */
Harald Welte (local)3e460312009-12-27 18:12:29 +0100210 LCHAN_S_ACT_REQ, /* channel activatin requested */
Harald Welteb8bfc562009-12-21 13:27:11 +0100211 LCHAN_S_ACTIVE, /* channel is active and operational */
Harald Welte8e93b792009-12-29 10:44:17 +0100212 LCHAN_S_REL_REQ, /* channel release has been requested */
Holger Hans Peter Freyther4b4dd102010-05-31 21:38:24 +0800213 LCHAN_S_REL_ERR, /* channel is in an error state */
Harald Welteb8bfc562009-12-21 13:27:11 +0100214 LCHAN_S_INACTIVE, /* channel is set inactive */
215};
216
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100217/* the per subscriber data for lchan */
218struct gsm_subscriber_connection {
219 /* To whom we are allocated at the moment */
220 struct gsm_subscriber *subscr;
221
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100222 /*
223 * Operations that have a state and might be pending
224 */
225 struct gsm_loc_updating_operation *loc_operation;
Sylvain Munaut30a15382009-12-24 00:27:26 +0100226 struct gsm_security_operation *sec_operation;
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100227
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100228 /* Are we part of a special "silent" call */
229 int silent_call;
230
Holger Hans Peter Freyther18b63f42010-03-23 07:52:17 +0100231 /* back pointers */
Holger Hans Peter Freyther40494552010-06-28 17:09:29 +0800232 int in_release;
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100233 struct gsm_lchan *lchan;
Holger Hans Peter Freyther18b63f42010-03-23 07:52:17 +0100234 struct gsm_bts *bts;
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100235};
236
Harald Welte8470bf22008-12-25 23:28:35 +0000237struct gsm_lchan {
238 /* The TS that we're part of */
239 struct gsm_bts_trx_ts *ts;
240 /* The logical subslot number in the TS */
241 u_int8_t nr;
Harald Welte45b407a2009-05-23 15:51:12 +0000242 /* The logical channel type */
Harald Welte8470bf22008-12-25 23:28:35 +0000243 enum gsm_chan_t type;
Harald Welte9943c5b2009-07-29 15:41:29 +0200244 /* RSL channel mode */
245 enum rsl_cmod_spd rsl_cmode;
Harald Welte45b407a2009-05-23 15:51:12 +0000246 /* If TCH, traffic channel mode */
Harald Welte9943c5b2009-07-29 15:41:29 +0200247 enum gsm48_chan_mode tch_mode;
Harald Welteb8bfc562009-12-21 13:27:11 +0100248 /* State */
249 enum gsm_lchan_state state;
Harald Welted4c9bf32009-02-15 16:56:18 +0000250 /* Power levels for MS and BTS */
251 u_int8_t bs_power;
252 u_int8_t ms_power;
Harald Welte08d91a52009-08-30 15:37:11 +0900253 /* Encryption information */
254 struct {
255 u_int8_t alg_id;
256 u_int8_t key_len;
257 u_int8_t key[MAX_A5_KEY_LEN];
258 } encr;
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100259
260 struct timer_list T3101;
Holger Hans Peter Freytherf30c0dc2010-05-31 21:33:15 +0800261 struct timer_list T3111;
Holger Hans Peter Freyther4b4dd102010-05-31 21:38:24 +0800262 struct timer_list error_timer;
Holger Hans Peter Freytherea528022009-11-18 22:57:02 +0100263
264 /* AMR bits */
265 struct gsm48_multi_rate_conf mr_conf;
Harald Welted4c9bf32009-02-15 16:56:18 +0000266
Holger Hans Peter Freyther5ba6f482009-10-28 14:23:39 +0100267 /* Established data link layer services */
268 u_int8_t sapis[8];
269
Holger Hans Peter Freyther5ba05f42010-06-22 12:11:59 +0800270 /* GSM Random Access data */
271 struct gsm48_req_ref *rqd_ref;
272 uint8_t rqd_ta;
273
Harald Welted12b0fd2009-12-15 21:36:05 +0100274 /* cache of last measurement reports on this lchan */
275 struct gsm_meas_rep meas_rep[6];
276 int meas_rep_idx;
277
Harald Weltef7c28b02009-12-21 13:30:17 +0100278 /* table of neighbor cell measurements */
279 struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS];
280
Harald Welte2c828992009-12-02 01:56:49 +0530281 struct {
282 u_int32_t bound_ip;
Harald Welte5e3d91b2009-12-19 16:42:06 +0100283 u_int32_t connect_ip;
Harald Welte2c828992009-12-02 01:56:49 +0530284 u_int16_t bound_port;
Harald Welte5e3d91b2009-12-19 16:42:06 +0100285 u_int16_t connect_port;
Harald Welte2c828992009-12-02 01:56:49 +0530286 u_int16_t conn_id;
Sylvain Munautb54dda42009-12-20 22:06:40 +0100287 u_int8_t rtp_payload;
Harald Welte5e3d91b2009-12-19 16:42:06 +0100288 u_int8_t rtp_payload2;
289 u_int8_t speech_mode;
Harald Welte2c828992009-12-02 01:56:49 +0530290 struct rtp_socket *rtp_socket;
291 } abis_ip;
Holger Hans Peter Freyther68884aa2010-03-23 06:41:45 +0100292
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +0800293 struct gsm_subscriber_connection *conn;
Harald Welte8470bf22008-12-25 23:28:35 +0000294};
295
Harald Welte85770c72009-01-18 17:47:32 +0000296struct gsm_e1_subslot {
297 /* Number of E1 link */
298 u_int8_t e1_nr;
299 /* Number of E1 TS inside E1 link */
300 u_int8_t e1_ts;
301 /* Sub-slot within the E1 TS, 0xff if full TS */
302 u_int8_t e1_ts_ss;
303};
304
Harald Welte4563eab2010-03-28 14:42:09 +0800305#define TS_F_PDCH_MODE 0x1000
Harald Welte52b1f982008-12-23 20:25:15 +0000306/* One Timeslot in a TRX */
307struct gsm_bts_trx_ts {
308 struct gsm_bts_trx *trx;
309 /* number of this timeslot at the TRX */
310 u_int8_t nr;
311
Harald Welte8470bf22008-12-25 23:28:35 +0000312 enum gsm_phys_chan_config pchan;
313
Harald Welte52b1f982008-12-23 20:25:15 +0000314 unsigned int flags;
Harald Weltebbcc7a52009-02-14 19:45:44 +0000315 struct gsm_nm_state nm_state;
Harald Welte93e9d172009-06-20 19:04:31 +0200316 struct tlv_parsed nm_attr;
Harald Welte39c7deb2009-08-09 21:49:48 +0200317 u_int8_t nm_chan_comb;
Harald Welte8470bf22008-12-25 23:28:35 +0000318
Harald Welte6e0cd042009-09-12 13:05:33 +0200319 struct {
Harald Weltefd370892010-06-15 08:52:12 +0200320 /* Parameters below are configured by VTY */
Harald Weltea39b0f22010-06-14 22:26:10 +0200321 int enabled;
Harald Welte6e0cd042009-09-12 13:05:33 +0200322 u_int8_t maio;
323 u_int8_t hsn;
Harald Weltea39b0f22010-06-14 22:26:10 +0200324 struct bitvec arfcns;
325 u_int8_t arfcns_data[1024/8];
Harald Weltefd370892010-06-15 08:52:12 +0200326 /* This is the pre-computed MA for channel assignments */
327 struct bitvec ma;
Harald Welte29aca172010-06-15 16:45:51 +0200328 u_int8_t ma_len; /* part of ma_data that is used */
Harald Weltefd370892010-06-15 08:52:12 +0200329 u_int8_t ma_data[8]; /* 10.5.2.21: max 8 bytes value part */
Harald Welte6e0cd042009-09-12 13:05:33 +0200330 } hopping;
331
Harald Welte85770c72009-01-18 17:47:32 +0000332 /* To which E1 subslot are we connected */
333 struct gsm_e1_subslot e1_link;
334
Harald Welte8470bf22008-12-25 23:28:35 +0000335 struct gsm_lchan lchan[TS_MAX_LCHAN];
Harald Welte52b1f982008-12-23 20:25:15 +0000336};
337
338/* One TRX in a BTS */
339struct gsm_bts_trx {
Harald Weltee441d9c2009-06-21 16:17:15 +0200340 /* list header in bts->trx_list */
341 struct llist_head list;
342
Harald Welte52b1f982008-12-23 20:25:15 +0000343 struct gsm_bts *bts;
344 /* number of this TRX in the BTS */
345 u_int8_t nr;
Harald Welte197dea92010-05-14 17:59:53 +0200346 /* human readable name / description */
347 char *description;
Harald Welte1fa60c82009-02-09 18:13:26 +0000348 /* how do we talk RSL with this TRX? */
Harald Welte42581822009-08-08 16:12:58 +0200349 struct gsm_e1_subslot rsl_e1_link;
350 u_int8_t rsl_tei;
Harald Welte1fa60c82009-02-09 18:13:26 +0000351 struct e1inp_sign_link *rsl_link;
Harald Welte42581822009-08-08 16:12:58 +0200352
Harald Weltebbcc7a52009-02-14 19:45:44 +0000353 struct gsm_nm_state nm_state;
Harald Welte93e9d172009-06-20 19:04:31 +0200354 struct tlv_parsed nm_attr;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000355 struct {
356 struct gsm_nm_state nm_state;
357 } bb_transc;
Harald Welte52b1f982008-12-23 20:25:15 +0000358
359 u_int16_t arfcn;
Harald Weltefcd24452009-06-20 18:15:19 +0200360 int nominal_power; /* in dBm */
361 unsigned int max_power_red; /* in actual dB */
Harald Welte8b697c72009-06-05 19:18:45 +0000362
363 union {
364 struct {
365 struct {
366 struct gsm_nm_state nm_state;
367 } bbsig;
368 struct {
369 struct gsm_nm_state nm_state;
370 } pa;
371 } bs11;
372 };
Harald Welte85770c72009-01-18 17:47:32 +0000373 struct gsm_bts_trx_ts ts[TRX_NR_TS];
Harald Welte52b1f982008-12-23 20:25:15 +0000374};
375
Harald Welte7401ae62010-06-15 16:44:12 +0200376#define GSM_BTS_SI(bts, i) (void *)(bts->si_buf[i])
377
Harald Welte978cb422009-01-18 17:57:27 +0000378enum gsm_bts_type {
379 GSM_BTS_TYPE_UNKNOWN,
380 GSM_BTS_TYPE_BS11,
Mike Habene2d82272009-10-02 12:19:34 +0100381 GSM_BTS_TYPE_NANOBTS,
Harald Welte978cb422009-01-18 17:57:27 +0000382};
383
Harald Welte39315c42010-01-10 18:01:52 +0100384struct gsm_bts_model {
385 struct llist_head list;
386
387 enum gsm_bts_type type;
388 const char *name;
389
390 struct tlv_definition nm_att_tlvdef;
Harald Weltef3d8e922010-06-14 22:44:42 +0200391
392 struct bitvec features;
393 uint8_t _features_data[128/8];
394};
395
396enum gsm_bts_features {
397 BTS_FEAT_HSCSD,
398 BTS_FEAT_GPRS,
399 BTS_FEAT_EGPRS,
400 BTS_FEAT_ECSD,
401 BTS_FEAT_HOPPING,
Harald Welte39315c42010-01-10 18:01:52 +0100402};
403
Holger Freytherceb59b72009-02-06 18:54:00 +0000404/**
405 * A pending paging request
406 */
407struct gsm_paging_request {
Harald Welte0932d1e2009-02-16 22:53:52 +0000408 /* list_head for list of all paging requests */
Holger Freytherceb59b72009-02-06 18:54:00 +0000409 struct llist_head entry;
Harald Welte0932d1e2009-02-16 22:53:52 +0000410 /* the subscriber which we're paging. Later gsm_paging_request
411 * should probably become a part of the gsm_subscriber struct? */
Holger Freytherceb59b72009-02-06 18:54:00 +0000412 struct gsm_subscriber *subscr;
Harald Welte0932d1e2009-02-16 22:53:52 +0000413 /* back-pointer to the BTS on which we are paging */
Holger Freytherceb59b72009-02-06 18:54:00 +0000414 struct gsm_bts *bts;
Harald Welte0932d1e2009-02-16 22:53:52 +0000415 /* what kind of channel type do we ask the MS to establish */
Holger Freytherceb59b72009-02-06 18:54:00 +0000416 int chan_type;
Harald Weltecd06bfb2009-02-10 17:33:56 +0000417
418 /* Timer 3113: how long do we try to page? */
419 struct timer_list T3113;
Harald Welte0932d1e2009-02-16 22:53:52 +0000420
421 /* callback to be called in case paging completes */
422 gsm_cbfn *cbfn;
423 void *cbfn_param;
Holger Freytherceb59b72009-02-06 18:54:00 +0000424};
425
426/*
427 * This keeps track of the paging status of one BTS. It
428 * includes a number of pending requests, a back pointer
429 * to the gsm_bts, a timer and some more state.
430 */
431struct gsm_bts_paging_state {
Holger Freytherceb59b72009-02-06 18:54:00 +0000432 /* pending requests */
433 struct llist_head pending_requests;
Holger Freytherceb59b72009-02-06 18:54:00 +0000434 struct gsm_bts *bts;
435
Harald Welte75a1fa82009-02-17 01:39:41 +0000436 struct timer_list work_timer;
437
Holger Freyther392209c2009-02-10 00:06:19 +0000438 /* load */
439 u_int16_t available_slots;
Holger Freytherceb59b72009-02-06 18:54:00 +0000440};
441
Harald Welte8b697c72009-06-05 19:18:45 +0000442struct gsm_envabtse {
443 struct gsm_nm_state nm_state;
444};
445
Harald Welte55dd4432009-10-24 10:19:14 +0200446struct gsm_bts_gprs_nsvc {
447 struct gsm_bts *bts;
Harald Welteab88a622010-03-18 00:01:23 +0800448 /* data read via VTY config file, to configure the BTS
449 * via OML from BSC */
Harald Welte55dd4432009-10-24 10:19:14 +0200450 int id;
Harald Welte97a282b2010-03-14 15:37:43 +0800451 u_int16_t nsvci;
Harald Welteab88a622010-03-18 00:01:23 +0800452 u_int16_t local_port; /* on the BTS */
453 u_int16_t remote_port; /* on the SGSN */
454 u_int32_t remote_ip; /* on the SGSN */
455
Harald Welte55dd4432009-10-24 10:19:14 +0200456 struct gsm_nm_state nm_state;
457};
458
Harald Welte52b1f982008-12-23 20:25:15 +0000459/* One BTS */
460struct gsm_bts {
Harald Weltee441d9c2009-06-21 16:17:15 +0200461 /* list header in net->bts_list */
462 struct llist_head list;
463
Harald Welte52b1f982008-12-23 20:25:15 +0000464 struct gsm_network *network;
465 /* number of ths BTS in network */
466 u_int8_t nr;
Harald Welte197dea92010-05-14 17:59:53 +0200467 /* human readable name / description */
468 char *description;
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200469 /* Cell Identity */
470 u_int16_t cell_identity;
Harald Welte52b1f982008-12-23 20:25:15 +0000471 /* location area code of this BTS */
Holger Hans Peter Freyther0b7f4b32009-09-29 14:02:33 +0200472 u_int16_t location_area_code;
Harald Welte02b0e092009-02-28 13:11:07 +0000473 /* Training Sequence Code */
474 u_int8_t tsc;
Harald Welte78f2f502009-05-23 16:56:52 +0000475 /* Base Station Identification Code (BSIC) */
476 u_int8_t bsic;
Harald Welte978cb422009-01-18 17:57:27 +0000477 /* type of BTS */
478 enum gsm_bts_type type;
Harald Welte39315c42010-01-10 18:01:52 +0100479 struct gsm_bts_model *model;
Harald Weltefcd24452009-06-20 18:15:19 +0200480 enum gsm_band band;
Harald Weltefc0d9522009-08-10 13:46:55 +0200481 /* should the channel allocator allocate channels from high TRX to TRX0,
482 * rather than starting from TRX0 and go upwards? */
483 int chan_alloc_reverse;
Harald Welte (local)0e451d02009-08-13 10:14:26 +0200484 /* maximum Tx power that the MS is permitted to use in this cell */
485 int ms_max_power;
Harald Weltefc0d9522009-08-10 13:46:55 +0200486
Harald Welte1fa60c82009-02-09 18:13:26 +0000487 /* how do we talk OML with this TRX? */
Harald Welte42581822009-08-08 16:12:58 +0200488 struct gsm_e1_subslot oml_e1_link;
489 u_int8_t oml_tei;
Harald Welte1fa60c82009-02-09 18:13:26 +0000490 struct e1inp_sign_link *oml_link;
Harald Welte52b1f982008-12-23 20:25:15 +0000491
492 /* Abis network management O&M handle */
493 struct abis_nm_h *nmh;
Harald Weltebbcc7a52009-02-14 19:45:44 +0000494 struct gsm_nm_state nm_state;
Harald Welte93e9d172009-06-20 19:04:31 +0200495 struct tlv_parsed nm_attr;
Harald Welte978cb422009-01-18 17:57:27 +0000496
Harald Welte52b1f982008-12-23 20:25:15 +0000497 /* number of this BTS on given E1 link */
498 u_int8_t bts_nr;
499
Holger Freytherceb59b72009-02-06 18:54:00 +0000500 /* paging state and control */
501 struct gsm_bts_paging_state paging;
502
Harald Welte52b1f982008-12-23 20:25:15 +0000503 /* CCCH is on C0 */
504 struct gsm_bts_trx *c0;
Harald Weltebbcc7a52009-02-14 19:45:44 +0000505
506 struct {
507 struct gsm_nm_state nm_state;
508 } site_mgr;
Harald Welteedb37782009-05-01 14:59:07 +0000509
Harald Weltea43f7892009-12-01 18:04:30 +0530510 /* parameters from which we build SYSTEM INFORMATION */
511 struct {
512 struct gsm48_rach_control rach_control;
513 u_int8_t ncc_permitted;
514 struct gsm48_cell_sel_par cell_sel_par;
515 struct gsm48_cell_options cell_options;
516 struct gsm48_control_channel_descr chan_desc;
Harald Welte6c40def2009-12-14 22:07:14 +0100517 struct bitvec neigh_list;
518 struct bitvec cell_alloc;
519 struct {
520 /* bitmask large enough for all possible ARFCN's */
521 u_int8_t neigh_list[1024/8];
522 u_int8_t cell_alloc[1024/8];
523 } data;
Harald Weltea43f7892009-12-01 18:04:30 +0530524 } si_common;
525
Harald Welte7401ae62010-06-15 16:44:12 +0200526 /* buffers where we put the pre-computed SI */
527 sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE];
528
Harald Welteedb37782009-05-01 14:59:07 +0000529 /* ip.accesss Unit ID's have Site/BTS/TRX layout */
Harald Welte7b26bcb2009-05-28 11:39:21 +0000530 union {
531 struct {
532 u_int16_t site_id;
533 u_int16_t bts_id;
Harald Welte88a412a2009-12-16 17:32:37 +0100534 u_int32_t flags;
Harald Welte7b26bcb2009-05-28 11:39:21 +0000535 } ip_access;
536 struct {
537 struct {
538 struct gsm_nm_state nm_state;
539 } cclk;
540 struct {
541 struct gsm_nm_state nm_state;
542 } rack;
Harald Welte8b697c72009-06-05 19:18:45 +0000543 struct gsm_envabtse envabtse[4];
Harald Welte7b26bcb2009-05-28 11:39:21 +0000544 } bs11;
545 };
Harald Welte55dd4432009-10-24 10:19:14 +0200546
547 /* Not entirely sure how ip.access specific this is */
548 struct {
Harald Welte4511d892010-04-18 15:51:20 +0200549 enum bts_gprs_mode mode;
Harald Welte55dd4432009-10-24 10:19:14 +0200550 struct {
551 struct gsm_nm_state nm_state;
Harald Weltea5731cf2010-03-22 11:48:36 +0800552 u_int16_t nsei;
Harald Welte615e9562010-05-11 23:50:21 +0200553 uint8_t timer[7];
Harald Welte55dd4432009-10-24 10:19:14 +0200554 } nse;
555 struct {
556 struct gsm_nm_state nm_state;
Harald Welte97a282b2010-03-14 15:37:43 +0800557 u_int16_t bvci;
Harald Welte615e9562010-05-11 23:50:21 +0200558 uint8_t timer[11];
Harald Welte55dd4432009-10-24 10:19:14 +0200559 } cell;
560 struct gsm_bts_gprs_nsvc nsvc[2];
Harald Welte97a282b2010-03-14 15:37:43 +0800561 u_int8_t rac;
Harald Welte55dd4432009-10-24 10:19:14 +0200562 } gprs;
Holger Hans Peter Freyther95c22902010-04-25 23:08:39 +0800563
564 /* RACH NM values */
565 int rach_b_thresh;
566 int rach_ldavg_slots;
Harald Weltebbcc7a52009-02-14 19:45:44 +0000567
Harald Welte52b1f982008-12-23 20:25:15 +0000568 /* transceivers */
569 int num_trx;
Harald Weltee441d9c2009-06-21 16:17:15 +0200570 struct llist_head trx_list;
Harald Welte52b1f982008-12-23 20:25:15 +0000571};
572
Harald Welte24ff6ee2009-12-22 00:41:05 +0100573/* Some statistics of our network */
574struct gsmnet_stats {
575 struct {
Harald Welteffa55a42009-12-22 19:07:32 +0100576 struct counter *total;
577 struct counter *no_channel;
Harald Welte24ff6ee2009-12-22 00:41:05 +0100578 } chreq;
579 struct {
Harald Welteffa55a42009-12-22 19:07:32 +0100580 struct counter *attempted;
581 struct counter *no_channel; /* no channel available */
582 struct counter *timeout; /* T3103 timeout */
583 struct counter *completed; /* HO COMPL received */
584 struct counter *failed; /* HO FAIL received */
Harald Welte24ff6ee2009-12-22 00:41:05 +0100585 } handover;
586 struct {
Harald Welteffa55a42009-12-22 19:07:32 +0100587 struct counter *attach;
588 struct counter *normal;
589 struct counter *periodic;
590 struct counter *detach;
Harald Welte24ff6ee2009-12-22 00:41:05 +0100591 } loc_upd_type;
592 struct {
Harald Welteffa55a42009-12-22 19:07:32 +0100593 struct counter *reject;
594 struct counter *accept;
Harald Welte24ff6ee2009-12-22 00:41:05 +0100595 } loc_upd_resp;
596 struct {
Harald Welteffa55a42009-12-22 19:07:32 +0100597 struct counter *attempted;
598 struct counter *detached;
599 struct counter *completed;
600 struct counter *expired;
Harald Welte24ff6ee2009-12-22 00:41:05 +0100601 } paging;
602 struct {
Harald Welteffa55a42009-12-22 19:07:32 +0100603 struct counter *submitted; /* MO SMS submissions */
604 struct counter *no_receiver;
605 struct counter *delivered; /* MT SMS deliveries */
606 struct counter *rp_err_mem;
607 struct counter *rp_err_other;
Harald Welte24ff6ee2009-12-22 00:41:05 +0100608 } sms;
609 struct {
Harald Welteffa55a42009-12-22 19:07:32 +0100610 struct counter *dialled; /* total number of dialled calls */
611 struct counter *alerted; /* we alerted the other end */
612 struct counter *connected;/* how many calls were accepted */
Harald Welte24ff6ee2009-12-22 00:41:05 +0100613 } call;
Holger Hans Peter Freyther3ba36d52010-04-17 06:48:29 +0200614 struct {
615 struct counter *rf_fail;
616 struct counter *rll_err;
617 } chan;
Holger Hans Peter Freytherbb110f92010-04-12 10:45:52 +0200618 struct {
619 struct counter *oml_fail;
620 struct counter *rsl_fail;
621 } bts;
Harald Welte24ff6ee2009-12-22 00:41:05 +0100622};
623
Harald Welte (local)69de3972009-08-12 14:42:23 +0200624enum gsm_auth_policy {
625 GSM_AUTH_POLICY_CLOSED, /* only subscribers authorized in DB */
626 GSM_AUTH_POLICY_ACCEPT_ALL, /* accept everyone, even if not authorized in DB */
627 GSM_AUTH_POLICY_TOKEN, /* accept first, send token per sms, then revoke authorization */
628};
629
Harald Welteb84ddfc2009-12-01 17:36:54 +0530630#define GSM_T3101_DEFAULT 10
631#define GSM_T3113_DEFAULT 60
632
Harald Welte52b1f982008-12-23 20:25:15 +0000633struct gsm_network {
634 /* global parameters */
Harald Welteb84e2f42008-12-28 23:42:04 +0000635 u_int16_t country_code;
636 u_int16_t network_code;
Harald Weltec6ba9c22008-12-30 18:01:02 +0000637 char *name_long;
638 char *name_short;
Harald Welte (local)69de3972009-08-12 14:42:23 +0200639 enum gsm_auth_policy auth_policy;
Harald Welte1085c092009-11-18 20:33:19 +0100640 enum gsm48_reject_value reject_cause;
Harald Welte4381cfe2009-08-30 15:47:06 +0900641 int a5_encryption;
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100642 int neci;
Harald Welte648b6ce2009-12-14 09:00:24 +0100643 int send_mm_info;
Harald Weltebc814502009-12-19 21:41:52 +0100644 struct {
645 int active;
Harald Weltef7c28b02009-12-21 13:30:17 +0100646 /* Window RXLEV averaging */
647 unsigned int win_rxlev_avg; /* number of SACCH frames */
648 /* Window RXQUAL averaging */
649 unsigned int win_rxqual_avg; /* number of SACCH frames */
650 /* Window RXLEV neighbouring cells averaging */
651 unsigned int win_rxlev_avg_neigh; /* number of SACCH frames */
652
653 /* how often should we check for power budget HO */
654 unsigned int pwr_interval; /* SACCH frames */
655 /* how much better does a neighbor cell have to be ? */
656 unsigned int pwr_hysteresis; /* dBm */
657 /* maximum distacne before we try a handover */
658 unsigned int max_distance; /* TA values */
Harald Weltebc814502009-12-19 21:41:52 +0100659 } handover;
Harald Welte52b1f982008-12-23 20:25:15 +0000660
Harald Welte24ff6ee2009-12-22 00:41:05 +0100661 struct gsmnet_stats stats;
662
Harald Welte4bfdfe72009-06-10 23:11:52 +0800663 /* layer 4 */
664 int (*mncc_recv) (struct gsm_network *net, int msg_type, void *arg);
665 struct llist_head upqueue;
666 struct llist_head trans_list;
Holger Hans Peter Freytherabcddf12010-06-14 18:20:15 +0800667 struct bsc_api *bsc_api;
Harald Welte4bfdfe72009-06-10 23:11:52 +0800668
Harald Welte52b1f982008-12-23 20:25:15 +0000669 unsigned int num_bts;
Harald Weltee441d9c2009-06-21 16:17:15 +0200670 struct llist_head bts_list;
Holger Hans Peter Freytherc4d88ad2009-11-21 21:18:38 +0100671
672 /* timer values */
673 int T3101;
Holger Hans Peter Freyther23975e72009-11-21 21:42:26 +0100674 int T3103;
675 int T3105;
676 int T3107;
677 int T3109;
678 int T3111;
679 int T3113;
680 int T3115;
681 int T3117;
682 int T3119;
683 int T3141;
Harald Welteeab84a12009-12-13 10:53:12 +0100684
685 /* Radio Resource Location Protocol (TS 04.31) */
686 struct {
687 enum rrlp_mode mode;
688 } rrlp;
Holger Hans Peter Freytherca999a92010-06-15 18:52:38 +0800689 int msc_prio;
Harald Welte52b1f982008-12-23 20:25:15 +0000690};
691
Harald Welte7e310b12009-03-30 20:56:32 +0000692#define SMS_HDR_SIZE 128
693#define SMS_TEXT_SIZE 256
694struct gsm_sms {
Harald Welted409be72009-11-07 00:06:19 +0900695 unsigned long long id;
Harald Welte7e310b12009-03-30 20:56:32 +0000696 struct gsm_subscriber *sender;
697 struct gsm_subscriber *receiver;
698
Harald Welteb9c758b2009-07-05 14:02:46 +0200699 unsigned long validity_minutes;
Harald Welte76042182009-08-08 16:03:15 +0200700 u_int8_t reply_path_req;
701 u_int8_t status_rep_req;
702 u_int8_t ud_hdr_ind;
703 u_int8_t protocol_id;
704 u_int8_t data_coding_scheme;
705 u_int8_t msg_ref;
706 char dest_addr[20+1]; /* DA LV is 12 bytes max, i.e. 10 bytes
707 * BCD == 20 bytes string */
708 u_int8_t user_data_len;
709 u_int8_t user_data[SMS_TEXT_SIZE];
Harald Weltef3efc592009-07-27 20:11:35 +0200710
Harald Welte7e310b12009-03-30 20:56:32 +0000711 char text[SMS_TEXT_SIZE];
712};
713
Harald Welte3606cc52009-12-05 15:13:22 +0530714
Harald Weltee441d9c2009-06-21 16:17:15 +0200715struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_code,
Harald Welte4bfdfe72009-06-10 23:11:52 +0800716 int (*mncc_recv)(struct gsm_network *, int, void *));
Harald Weltee441d9c2009-06-21 16:17:15 +0200717struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type,
718 u_int8_t tsc, u_int8_t bsic);
719struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);
Harald Welte39315c42010-01-10 18:01:52 +0100720int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);
Harald Weltee441d9c2009-06-21 16:17:15 +0200721
722struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);
Harald Welte84874c92009-12-14 22:33:02 +0100723
724/* Get reference to a neighbor cell on a given BCCH ARFCN */
Harald Welte0b121032009-12-15 00:21:31 +0100725struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
726 u_int16_t arfcn, u_int8_t bsic);
Harald Welte84874c92009-12-14 22:33:02 +0100727
Harald Weltee441d9c2009-06-21 16:17:15 +0200728struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num);
Harald Welte8470bf22008-12-25 23:28:35 +0000729
Harald Weltea72c98e2009-01-04 16:10:38 +0000730const char *gsm_pchan_name(enum gsm_phys_chan_config c);
Harald Welte65da9122009-08-07 00:32:22 +0200731enum gsm_phys_chan_config gsm_pchan_parse(const char *name);
Harald Welte (local)ccd88452009-12-27 18:05:25 +0100732const char *gsm_lchant_name(enum gsm_chan_t c);
Harald Weltea72c98e2009-01-04 16:10:38 +0000733const char *gsm_chreq_name(enum gsm_chreq_reason_t c);
Harald Welte (local)d48f4eb2009-12-28 23:14:22 +0100734char *gsm_trx_name(struct gsm_bts_trx *trx);
Harald Welte23a68632009-02-19 17:06:42 +0000735char *gsm_ts_name(struct gsm_bts_trx_ts *ts);
Harald Welte (local)19ef62a2009-12-27 18:16:36 +0100736char *gsm_lchan_name(struct gsm_lchan *lchan);
Harald Welte1887f9d2009-12-29 10:52:38 +0100737const char *gsm_lchans_name(enum gsm_lchan_state s);
Harald Weltea72c98e2009-01-04 16:10:38 +0000738
Harald Weltead384642008-12-26 10:20:07 +0000739enum gsm_e1_event {
740 EVT_E1_NONE,
Harald Welte1fa60c82009-02-09 18:13:26 +0000741 EVT_E1_TEI_UP,
742 EVT_E1_TEI_DN,
Harald Weltead384642008-12-26 10:20:07 +0000743};
744
Harald Weltecd06bfb2009-02-10 17:33:56 +0000745void set_ts_e1link(struct gsm_bts_trx_ts *ts, u_int8_t e1_nr,
746 u_int8_t e1_ts, u_int8_t e1_ts_ss);
Harald Welte1d014a52009-08-08 15:38:29 +0200747enum gsm_bts_type parse_btstype(const char *arg);
Holger Hans Peter Freyther2dceae62009-06-12 17:39:38 +0200748const char *btstype2str(enum gsm_bts_type type);
Harald Welte6e670aa2010-01-07 20:44:32 +0100749struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr);
Harald Weltebe991492009-05-23 13:56:40 +0000750struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
751 struct gsm_bts *start_bts);
Harald Welte32201c12009-03-10 12:15:10 +0000752
Andreas Eversberg8226fa72009-06-29 15:19:38 +0200753extern void *tall_bsc_ctx;
Harald Weltef88c8a02009-12-20 13:48:15 +0100754extern int ipacc_rtp_direct;
Harald Welte2cf161b2009-06-20 22:36:41 +0200755
Harald Welte32201c12009-03-10 12:15:10 +0000756static inline int is_ipaccess_bts(struct gsm_bts *bts)
757{
758 switch (bts->type) {
Mike Habene2d82272009-10-02 12:19:34 +0100759 case GSM_BTS_TYPE_NANOBTS:
Harald Welte32201c12009-03-10 12:15:10 +0000760 return 1;
761 default:
762 break;
763 }
764 return 0;
765}
766
Harald Welte5b570672009-08-10 10:08:01 +0200767static inline int is_siemens_bts(struct gsm_bts *bts)
768{
769 switch (bts->type) {
770 case GSM_BTS_TYPE_BS11:
771 return 1;
772 default:
773 break;
774 }
775
776 return 0;
777}
778
Harald Welte (local)69de3972009-08-12 14:42:23 +0200779
780enum gsm_auth_policy gsm_auth_policy_parse(const char *arg);
781const char *gsm_auth_policy_name(enum gsm_auth_policy policy);
782
Harald Welteeab84a12009-12-13 10:53:12 +0100783enum rrlp_mode rrlp_mode_parse(const char *arg);
784const char *rrlp_mode_name(enum rrlp_mode mode);
785
Harald Welte4511d892010-04-18 15:51:20 +0200786enum bts_gprs_mode bts_gprs_mode_parse(const char *arg);
787const char *bts_gprs_mode_name(enum bts_gprs_mode mode);
788
Holger Hans Peter Freyther2d501ea2009-11-11 11:54:24 +0100789void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked);
790
Harald Welte97a282b2010-03-14 15:37:43 +0800791int gsm48_ra_id_by_bts(u_int8_t *buf, struct gsm_bts *bts);
792void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts);
Harald Welted12b0fd2009-12-15 21:36:05 +0100793struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan);
794
Harald Weltef3d8e922010-06-14 22:44:42 +0200795int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat);
796int gsm_bts_has_feature(struct gsm_bts *bts, enum gsm_bts_features feat);
Harald Weltefbda4e12010-03-04 11:04:52 +0100797int gsm_bts_model_register(struct gsm_bts_model *model);
798
Holger Hans Peter Freyther2412a072010-06-28 15:47:12 +0800799struct gsm_subscriber_connection *subscr_con_allocate(struct gsm_lchan *lchan);
800void subscr_con_free(struct gsm_subscriber_connection *conn);
801
Harald Welte52b1f982008-12-23 20:25:15 +0000802#endif