blob: 5b6e4a3e356f5bf3a8718b170ac741714f804bc2 [file] [log] [blame]
Harald Welte52b1f982008-12-23 20:25:15 +00001/* A hackish minimal BSC (+MSC +HLR) implementation */
2
3/* (C) 2008 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 Welte52b1f982008-12-23 20:25:15 +000049
50/* global pointer to the gsm network data structure */
51static struct gsm_network *gsmnet;
52
Holger Freytherefde7fb2008-12-28 14:14:56 +000053/* MCC and MNC for the Location Area Identifier */
54static int MCC = 1;
55static int MNC = 1;
Harald Welte98981882009-01-06 18:59:11 +000056static int ARFCN = HARDCODED_ARFCN;
Harald Welte8c1d0e42009-02-15 03:38:12 +000057static enum gsm_bts_type BTS_TYPE = GSM_BTS_TYPE_BS11;
Holger Freytherbde36102008-12-28 22:51:39 +000058static const char *database_name = "hlr.sqlite3";
Holger Freytherefde7fb2008-12-28 14:14:56 +000059
Harald Welte52b1f982008-12-23 20:25:15 +000060/* The following definitions are for OM and NM packets that we cannot yet
61 * generate by code but we just pass on */
62
63// BTS Site Manager, SET ATTRIBUTES
64
65/*
66 Object Class: BTS Site Manager
67 Instance 1: FF
68 Instance 2: FF
69 Instance 3: FF
70SET ATTRIBUTES
71 sAbisExternalTime: 2007/09/08 14:36:11
72 omLAPDRelTimer: 30sec
73 shortLAPDIntTimer: 5sec
74 emergencyTimer1: 10 minutes
75 emergencyTimer2: 0 minutes
76*/
77
78unsigned char msg_1[] =
79{
80 0xD0, 0x00, 0xFF, 0xFF, 0xFF, 0x91, 0x07, 0xD7, 0x09, 0x08, 0x0E, 0x24,
81 0x0B, 0xCE, 0x02, 0x00, 0x1E, 0xE8, 0x01, 0x05, 0x42, 0x02, 0x00, 0x0A, 0x44,
82 0x02, 0x00, 0x00
83};
84
85// BTS, SET BTS ATTRIBUTES
86
87/*
88 Object Class: BTS
89 BTS relat. Number: 0
90 Instance 2: FF
91 Instance 3: FF
92SET BTS ATTRIBUTES
93 bsIdentityCode / BSIC:
94 PLMN_colour_code: 7h
95 BS_colour_code: 7h
96 BTS Air Timer T3105: 4 ,unit 10 ms
97 btsIsHopping: FALSE
Harald Welte83282292009-02-01 16:22:19 +000098 periodCCCHLoadIndication: 1sec
Holger Freyther3b910432009-02-11 00:43:48 +000099 thresholdCCCHLoadIndication: 0%
Harald Welte52b1f982008-12-23 20:25:15 +0000100 cellAllocationNumber: 00h = GSM 900
101 enableInterferenceClass: 00h = Disabled
102 fACCHQual: 6 (FACCH stealing flags minus 1)
103 intaveParameter: 31 SACCH multiframes
104 interferenceLevelBoundaries:
105 Interference Boundary 1: 0Ah
106 Interference Boundary 2: 0Fh
107 Interference Boundary 3: 14h
108 Interference Boundary 4: 19h
109 Interference Boundary 5: 1Eh
110 mSTxPwrMax: 11
111 GSM range: 2=39dBm, 15=13dBm, stepsize 2 dBm
112 DCS1800 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
113 PCS1900 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
114 30=33dBm, 31=32dBm
115 ny1:
116 Maximum number of repetitions for PHYSICAL INFORMATION message (GSM 04.08): 20
117 powerOutputThresholds:
118 Out Power Fault Threshold: -10 dB
119 Red Out Power Threshold: - 6 dB
120 Excessive Out Power Threshold: 5 dB
121 rACHBusyThreshold: -127 dBm
122 rACHLoadAveragingSlots: 250 ,number of RACH burst periods
123 rfResourceIndicationPeriod: 125 SACCH multiframes
124 T200:
125 SDCCH: 044 in 5 ms
126 FACCH/Full rate: 031 in 5 ms
127 FACCH/Half rate: 041 in 5 ms
128 SACCH with TCH SAPI0: 090 in 10 ms
129 SACCH with SDCCH: 090 in 10 ms
130 SDCCH with SAPI3: 090 in 5 ms
131 SACCH with TCH SAPI3: 135 in 10 ms
132 tSync: 9000 units of 10 msec
133 tTrau: 9000 units of 10 msec
134 enableUmLoopTest: 00h = disabled
135 enableExcessiveDistance: 00h = Disabled
136 excessiveDistance: 64km
137 hoppingMode: 00h = baseband hopping
138 cellType: 00h = Standard Cell
139 BCCH ARFCN / bCCHFrequency: 1
140*/
141
142unsigned char msg_2[] =
143{
Harald Welte8c1d0e42009-02-15 03:38:12 +0000144 0x41, 0x01, 0x00, 0xFF, 0xFF,
145 NM_ATT_BSIC, 0x3F,
146 NM_ATT_BTS_AIR_TIMER, 0x04,
147 0x61, 0x00,
148 NM_ATT_CCCH_L_I_P, 0x01,
149 NM_ATT_CCCH_L_T, 0x00,
150 0x62, 0x00,
151 0x66, 0x00,
152 0x6E, 0x06,
153 NM_ATT_INTAVE_PARAM, 0x1F,
154 NM_ATT_INTERF_BOUND, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x7B,
155 NM_ATT_CCCH_L_T, 0x23,
156 NM_ATT_GSM_TIME, 0x28, 0x00,
157 NM_ATT_ADM_STATE, 0x03,
158 NM_ATT_RACH_B_THRESH, 0x7F,
159 NM_ATT_LDAVG_SLOTS, 0x00, 0xFA,
160 0x8F, 0x7D,
161 NM_ATT_T200, 0x2C, 0x1F, 0x29, 0x5A, 0x5A, 0x5A, 0x87,
162 0x94, 0x23, 0x28,
163 0x95, 0x23, 0x28,
164 0x35, 0x01, 0x00,
165 0x46, 0x01, 0x00,
166 0x58, 0x01, 0x40,
167 0xC5, 0x01, 0x00,
168 0xF2, 0x01, 0x00,
169 NM_ATT_BCCH_ARFCN, 0x00, HARDCODED_ARFCN/*0x01*/,
Harald Welte52b1f982008-12-23 20:25:15 +0000170};
171
172// Handover Recognition, SET ATTRIBUTES
173
174/*
175Illegal Contents GSM Formatted O&M Msg
176 Object Class: Handover Recognition
177 BTS relat. Number: 0
178 Instance 2: FF
179 Instance 3: FF
180SET ATTRIBUTES
181 enableDelayPowerBudgetHO: 00h = Disabled
182 enableDistanceHO: 00h = Disabled
183 enableInternalInterCellHandover: 00h = Disabled
184 enableInternalIntraCellHandover: 00h = Disabled
185 enablePowerBudgetHO: 00h = Disabled
186 enableRXLEVHO: 00h = Disabled
187 enableRXQUALHO: 00h = Disabled
188 hoAveragingDistance: 8 SACCH multiframes
189 hoAveragingLev:
190 A_LEV_HO: 8 SACCH multiframes
191 W_LEV_HO: 1 SACCH multiframes
192 hoAveragingPowerBudget: 16 SACCH multiframes
193 hoAveragingQual:
194 A_QUAL_HO: 8 SACCH multiframes
195 W_QUAL_HO: 2 SACCH multiframes
196 hoLowerThresholdLevDL: (10 - 110) dBm
197 hoLowerThresholdLevUL: (5 - 110) dBm
198 hoLowerThresholdQualDL: 06h = 6.4% < BER < 12.8%
199 hoLowerThresholdQualUL: 06h = 6.4% < BER < 12.8%
200 hoThresholdLevDLintra : (20 - 110) dBm
201 hoThresholdLevULintra: (20 - 110) dBm
202 hoThresholdMsRangeMax: 20 km
203 nCell: 06h
204 timerHORequest: 3 ,unit 2 SACCH multiframes
205*/
206
207unsigned char msg_3[] =
208{
209 0xD0, 0xA1, 0x00, 0xFF, 0xFF, 0xD0, 0x00, 0x64, 0x00, 0x67, 0x00, 0x68,
210 0x00, 0x6A, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6F, 0x08, 0x70, 0x08, 0x01,
211 0x71, 0x10, 0x10, 0x10, 0x72, 0x08, 0x02, 0x73, 0x0A, 0x74, 0x05, 0x75,
212 0x06, 0x76, 0x06, 0x78, 0x14, 0x79, 0x14, 0x7A, 0x14, 0x7D, 0x06, 0x92,
213 0x03, 0x20, 0x01, 0x00, 0x45, 0x01, 0x00, 0x48, 0x01, 0x00, 0x5A, 0x01,
214 0x00, 0x5B, 0x01, 0x05, 0x5E, 0x01, 0x1A, 0x5F, 0x01, 0x20, 0x9D, 0x01,
215 0x00, 0x47, 0x01, 0x00, 0x5C, 0x01, 0x64, 0x5D, 0x01, 0x1E, 0x97, 0x01,
216 0x20, 0xF7, 0x01, 0x3C,
217};
218
219// Power Control, SET ATTRIBUTES
220
221/*
222 Object Class: Power Control
223 BTS relat. Number: 0
224 Instance 2: FF
225 Instance 3: FF
226SET ATTRIBUTES
227 enableMsPowerControl: 00h = Disabled
228 enablePowerControlRLFW: 00h = Disabled
229 pcAveragingLev:
230 A_LEV_PC: 4 SACCH multiframes
231 W_LEV_PC: 1 SACCH multiframes
232 pcAveragingQual:
233 A_QUAL_PC: 4 SACCH multiframes
234 W_QUAL_PC: 2 SACCH multiframes
235 pcLowerThresholdLevDL: 0Fh
236 pcLowerThresholdLevUL: 0Ah
237 pcLowerThresholdQualDL: 05h = 3.2% < BER < 6.4%
238 pcLowerThresholdQualUL: 05h = 3.2% < BER < 6.4%
239 pcRLFThreshold: 0Ch
240 pcUpperThresholdLevDL: 14h
241 pcUpperThresholdLevUL: 0Fh
242 pcUpperThresholdQualDL: 04h = 1.6% < BER < 3.2%
243 pcUpperThresholdQualUL: 04h = 1.6% < BER < 3.2%
244 powerConfirm: 2 ,unit 2 SACCH multiframes
245 powerControlInterval: 2 ,unit 2 SACCH multiframes
246 powerIncrStepSize: 02h = 4 dB
247 powerRedStepSize: 01h = 2 dB
248 radioLinkTimeoutBs: 64 SACCH multiframes
249 enableBSPowerControl: 00h = disabled
250*/
251
252unsigned char msg_4[] =
253{
254 0xD0, 0xA2, 0x00, 0xFF, 0xFF, 0x69, 0x00, 0x6B, 0x00, 0x7E, 0x04, 0x01,
255 0x7F, 0x04, 0x02, 0x80, 0x0F, 0x81, 0x0A, 0x82, 0x05, 0x83, 0x05, 0x84,
256 0x0C, 0x85, 0x14, 0x86, 0x0F, 0x87, 0x04, 0x88, 0x04, 0x89, 0x02, 0x8A,
257 0x02, 0x8B, 0x02, 0x8C, 0x01, 0x8D, 0x40, 0x65, 0x01, 0x00 // set to 0x01 to enable BSPowerControl
258};
259
260
261// Transceiver, SET TRX ATTRIBUTES (TRX 0)
262
263/*
264 Object Class: Transceiver
265 BTS relat. Number: 0
266 Tranceiver number: 0
267 Instance 3: FF
268SET TRX ATTRIBUTES
269 aRFCNList (HEX): 0001
270 txPwrMaxReduction: 00h = 0dB
271 radioMeasGran: 254 SACCH multiframes
272 radioMeasRep: 01h = enabled
273 memberOfEmergencyConfig: 01h = TRUE
274 trxArea: 00h = TRX doesn't belong to a concentric cell
275*/
276
277unsigned char msg_6[] =
278{
279 0x44, 0x02, 0x00, 0x00, 0xFF, 0x05, 0x01, 0x00, HARDCODED_ARFCN /*0x01*/, 0x2D,
280 0x00, 0xDC, 0x01, 0xFE, 0xDD, 0x01, 0x01, 0x9B, 0x01, 0x01, 0x9F, 0x01, 0x00,
281};
282
Harald Welte8c1d0e42009-02-15 03:38:12 +0000283static unsigned char nanobts_attr_bts[] = {
284 NM_ATT_INTERF_BOUND, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73,
285 NM_ATT_INTAVE_PARAM, 0x06,
286 NM_ATT_CONN_FAIL_CRIT, 0x00, 0x02, 0x01, 0x10,
287 NM_ATT_T200, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21, 0xa8,
288 NM_ATT_MAX_TA, 0x3f,
289 NM_ATT_OVERL_PERIOD, 0x00, 0x01, 0x0a,
290 NM_ATT_CCCH_L_T, 0x1e,
291 NM_ATT_CCCH_L_I_P, 0x64,
292 NM_ATT_RACH_B_THRESH, 0x0a,
293 NM_ATT_LDAVG_SLOTS, 0x03, 0xe8,
294 NM_ATT_BTS_AIR_TIMER, 0x80,
295 NM_ATT_NY1, 0x0a,
296 NM_ATT_BCCH_ARFCN, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
297 NM_ATT_BSIC, 0x20,
298};
Harald Welte52b1f982008-12-23 20:25:15 +0000299
Harald Welte8c1d0e42009-02-15 03:38:12 +0000300static unsigned char nanobts_attr_radio[] = {
301 NM_ATT_RF_MAXPOWR_R, 0x0c,
302 NM_ATT_ARFCN_LIST, 0x00, 0x02, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
303};
304
Harald Welte5c1e4582009-02-15 11:57:29 +0000305static unsigned char nanobts_attr_e0[] = {
306 0x85, 0x00,
307 0x81, 0x0b, 0xbb, /* TCP PORT for RSL */
308};
309
Harald Welte8c1d0e42009-02-15 03:38:12 +0000310int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
311 struct gsm_nm_state *old_state, struct gsm_nm_state *new_state)
312{
313 struct gsm_bts *bts;
314 struct gsm_bts_trx *trx;
315 struct gsm_bts_trx_ts *ts;
316
317 /* This is currently only required on nanoBTS */
318
319 switch (evt) {
320 case EVT_STATECHG_OPER:
321 switch (obj_class) {
322 case NM_OC_SITE_MANAGER:
323 bts = container_of(obj, struct gsm_bts, site_mgr);
324 if (old_state->operational != 2 && new_state->operational == 2) {
325 abis_nm_opstart(bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
326 }
327 break;
328 case NM_OC_BTS:
329 bts = obj;
330 if (new_state->availability == 5) {
331 abis_nm_set_bts_attr(bts, nanobts_attr_bts,
332 sizeof(nanobts_attr_bts));
333 abis_nm_opstart(bts, NM_OC_BTS,
334 bts->nr, 0xff, 0xff);
335 abis_nm_chg_adm_state(bts, NM_OC_BTS,
336 bts->nr, 0xff, 0xff,
337 NM_STATE_UNLOCKED);
338 }
339 break;
340 case NM_OC_RADIO_CARRIER:
341 trx = obj;
342 if (new_state->availability == 3) {
343 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
344 sizeof(nanobts_attr_radio));
345 abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
346 trx->bts->nr, trx->nr, 0xff);
347 abis_nm_chg_adm_state(trx->bts, NM_OC_RADIO_CARRIER,
348 trx->bts->nr, trx->nr, 0xff,
349 NM_STATE_UNLOCKED);
350 }
351 break;
352 case NM_OC_CHANNEL:
353 ts = obj;
354 trx = ts->trx;
355 if (new_state->availability == 5) {
356 if (ts->nr == 0 && trx == trx->bts->c0)
357 abis_nm_set_channel_attr(ts, NM_CHANC_SDCCH_CBCH);
358 else
359 abis_nm_set_channel_attr(ts, NM_CHANC_TCHFull);
360 abis_nm_opstart(trx->bts, NM_OC_CHANNEL,
361 trx->bts->nr, trx->nr, ts->nr);
362 abis_nm_chg_adm_state(trx->bts, NM_OC_CHANNEL,
363 trx->bts->nr, trx->nr, ts->nr,
364 NM_STATE_UNLOCKED);
365 }
366 break;
367 case NM_OC_BASEB_TRANSC:
368 trx = container_of(obj, struct gsm_bts_trx, bb_transc);
369 if (new_state->availability == 5) {
Harald Welte5c1e4582009-02-15 11:57:29 +0000370 abis_nm_ipaccess_msg(trx->bts, 0xe0, NM_OC_BASEB_TRANSC,
371 trx->bts->nr, trx->nr, 0xff,
372 nanobts_attr_e0, sizeof(nanobts_attr_e0));
Harald Welte8c1d0e42009-02-15 03:38:12 +0000373 abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC,
374 trx->bts->nr, trx->nr, 0xff);
375 abis_nm_chg_adm_state(trx->bts, NM_OC_BASEB_TRANSC,
376 trx->bts->nr, trx->nr, 0xff,
377 NM_STATE_UNLOCKED);
378 }
379 break;
380 }
381 break;
382 }
383 return 0;
384}
385
386static void bootstrap_om_nanobts(struct gsm_bts *bts)
387{
388#if 0
389 struct gsm_bts_trx *trx = &bts->trx[0];
390 int i;
391
392 abis_nm_set_bts_attr(bts, nanobts_attr_bts, sizeof(nanobts_attr_bts));
393 abis_nm_opstart(bts, NM_OC_BTS, 0x00, 0xff, 0xff);
394 abis_nm_set_radio_attr(bts->c0, nanobts_attr_radio, sizeof(nanobts_attr_radio));
395
396 abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH_CBCH);
397 for (i = 1; i < TRX_NR_TS; i++)
398 abis_nm_set_channel_attr(&trx->ts[i], NM_CHANC_TCHFull);
399
400 abis_nm_opstart(bts, NM_OC_BASEB_TRANSC, 0x00, 0x00, 0xff);
401 abis_nm_opstart(bts, NM_OC_RADIO_CARRIER, 0x00, 0x00, 0xff);
402
403
404 for (i = 0; i < TRX_NR_TS; i++)
405 abis_nm_opstart(bts, NM_OC_CHANNEL, 0x00, 0x00, i);
406
407 abis_nm_chg_adm_state(bts, NM_OC_BASEB_TRANSC, 0x00, 0x00, 0xff,
408 NM_STATE_UNLOCKED);
409
410 abis_nm_chg_adm_state(bts, NM_OC_RADIO_CARRIER, 0x00, 0x00, 0xff,
411 NM_STATE_UNLOCKED);
412
413 for (i = 0; i < TRX_NR_TS; i++)
414 abis_nm_chg_adm_state(bts, NM_OC_CHANNEL, 0x00, 0x00, i,
415 NM_STATE_UNLOCKED);
416
417#endif
418}
419
420static void bootstrap_om_bs11(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000421{
422 struct gsm_bts_trx *trx = &bts->trx[0];
423
424 /* stop sending event reports */
425 abis_nm_event_reports(bts, 0);
426
427 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000428 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000429
Harald Welte702d8702008-12-26 20:25:35 +0000430 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000431 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte702d8702008-12-26 20:25:35 +0000432
433 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000434 abis_nm_bs11_reset_resource(bts);
Harald Welte702d8702008-12-26 20:25:35 +0000435
436 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000437 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte702d8702008-12-26 20:25:35 +0000438
Harald Welte52b1f982008-12-23 20:25:15 +0000439 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
440 abis_nm_raw_msg(bts, sizeof(msg_2), msg_2); /* set BTS attr */
441 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
442 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
443
444 /* Connect signalling of bts0/trx0 to e1_0/ts1/64kbps */
445 abis_nm_conn_terr_sign(trx, 0, 1, 0xff);
Harald Weltecd06bfb2009-02-10 17:33:56 +0000446 set_ts_e1link(&trx->ts[0], 0, 1, 0xff);
Harald Welte52b1f982008-12-23 20:25:15 +0000447 abis_nm_raw_msg(bts, sizeof(msg_6), msg_6); /* SET TRX ATTRIBUTES */
448
449 /* Use TEI 1 for signalling */
450 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x01);
451 abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH_CBCH);
Harald Weltecd06bfb2009-02-10 17:33:56 +0000452
453#ifdef HAVE_TRX1
Harald Welte52b1f982008-12-23 20:25:15 +0000454 /* TRX 1 */
455 abis_nm_conn_terr_sign(&bts->trx[1], 0, 1, 0xff);
456 /* FIXME: TRX ATTRIBUTE */
457 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x02);
458#endif
459
460 /* SET CHANNEL ATTRIBUTE TS1 */
461 abis_nm_set_channel_attr(&trx->ts[1], 0x09);
462 /* Connect traffic of bts0/trx0/ts1 to e1_0/ts2/b */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000463 set_ts_e1link(&trx->ts[1], 0, 2, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000464 abis_nm_conn_terr_traf(&trx->ts[1], 0, 2, 1);
465
466 /* SET CHANNEL ATTRIBUTE TS2 */
467 abis_nm_set_channel_attr(&trx->ts[2], 0x09);
468 /* Connect traffic of bts0/trx0/ts2 to e1_0/ts2/c */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000469 set_ts_e1link(&trx->ts[2], 0, 2, 2);
Harald Welte52b1f982008-12-23 20:25:15 +0000470 abis_nm_conn_terr_traf(&trx->ts[2], 0, 2, 2);
471
472 /* SET CHANNEL ATTRIBUTE TS3 */
473 abis_nm_set_channel_attr(&trx->ts[3], 0x09);
474 /* Connect traffic of bts0/trx0/ts3 to e1_0/ts2/d */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000475 set_ts_e1link(&trx->ts[3], 0, 2, 3);
Harald Welte52b1f982008-12-23 20:25:15 +0000476 abis_nm_conn_terr_traf(&trx->ts[3], 0, 2, 3);
477
478 /* SET CHANNEL ATTRIBUTE TS4 */
479 abis_nm_set_channel_attr(&trx->ts[4], 0x09);
480 /* Connect traffic of bts0/trx0/ts4 to e1_0/ts3/a */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000481 set_ts_e1link(&trx->ts[4], 0, 3, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000482 abis_nm_conn_terr_traf(&trx->ts[4], 0, 3, 0);
483
484 /* SET CHANNEL ATTRIBUTE TS5 */
485 abis_nm_set_channel_attr(&trx->ts[5], 0x09);
486 /* Connect traffic of bts0/trx0/ts5 to e1_0/ts3/b */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000487 set_ts_e1link(&trx->ts[5], 0, 3, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000488 abis_nm_conn_terr_traf(&trx->ts[5], 0, 3, 1);
489
490 /* SET CHANNEL ATTRIBUTE TS6 */
491 abis_nm_set_channel_attr(&trx->ts[6], 0x09);
492 /* Connect traffic of bts0/trx0/ts6 to e1_0/ts3/c */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000493 set_ts_e1link(&trx->ts[6], 0, 3, 2);
Harald Welte52b1f982008-12-23 20:25:15 +0000494 abis_nm_conn_terr_traf(&trx->ts[6], 0, 3, 2);
495
496 /* SET CHANNEL ATTRIBUTE TS7 */
497 abis_nm_set_channel_attr(&trx->ts[7], 0x09);
498 /* Connect traffic of bts0/trx0/ts7 to e1_0/ts3/d */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000499 set_ts_e1link(&trx->ts[7], 0, 3, 3);
Harald Welte52b1f982008-12-23 20:25:15 +0000500 abis_nm_conn_terr_traf(&trx->ts[7], 0, 3, 3);
501
502 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000503 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000504
505 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000506 abis_nm_bs11_reset_resource(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000507
508 /* restart sending event reports */
509 abis_nm_event_reports(bts, 1);
510}
511
Harald Welte8c1d0e42009-02-15 03:38:12 +0000512static void bootstrap_om(struct gsm_bts *bts)
513{
514 fprintf(stdout, "bootstrapping OML\n");
515
516 switch (bts->type) {
517 case GSM_BTS_TYPE_BS11:
518 bootstrap_om_bs11(bts);
519 break;
520 case GSM_BTS_TYPE_NANOBTS_900:
521 case GSM_BTS_TYPE_NANOBTS_1800:
522 bootstrap_om_nanobts(bts);
523 break;
524 default:
525 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
526 }
527}
528
Harald Welted1252502009-01-01 01:50:32 +0000529static int shutdown_om(struct gsm_bts *bts)
530{
531 /* stop sending event reports */
532 abis_nm_event_reports(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000533
Harald Welted1252502009-01-01 01:50:32 +0000534 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000535 abis_nm_bs11_db_transmission(bts, 1);
Harald Welted1252502009-01-01 01:50:32 +0000536
537 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000538 abis_nm_bs11_db_transmission(bts, 0);
Harald Welted1252502009-01-01 01:50:32 +0000539
540 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000541 abis_nm_bs11_reset_resource(bts);
Harald Welted1252502009-01-01 01:50:32 +0000542
543 return 0;
544}
545
546static int shutdown_net(struct gsm_network *net)
547{
548 int i;
549 for (i = 0; i < net->num_bts; i++) {
550 int rc;
551 rc = shutdown_om(&net->bts[i]);
552 if (rc < 0)
553 return rc;
554 }
555
556 return 0;
557}
Harald Welte52b1f982008-12-23 20:25:15 +0000558
559struct bcch_info {
560 u_int8_t type;
561 u_int8_t len;
562 const u_int8_t *data;
563};
564
565/*
566SYSTEM INFORMATION TYPE 1
567 Cell channel description
568 Format-ID bit map 0
569 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
570 RACH Control Parameters
571 maximum 7 retransmissions
572 8 slots used to spread transmission
573 cell not barred for access
574 call reestablishment not allowed
575 Access Control Class = 0000
576*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000577static u_int8_t si1[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000578 /* header */0x55, 0x06, 0x19,
579 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
581 /* rach */0xD5, 0x00, 0x00,
582 /* s1 reset*/0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000583};
584
585/*
586 SYSTEM INFORMATION TYPE 2
587 Neighbour Cells Description
588 EXT-IND: Carries the complete BA
589 BA-IND = 0
590 Format-ID bit map 0
591 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
592 NCC permitted (NCC) = FF
593 RACH Control Parameters
594 maximum 7 retransmissions
595 8 slots used to spread transmission
596 cell not barred for access
597 call reestablishment not allowed
598 Access Control Class = 0000
599*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000600static u_int8_t si2[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000601 /* header */0x59, 0x06, 0x1A,
602 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 /* ncc */0xFF,
605 /* rach*/0xD5, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +0000606};
607
608/*
609SYSTEM INFORMATION TYPE 3
610 Cell identity = 00001 (1h)
611 Location area identification
612 Mobile Country Code (MCC): 001
613 Mobile Network Code (MNC): 01
614 Location Area Code (LAC): 00001 (1h)
615 Control Channel Description
616 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
617 0 blocks reserved for access grant
618 1 channel used for CCCH, with SDCCH
619 5 multiframes period for PAGING REQUEST
620 Time-out T3212 = 0
621 Cell Options BCCH
622 Power control indicator: not set
623 MSs shall not use uplink DTX
624 Radio link timeout = 36
625 Cell Selection Parameters
626 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
Harald Welte3b2ec422008-12-29 04:11:14 +0000627 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
Harald Welte52b1f982008-12-23 20:25:15 +0000628 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
629 Half rate support (NECI): New establishment causes are not supported
630 min.RX signal level for MS = 0
631 RACH Control Parameters
632 maximum 7 retransmissions
633 8 slots used to spread transmission
634 cell not barred for access
635 call reestablishment not allowed
636 Access Control Class = 0000
637 SI 3 Rest Octets
638 Cell Bar Qualify (CBQ): 0
639 Cell Reselect Offset = 0 dB
640 Temporary Offset = 0 dB
641 Penalty Time = 20 s
642 System Information 2ter Indicator (2TI): 0 = not available
643 Early Classmark Sending Control (ECSC): 0 = forbidden
644 Scheduling Information is not sent in SYSTEM INFORMATION TYPE 9 on the BCCH
645*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000646static u_int8_t si3[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000647 /* header */0x49, 0x06, 0x1B,
648 /* cell */0x00, 0x01,
649 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
650 /* desc */0x01, 0x03, 0x00,
651 /* option*/0x28,
652 /* selection*/0x62, 0x00,
653 /* rach */0xD5, 0x00, 0x00,
654 /* reset*/0x80, 0x00, 0x00, 0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000655};
656
657/*
658SYSTEM INFORMATION TYPE 4
659 Location area identification
660 Mobile Country Code (MCC): 001
661 Mobile Network Code (MNC): 01
662 Location Area Code (LAC): 00001 (1h)
663 Cell Selection Parameters
664 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
665 max.TX power level MS may use for CCH = 2
666 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
667 Half rate support (NECI): New establishment causes are not supported
668 min.RX signal level for MS = 0
669 RACH Control Parameters
670 maximum 7 retransmissions
671 8 slots used to spread transmission
672 cell not barred for access
673 call reestablishment not allowed
674 Access Control Class = 0000
675 Channel Description
676 Type = SDCCH/4[2]
677 Timeslot Number: 0
678 Training Sequence Code: 7h
679 ARFCN: 1
680 SI Rest Octets
681 Cell Bar Qualify (CBQ): 0
682 Cell Reselect Offset = 0 dB
683 Temporary Offset = 0 dB
684 Penalty Time = 20 s
685*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000686static u_int8_t si4[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000687 /* header */0x41, 0x06, 0x1C,
688 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
689 /* sel */0x62, 0x00,
690 /* rach*/0xD5, 0x00, 0x00,
691 /* var */0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/, 0x80, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000692 0x2B, 0x2B, 0x2B
693};
694
695/*
696 SYSTEM INFORMATION TYPE 5
697 Neighbour Cells Description
698 EXT-IND: Carries the complete BA
699 BA-IND = 0
700 Format-ID bit map 0
701 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
702*/
703
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000704static u_int8_t si5[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000705 /* header without l2 len*/0x06, 0x1D,
706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
707 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000708};
709
710// SYSTEM INFORMATION TYPE 6
711
712/*
713SACCH FILLING
714 System Info Type: SYSTEM INFORMATION 6
715 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
716
717SYSTEM INFORMATION TYPE 6
718 Cell identity = 00001 (1h)
719 Location area identification
720 Mobile Country Code (MCC): 001
721 Mobile Network Code (MNC): 01
722 Location Area Code (LAC): 00001 (1h)
723 Cell Options SACCH
724 Power control indicator: not set
725 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
726 Radio link timeout = 36
727 NCC permitted (NCC) = FF
728*/
729
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000730static u_int8_t si6[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000731 /* header */0x06, 0x1E,
732 /* cell id*/ 0x00, 0x01,
733 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
734 /* options */ 0x28,
735 /* ncc */ 0xFF,
Harald Welte52b1f982008-12-23 20:25:15 +0000736};
737
738
739
740static const struct bcch_info bcch_infos[] = {
741 {
742 .type = RSL_SYSTEM_INFO_1,
743 .len = sizeof(si1),
744 .data = si1,
745 }, {
746 .type = RSL_SYSTEM_INFO_2,
747 .len = sizeof(si2),
748 .data = si2,
749 }, {
750 .type = RSL_SYSTEM_INFO_3,
751 .len = sizeof(si3),
752 .data = si3,
753 }, {
754 .type = RSL_SYSTEM_INFO_4,
755 .len = sizeof(si4),
756 .data = si4,
757 },
758};
759
Holger Freyther24287b62008-12-28 16:32:41 +0000760static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
761static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
762static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
763static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
Harald Welte104604e2008-12-28 16:36:11 +0000764static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
765static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
Holger Freyther24287b62008-12-28 16:32:41 +0000766
Harald Welte52b1f982008-12-23 20:25:15 +0000767/* set all system information types */
Harald Weltee79769b2009-02-07 00:48:17 +0000768static int set_system_infos(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000769{
770 int i;
771
772 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
Harald Weltee79769b2009-02-07 00:48:17 +0000773 rsl_bcch_info(trx, bcch_infos[i].type,
Harald Welte52b1f982008-12-23 20:25:15 +0000774 bcch_infos[i].data,
775 bcch_infos[i].len);
776 }
Harald Weltee79769b2009-02-07 00:48:17 +0000777 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
778 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
Harald Weltead384642008-12-26 10:20:07 +0000779
780 return 0;
Harald Welte52b1f982008-12-23 20:25:15 +0000781}
782
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000783/*
Harald Welte38c2f132009-01-06 23:10:57 +0000784 * Inform anyone...
785 */
786static void bsc_hack_channel_allocated(struct gsm_lchan *lchan) {
787}
788
789/*
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000790 * Patch the various SYSTEM INFORMATION tables to update
791 * the LAI
792 */
793static void patch_tables(struct gsm_bts *bts)
794{
Harald Welte98981882009-01-06 18:59:11 +0000795 u_int8_t arfcn_low = ARFCN & 0xff;
796 u_int8_t arfcn_high = (ARFCN >> 8) & 0x0f;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000797 /* covert the raw packet to the struct */
798 struct gsm48_system_information_type_3 *type_3 =
799 (struct gsm48_system_information_type_3*)&si3;
800 struct gsm48_system_information_type_4 *type_4 =
801 (struct gsm48_system_information_type_4*)&si4;
802 struct gsm48_system_information_type_6 *type_6 =
803 (struct gsm48_system_information_type_6*)&si6;
Harald Welteb84e2f42008-12-28 23:42:04 +0000804 struct gsm48_loc_area_id lai;
805
806 gsm0408_generate_lai(&lai, bts->network->country_code,
807 bts->network->network_code, bts->location_area_code);
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000808
809 /* assign the MCC and MNC */
Harald Welteb84e2f42008-12-28 23:42:04 +0000810 type_3->lai = lai;
811 type_4->lai = lai;
812 type_6->lai = lai;
Harald Welte98981882009-01-06 18:59:11 +0000813
814 /* patch ARFCN */
815 msg_2[74] &= 0xf0;
816 msg_2[74] |= arfcn_high;
817 msg_2[75] = arfcn_low;
818
819 msg_6[7] &= 0xf0;
820 msg_6[7] |= arfcn_high;
821 msg_6[8] = arfcn_low;
822
823 type_4->data[2] &= 0xf0;
824 type_4->data[2] |= arfcn_high;
825 type_4->data[3] = arfcn_low;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000826
827 /* patch Control Channel Description 10.5.2.11 */
828 type_3->control_channel_desc = bts->chan_desc;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000829}
830
831
Harald Weltee79769b2009-02-07 00:48:17 +0000832static void bootstrap_rsl(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000833{
Harald Welteb84e2f42008-12-28 23:42:04 +0000834 fprintf(stdout, "bootstrapping RSL MCC=%u MNC=%u\n", MCC, MNC);
Harald Weltee79769b2009-02-07 00:48:17 +0000835 set_system_infos(trx);
Harald Welte52b1f982008-12-23 20:25:15 +0000836}
837
Harald Welte1fa60c82009-02-09 18:13:26 +0000838void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
Harald Weltead384642008-12-26 10:20:07 +0000839{
840 switch (event) {
Harald Welte1fa60c82009-02-09 18:13:26 +0000841 case EVT_E1_TEI_UP:
842 switch (type) {
843 case E1INP_SIGN_OML:
844 bootstrap_om(trx->bts);
845 break;
846 case E1INP_SIGN_RSL:
847 bootstrap_rsl(trx);
848 break;
849 default:
850 break;
851 }
Harald Weltead384642008-12-26 10:20:07 +0000852 break;
Harald Welte1fa60c82009-02-09 18:13:26 +0000853 case EVT_E1_TEI_DN:
854 fprintf(stderr, "Lost some E1 TEI link\n");
855 /* FIXME: deal with TEI or L1 link loss */
Harald Weltead384642008-12-26 10:20:07 +0000856 break;
857 default:
Harald Weltead384642008-12-26 10:20:07 +0000858 break;
859 }
860}
861
862static int bootstrap_network(void)
Harald Welte52b1f982008-12-23 20:25:15 +0000863{
864 struct gsm_bts *bts;
865
866 /* initialize our data structures */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000867 gsmnet = gsm_network_init(1, BTS_TYPE, MCC, MNC);
Harald Weltead384642008-12-26 10:20:07 +0000868 if (!gsmnet)
869 return -ENOMEM;
Harald Weltef5cbab72008-12-30 18:00:15 +0000870
871 gsmnet->name_short = "25C3";
872 gsmnet->name_long = "25C3 GSM";
Harald Welte52b1f982008-12-23 20:25:15 +0000873 bts = &gsmnet->bts[0];
874 bts->location_area_code = 1;
Harald Welte98981882009-01-06 18:59:11 +0000875 bts->trx[0].arfcn = ARFCN;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000876
877 /* Control Channel Description */
878 memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr));
879 bts->chan_desc.att = 0;
880 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
881 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
882 bts->chan_desc.t3212 = 0;
883
Harald Welte98981882009-01-06 18:59:11 +0000884 patch_tables(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000885
Holger Freyther1fd34142009-02-09 23:42:03 +0000886 paging_init(bts);
Holger Freytherceb59b72009-02-06 18:54:00 +0000887 bts->paging.channel_allocated = bsc_hack_channel_allocated;
Harald Welte38c2f132009-01-06 23:10:57 +0000888
Holger Freyther219518d2009-01-02 22:04:43 +0000889 telnet_init(gsmnet, 4242);
Harald Weltead384642008-12-26 10:20:07 +0000890
Harald Welte1fa60c82009-02-09 18:13:26 +0000891 /* E1 mISDN input setup */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000892 if (BTS_TYPE == GSM_BTS_TYPE_BS11)
893 return e1_config(bts);
894 else
895 return ia_config(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000896}
Harald Weltef6b7a902008-12-26 00:05:11 +0000897
Holger Freyther9a3ee0f2009-01-02 00:40:15 +0000898static void create_pcap_file(char *file)
899{
Harald Welte1fa60c82009-02-09 18:13:26 +0000900#if 0
Holger Freyther9a3ee0f2009-01-02 00:40:15 +0000901 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
902 int fd = open(file, O_WRONLY|O_TRUNC|O_CREAT, mode);
903
904 if (fd < 0) {
905 perror("Failed to open file for pcap");
906 return;
907 }
908
909 mi_set_pcap_fd(fd);
Harald Welte1fa60c82009-02-09 18:13:26 +0000910#else
911 fprintf(stderr, "PCAP support currently disabled!!\n");
912#endif
Holger Freyther9a3ee0f2009-01-02 00:40:15 +0000913}
914
Holger Freytherb332f612008-12-27 12:46:51 +0000915static void print_usage()
916{
917 printf("Usage: bsc_hack\n");
918}
919
920static void print_help()
921{
922 printf(" Some useful help...\n");
923 printf(" -d option --debug=DRLL:DCC:DMM:DRR:DRSL:DNM enable debugging\n");
Holger Freytherefde7fb2008-12-28 14:14:56 +0000924 printf(" -s --disable-color\n");
925 printf(" -n --network-code number(MNC) \n");
926 printf(" -c --country-code number (MCC) \n");
Harald Welte98981882009-01-06 18:59:11 +0000927 printf(" -f --arfcn number The frequency ARFCN\n");
Holger Freytherbde36102008-12-28 22:51:39 +0000928 printf(" -l --database db-name The database to use\n");
Holger Freyther89824fc2008-12-30 16:18:18 +0000929 printf(" -a --authorize-everyone Allow everyone into the network.\n");
Holger Freythere97f7fb2008-12-31 18:52:11 +0000930 printf(" -r --reject-cause number The reject cause for LOCATION UPDATING REJECT.\n");
Holger Freyther9a3ee0f2009-01-02 00:40:15 +0000931 printf(" -p --pcap file The filename of the pcap file\n");
Holger Freytherb332f612008-12-27 12:46:51 +0000932 printf(" -h --help this text\n");
933}
934
Harald Welte8c1d0e42009-02-15 03:38:12 +0000935static const char *bts_types[] = {
936 [GSM_BTS_TYPE_UNKNOWN] = "unknown",
937 [GSM_BTS_TYPE_BS11] = "bs11",
938 [GSM_BTS_TYPE_NANOBTS_900] = "nanobts900",
939 [GSM_BTS_TYPE_NANOBTS_1800] = "nanobts1800",
940};
941
942enum gsm_bts_type parse_btstype(char *arg)
943{
944 int i;
945 for (i = 0; i < ARRAY_SIZE(bts_types); i++) {
946 if (!strcmp(arg, bts_types[i]))
947 return i;
948 }
949 return 0; /* Default: BS11 */
950}
951
Holger Freytherb332f612008-12-27 12:46:51 +0000952static void handle_options(int argc, char** argv)
953{
954 while (1) {
955 int option_index = 0, c;
956 static struct option long_options[] = {
957 {"help", 0, 0, 'h'},
958 {"debug", 1, 0, 'd'},
Holger Freytherefde7fb2008-12-28 14:14:56 +0000959 {"disable-color", 0, 0, 's'},
960 {"network-code", 1, 0, 'n'},
961 {"country-code", 1, 0, 'c'},
Holger Freytherbde36102008-12-28 22:51:39 +0000962 {"database", 1, 0, 'l'},
Holger Freyther89824fc2008-12-30 16:18:18 +0000963 {"authorize-everyone", 0, 0, 'a'},
Holger Freythere97f7fb2008-12-31 18:52:11 +0000964 {"reject-cause", 1, 0, 'r'},
Holger Freyther9a3ee0f2009-01-02 00:40:15 +0000965 {"pcap", 1, 0, 'p'},
Harald Welte98981882009-01-06 18:59:11 +0000966 {"arfcn", 1, 0, 'f'},
Harald Welte8c1d0e42009-02-15 03:38:12 +0000967 {"bts-type", 1, 0, 't'},
Holger Freytherb332f612008-12-27 12:46:51 +0000968 {0, 0, 0, 0}
969 };
970
Harald Welte8c1d0e42009-02-15 03:38:12 +0000971 c = getopt_long(argc, argv, "hc:n:d:sar:p:f:t:",
Holger Freytherb332f612008-12-27 12:46:51 +0000972 long_options, &option_index);
973 if (c == -1)
974 break;
975
976 switch (c) {
977 case 'h':
978 print_usage();
979 print_help();
980 exit(0);
Holger Freytherefde7fb2008-12-28 14:14:56 +0000981 case 's':
Holger Freytherb332f612008-12-27 12:46:51 +0000982 debug_use_color(0);
983 break;
984 case 'd':
985 debug_parse_category_mask(optarg);
986 break;
Holger Freytherefde7fb2008-12-28 14:14:56 +0000987 case 'n':
988 MNC = atoi(optarg);
989 break;
990 case 'c':
991 MCC = atoi(optarg);
992 break;
Harald Welte98981882009-01-06 18:59:11 +0000993 case 'f':
994 ARFCN = atoi(optarg);
995 break;
Harald Welte8965da42009-01-06 18:09:02 +0000996 case 'l':
Holger Freytherbde36102008-12-28 22:51:39 +0000997 database_name = strdup(optarg);
998 break;
Holger Freyther89824fc2008-12-30 16:18:18 +0000999 case 'a':
1000 gsm0408_allow_everyone(1);
1001 break;
Holger Freythere97f7fb2008-12-31 18:52:11 +00001002 case 'r':
1003 gsm0408_set_reject_cause(atoi(optarg));
1004 break;
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001005 case 'p':
1006 create_pcap_file(optarg);
1007 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +00001008 case 't':
1009 BTS_TYPE = parse_btstype(optarg);
1010 break;
Holger Freytherb332f612008-12-27 12:46:51 +00001011 default:
1012 /* ignore */
1013 break;
1014 }
1015 }
1016}
1017
Harald Welted1252502009-01-01 01:50:32 +00001018static void signal_handler(int signal)
1019{
1020 fprintf(stdout, "signal %u received\n", signal);
1021
1022 switch (signal) {
1023 case SIGHUP:
1024 case SIGABRT:
1025 shutdown_net(gsmnet);
1026 break;
1027 default:
1028 break;
1029 }
1030}
1031
Harald Weltef6b7a902008-12-26 00:05:11 +00001032int main(int argc, char **argv)
1033{
Harald Welte1fa60c82009-02-09 18:13:26 +00001034 int rc;
1035
Holger Freytherb332f612008-12-27 12:46:51 +00001036 /* parse options */
1037 handle_options(argc, argv);
1038
Holger Freytherbde36102008-12-28 22:51:39 +00001039 if (db_init(database_name)) {
Harald Welte75a983f2008-12-27 21:34:06 +00001040 printf("DB: Failed to init database. Please check the option settings.\n");
1041 return 1;
1042 }
1043 printf("DB: Database initialized.\n");
1044
1045 if (db_prepare()) {
1046 printf("DB: Failed to prepare database.\n");
1047 return 1;
1048 }
1049 printf("DB: Database prepared.\n");
1050
Harald Welte1fa60c82009-02-09 18:13:26 +00001051 rc = bootstrap_network();
1052 if (rc < 0)
1053 exit(1);
Harald Weltef6b7a902008-12-26 00:05:11 +00001054
Harald Welted1252502009-01-01 01:50:32 +00001055 signal(SIGHUP, &signal_handler);
1056 signal(SIGABRT, &signal_handler);
1057
Harald Weltef6b7a902008-12-26 00:05:11 +00001058 while (1) {
1059 bsc_select_main();
1060 }
1061}