blob: e3e3a407ff39fdf3c5d31289647fffc70762c9d4 [file] [log] [blame]
Harald Welte52b1f982008-12-23 20:25:15 +00001/* A hackish minimal BSC (+MSC +HLR) implementation */
2
Harald Welte32201c12009-03-10 12:15:10 +00003/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
Holger Freyther219518d2009-01-02 22:04:43 +00004 * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
Harald Welte52b1f982008-12-23 20:25:15 +00005 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 */
22
Harald Weltef6b7a902008-12-26 00:05:11 +000023#include <unistd.h>
24#include <stdlib.h>
25#include <stdio.h>
26#include <stdarg.h>
27#include <time.h>
28#include <string.h>
Harald Weltead384642008-12-26 10:20:07 +000029#include <errno.h>
Harald Welted1252502009-01-01 01:50:32 +000030#include <signal.h>
Holger Freyther9a3ee0f2009-01-02 00:40:15 +000031#include <fcntl.h>
32#include <sys/stat.h>
Harald Welte52b1f982008-12-23 20:25:15 +000033
Holger Freytherb332f612008-12-27 12:46:51 +000034#define _GNU_SOURCE
35#include <getopt.h>
36
Harald Welte255539c2008-12-28 02:26:27 +000037#include <openbsc/db.h>
38#include <openbsc/timer.h>
Harald Welte8470bf22008-12-25 23:28:35 +000039#include <openbsc/gsm_data.h>
Harald Welte255539c2008-12-28 02:26:27 +000040#include <openbsc/gsm_04_08.h>
Harald Weltead384642008-12-26 10:20:07 +000041#include <openbsc/select.h>
Harald Welte8470bf22008-12-25 23:28:35 +000042#include <openbsc/abis_rsl.h>
43#include <openbsc/abis_nm.h>
Harald Welte702d8702008-12-26 20:25:35 +000044#include <openbsc/debug.h>
Holger Freyther5677ae32008-12-27 09:41:03 +000045#include <openbsc/misdn.h>
Holger Freyther219518d2009-01-02 22:04:43 +000046#include <openbsc/telnet_interface.h>
Harald Welte38c2f132009-01-06 23:10:57 +000047#include <openbsc/paging.h>
Harald Welte1fa60c82009-02-09 18:13:26 +000048#include <openbsc/e1_input.h>
Harald Welteb4630602009-05-01 15:43:22 +000049#include <openbsc/signal.h>
Harald Welte2cf161b2009-06-20 22:36:41 +020050#include <openbsc/talloc.h>
51
52void *tall_bsc_ctx;
Harald Welte52b1f982008-12-23 20:25:15 +000053
54/* global pointer to the gsm network data structure */
Harald Welte879c85a2009-05-01 15:00:20 +000055static struct gsm_network *gsmnet;
Harald Welte52b1f982008-12-23 20:25:15 +000056
Holger Freytherefde7fb2008-12-28 14:14:56 +000057/* MCC and MNC for the Location Area Identifier */
58static int MCC = 1;
59static int MNC = 1;
Holger Freyther0a173bf2009-04-22 22:07:07 +000060static int LAC = 1;
Harald Welte98981882009-01-06 18:59:11 +000061static int ARFCN = HARDCODED_ARFCN;
Holger Freytherdda22c12009-04-22 22:07:31 +000062static int cardnr = 0;
Holger Freytherb5c00f52009-04-22 22:08:07 +000063static int release_l2 = 0;
Harald Welte8c1d0e42009-02-15 03:38:12 +000064static enum gsm_bts_type BTS_TYPE = GSM_BTS_TYPE_BS11;
Harald Weltefcd24452009-06-20 18:15:19 +020065static enum gsm_band BAND = GSM_BAND_900;
Holger Freytherbde36102008-12-28 22:51:39 +000066static const char *database_name = "hlr.sqlite3";
Holger Freytherefde7fb2008-12-28 14:14:56 +000067
Harald Welte52b1f982008-12-23 20:25:15 +000068/* The following definitions are for OM and NM packets that we cannot yet
69 * generate by code but we just pass on */
70
71// BTS Site Manager, SET ATTRIBUTES
72
73/*
74 Object Class: BTS Site Manager
75 Instance 1: FF
76 Instance 2: FF
77 Instance 3: FF
78SET ATTRIBUTES
79 sAbisExternalTime: 2007/09/08 14:36:11
80 omLAPDRelTimer: 30sec
81 shortLAPDIntTimer: 5sec
82 emergencyTimer1: 10 minutes
83 emergencyTimer2: 0 minutes
84*/
85
86unsigned char msg_1[] =
87{
Harald Weltea865f1b2009-06-20 10:42:17 +020088 NM_MT_BS11_SET_ATTR, NM_OC_SITE_MANAGER, 0xFF, 0xFF, 0xFF,
Harald Welte110c0ab2009-05-23 16:27:05 +000089 NM_ATT_BS11_ABIS_EXT_TIME, 0x07,
90 0xD7, 0x09, 0x08, 0x0E, 0x24, 0x0B, 0xCE,
91 0x02,
92 0x00, 0x1E,
93 NM_ATT_BS11_SH_LAPD_INT_TIMER,
94 0x01, 0x05,
Harald Weltecd993872009-02-15 16:16:28 +000095 0x42, 0x02, 0x00, 0x0A,
96 0x44, 0x02, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +000097};
98
99// BTS, SET BTS ATTRIBUTES
100
101/*
102 Object Class: BTS
103 BTS relat. Number: 0
104 Instance 2: FF
105 Instance 3: FF
106SET BTS ATTRIBUTES
107 bsIdentityCode / BSIC:
108 PLMN_colour_code: 7h
109 BS_colour_code: 7h
110 BTS Air Timer T3105: 4 ,unit 10 ms
111 btsIsHopping: FALSE
Harald Welte83282292009-02-01 16:22:19 +0000112 periodCCCHLoadIndication: 1sec
Holger Freyther3b910432009-02-11 00:43:48 +0000113 thresholdCCCHLoadIndication: 0%
Harald Welte52b1f982008-12-23 20:25:15 +0000114 cellAllocationNumber: 00h = GSM 900
115 enableInterferenceClass: 00h = Disabled
116 fACCHQual: 6 (FACCH stealing flags minus 1)
117 intaveParameter: 31 SACCH multiframes
118 interferenceLevelBoundaries:
119 Interference Boundary 1: 0Ah
120 Interference Boundary 2: 0Fh
121 Interference Boundary 3: 14h
122 Interference Boundary 4: 19h
123 Interference Boundary 5: 1Eh
124 mSTxPwrMax: 11
125 GSM range: 2=39dBm, 15=13dBm, stepsize 2 dBm
126 DCS1800 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
127 PCS1900 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
128 30=33dBm, 31=32dBm
129 ny1:
130 Maximum number of repetitions for PHYSICAL INFORMATION message (GSM 04.08): 20
131 powerOutputThresholds:
132 Out Power Fault Threshold: -10 dB
133 Red Out Power Threshold: - 6 dB
134 Excessive Out Power Threshold: 5 dB
135 rACHBusyThreshold: -127 dBm
136 rACHLoadAveragingSlots: 250 ,number of RACH burst periods
137 rfResourceIndicationPeriod: 125 SACCH multiframes
138 T200:
139 SDCCH: 044 in 5 ms
140 FACCH/Full rate: 031 in 5 ms
141 FACCH/Half rate: 041 in 5 ms
142 SACCH with TCH SAPI0: 090 in 10 ms
143 SACCH with SDCCH: 090 in 10 ms
144 SDCCH with SAPI3: 090 in 5 ms
145 SACCH with TCH SAPI3: 135 in 10 ms
146 tSync: 9000 units of 10 msec
147 tTrau: 9000 units of 10 msec
148 enableUmLoopTest: 00h = disabled
149 enableExcessiveDistance: 00h = Disabled
150 excessiveDistance: 64km
151 hoppingMode: 00h = baseband hopping
152 cellType: 00h = Standard Cell
153 BCCH ARFCN / bCCHFrequency: 1
154*/
155
Harald Weltea865f1b2009-06-20 10:42:17 +0200156static unsigned char bs11_attr_bts[] =
Harald Welte52b1f982008-12-23 20:25:15 +0000157{
Harald Welte060f6df2009-05-23 17:50:53 +0000158 NM_ATT_BSIC, HARDCODED_BSIC,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000159 NM_ATT_BTS_AIR_TIMER, 0x04,
Harald Weltecd993872009-02-15 16:16:28 +0000160 NM_ATT_BS11_BTSLS_HOPPING, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000161 NM_ATT_CCCH_L_I_P, 0x01,
162 NM_ATT_CCCH_L_T, 0x00,
Harald Welte7b26bcb2009-05-28 11:39:21 +0000163 NM_ATT_BS11_CELL_ALLOC_NR, NM_BS11_CANR_GSM,
164 NM_ATT_BS11_ENA_INTERF_CLASS, 0x01,
Harald Weltecd993872009-02-15 16:16:28 +0000165 NM_ATT_BS11_FACCH_QUAL, 0x06,
Harald Weltefe609d82009-05-23 18:14:31 +0000166 /* interference avg. period in numbers of SACCH multifr */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000167 NM_ATT_INTAVE_PARAM, 0x1F,
168 NM_ATT_INTERF_BOUND, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x7B,
169 NM_ATT_CCCH_L_T, 0x23,
170 NM_ATT_GSM_TIME, 0x28, 0x00,
171 NM_ATT_ADM_STATE, 0x03,
172 NM_ATT_RACH_B_THRESH, 0x7F,
173 NM_ATT_LDAVG_SLOTS, 0x00, 0xFA,
Harald Weltecd993872009-02-15 16:16:28 +0000174 NM_ATT_BS11_RF_RES_IND_PER, 0x7D,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000175 NM_ATT_T200, 0x2C, 0x1F, 0x29, 0x5A, 0x5A, 0x5A, 0x87,
Harald Weltecd993872009-02-15 16:16:28 +0000176 NM_ATT_BS11_TSYNC, 0x23, 0x28,
177 NM_ATT_BS11_TTRAU, 0x23, 0x28,
178 NM_ATT_TEST_DUR, 0x01, 0x00,
179 NM_ATT_OUTST_ALARM, 0x01, 0x00,
180 NM_ATT_BS11_EXCESSIVE_DISTANCE, 0x01, 0x40,
181 NM_ATT_BS11_HOPPING_MODE, 0x01, 0x00,
182 NM_ATT_BS11_PLL, 0x01, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000183 NM_ATT_BCCH_ARFCN, 0x00, HARDCODED_ARFCN/*0x01*/,
Harald Welte52b1f982008-12-23 20:25:15 +0000184};
185
186// Handover Recognition, SET ATTRIBUTES
187
188/*
189Illegal Contents GSM Formatted O&M Msg
190 Object Class: Handover Recognition
191 BTS relat. Number: 0
192 Instance 2: FF
193 Instance 3: FF
194SET ATTRIBUTES
195 enableDelayPowerBudgetHO: 00h = Disabled
196 enableDistanceHO: 00h = Disabled
197 enableInternalInterCellHandover: 00h = Disabled
198 enableInternalIntraCellHandover: 00h = Disabled
199 enablePowerBudgetHO: 00h = Disabled
200 enableRXLEVHO: 00h = Disabled
201 enableRXQUALHO: 00h = Disabled
202 hoAveragingDistance: 8 SACCH multiframes
203 hoAveragingLev:
204 A_LEV_HO: 8 SACCH multiframes
205 W_LEV_HO: 1 SACCH multiframes
206 hoAveragingPowerBudget: 16 SACCH multiframes
207 hoAveragingQual:
208 A_QUAL_HO: 8 SACCH multiframes
209 W_QUAL_HO: 2 SACCH multiframes
210 hoLowerThresholdLevDL: (10 - 110) dBm
211 hoLowerThresholdLevUL: (5 - 110) dBm
212 hoLowerThresholdQualDL: 06h = 6.4% < BER < 12.8%
213 hoLowerThresholdQualUL: 06h = 6.4% < BER < 12.8%
214 hoThresholdLevDLintra : (20 - 110) dBm
215 hoThresholdLevULintra: (20 - 110) dBm
216 hoThresholdMsRangeMax: 20 km
217 nCell: 06h
218 timerHORequest: 3 ,unit 2 SACCH multiframes
219*/
220
221unsigned char msg_3[] =
222{
Harald Weltea865f1b2009-06-20 10:42:17 +0200223 NM_MT_BS11_SET_ATTR, NM_OC_BS11_HANDOVER, 0x00, 0xFF, 0xFF,
Harald Weltecd993872009-02-15 16:16:28 +0000224 0xD0, 0x00,
225 0x64, 0x00,
226 0x67, 0x00,
227 0x68, 0x00,
228 0x6A, 0x00,
229 0x6C, 0x00,
230 0x6D, 0x00,
231 0x6F, 0x08,
232 0x70, 0x08, 0x01,
233 0x71, 0x10, 0x10, 0x10,
234 0x72, 0x08, 0x02,
235 0x73, 0x0A,
236 0x74, 0x05,
237 0x75, 0x06,
238 0x76, 0x06,
239 0x78, 0x14,
240 0x79, 0x14,
241 0x7A, 0x14,
242 0x7D, 0x06,
243 0x92, 0x03, 0x20, 0x01, 0x00,
244 0x45, 0x01, 0x00,
245 0x48, 0x01, 0x00,
246 0x5A, 0x01, 0x00,
247 0x5B, 0x01, 0x05,
248 0x5E, 0x01, 0x1A,
249 0x5F, 0x01, 0x20,
250 0x9D, 0x01, 0x00,
251 0x47, 0x01, 0x00,
252 0x5C, 0x01, 0x64,
253 0x5D, 0x01, 0x1E,
254 0x97, 0x01, 0x20,
255 0xF7, 0x01, 0x3C,
Harald Welte52b1f982008-12-23 20:25:15 +0000256};
257
258// Power Control, SET ATTRIBUTES
259
260/*
261 Object Class: Power Control
262 BTS relat. Number: 0
263 Instance 2: FF
264 Instance 3: FF
265SET ATTRIBUTES
266 enableMsPowerControl: 00h = Disabled
267 enablePowerControlRLFW: 00h = Disabled
268 pcAveragingLev:
269 A_LEV_PC: 4 SACCH multiframes
270 W_LEV_PC: 1 SACCH multiframes
271 pcAveragingQual:
272 A_QUAL_PC: 4 SACCH multiframes
273 W_QUAL_PC: 2 SACCH multiframes
274 pcLowerThresholdLevDL: 0Fh
275 pcLowerThresholdLevUL: 0Ah
276 pcLowerThresholdQualDL: 05h = 3.2% < BER < 6.4%
277 pcLowerThresholdQualUL: 05h = 3.2% < BER < 6.4%
278 pcRLFThreshold: 0Ch
279 pcUpperThresholdLevDL: 14h
280 pcUpperThresholdLevUL: 0Fh
281 pcUpperThresholdQualDL: 04h = 1.6% < BER < 3.2%
282 pcUpperThresholdQualUL: 04h = 1.6% < BER < 3.2%
283 powerConfirm: 2 ,unit 2 SACCH multiframes
284 powerControlInterval: 2 ,unit 2 SACCH multiframes
285 powerIncrStepSize: 02h = 4 dB
286 powerRedStepSize: 01h = 2 dB
287 radioLinkTimeoutBs: 64 SACCH multiframes
288 enableBSPowerControl: 00h = disabled
289*/
290
291unsigned char msg_4[] =
292{
Harald Weltea865f1b2009-06-20 10:42:17 +0200293 NM_MT_BS11_SET_ATTR, NM_OC_BS11_PWR_CTRL, 0x00, 0xFF, 0xFF,
Harald Weltecd993872009-02-15 16:16:28 +0000294 NM_ATT_BS11_ENA_MS_PWR_CTRL, 0x00,
295 NM_ATT_BS11_ENA_PWR_CTRL_RLFW, 0x00,
296 0x7E, 0x04, 0x01,
297 0x7F, 0x04, 0x02,
298 0x80, 0x0F,
299 0x81, 0x0A,
300 0x82, 0x05,
301 0x83, 0x05,
302 0x84, 0x0C,
303 0x85, 0x14,
304 0x86, 0x0F,
305 0x87, 0x04,
306 0x88, 0x04,
307 0x89, 0x02,
308 0x8A, 0x02,
309 0x8B, 0x02,
310 0x8C, 0x01,
311 0x8D, 0x40,
312 0x65, 0x01, 0x00 // set to 0x01 to enable BSPowerControl
Harald Welte52b1f982008-12-23 20:25:15 +0000313};
314
315
316// Transceiver, SET TRX ATTRIBUTES (TRX 0)
317
318/*
319 Object Class: Transceiver
320 BTS relat. Number: 0
321 Tranceiver number: 0
322 Instance 3: FF
323SET TRX ATTRIBUTES
324 aRFCNList (HEX): 0001
Harald Weltecd993872009-02-15 16:16:28 +0000325 txPwrMaxReduction: 00h = 30dB
Harald Welte52b1f982008-12-23 20:25:15 +0000326 radioMeasGran: 254 SACCH multiframes
327 radioMeasRep: 01h = enabled
328 memberOfEmergencyConfig: 01h = TRUE
329 trxArea: 00h = TRX doesn't belong to a concentric cell
330*/
331
Harald Weltea865f1b2009-06-20 10:42:17 +0200332static unsigned char bs11_attr_radio[] =
Harald Welte52b1f982008-12-23 20:25:15 +0000333{
Harald Weltecd993872009-02-15 16:16:28 +0000334 NM_ATT_ARFCN_LIST, 0x01, 0x00, HARDCODED_ARFCN /*0x01*/,
Harald Welte311d0cf2009-02-17 17:45:59 +0000335 NM_ATT_RF_MAXPOWR_R, 0x00,
Harald Weltecd993872009-02-15 16:16:28 +0000336 NM_ATT_BS11_RADIO_MEAS_GRAN, 0x01, 0xFE,
337 NM_ATT_BS11_RADIO_MEAS_REP, 0x01, 0x01,
338 NM_ATT_BS11_EMRG_CFG_MEMBER, 0x01, 0x01,
339 NM_ATT_BS11_TRX_AREA, 0x01, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000340};
341
Harald Welte8c1d0e42009-02-15 03:38:12 +0000342static unsigned char nanobts_attr_bts[] = {
343 NM_ATT_INTERF_BOUND, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73,
Harald Weltefe609d82009-05-23 18:14:31 +0000344 /* interference avg. period in numbers of SACCH multifr */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000345 NM_ATT_INTAVE_PARAM, 0x06,
Harald Welted0fbab52009-06-09 20:04:44 +0000346 /* conn fail based on SACCH error rate */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000347 NM_ATT_CONN_FAIL_CRIT, 0x00, 0x02, 0x01, 0x10,
348 NM_ATT_T200, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21, 0xa8,
349 NM_ATT_MAX_TA, 0x3f,
Harald Welte311d0cf2009-02-17 17:45:59 +0000350 NM_ATT_OVERL_PERIOD, 0x00, 0x01, 10, /* seconds */
351 NM_ATT_CCCH_L_T, 10, /* percent */
352 NM_ATT_CCCH_L_I_P, 1, /* seconds */
Harald Weltefe609d82009-05-23 18:14:31 +0000353 NM_ATT_RACH_B_THRESH, 10, /* busy threshold in - dBm */
Harald Welted0fbab52009-06-09 20:04:44 +0000354 NM_ATT_LDAVG_SLOTS, 0x03, 0xe8, /* rach load averaging 1000 slots */
Harald Weltefe609d82009-05-23 18:14:31 +0000355 NM_ATT_BTS_AIR_TIMER, 128, /* miliseconds */
356 NM_ATT_NY1, 10, /* 10 retransmissions of physical config */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000357 NM_ATT_BCCH_ARFCN, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
Harald Welte060f6df2009-05-23 17:50:53 +0000358 NM_ATT_BSIC, HARDCODED_BSIC,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000359};
Harald Welte52b1f982008-12-23 20:25:15 +0000360
Harald Welte8c1d0e42009-02-15 03:38:12 +0000361static unsigned char nanobts_attr_radio[] = {
Harald Welted0fbab52009-06-09 20:04:44 +0000362 NM_ATT_RF_MAXPOWR_R, 0x0c, /* number of -2dB reduction steps / Pn */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000363 NM_ATT_ARFCN_LIST, 0x00, 0x02, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
364};
365
Harald Welte5c1e4582009-02-15 11:57:29 +0000366static unsigned char nanobts_attr_e0[] = {
367 0x85, 0x00,
368 0x81, 0x0b, 0xbb, /* TCP PORT for RSL */
369};
370
Harald Welteb4630602009-05-01 15:43:22 +0000371/* Callback function to be called whenever we get a GSM 12.21 state change event */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000372int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
373 struct gsm_nm_state *old_state, struct gsm_nm_state *new_state)
374{
375 struct gsm_bts *bts;
376 struct gsm_bts_trx *trx;
377 struct gsm_bts_trx_ts *ts;
378
379 /* This is currently only required on nanoBTS */
380
381 switch (evt) {
382 case EVT_STATECHG_OPER:
383 switch (obj_class) {
384 case NM_OC_SITE_MANAGER:
385 bts = container_of(obj, struct gsm_bts, site_mgr);
386 if (old_state->operational != 2 && new_state->operational == 2) {
387 abis_nm_opstart(bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
388 }
389 break;
390 case NM_OC_BTS:
391 bts = obj;
392 if (new_state->availability == 5) {
393 abis_nm_set_bts_attr(bts, nanobts_attr_bts,
394 sizeof(nanobts_attr_bts));
395 abis_nm_opstart(bts, NM_OC_BTS,
Harald Welte191280d2009-05-01 13:20:04 +0000396 bts->bts_nr, 0xff, 0xff);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000397 abis_nm_chg_adm_state(bts, NM_OC_BTS,
Harald Welte191280d2009-05-01 13:20:04 +0000398 bts->bts_nr, 0xff, 0xff,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000399 NM_STATE_UNLOCKED);
400 }
401 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000402 case NM_OC_CHANNEL:
403 ts = obj;
404 trx = ts->trx;
405 if (new_state->availability == 5) {
406 if (ts->nr == 0 && trx == trx->bts->c0)
Harald Weltee1bd2412009-02-15 14:40:09 +0000407 abis_nm_set_channel_attr(ts, NM_CHANC_BCCH_CBCH);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000408 else
409 abis_nm_set_channel_attr(ts, NM_CHANC_TCHFull);
410 abis_nm_opstart(trx->bts, NM_OC_CHANNEL,
Harald Welte191280d2009-05-01 13:20:04 +0000411 trx->bts->bts_nr, trx->nr, ts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000412 abis_nm_chg_adm_state(trx->bts, NM_OC_CHANNEL,
Harald Welte191280d2009-05-01 13:20:04 +0000413 trx->bts->bts_nr, trx->nr, ts->nr,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000414 NM_STATE_UNLOCKED);
415 }
416 break;
Harald Weltea994a482009-05-01 15:54:23 +0000417 default:
Harald Welte8c1d0e42009-02-15 03:38:12 +0000418 break;
419 }
420 break;
Harald Weltea994a482009-05-01 15:54:23 +0000421 default:
422 //DEBUGP(DMM, "Unhandled state change in %s:%d\n", __func__, __LINE__);
Holger Freytherff9592f2009-03-09 16:17:14 +0000423 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000424 }
425 return 0;
426}
427
Harald Welteb4630602009-05-01 15:43:22 +0000428/* Callback function to be called every time we receive a 12.21 SW activated report */
429static int sw_activ_rep(struct msgb *mb)
430{
431 struct abis_om_fom_hdr *foh = msgb_l3(mb);
432 struct gsm_bts_trx *trx = mb->trx;
433
434 switch (foh->obj_class) {
435 case NM_OC_BASEB_TRANSC:
436 /* TRX software is active, tell it to initiate RSL Link */
437 abis_nm_ipaccess_msg(trx->bts, 0xe0, NM_OC_BASEB_TRANSC,
438 trx->bts->bts_nr, trx->nr, 0xff,
439 nanobts_attr_e0, sizeof(nanobts_attr_e0));
440 abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC,
441 trx->bts->bts_nr, trx->nr, 0xff);
442 abis_nm_chg_adm_state(trx->bts, NM_OC_BASEB_TRANSC,
443 trx->bts->bts_nr, trx->nr, 0xff,
444 NM_STATE_UNLOCKED);
445 break;
446 case NM_OC_RADIO_CARRIER:
447 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
448 sizeof(nanobts_attr_radio));
449 abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
450 trx->bts->bts_nr, trx->nr, 0xff);
451 abis_nm_chg_adm_state(trx->bts, NM_OC_RADIO_CARRIER,
452 trx->bts->bts_nr, trx->nr, 0xff,
453 NM_STATE_UNLOCKED);
454 break;
455 }
456 return 0;
457}
458
Holger Hans Peter Freyther500f3ca2009-06-10 10:48:14 +0200459/* Callback function for NACK on the OML NM */
460static int oml_msg_nack(int mt)
461{
462 if (mt == NM_MT_SET_BTS_ATTR_NACK) {
463 fprintf(stderr, "Failed to set BTS attributes. That is fatal. "
464 "Was the bts type and frequency properly specified?\n");
465 exit(-1);
466 }
467
468 return 0;
469}
470
Harald Welteb4630602009-05-01 15:43:22 +0000471/* Callback function to be called every time we receive a signal from NM */
472static int nm_sig_cb(unsigned int subsys, unsigned int signal,
473 void *handler_data, void *signal_data)
474{
475 switch (signal) {
476 case S_NM_SW_ACTIV_REP:
477 return sw_activ_rep(signal_data);
Holger Hans Peter Freyther500f3ca2009-06-10 10:48:14 +0200478 case S_NM_NACK:
479 return oml_msg_nack((int)signal_data);
Harald Welteb4630602009-05-01 15:43:22 +0000480 default:
481 break;
482 }
483 return 0;
484}
485
Harald Welte8c1d0e42009-02-15 03:38:12 +0000486static void bootstrap_om_nanobts(struct gsm_bts *bts)
487{
Harald Weltee1bd2412009-02-15 14:40:09 +0000488 /* We don't do callback based bootstrapping, but event driven (see above) */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000489}
490
491static void bootstrap_om_bs11(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000492{
Harald Weltee441d9c2009-06-21 16:17:15 +0200493 struct gsm_bts_trx *trx = bts->c0;
Harald Welte52b1f982008-12-23 20:25:15 +0000494
495 /* stop sending event reports */
496 abis_nm_event_reports(bts, 0);
497
498 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000499 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000500
Harald Welte702d8702008-12-26 20:25:35 +0000501 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000502 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte702d8702008-12-26 20:25:35 +0000503
504 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000505 abis_nm_bs11_reset_resource(bts);
Harald Welte702d8702008-12-26 20:25:35 +0000506
507 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000508 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte702d8702008-12-26 20:25:35 +0000509
Harald Welte52b1f982008-12-23 20:25:15 +0000510 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
Harald Weltea865f1b2009-06-20 10:42:17 +0200511 abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
Harald Welte52b1f982008-12-23 20:25:15 +0000512 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
513 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
514
515 /* Connect signalling of bts0/trx0 to e1_0/ts1/64kbps */
516 abis_nm_conn_terr_sign(trx, 0, 1, 0xff);
Harald Weltea865f1b2009-06-20 10:42:17 +0200517 abis_nm_set_radio_attr(trx, bs11_attr_radio, sizeof(bs11_attr_radio));
Harald Welte52b1f982008-12-23 20:25:15 +0000518
519 /* Use TEI 1 for signalling */
520 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x01);
521 abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH_CBCH);
Harald Weltecd06bfb2009-02-10 17:33:56 +0000522
523#ifdef HAVE_TRX1
Harald Welte52b1f982008-12-23 20:25:15 +0000524 /* TRX 1 */
525 abis_nm_conn_terr_sign(&bts->trx[1], 0, 1, 0xff);
526 /* FIXME: TRX ATTRIBUTE */
527 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x02);
528#endif
529
530 /* SET CHANNEL ATTRIBUTE TS1 */
Harald Welte23887b62009-02-18 03:37:20 +0000531 abis_nm_set_channel_attr(&trx->ts[1], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000532 /* Connect traffic of bts0/trx0/ts1 to e1_0/ts2/b */
533 abis_nm_conn_terr_traf(&trx->ts[1], 0, 2, 1);
534
535 /* SET CHANNEL ATTRIBUTE TS2 */
Harald Welte23887b62009-02-18 03:37:20 +0000536 abis_nm_set_channel_attr(&trx->ts[2], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000537 /* Connect traffic of bts0/trx0/ts2 to e1_0/ts2/c */
538 abis_nm_conn_terr_traf(&trx->ts[2], 0, 2, 2);
539
540 /* SET CHANNEL ATTRIBUTE TS3 */
Harald Welte23887b62009-02-18 03:37:20 +0000541 abis_nm_set_channel_attr(&trx->ts[3], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000542 /* Connect traffic of bts0/trx0/ts3 to e1_0/ts2/d */
543 abis_nm_conn_terr_traf(&trx->ts[3], 0, 2, 3);
544
545 /* SET CHANNEL ATTRIBUTE TS4 */
Harald Welte23887b62009-02-18 03:37:20 +0000546 abis_nm_set_channel_attr(&trx->ts[4], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000547 /* Connect traffic of bts0/trx0/ts4 to e1_0/ts3/a */
548 abis_nm_conn_terr_traf(&trx->ts[4], 0, 3, 0);
549
550 /* SET CHANNEL ATTRIBUTE TS5 */
Harald Welte23887b62009-02-18 03:37:20 +0000551 abis_nm_set_channel_attr(&trx->ts[5], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000552 /* Connect traffic of bts0/trx0/ts5 to e1_0/ts3/b */
553 abis_nm_conn_terr_traf(&trx->ts[5], 0, 3, 1);
554
555 /* SET CHANNEL ATTRIBUTE TS6 */
Harald Welte23887b62009-02-18 03:37:20 +0000556 abis_nm_set_channel_attr(&trx->ts[6], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000557 /* Connect traffic of bts0/trx0/ts6 to e1_0/ts3/c */
558 abis_nm_conn_terr_traf(&trx->ts[6], 0, 3, 2);
559
560 /* SET CHANNEL ATTRIBUTE TS7 */
Harald Welte23887b62009-02-18 03:37:20 +0000561 abis_nm_set_channel_attr(&trx->ts[7], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000562 /* Connect traffic of bts0/trx0/ts7 to e1_0/ts3/d */
563 abis_nm_conn_terr_traf(&trx->ts[7], 0, 3, 3);
564
565 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000566 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000567
568 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000569 abis_nm_bs11_reset_resource(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000570
571 /* restart sending event reports */
572 abis_nm_event_reports(bts, 1);
573}
574
Harald Welte8c1d0e42009-02-15 03:38:12 +0000575static void bootstrap_om(struct gsm_bts *bts)
576{
Harald Welteedb37782009-05-01 14:59:07 +0000577 fprintf(stdout, "bootstrapping OML for BTS %u\n", bts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000578
579 switch (bts->type) {
580 case GSM_BTS_TYPE_BS11:
581 bootstrap_om_bs11(bts);
582 break;
583 case GSM_BTS_TYPE_NANOBTS_900:
584 case GSM_BTS_TYPE_NANOBTS_1800:
585 bootstrap_om_nanobts(bts);
586 break;
587 default:
588 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
589 }
590}
591
Harald Welted1252502009-01-01 01:50:32 +0000592static int shutdown_om(struct gsm_bts *bts)
593{
594 /* stop sending event reports */
595 abis_nm_event_reports(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000596
Harald Welted1252502009-01-01 01:50:32 +0000597 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000598 abis_nm_bs11_db_transmission(bts, 1);
Harald Welted1252502009-01-01 01:50:32 +0000599
600 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000601 abis_nm_bs11_db_transmission(bts, 0);
Harald Welted1252502009-01-01 01:50:32 +0000602
603 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000604 abis_nm_bs11_reset_resource(bts);
Harald Welted1252502009-01-01 01:50:32 +0000605
606 return 0;
607}
608
609static int shutdown_net(struct gsm_network *net)
610{
Harald Weltee441d9c2009-06-21 16:17:15 +0200611 struct gsm_bts *bts;
612
613 llist_for_each_entry(bts, &net->bts_list, list) {
Harald Welted1252502009-01-01 01:50:32 +0000614 int rc;
Harald Weltee441d9c2009-06-21 16:17:15 +0200615 rc = shutdown_om(bts);
Harald Welted1252502009-01-01 01:50:32 +0000616 if (rc < 0)
617 return rc;
618 }
619
620 return 0;
621}
Harald Welte52b1f982008-12-23 20:25:15 +0000622
623struct bcch_info {
624 u_int8_t type;
625 u_int8_t len;
626 const u_int8_t *data;
627};
628
629/*
630SYSTEM INFORMATION TYPE 1
631 Cell channel description
632 Format-ID bit map 0
633 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
634 RACH Control Parameters
635 maximum 7 retransmissions
636 8 slots used to spread transmission
637 cell not barred for access
638 call reestablishment not allowed
639 Access Control Class = 0000
640*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000641static u_int8_t si1[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000642 /* header */0x55, 0x06, 0x19,
643 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
645 /* rach */0xD5, 0x00, 0x00,
646 /* s1 reset*/0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000647};
648
649/*
650 SYSTEM INFORMATION TYPE 2
651 Neighbour Cells Description
652 EXT-IND: Carries the complete BA
653 BA-IND = 0
654 Format-ID bit map 0
655 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
656 NCC permitted (NCC) = FF
657 RACH Control Parameters
658 maximum 7 retransmissions
659 8 slots used to spread transmission
660 cell not barred for access
661 call reestablishment not allowed
662 Access Control Class = 0000
663*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000664static u_int8_t si2[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000665 /* header */0x59, 0x06, 0x1A,
666 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
667 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
668 /* ncc */0xFF,
669 /* rach*/0xD5, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +0000670};
671
672/*
673SYSTEM INFORMATION TYPE 3
674 Cell identity = 00001 (1h)
675 Location area identification
676 Mobile Country Code (MCC): 001
677 Mobile Network Code (MNC): 01
678 Location Area Code (LAC): 00001 (1h)
679 Control Channel Description
680 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
681 0 blocks reserved for access grant
682 1 channel used for CCCH, with SDCCH
683 5 multiframes period for PAGING REQUEST
684 Time-out T3212 = 0
685 Cell Options BCCH
686 Power control indicator: not set
687 MSs shall not use uplink DTX
688 Radio link timeout = 36
689 Cell Selection Parameters
690 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
Harald Welte3b2ec422008-12-29 04:11:14 +0000691 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
Harald Welte52b1f982008-12-23 20:25:15 +0000692 Additional Reselect Parameter Indication (ACS) = only SYSTEM INFO 4: The SI rest octets, if present, shall be used to derive the value of PI and possibly C2 parameters
693 Half rate support (NECI): New establishment causes are not supported
694 min.RX signal level for MS = 0
695 RACH Control Parameters
696 maximum 7 retransmissions
697 8 slots used to spread transmission
698 cell not barred for access
699 call reestablishment not allowed
700 Access Control Class = 0000
701 SI 3 Rest Octets
702 Cell Bar Qualify (CBQ): 0
703 Cell Reselect Offset = 0 dB
704 Temporary Offset = 0 dB
705 Penalty Time = 20 s
706 System Information 2ter Indicator (2TI): 0 = not available
707 Early Classmark Sending Control (ECSC): 0 = forbidden
708 Scheduling Information is not sent in SYSTEM INFORMATION TYPE 9 on the BCCH
709*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000710static u_int8_t si3[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000711 /* header */0x49, 0x06, 0x1B,
712 /* cell */0x00, 0x01,
713 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
714 /* desc */0x01, 0x03, 0x00,
715 /* option*/0x28,
716 /* selection*/0x62, 0x00,
717 /* rach */0xD5, 0x00, 0x00,
718 /* reset*/0x80, 0x00, 0x00, 0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000719};
720
721/*
722SYSTEM INFORMATION TYPE 4
723 Location area identification
724 Mobile Country Code (MCC): 001
725 Mobile Network Code (MNC): 01
726 Location Area Code (LAC): 00001 (1h)
727 Cell Selection Parameters
728 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
729 max.TX power level MS may use for CCH = 2
730 Additional Reselect Parameter Indication (ACS) = only SYSTEM INFO 4: The SI rest octets, if present, shall be used to derive the value of PI and possibly C2 parameters
731 Half rate support (NECI): New establishment causes are not supported
732 min.RX signal level for MS = 0
733 RACH Control Parameters
734 maximum 7 retransmissions
735 8 slots used to spread transmission
736 cell not barred for access
737 call reestablishment not allowed
738 Access Control Class = 0000
739 Channel Description
740 Type = SDCCH/4[2]
741 Timeslot Number: 0
742 Training Sequence Code: 7h
743 ARFCN: 1
744 SI Rest Octets
745 Cell Bar Qualify (CBQ): 0
746 Cell Reselect Offset = 0 dB
747 Temporary Offset = 0 dB
748 Penalty Time = 20 s
749*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000750static u_int8_t si4[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000751 /* header */0x41, 0x06, 0x1C,
752 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
753 /* sel */0x62, 0x00,
754 /* rach*/0xD5, 0x00, 0x00,
755 /* var */0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/, 0x80, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000756 0x2B, 0x2B, 0x2B
757};
758
759/*
760 SYSTEM INFORMATION TYPE 5
761 Neighbour Cells Description
762 EXT-IND: Carries the complete BA
763 BA-IND = 0
764 Format-ID bit map 0
765 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
766*/
767
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000768static u_int8_t si5[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000769 /* header without l2 len*/0x06, 0x1D,
770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000772};
773
774// SYSTEM INFORMATION TYPE 6
775
776/*
777SACCH FILLING
778 System Info Type: SYSTEM INFORMATION 6
779 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
780
781SYSTEM INFORMATION TYPE 6
782 Cell identity = 00001 (1h)
783 Location area identification
784 Mobile Country Code (MCC): 001
785 Mobile Network Code (MNC): 01
786 Location Area Code (LAC): 00001 (1h)
787 Cell Options SACCH
788 Power control indicator: not set
789 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
790 Radio link timeout = 36
791 NCC permitted (NCC) = FF
792*/
793
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000794static u_int8_t si6[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000795 /* header */0x06, 0x1E,
796 /* cell id*/ 0x00, 0x01,
797 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
798 /* options */ 0x28,
799 /* ncc */ 0xFF,
Harald Welte52b1f982008-12-23 20:25:15 +0000800};
801
802
803
804static const struct bcch_info bcch_infos[] = {
805 {
806 .type = RSL_SYSTEM_INFO_1,
807 .len = sizeof(si1),
808 .data = si1,
809 }, {
810 .type = RSL_SYSTEM_INFO_2,
811 .len = sizeof(si2),
812 .data = si2,
813 }, {
814 .type = RSL_SYSTEM_INFO_3,
815 .len = sizeof(si3),
816 .data = si3,
817 }, {
818 .type = RSL_SYSTEM_INFO_4,
819 .len = sizeof(si4),
820 .data = si4,
821 },
822};
823
Holger Freyther24287b62008-12-28 16:32:41 +0000824static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
825static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
826static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
827static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
Harald Welte104604e2008-12-28 16:36:11 +0000828static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
829static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
Holger Freyther24287b62008-12-28 16:32:41 +0000830
Harald Welte52b1f982008-12-23 20:25:15 +0000831/* set all system information types */
Harald Weltee79769b2009-02-07 00:48:17 +0000832static int set_system_infos(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000833{
834 int i;
835
836 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
Harald Weltee79769b2009-02-07 00:48:17 +0000837 rsl_bcch_info(trx, bcch_infos[i].type,
Harald Welte52b1f982008-12-23 20:25:15 +0000838 bcch_infos[i].data,
839 bcch_infos[i].len);
840 }
Harald Weltee79769b2009-02-07 00:48:17 +0000841 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
842 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
Harald Weltead384642008-12-26 10:20:07 +0000843
844 return 0;
Harald Welte52b1f982008-12-23 20:25:15 +0000845}
846
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000847/*
848 * Patch the various SYSTEM INFORMATION tables to update
849 * the LAI
850 */
851static void patch_tables(struct gsm_bts *bts)
852{
Harald Weltee441d9c2009-06-21 16:17:15 +0200853 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
854 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000855 /* covert the raw packet to the struct */
856 struct gsm48_system_information_type_3 *type_3 =
857 (struct gsm48_system_information_type_3*)&si3;
858 struct gsm48_system_information_type_4 *type_4 =
859 (struct gsm48_system_information_type_4*)&si4;
860 struct gsm48_system_information_type_6 *type_6 =
861 (struct gsm48_system_information_type_6*)&si6;
Harald Welteb84e2f42008-12-28 23:42:04 +0000862 struct gsm48_loc_area_id lai;
863
864 gsm0408_generate_lai(&lai, bts->network->country_code,
Harald Welte110c0ab2009-05-23 16:27:05 +0000865 bts->network->network_code,
866 bts->location_area_code);
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000867
868 /* assign the MCC and MNC */
Harald Welteb84e2f42008-12-28 23:42:04 +0000869 type_3->lai = lai;
870 type_4->lai = lai;
871 type_6->lai = lai;
Harald Welte98981882009-01-06 18:59:11 +0000872
Harald Welte94009322009-02-15 15:38:42 +0000873 /* patch ARFCN into BTS Attributes */
Harald Weltea865f1b2009-06-20 10:42:17 +0200874 bs11_attr_bts[69] &= 0xf0;
875 bs11_attr_bts[69] |= arfcn_high;
876 bs11_attr_bts[70] = arfcn_low;
Harald Welte94009322009-02-15 15:38:42 +0000877 nanobts_attr_bts[42] &= 0xf0;
878 nanobts_attr_bts[42] |= arfcn_high;
879 nanobts_attr_bts[43] = arfcn_low;
Harald Welte98981882009-01-06 18:59:11 +0000880
Harald Welte94009322009-02-15 15:38:42 +0000881 /* patch ARFCN into TRX Attributes */
Harald Weltea865f1b2009-06-20 10:42:17 +0200882 bs11_attr_radio[2] &= 0xf0;
883 bs11_attr_radio[2] |= arfcn_high;
884 bs11_attr_radio[3] = arfcn_low;
Harald Welte94009322009-02-15 15:38:42 +0000885 nanobts_attr_radio[5] &= 0xf0;
886 nanobts_attr_radio[5] |= arfcn_high;
887 nanobts_attr_radio[6] = arfcn_low;
Harald Welte98981882009-01-06 18:59:11 +0000888
889 type_4->data[2] &= 0xf0;
890 type_4->data[2] |= arfcn_high;
891 type_4->data[3] = arfcn_low;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000892
893 /* patch Control Channel Description 10.5.2.11 */
894 type_3->control_channel_desc = bts->chan_desc;
Harald Welte78f2f502009-05-23 16:56:52 +0000895
896 /* patch BSIC */
Harald Weltea865f1b2009-06-20 10:42:17 +0200897 bs11_attr_bts[1] = bts->bsic;
Harald Welte78f2f502009-05-23 16:56:52 +0000898 nanobts_attr_bts[sizeof(nanobts_attr_bts)-1] = bts->bsic;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000899}
900
901
Harald Weltee79769b2009-02-07 00:48:17 +0000902static void bootstrap_rsl(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000903{
Harald Welteedb37782009-05-01 14:59:07 +0000904 fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) "
905 "using MCC=%u MNC=%u\n", trx->nr, trx->bts->nr, MCC, MNC);
Harald Weltee79769b2009-02-07 00:48:17 +0000906 set_system_infos(trx);
Harald Welte52b1f982008-12-23 20:25:15 +0000907}
908
Harald Welte1fa60c82009-02-09 18:13:26 +0000909void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
Harald Weltead384642008-12-26 10:20:07 +0000910{
911 switch (event) {
Harald Welte1fa60c82009-02-09 18:13:26 +0000912 case EVT_E1_TEI_UP:
913 switch (type) {
914 case E1INP_SIGN_OML:
915 bootstrap_om(trx->bts);
916 break;
917 case E1INP_SIGN_RSL:
918 bootstrap_rsl(trx);
919 break;
920 default:
921 break;
922 }
Harald Weltead384642008-12-26 10:20:07 +0000923 break;
Harald Welte1fa60c82009-02-09 18:13:26 +0000924 case EVT_E1_TEI_DN:
925 fprintf(stderr, "Lost some E1 TEI link\n");
926 /* FIXME: deal with TEI or L1 link loss */
Harald Weltead384642008-12-26 10:20:07 +0000927 break;
928 default:
Harald Weltead384642008-12-26 10:20:07 +0000929 break;
930 }
931}
932
Harald Welteedb37782009-05-01 14:59:07 +0000933static int bootstrap_bts(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000934{
Harald Weltefcd24452009-06-20 18:15:19 +0200935 bts->band = BAND;
Holger Freyther0a173bf2009-04-22 22:07:07 +0000936 bts->location_area_code = LAC;
Harald Weltee441d9c2009-06-21 16:17:15 +0200937 bts->c0->arfcn = ARFCN;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000938
939 /* Control Channel Description */
940 memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr));
Harald Welte41fbf442009-02-24 22:34:22 +0000941 bts->chan_desc.att = 1;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000942 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
943 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
944 bts->chan_desc.t3212 = 0;
945
Harald Welte98981882009-01-06 18:59:11 +0000946 patch_tables(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000947
Holger Freyther1fd34142009-02-09 23:42:03 +0000948 paging_init(bts);
Harald Welte38c2f132009-01-06 23:10:57 +0000949
Holger Freytherb8be6542009-06-02 03:25:14 +0000950 if (bts->type == GSM_BTS_TYPE_BS11) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200951 struct gsm_bts_trx *trx = bts->c0;
Holger Freytherb8be6542009-06-02 03:25:14 +0000952 set_ts_e1link(&trx->ts[0], 0, 1, 0xff);
953 set_ts_e1link(&trx->ts[1], 0, 2, 1);
954 set_ts_e1link(&trx->ts[2], 0, 2, 2);
955 set_ts_e1link(&trx->ts[3], 0, 2, 3);
956 set_ts_e1link(&trx->ts[4], 0, 3, 0);
957 set_ts_e1link(&trx->ts[5], 0, 3, 1);
958 set_ts_e1link(&trx->ts[6], 0, 3, 2);
959 set_ts_e1link(&trx->ts[7], 0, 3, 3);
960#ifdef HAVE_TRX1
961 /* TRX 1 */
962 trx = &bts->trx[1];
963 set_ts_e1link(&trx->ts[0], 0, 1, 0xff);
964 set_ts_e1link(&trx->ts[1], 0, 2, 1);
965 set_ts_e1link(&trx->ts[2], 0, 2, 2);
966 set_ts_e1link(&trx->ts[3], 0, 2, 3);
967 set_ts_e1link(&trx->ts[4], 0, 3, 0);
968 set_ts_e1link(&trx->ts[5], 0, 3, 1);
969 set_ts_e1link(&trx->ts[6], 0, 3, 2);
970 set_ts_e1link(&trx->ts[7], 0, 3, 3);
971#endif
972 }
973
Harald Welteedb37782009-05-01 14:59:07 +0000974 return 0;
975}
976
977static int bootstrap_network(void)
978{
979 struct gsm_bts *bts;
980
Holger Hans Peter Freythere91f5782009-06-10 10:20:16 +0200981 switch(BTS_TYPE) {
982 case GSM_BTS_TYPE_NANOBTS_1800:
983 if (ARFCN < 512 || ARFCN > 885) {
984 fprintf(stderr, "GSM1800 channel must be between 512-885.\n");
985 return -EINVAL;
986 }
987 break;
988 case GSM_BTS_TYPE_BS11:
989 case GSM_BTS_TYPE_NANOBTS_900:
990 /* Assume we have a P-GSM900 here */
991 if (ARFCN < 1 || ARFCN > 124) {
992 fprintf(stderr, "GSM900 channel must be between 1-124.\n");
993 return -EINVAL;
994 }
995 break;
996 case GSM_BTS_TYPE_UNKNOWN:
997 fprintf(stderr, "Unknown BTS. Please use the --bts-type switch\n");
998 return -EINVAL;
999 }
1000
Harald Welteedb37782009-05-01 14:59:07 +00001001 /* initialize our data structures */
Harald Weltee441d9c2009-06-21 16:17:15 +02001002 gsmnet = gsm_network_init(MCC, MNC, mncc_recv);
Harald Welteedb37782009-05-01 14:59:07 +00001003 if (!gsmnet)
1004 return -ENOMEM;
1005
1006 gsmnet->name_long = "OpenBSC";
1007 gsmnet->name_short = "OpenBSC";
1008
Harald Weltee441d9c2009-06-21 16:17:15 +02001009 bts = gsm_bts_alloc(gsmnet, BTS_TYPE, HARDCODED_TSC, HARDCODED_BSIC);
Harald Welteedb37782009-05-01 14:59:07 +00001010 bootstrap_bts(bts);
1011
Holger Freytherc7b86f92009-06-06 13:54:20 +00001012 if (db_init(database_name)) {
Holger Freytheref7f7ce2009-04-19 06:35:12 +00001013 printf("DB: Failed to init database. Please check the option settings.\n");
1014 return -1;
1015 }
1016 printf("DB: Database initialized.\n");
1017
1018 if (db_prepare()) {
1019 printf("DB: Failed to prepare database.\n");
1020 return -1;
1021 }
1022 printf("DB: Database prepared.\n");
1023
Holger Freyther219518d2009-01-02 22:04:43 +00001024 telnet_init(gsmnet, 4242);
Harald Weltead384642008-12-26 10:20:07 +00001025
Harald Welteb4630602009-05-01 15:43:22 +00001026 register_signal_handler(SS_NM, nm_sig_cb, NULL);
1027
Harald Welte1fa60c82009-02-09 18:13:26 +00001028 /* E1 mISDN input setup */
Harald Welteedb37782009-05-01 14:59:07 +00001029 if (BTS_TYPE == GSM_BTS_TYPE_BS11) {
1030 gsmnet->num_bts = 1;
Holger Freytherb5c00f52009-04-22 22:08:07 +00001031 return e1_config(bts, cardnr, release_l2);
Harald Welteedb37782009-05-01 14:59:07 +00001032 } else {
1033 /* FIXME: do this dynamic */
1034 bts->ip_access.site_id = 1801;
1035 bts->ip_access.bts_id = 0;
Harald Weltefcd24452009-06-20 18:15:19 +02001036
Harald Weltee441d9c2009-06-21 16:17:15 +02001037 bts = gsm_bts_alloc(gsmnet, BTS_TYPE, HARDCODED_TSC, HARDCODED_BSIC);
Harald Welteedb37782009-05-01 14:59:07 +00001038 bootstrap_bts(bts);
1039 bts->ip_access.site_id = 1800;
1040 bts->ip_access.bts_id = 0;
Harald Weltecf559782009-05-01 15:43:49 +00001041 return ipaccess_setup(gsmnet);
Harald Welteedb37782009-05-01 14:59:07 +00001042 }
Harald Welte52b1f982008-12-23 20:25:15 +00001043}
Harald Weltef6b7a902008-12-26 00:05:11 +00001044
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001045static void create_pcap_file(char *file)
1046{
1047 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
1048 int fd = open(file, O_WRONLY|O_TRUNC|O_CREAT, mode);
1049
1050 if (fd < 0) {
1051 perror("Failed to open file for pcap");
1052 return;
1053 }
1054
Holger Freyther0469cf62009-03-31 12:14:16 +00001055 e1_set_pcap_fd(fd);
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001056}
1057
Holger Freytherb332f612008-12-27 12:46:51 +00001058static void print_usage()
1059{
1060 printf("Usage: bsc_hack\n");
1061}
1062
1063static void print_help()
1064{
1065 printf(" Some useful help...\n");
1066 printf(" -d option --debug=DRLL:DCC:DMM:DRR:DRSL:DNM enable debugging\n");
Holger Freytherefde7fb2008-12-28 14:14:56 +00001067 printf(" -s --disable-color\n");
1068 printf(" -n --network-code number(MNC) \n");
1069 printf(" -c --country-code number (MCC) \n");
Holger Freyther0a173bf2009-04-22 22:07:07 +00001070 printf(" -L --location-area-code number (LAC) \n");
Harald Welte98981882009-01-06 18:59:11 +00001071 printf(" -f --arfcn number The frequency ARFCN\n");
Holger Freytherbde36102008-12-28 22:51:39 +00001072 printf(" -l --database db-name The database to use\n");
Holger Freyther89824fc2008-12-30 16:18:18 +00001073 printf(" -a --authorize-everyone Allow everyone into the network.\n");
Holger Freythere97f7fb2008-12-31 18:52:11 +00001074 printf(" -r --reject-cause number The reject cause for LOCATION UPDATING REJECT.\n");
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001075 printf(" -p --pcap file The filename of the pcap file\n");
Harald Weltee1bd2412009-02-15 14:40:09 +00001076 printf(" -t --bts-type type The BTS type (bs11, nanobts900, nanobts1800)\n");
Holger Freytherdda22c12009-04-22 22:07:31 +00001077 printf(" -C --cardnr number For bs11 select E1 card number other than 0\n");
Holger Freytherb5c00f52009-04-22 22:08:07 +00001078 printf(" -R --release-l2 Releases mISDN layer 2 after exit, to unload driver.\n");
Holger Freytherb332f612008-12-27 12:46:51 +00001079 printf(" -h --help this text\n");
1080}
1081
1082static void handle_options(int argc, char** argv)
1083{
1084 while (1) {
Harald Welte2cf161b2009-06-20 22:36:41 +02001085 int option_index = 0, c;
Holger Freytherb332f612008-12-27 12:46:51 +00001086 static struct option long_options[] = {
1087 {"help", 0, 0, 'h'},
1088 {"debug", 1, 0, 'd'},
Holger Freytherefde7fb2008-12-28 14:14:56 +00001089 {"disable-color", 0, 0, 's'},
1090 {"network-code", 1, 0, 'n'},
1091 {"country-code", 1, 0, 'c'},
Holger Freyther0a173bf2009-04-22 22:07:07 +00001092 {"location-area-code", 1, 0, 'L'},
Holger Freytherbde36102008-12-28 22:51:39 +00001093 {"database", 1, 0, 'l'},
Holger Freyther89824fc2008-12-30 16:18:18 +00001094 {"authorize-everyone", 0, 0, 'a'},
Holger Freythere97f7fb2008-12-31 18:52:11 +00001095 {"reject-cause", 1, 0, 'r'},
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001096 {"pcap", 1, 0, 'p'},
Harald Welte98981882009-01-06 18:59:11 +00001097 {"arfcn", 1, 0, 'f'},
Harald Welte8c1d0e42009-02-15 03:38:12 +00001098 {"bts-type", 1, 0, 't'},
Holger Freytherdda22c12009-04-22 22:07:31 +00001099 {"cardnr", 1, 0, 'C'},
Holger Freytherb5c00f52009-04-22 22:08:07 +00001100 {"release-l2", 0, 0, 'R'},
Harald Welted3ff51d2009-06-09 20:21:57 +00001101 {"timestamp", 0, 0, 'T'},
Harald Weltefcd24452009-06-20 18:15:19 +02001102 {"band", 0, 0, 'b'},
Holger Freytherb332f612008-12-27 12:46:51 +00001103 {0, 0, 0, 0}
1104 };
1105
Harald Weltefcd24452009-06-20 18:15:19 +02001106 c = getopt_long(argc, argv, "hc:n:d:sar:p:f:t:C:RL:l:Tb:",
Holger Freytherb332f612008-12-27 12:46:51 +00001107 long_options, &option_index);
1108 if (c == -1)
1109 break;
1110
1111 switch (c) {
1112 case 'h':
1113 print_usage();
1114 print_help();
1115 exit(0);
Holger Freytherefde7fb2008-12-28 14:14:56 +00001116 case 's':
Holger Freytherb332f612008-12-27 12:46:51 +00001117 debug_use_color(0);
1118 break;
1119 case 'd':
1120 debug_parse_category_mask(optarg);
1121 break;
Holger Freytherefde7fb2008-12-28 14:14:56 +00001122 case 'n':
1123 MNC = atoi(optarg);
1124 break;
1125 case 'c':
1126 MCC = atoi(optarg);
1127 break;
Holger Freyther0a173bf2009-04-22 22:07:07 +00001128 case 'L':
1129 LAC = atoi(optarg);
1130 break;
Harald Welte98981882009-01-06 18:59:11 +00001131 case 'f':
1132 ARFCN = atoi(optarg);
1133 break;
Harald Welte8965da42009-01-06 18:09:02 +00001134 case 'l':
Holger Freytherbde36102008-12-28 22:51:39 +00001135 database_name = strdup(optarg);
1136 break;
Holger Freyther89824fc2008-12-30 16:18:18 +00001137 case 'a':
1138 gsm0408_allow_everyone(1);
1139 break;
Holger Freythere97f7fb2008-12-31 18:52:11 +00001140 case 'r':
1141 gsm0408_set_reject_cause(atoi(optarg));
1142 break;
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001143 case 'p':
1144 create_pcap_file(optarg);
1145 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +00001146 case 't':
1147 BTS_TYPE = parse_btstype(optarg);
1148 break;
Holger Freytherdda22c12009-04-22 22:07:31 +00001149 case 'C':
1150 cardnr = atoi(optarg);
1151 break;
Holger Freytherb5c00f52009-04-22 22:08:07 +00001152 case 'R':
1153 release_l2 = 1;
1154 break;
Harald Welted3ff51d2009-06-09 20:21:57 +00001155 case 'T':
1156 debug_timestamp(1);
1157 break;
Harald Weltefcd24452009-06-20 18:15:19 +02001158 case 'b':
1159 BAND = gsm_band_parse(atoi(optarg));
1160 break;
Holger Freytherb332f612008-12-27 12:46:51 +00001161 default:
1162 /* ignore */
1163 break;
1164 }
1165 }
1166}
1167
Harald Welted1252502009-01-01 01:50:32 +00001168static void signal_handler(int signal)
1169{
1170 fprintf(stdout, "signal %u received\n", signal);
1171
1172 switch (signal) {
1173 case SIGHUP:
1174 case SIGABRT:
1175 shutdown_net(gsmnet);
1176 break;
Harald Welte2cf161b2009-06-20 22:36:41 +02001177 case SIGUSR1:
1178 talloc_report_full(tall_bsc_ctx, stderr);
1179 break;
Harald Welted1252502009-01-01 01:50:32 +00001180 default:
1181 break;
1182 }
1183}
1184
Harald Weltef6b7a902008-12-26 00:05:11 +00001185int main(int argc, char **argv)
1186{
Harald Welte1fa60c82009-02-09 18:13:26 +00001187 int rc;
1188
Harald Welte2cf161b2009-06-20 22:36:41 +02001189 tall_bsc_ctx = talloc_named_const(NULL, 1, "openbsc");
1190
Holger Freytherb332f612008-12-27 12:46:51 +00001191 /* parse options */
1192 handle_options(argc, argv);
1193
Harald Welte65ccf882009-02-24 22:36:20 +00001194 /* seed the PRNG */
1195 srand(time(NULL));
1196
Harald Welte1fa60c82009-02-09 18:13:26 +00001197 rc = bootstrap_network();
1198 if (rc < 0)
1199 exit(1);
Harald Weltef6b7a902008-12-26 00:05:11 +00001200
Harald Welted1252502009-01-01 01:50:32 +00001201 signal(SIGHUP, &signal_handler);
1202 signal(SIGABRT, &signal_handler);
Harald Welte2cf161b2009-06-20 22:36:41 +02001203 signal(SIGUSR1, &signal_handler);
Harald Welted1252502009-01-01 01:50:32 +00001204
Harald Weltef6b7a902008-12-26 00:05:11 +00001205 while (1) {
Harald Welte4bfdfe72009-06-10 23:11:52 +08001206 bsc_upqueue(gsmnet);
Harald Welte04d3c922009-05-23 06:07:04 +00001207 bsc_select_main(0);
Harald Weltef6b7a902008-12-26 00:05:11 +00001208 }
1209}