blob: f1142cc7f17ca0c2c91ee83db90a8be6f793a611 [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 Welte52b1f982008-12-23 20:25:15 +000050
51/* global pointer to the gsm network data structure */
Harald Welte879c85a2009-05-01 15:00:20 +000052static struct gsm_network *gsmnet;
Harald Welte52b1f982008-12-23 20:25:15 +000053
Holger Freytherefde7fb2008-12-28 14:14:56 +000054/* MCC and MNC for the Location Area Identifier */
55static int MCC = 1;
56static int MNC = 1;
Holger Freyther0a173bf2009-04-22 22:07:07 +000057static int LAC = 1;
Harald Welte98981882009-01-06 18:59:11 +000058static int ARFCN = HARDCODED_ARFCN;
Holger Freytherdda22c12009-04-22 22:07:31 +000059static int cardnr = 0;
Holger Freytherb5c00f52009-04-22 22:08:07 +000060static int release_l2 = 0;
Harald Welte8c1d0e42009-02-15 03:38:12 +000061static enum gsm_bts_type BTS_TYPE = GSM_BTS_TYPE_BS11;
Holger Freytherbde36102008-12-28 22:51:39 +000062static const char *database_name = "hlr.sqlite3";
Holger Freytherefde7fb2008-12-28 14:14:56 +000063
Harald Welte52b1f982008-12-23 20:25:15 +000064/* The following definitions are for OM and NM packets that we cannot yet
65 * generate by code but we just pass on */
66
67// BTS Site Manager, SET ATTRIBUTES
68
69/*
70 Object Class: BTS Site Manager
71 Instance 1: FF
72 Instance 2: FF
73 Instance 3: FF
74SET ATTRIBUTES
75 sAbisExternalTime: 2007/09/08 14:36:11
76 omLAPDRelTimer: 30sec
77 shortLAPDIntTimer: 5sec
78 emergencyTimer1: 10 minutes
79 emergencyTimer2: 0 minutes
80*/
81
82unsigned char msg_1[] =
83{
Harald Weltecd993872009-02-15 16:16:28 +000084 0xD0, 0x00, 0xFF, 0xFF, 0xFF,
85 NM_ATT_BS11_ABIS_EXT_TIME, 0x07, 0xD7, 0x09, 0x08, 0x0E, 0x24, 0x0B, 0xCE,
86 0x02, 0x00, 0x1E,
87 0xE8, 0x01, 0x05,
88 0x42, 0x02, 0x00, 0x0A,
89 0x44, 0x02, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +000090};
91
92// BTS, SET BTS ATTRIBUTES
93
94/*
95 Object Class: BTS
96 BTS relat. Number: 0
97 Instance 2: FF
98 Instance 3: FF
99SET BTS ATTRIBUTES
100 bsIdentityCode / BSIC:
101 PLMN_colour_code: 7h
102 BS_colour_code: 7h
103 BTS Air Timer T3105: 4 ,unit 10 ms
104 btsIsHopping: FALSE
Harald Welte83282292009-02-01 16:22:19 +0000105 periodCCCHLoadIndication: 1sec
Holger Freyther3b910432009-02-11 00:43:48 +0000106 thresholdCCCHLoadIndication: 0%
Harald Welte52b1f982008-12-23 20:25:15 +0000107 cellAllocationNumber: 00h = GSM 900
108 enableInterferenceClass: 00h = Disabled
109 fACCHQual: 6 (FACCH stealing flags minus 1)
110 intaveParameter: 31 SACCH multiframes
111 interferenceLevelBoundaries:
112 Interference Boundary 1: 0Ah
113 Interference Boundary 2: 0Fh
114 Interference Boundary 3: 14h
115 Interference Boundary 4: 19h
116 Interference Boundary 5: 1Eh
117 mSTxPwrMax: 11
118 GSM range: 2=39dBm, 15=13dBm, stepsize 2 dBm
119 DCS1800 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
120 PCS1900 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
121 30=33dBm, 31=32dBm
122 ny1:
123 Maximum number of repetitions for PHYSICAL INFORMATION message (GSM 04.08): 20
124 powerOutputThresholds:
125 Out Power Fault Threshold: -10 dB
126 Red Out Power Threshold: - 6 dB
127 Excessive Out Power Threshold: 5 dB
128 rACHBusyThreshold: -127 dBm
129 rACHLoadAveragingSlots: 250 ,number of RACH burst periods
130 rfResourceIndicationPeriod: 125 SACCH multiframes
131 T200:
132 SDCCH: 044 in 5 ms
133 FACCH/Full rate: 031 in 5 ms
134 FACCH/Half rate: 041 in 5 ms
135 SACCH with TCH SAPI0: 090 in 10 ms
136 SACCH with SDCCH: 090 in 10 ms
137 SDCCH with SAPI3: 090 in 5 ms
138 SACCH with TCH SAPI3: 135 in 10 ms
139 tSync: 9000 units of 10 msec
140 tTrau: 9000 units of 10 msec
141 enableUmLoopTest: 00h = disabled
142 enableExcessiveDistance: 00h = Disabled
143 excessiveDistance: 64km
144 hoppingMode: 00h = baseband hopping
145 cellType: 00h = Standard Cell
146 BCCH ARFCN / bCCHFrequency: 1
147*/
148
149unsigned char msg_2[] =
150{
Harald Welte8c1d0e42009-02-15 03:38:12 +0000151 0x41, 0x01, 0x00, 0xFF, 0xFF,
152 NM_ATT_BSIC, 0x3F,
153 NM_ATT_BTS_AIR_TIMER, 0x04,
Harald Weltecd993872009-02-15 16:16:28 +0000154 NM_ATT_BS11_BTSLS_HOPPING, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000155 NM_ATT_CCCH_L_I_P, 0x01,
156 NM_ATT_CCCH_L_T, 0x00,
Harald Weltecd993872009-02-15 16:16:28 +0000157 NM_ATT_BS11_CELL_ALLOC_NR, 0x00,
158 NM_ATT_BS11_ENA_INTERF_CLASS, 0x00,
159 NM_ATT_BS11_FACCH_QUAL, 0x06,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000160 NM_ATT_INTAVE_PARAM, 0x1F,
161 NM_ATT_INTERF_BOUND, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x7B,
162 NM_ATT_CCCH_L_T, 0x23,
163 NM_ATT_GSM_TIME, 0x28, 0x00,
164 NM_ATT_ADM_STATE, 0x03,
165 NM_ATT_RACH_B_THRESH, 0x7F,
166 NM_ATT_LDAVG_SLOTS, 0x00, 0xFA,
Harald Weltecd993872009-02-15 16:16:28 +0000167 NM_ATT_BS11_RF_RES_IND_PER, 0x7D,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000168 NM_ATT_T200, 0x2C, 0x1F, 0x29, 0x5A, 0x5A, 0x5A, 0x87,
Harald Weltecd993872009-02-15 16:16:28 +0000169 NM_ATT_BS11_TSYNC, 0x23, 0x28,
170 NM_ATT_BS11_TTRAU, 0x23, 0x28,
171 NM_ATT_TEST_DUR, 0x01, 0x00,
172 NM_ATT_OUTST_ALARM, 0x01, 0x00,
173 NM_ATT_BS11_EXCESSIVE_DISTANCE, 0x01, 0x40,
174 NM_ATT_BS11_HOPPING_MODE, 0x01, 0x00,
175 NM_ATT_BS11_PLL, 0x01, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000176 NM_ATT_BCCH_ARFCN, 0x00, HARDCODED_ARFCN/*0x01*/,
Harald Welte52b1f982008-12-23 20:25:15 +0000177};
178
179// Handover Recognition, SET ATTRIBUTES
180
181/*
182Illegal Contents GSM Formatted O&M Msg
183 Object Class: Handover Recognition
184 BTS relat. Number: 0
185 Instance 2: FF
186 Instance 3: FF
187SET ATTRIBUTES
188 enableDelayPowerBudgetHO: 00h = Disabled
189 enableDistanceHO: 00h = Disabled
190 enableInternalInterCellHandover: 00h = Disabled
191 enableInternalIntraCellHandover: 00h = Disabled
192 enablePowerBudgetHO: 00h = Disabled
193 enableRXLEVHO: 00h = Disabled
194 enableRXQUALHO: 00h = Disabled
195 hoAveragingDistance: 8 SACCH multiframes
196 hoAveragingLev:
197 A_LEV_HO: 8 SACCH multiframes
198 W_LEV_HO: 1 SACCH multiframes
199 hoAveragingPowerBudget: 16 SACCH multiframes
200 hoAveragingQual:
201 A_QUAL_HO: 8 SACCH multiframes
202 W_QUAL_HO: 2 SACCH multiframes
203 hoLowerThresholdLevDL: (10 - 110) dBm
204 hoLowerThresholdLevUL: (5 - 110) dBm
205 hoLowerThresholdQualDL: 06h = 6.4% < BER < 12.8%
206 hoLowerThresholdQualUL: 06h = 6.4% < BER < 12.8%
207 hoThresholdLevDLintra : (20 - 110) dBm
208 hoThresholdLevULintra: (20 - 110) dBm
209 hoThresholdMsRangeMax: 20 km
210 nCell: 06h
211 timerHORequest: 3 ,unit 2 SACCH multiframes
212*/
213
214unsigned char msg_3[] =
215{
Harald Weltecd993872009-02-15 16:16:28 +0000216 0xD0, 0xA1, 0x00, 0xFF, 0xFF,
217 0xD0, 0x00,
218 0x64, 0x00,
219 0x67, 0x00,
220 0x68, 0x00,
221 0x6A, 0x00,
222 0x6C, 0x00,
223 0x6D, 0x00,
224 0x6F, 0x08,
225 0x70, 0x08, 0x01,
226 0x71, 0x10, 0x10, 0x10,
227 0x72, 0x08, 0x02,
228 0x73, 0x0A,
229 0x74, 0x05,
230 0x75, 0x06,
231 0x76, 0x06,
232 0x78, 0x14,
233 0x79, 0x14,
234 0x7A, 0x14,
235 0x7D, 0x06,
236 0x92, 0x03, 0x20, 0x01, 0x00,
237 0x45, 0x01, 0x00,
238 0x48, 0x01, 0x00,
239 0x5A, 0x01, 0x00,
240 0x5B, 0x01, 0x05,
241 0x5E, 0x01, 0x1A,
242 0x5F, 0x01, 0x20,
243 0x9D, 0x01, 0x00,
244 0x47, 0x01, 0x00,
245 0x5C, 0x01, 0x64,
246 0x5D, 0x01, 0x1E,
247 0x97, 0x01, 0x20,
248 0xF7, 0x01, 0x3C,
Harald Welte52b1f982008-12-23 20:25:15 +0000249};
250
251// Power Control, SET ATTRIBUTES
252
253/*
254 Object Class: Power Control
255 BTS relat. Number: 0
256 Instance 2: FF
257 Instance 3: FF
258SET ATTRIBUTES
259 enableMsPowerControl: 00h = Disabled
260 enablePowerControlRLFW: 00h = Disabled
261 pcAveragingLev:
262 A_LEV_PC: 4 SACCH multiframes
263 W_LEV_PC: 1 SACCH multiframes
264 pcAveragingQual:
265 A_QUAL_PC: 4 SACCH multiframes
266 W_QUAL_PC: 2 SACCH multiframes
267 pcLowerThresholdLevDL: 0Fh
268 pcLowerThresholdLevUL: 0Ah
269 pcLowerThresholdQualDL: 05h = 3.2% < BER < 6.4%
270 pcLowerThresholdQualUL: 05h = 3.2% < BER < 6.4%
271 pcRLFThreshold: 0Ch
272 pcUpperThresholdLevDL: 14h
273 pcUpperThresholdLevUL: 0Fh
274 pcUpperThresholdQualDL: 04h = 1.6% < BER < 3.2%
275 pcUpperThresholdQualUL: 04h = 1.6% < BER < 3.2%
276 powerConfirm: 2 ,unit 2 SACCH multiframes
277 powerControlInterval: 2 ,unit 2 SACCH multiframes
278 powerIncrStepSize: 02h = 4 dB
279 powerRedStepSize: 01h = 2 dB
280 radioLinkTimeoutBs: 64 SACCH multiframes
281 enableBSPowerControl: 00h = disabled
282*/
283
284unsigned char msg_4[] =
285{
Harald Weltecd993872009-02-15 16:16:28 +0000286 0xD0, 0xA2, 0x00, 0xFF, 0xFF,
287 NM_ATT_BS11_ENA_MS_PWR_CTRL, 0x00,
288 NM_ATT_BS11_ENA_PWR_CTRL_RLFW, 0x00,
289 0x7E, 0x04, 0x01,
290 0x7F, 0x04, 0x02,
291 0x80, 0x0F,
292 0x81, 0x0A,
293 0x82, 0x05,
294 0x83, 0x05,
295 0x84, 0x0C,
296 0x85, 0x14,
297 0x86, 0x0F,
298 0x87, 0x04,
299 0x88, 0x04,
300 0x89, 0x02,
301 0x8A, 0x02,
302 0x8B, 0x02,
303 0x8C, 0x01,
304 0x8D, 0x40,
305 0x65, 0x01, 0x00 // set to 0x01 to enable BSPowerControl
Harald Welte52b1f982008-12-23 20:25:15 +0000306};
307
308
309// Transceiver, SET TRX ATTRIBUTES (TRX 0)
310
311/*
312 Object Class: Transceiver
313 BTS relat. Number: 0
314 Tranceiver number: 0
315 Instance 3: FF
316SET TRX ATTRIBUTES
317 aRFCNList (HEX): 0001
Harald Weltecd993872009-02-15 16:16:28 +0000318 txPwrMaxReduction: 00h = 30dB
Harald Welte52b1f982008-12-23 20:25:15 +0000319 radioMeasGran: 254 SACCH multiframes
320 radioMeasRep: 01h = enabled
321 memberOfEmergencyConfig: 01h = TRUE
322 trxArea: 00h = TRX doesn't belong to a concentric cell
323*/
324
325unsigned char msg_6[] =
326{
Harald Weltecd993872009-02-15 16:16:28 +0000327 0x44, 0x02, 0x00, 0x00, 0xFF,
328 NM_ATT_ARFCN_LIST, 0x01, 0x00, HARDCODED_ARFCN /*0x01*/,
Harald Welte311d0cf2009-02-17 17:45:59 +0000329 NM_ATT_RF_MAXPOWR_R, 0x00,
Harald Weltecd993872009-02-15 16:16:28 +0000330 NM_ATT_BS11_RADIO_MEAS_GRAN, 0x01, 0xFE,
331 NM_ATT_BS11_RADIO_MEAS_REP, 0x01, 0x01,
332 NM_ATT_BS11_EMRG_CFG_MEMBER, 0x01, 0x01,
333 NM_ATT_BS11_TRX_AREA, 0x01, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000334};
335
Harald Welte8c1d0e42009-02-15 03:38:12 +0000336static unsigned char nanobts_attr_bts[] = {
337 NM_ATT_INTERF_BOUND, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73,
338 NM_ATT_INTAVE_PARAM, 0x06,
339 NM_ATT_CONN_FAIL_CRIT, 0x00, 0x02, 0x01, 0x10,
340 NM_ATT_T200, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21, 0xa8,
341 NM_ATT_MAX_TA, 0x3f,
Harald Welte311d0cf2009-02-17 17:45:59 +0000342 NM_ATT_OVERL_PERIOD, 0x00, 0x01, 10, /* seconds */
343 NM_ATT_CCCH_L_T, 10, /* percent */
344 NM_ATT_CCCH_L_I_P, 1, /* seconds */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000345 NM_ATT_RACH_B_THRESH, 0x0a,
346 NM_ATT_LDAVG_SLOTS, 0x03, 0xe8,
347 NM_ATT_BTS_AIR_TIMER, 0x80,
348 NM_ATT_NY1, 0x0a,
349 NM_ATT_BCCH_ARFCN, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
350 NM_ATT_BSIC, 0x20,
351};
Harald Welte52b1f982008-12-23 20:25:15 +0000352
Harald Welte8c1d0e42009-02-15 03:38:12 +0000353static unsigned char nanobts_attr_radio[] = {
Harald Welte311d0cf2009-02-17 17:45:59 +0000354 NM_ATT_RF_MAXPOWR_R, 0x0c,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000355 NM_ATT_ARFCN_LIST, 0x00, 0x02, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
356};
357
Harald Welte5c1e4582009-02-15 11:57:29 +0000358static unsigned char nanobts_attr_e0[] = {
359 0x85, 0x00,
360 0x81, 0x0b, 0xbb, /* TCP PORT for RSL */
361};
362
Harald Welteb4630602009-05-01 15:43:22 +0000363/* Callback function to be called whenever we get a GSM 12.21 state change event */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000364int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
365 struct gsm_nm_state *old_state, struct gsm_nm_state *new_state)
366{
367 struct gsm_bts *bts;
368 struct gsm_bts_trx *trx;
369 struct gsm_bts_trx_ts *ts;
370
371 /* This is currently only required on nanoBTS */
372
373 switch (evt) {
374 case EVT_STATECHG_OPER:
375 switch (obj_class) {
376 case NM_OC_SITE_MANAGER:
377 bts = container_of(obj, struct gsm_bts, site_mgr);
378 if (old_state->operational != 2 && new_state->operational == 2) {
379 abis_nm_opstart(bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
380 }
381 break;
382 case NM_OC_BTS:
383 bts = obj;
384 if (new_state->availability == 5) {
385 abis_nm_set_bts_attr(bts, nanobts_attr_bts,
386 sizeof(nanobts_attr_bts));
387 abis_nm_opstart(bts, NM_OC_BTS,
Harald Welte191280d2009-05-01 13:20:04 +0000388 bts->bts_nr, 0xff, 0xff);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000389 abis_nm_chg_adm_state(bts, NM_OC_BTS,
Harald Welte191280d2009-05-01 13:20:04 +0000390 bts->bts_nr, 0xff, 0xff,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000391 NM_STATE_UNLOCKED);
392 }
393 break;
394 case NM_OC_RADIO_CARRIER:
Harald Welte8c1d0e42009-02-15 03:38:12 +0000395 break;
396 case NM_OC_CHANNEL:
397 ts = obj;
398 trx = ts->trx;
399 if (new_state->availability == 5) {
400 if (ts->nr == 0 && trx == trx->bts->c0)
Harald Weltee1bd2412009-02-15 14:40:09 +0000401 abis_nm_set_channel_attr(ts, NM_CHANC_BCCH_CBCH);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000402 else
403 abis_nm_set_channel_attr(ts, NM_CHANC_TCHFull);
404 abis_nm_opstart(trx->bts, NM_OC_CHANNEL,
Harald Welte191280d2009-05-01 13:20:04 +0000405 trx->bts->bts_nr, trx->nr, ts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000406 abis_nm_chg_adm_state(trx->bts, NM_OC_CHANNEL,
Harald Welte191280d2009-05-01 13:20:04 +0000407 trx->bts->bts_nr, trx->nr, ts->nr,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000408 NM_STATE_UNLOCKED);
409 }
410 break;
411 case NM_OC_BASEB_TRANSC:
412 trx = container_of(obj, struct gsm_bts_trx, bb_transc);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000413 break;
414 }
415 break;
Holger Freytherff9592f2009-03-09 16:17:14 +0000416 case EVT_STATECHG_ADM:
417 DEBUGP(DMM, "Unhandled state change in %s:%d\n", __func__, __LINE__);
418 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000419 }
420 return 0;
421}
422
Harald Welteb4630602009-05-01 15:43:22 +0000423/* Callback function to be called every time we receive a 12.21 SW activated report */
424static int sw_activ_rep(struct msgb *mb)
425{
426 struct abis_om_fom_hdr *foh = msgb_l3(mb);
427 struct gsm_bts_trx *trx = mb->trx;
428
429 switch (foh->obj_class) {
430 case NM_OC_BASEB_TRANSC:
431 /* TRX software is active, tell it to initiate RSL Link */
432 abis_nm_ipaccess_msg(trx->bts, 0xe0, NM_OC_BASEB_TRANSC,
433 trx->bts->bts_nr, trx->nr, 0xff,
434 nanobts_attr_e0, sizeof(nanobts_attr_e0));
435 abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC,
436 trx->bts->bts_nr, trx->nr, 0xff);
437 abis_nm_chg_adm_state(trx->bts, NM_OC_BASEB_TRANSC,
438 trx->bts->bts_nr, trx->nr, 0xff,
439 NM_STATE_UNLOCKED);
440 break;
441 case NM_OC_RADIO_CARRIER:
442 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
443 sizeof(nanobts_attr_radio));
444 abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
445 trx->bts->bts_nr, trx->nr, 0xff);
446 abis_nm_chg_adm_state(trx->bts, NM_OC_RADIO_CARRIER,
447 trx->bts->bts_nr, trx->nr, 0xff,
448 NM_STATE_UNLOCKED);
449 break;
450 }
451 return 0;
452}
453
454/* Callback function to be called every time we receive a signal from NM */
455static int nm_sig_cb(unsigned int subsys, unsigned int signal,
456 void *handler_data, void *signal_data)
457{
458 switch (signal) {
459 case S_NM_SW_ACTIV_REP:
460 return sw_activ_rep(signal_data);
461 default:
462 break;
463 }
464 return 0;
465}
466
Harald Welte8c1d0e42009-02-15 03:38:12 +0000467static void bootstrap_om_nanobts(struct gsm_bts *bts)
468{
Harald Weltee1bd2412009-02-15 14:40:09 +0000469 /* We don't do callback based bootstrapping, but event driven (see above) */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000470}
471
472static void bootstrap_om_bs11(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000473{
474 struct gsm_bts_trx *trx = &bts->trx[0];
475
476 /* stop sending event reports */
477 abis_nm_event_reports(bts, 0);
478
479 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000480 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000481
Harald Welte702d8702008-12-26 20:25:35 +0000482 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000483 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte702d8702008-12-26 20:25:35 +0000484
485 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000486 abis_nm_bs11_reset_resource(bts);
Harald Welte702d8702008-12-26 20:25:35 +0000487
488 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000489 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte702d8702008-12-26 20:25:35 +0000490
Harald Welte52b1f982008-12-23 20:25:15 +0000491 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
492 abis_nm_raw_msg(bts, sizeof(msg_2), msg_2); /* set BTS attr */
493 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
494 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
495
496 /* Connect signalling of bts0/trx0 to e1_0/ts1/64kbps */
497 abis_nm_conn_terr_sign(trx, 0, 1, 0xff);
Harald Weltecd06bfb2009-02-10 17:33:56 +0000498 set_ts_e1link(&trx->ts[0], 0, 1, 0xff);
Harald Welte52b1f982008-12-23 20:25:15 +0000499 abis_nm_raw_msg(bts, sizeof(msg_6), msg_6); /* SET TRX ATTRIBUTES */
500
501 /* Use TEI 1 for signalling */
502 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x01);
503 abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH_CBCH);
Harald Weltecd06bfb2009-02-10 17:33:56 +0000504
505#ifdef HAVE_TRX1
Harald Welte52b1f982008-12-23 20:25:15 +0000506 /* TRX 1 */
507 abis_nm_conn_terr_sign(&bts->trx[1], 0, 1, 0xff);
508 /* FIXME: TRX ATTRIBUTE */
509 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x02);
510#endif
511
512 /* SET CHANNEL ATTRIBUTE TS1 */
Harald Welte23887b62009-02-18 03:37:20 +0000513 abis_nm_set_channel_attr(&trx->ts[1], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000514 /* Connect traffic of bts0/trx0/ts1 to e1_0/ts2/b */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000515 set_ts_e1link(&trx->ts[1], 0, 2, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000516 abis_nm_conn_terr_traf(&trx->ts[1], 0, 2, 1);
517
518 /* SET CHANNEL ATTRIBUTE TS2 */
Harald Welte23887b62009-02-18 03:37:20 +0000519 abis_nm_set_channel_attr(&trx->ts[2], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000520 /* Connect traffic of bts0/trx0/ts2 to e1_0/ts2/c */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000521 set_ts_e1link(&trx->ts[2], 0, 2, 2);
Harald Welte52b1f982008-12-23 20:25:15 +0000522 abis_nm_conn_terr_traf(&trx->ts[2], 0, 2, 2);
523
524 /* SET CHANNEL ATTRIBUTE TS3 */
Harald Welte23887b62009-02-18 03:37:20 +0000525 abis_nm_set_channel_attr(&trx->ts[3], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000526 /* Connect traffic of bts0/trx0/ts3 to e1_0/ts2/d */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000527 set_ts_e1link(&trx->ts[3], 0, 2, 3);
Harald Welte52b1f982008-12-23 20:25:15 +0000528 abis_nm_conn_terr_traf(&trx->ts[3], 0, 2, 3);
529
530 /* SET CHANNEL ATTRIBUTE TS4 */
Harald Welte23887b62009-02-18 03:37:20 +0000531 abis_nm_set_channel_attr(&trx->ts[4], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000532 /* Connect traffic of bts0/trx0/ts4 to e1_0/ts3/a */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000533 set_ts_e1link(&trx->ts[4], 0, 3, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000534 abis_nm_conn_terr_traf(&trx->ts[4], 0, 3, 0);
535
536 /* SET CHANNEL ATTRIBUTE TS5 */
Harald Welte23887b62009-02-18 03:37:20 +0000537 abis_nm_set_channel_attr(&trx->ts[5], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000538 /* Connect traffic of bts0/trx0/ts5 to e1_0/ts3/b */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000539 set_ts_e1link(&trx->ts[5], 0, 3, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000540 abis_nm_conn_terr_traf(&trx->ts[5], 0, 3, 1);
541
542 /* SET CHANNEL ATTRIBUTE TS6 */
Harald Welte23887b62009-02-18 03:37:20 +0000543 abis_nm_set_channel_attr(&trx->ts[6], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000544 /* Connect traffic of bts0/trx0/ts6 to e1_0/ts3/c */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000545 set_ts_e1link(&trx->ts[6], 0, 3, 2);
Harald Welte52b1f982008-12-23 20:25:15 +0000546 abis_nm_conn_terr_traf(&trx->ts[6], 0, 3, 2);
547
548 /* SET CHANNEL ATTRIBUTE TS7 */
Harald Welte23887b62009-02-18 03:37:20 +0000549 abis_nm_set_channel_attr(&trx->ts[7], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000550 /* Connect traffic of bts0/trx0/ts7 to e1_0/ts3/d */
Harald Weltecd06bfb2009-02-10 17:33:56 +0000551 set_ts_e1link(&trx->ts[7], 0, 3, 3);
Harald Welte52b1f982008-12-23 20:25:15 +0000552 abis_nm_conn_terr_traf(&trx->ts[7], 0, 3, 3);
553
554 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000555 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000556
557 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000558 abis_nm_bs11_reset_resource(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000559
560 /* restart sending event reports */
561 abis_nm_event_reports(bts, 1);
562}
563
Harald Welte8c1d0e42009-02-15 03:38:12 +0000564static void bootstrap_om(struct gsm_bts *bts)
565{
Harald Welteedb37782009-05-01 14:59:07 +0000566 fprintf(stdout, "bootstrapping OML for BTS %u\n", bts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000567
568 switch (bts->type) {
569 case GSM_BTS_TYPE_BS11:
570 bootstrap_om_bs11(bts);
571 break;
572 case GSM_BTS_TYPE_NANOBTS_900:
573 case GSM_BTS_TYPE_NANOBTS_1800:
574 bootstrap_om_nanobts(bts);
575 break;
576 default:
577 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
578 }
579}
580
Harald Welted1252502009-01-01 01:50:32 +0000581static int shutdown_om(struct gsm_bts *bts)
582{
583 /* stop sending event reports */
584 abis_nm_event_reports(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000585
Harald Welted1252502009-01-01 01:50:32 +0000586 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000587 abis_nm_bs11_db_transmission(bts, 1);
Harald Welted1252502009-01-01 01:50:32 +0000588
589 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000590 abis_nm_bs11_db_transmission(bts, 0);
Harald Welted1252502009-01-01 01:50:32 +0000591
592 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000593 abis_nm_bs11_reset_resource(bts);
Harald Welted1252502009-01-01 01:50:32 +0000594
595 return 0;
596}
597
598static int shutdown_net(struct gsm_network *net)
599{
600 int i;
601 for (i = 0; i < net->num_bts; i++) {
602 int rc;
603 rc = shutdown_om(&net->bts[i]);
604 if (rc < 0)
605 return rc;
606 }
607
608 return 0;
609}
Harald Welte52b1f982008-12-23 20:25:15 +0000610
611struct bcch_info {
612 u_int8_t type;
613 u_int8_t len;
614 const u_int8_t *data;
615};
616
617/*
618SYSTEM INFORMATION TYPE 1
619 Cell channel description
620 Format-ID bit map 0
621 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
622 RACH Control Parameters
623 maximum 7 retransmissions
624 8 slots used to spread transmission
625 cell not barred for access
626 call reestablishment not allowed
627 Access Control Class = 0000
628*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000629static u_int8_t si1[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000630 /* header */0x55, 0x06, 0x19,
631 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
632 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
633 /* rach */0xD5, 0x00, 0x00,
634 /* s1 reset*/0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000635};
636
637/*
638 SYSTEM INFORMATION TYPE 2
639 Neighbour Cells Description
640 EXT-IND: Carries the complete BA
641 BA-IND = 0
642 Format-ID bit map 0
643 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
644 NCC permitted (NCC) = FF
645 RACH Control Parameters
646 maximum 7 retransmissions
647 8 slots used to spread transmission
648 cell not barred for access
649 call reestablishment not allowed
650 Access Control Class = 0000
651*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000652static u_int8_t si2[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000653 /* header */0x59, 0x06, 0x1A,
654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 /* ncc */0xFF,
657 /* rach*/0xD5, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +0000658};
659
660/*
661SYSTEM INFORMATION TYPE 3
662 Cell identity = 00001 (1h)
663 Location area identification
664 Mobile Country Code (MCC): 001
665 Mobile Network Code (MNC): 01
666 Location Area Code (LAC): 00001 (1h)
667 Control Channel Description
668 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
669 0 blocks reserved for access grant
670 1 channel used for CCCH, with SDCCH
671 5 multiframes period for PAGING REQUEST
672 Time-out T3212 = 0
673 Cell Options BCCH
674 Power control indicator: not set
675 MSs shall not use uplink DTX
676 Radio link timeout = 36
677 Cell Selection Parameters
678 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
Harald Welte3b2ec422008-12-29 04:11:14 +0000679 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
Harald Welte52b1f982008-12-23 20:25:15 +0000680 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
681 Half rate support (NECI): New establishment causes are not supported
682 min.RX signal level for MS = 0
683 RACH Control Parameters
684 maximum 7 retransmissions
685 8 slots used to spread transmission
686 cell not barred for access
687 call reestablishment not allowed
688 Access Control Class = 0000
689 SI 3 Rest Octets
690 Cell Bar Qualify (CBQ): 0
691 Cell Reselect Offset = 0 dB
692 Temporary Offset = 0 dB
693 Penalty Time = 20 s
694 System Information 2ter Indicator (2TI): 0 = not available
695 Early Classmark Sending Control (ECSC): 0 = forbidden
696 Scheduling Information is not sent in SYSTEM INFORMATION TYPE 9 on the BCCH
697*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000698static u_int8_t si3[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000699 /* header */0x49, 0x06, 0x1B,
700 /* cell */0x00, 0x01,
701 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
702 /* desc */0x01, 0x03, 0x00,
703 /* option*/0x28,
704 /* selection*/0x62, 0x00,
705 /* rach */0xD5, 0x00, 0x00,
706 /* reset*/0x80, 0x00, 0x00, 0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000707};
708
709/*
710SYSTEM INFORMATION TYPE 4
711 Location area identification
712 Mobile Country Code (MCC): 001
713 Mobile Network Code (MNC): 01
714 Location Area Code (LAC): 00001 (1h)
715 Cell Selection Parameters
716 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
717 max.TX power level MS may use for CCH = 2
718 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
719 Half rate support (NECI): New establishment causes are not supported
720 min.RX signal level for MS = 0
721 RACH Control Parameters
722 maximum 7 retransmissions
723 8 slots used to spread transmission
724 cell not barred for access
725 call reestablishment not allowed
726 Access Control Class = 0000
727 Channel Description
728 Type = SDCCH/4[2]
729 Timeslot Number: 0
730 Training Sequence Code: 7h
731 ARFCN: 1
732 SI Rest Octets
733 Cell Bar Qualify (CBQ): 0
734 Cell Reselect Offset = 0 dB
735 Temporary Offset = 0 dB
736 Penalty Time = 20 s
737*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000738static u_int8_t si4[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000739 /* header */0x41, 0x06, 0x1C,
740 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
741 /* sel */0x62, 0x00,
742 /* rach*/0xD5, 0x00, 0x00,
743 /* var */0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/, 0x80, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000744 0x2B, 0x2B, 0x2B
745};
746
747/*
748 SYSTEM INFORMATION TYPE 5
749 Neighbour Cells Description
750 EXT-IND: Carries the complete BA
751 BA-IND = 0
752 Format-ID bit map 0
753 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
754*/
755
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000756static u_int8_t si5[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000757 /* header without l2 len*/0x06, 0x1D,
758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
759 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000760};
761
762// SYSTEM INFORMATION TYPE 6
763
764/*
765SACCH FILLING
766 System Info Type: SYSTEM INFORMATION 6
767 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
768
769SYSTEM INFORMATION TYPE 6
770 Cell identity = 00001 (1h)
771 Location area identification
772 Mobile Country Code (MCC): 001
773 Mobile Network Code (MNC): 01
774 Location Area Code (LAC): 00001 (1h)
775 Cell Options SACCH
776 Power control indicator: not set
777 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
778 Radio link timeout = 36
779 NCC permitted (NCC) = FF
780*/
781
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000782static u_int8_t si6[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000783 /* header */0x06, 0x1E,
784 /* cell id*/ 0x00, 0x01,
785 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
786 /* options */ 0x28,
787 /* ncc */ 0xFF,
Harald Welte52b1f982008-12-23 20:25:15 +0000788};
789
790
791
792static const struct bcch_info bcch_infos[] = {
793 {
794 .type = RSL_SYSTEM_INFO_1,
795 .len = sizeof(si1),
796 .data = si1,
797 }, {
798 .type = RSL_SYSTEM_INFO_2,
799 .len = sizeof(si2),
800 .data = si2,
801 }, {
802 .type = RSL_SYSTEM_INFO_3,
803 .len = sizeof(si3),
804 .data = si3,
805 }, {
806 .type = RSL_SYSTEM_INFO_4,
807 .len = sizeof(si4),
808 .data = si4,
809 },
810};
811
Holger Freyther24287b62008-12-28 16:32:41 +0000812static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
813static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
814static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
815static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
Harald Welte104604e2008-12-28 16:36:11 +0000816static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
817static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
Holger Freyther24287b62008-12-28 16:32:41 +0000818
Harald Welte52b1f982008-12-23 20:25:15 +0000819/* set all system information types */
Harald Weltee79769b2009-02-07 00:48:17 +0000820static int set_system_infos(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000821{
822 int i;
823
824 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
Harald Weltee79769b2009-02-07 00:48:17 +0000825 rsl_bcch_info(trx, bcch_infos[i].type,
Harald Welte52b1f982008-12-23 20:25:15 +0000826 bcch_infos[i].data,
827 bcch_infos[i].len);
828 }
Harald Weltee79769b2009-02-07 00:48:17 +0000829 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
830 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
Harald Weltead384642008-12-26 10:20:07 +0000831
832 return 0;
Harald Welte52b1f982008-12-23 20:25:15 +0000833}
834
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000835/*
836 * Patch the various SYSTEM INFORMATION tables to update
837 * the LAI
838 */
839static void patch_tables(struct gsm_bts *bts)
840{
Harald Welte98981882009-01-06 18:59:11 +0000841 u_int8_t arfcn_low = ARFCN & 0xff;
842 u_int8_t arfcn_high = (ARFCN >> 8) & 0x0f;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000843 /* covert the raw packet to the struct */
844 struct gsm48_system_information_type_3 *type_3 =
845 (struct gsm48_system_information_type_3*)&si3;
846 struct gsm48_system_information_type_4 *type_4 =
847 (struct gsm48_system_information_type_4*)&si4;
848 struct gsm48_system_information_type_6 *type_6 =
849 (struct gsm48_system_information_type_6*)&si6;
Harald Welteb84e2f42008-12-28 23:42:04 +0000850 struct gsm48_loc_area_id lai;
851
852 gsm0408_generate_lai(&lai, bts->network->country_code,
853 bts->network->network_code, bts->location_area_code);
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000854
855 /* assign the MCC and MNC */
Harald Welteb84e2f42008-12-28 23:42:04 +0000856 type_3->lai = lai;
857 type_4->lai = lai;
858 type_6->lai = lai;
Harald Welte98981882009-01-06 18:59:11 +0000859
Harald Welte94009322009-02-15 15:38:42 +0000860 /* patch ARFCN into BTS Attributes */
Harald Welte98981882009-01-06 18:59:11 +0000861 msg_2[74] &= 0xf0;
862 msg_2[74] |= arfcn_high;
863 msg_2[75] = arfcn_low;
Harald Welte94009322009-02-15 15:38:42 +0000864 nanobts_attr_bts[42] &= 0xf0;
865 nanobts_attr_bts[42] |= arfcn_high;
866 nanobts_attr_bts[43] = arfcn_low;
Harald Welte98981882009-01-06 18:59:11 +0000867
Harald Welte94009322009-02-15 15:38:42 +0000868 /* patch ARFCN into TRX Attributes */
Harald Welte98981882009-01-06 18:59:11 +0000869 msg_6[7] &= 0xf0;
870 msg_6[7] |= arfcn_high;
871 msg_6[8] = arfcn_low;
Harald Welte94009322009-02-15 15:38:42 +0000872 nanobts_attr_radio[5] &= 0xf0;
873 nanobts_attr_radio[5] |= arfcn_high;
874 nanobts_attr_radio[6] = arfcn_low;
Harald Welte98981882009-01-06 18:59:11 +0000875
876 type_4->data[2] &= 0xf0;
877 type_4->data[2] |= arfcn_high;
878 type_4->data[3] = arfcn_low;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000879
880 /* patch Control Channel Description 10.5.2.11 */
881 type_3->control_channel_desc = bts->chan_desc;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000882}
883
884
Harald Weltee79769b2009-02-07 00:48:17 +0000885static void bootstrap_rsl(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000886{
Harald Welteedb37782009-05-01 14:59:07 +0000887 fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) "
888 "using MCC=%u MNC=%u\n", trx->nr, trx->bts->nr, MCC, MNC);
Harald Weltee79769b2009-02-07 00:48:17 +0000889 set_system_infos(trx);
Harald Welte52b1f982008-12-23 20:25:15 +0000890}
891
Harald Welte1fa60c82009-02-09 18:13:26 +0000892void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
Harald Weltead384642008-12-26 10:20:07 +0000893{
894 switch (event) {
Harald Welte1fa60c82009-02-09 18:13:26 +0000895 case EVT_E1_TEI_UP:
896 switch (type) {
897 case E1INP_SIGN_OML:
898 bootstrap_om(trx->bts);
899 break;
900 case E1INP_SIGN_RSL:
901 bootstrap_rsl(trx);
902 break;
903 default:
904 break;
905 }
Harald Weltead384642008-12-26 10:20:07 +0000906 break;
Harald Welte1fa60c82009-02-09 18:13:26 +0000907 case EVT_E1_TEI_DN:
908 fprintf(stderr, "Lost some E1 TEI link\n");
909 /* FIXME: deal with TEI or L1 link loss */
Harald Weltead384642008-12-26 10:20:07 +0000910 break;
911 default:
Harald Weltead384642008-12-26 10:20:07 +0000912 break;
913 }
914}
915
Harald Welteedb37782009-05-01 14:59:07 +0000916static int bootstrap_bts(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000917{
Holger Freyther0a173bf2009-04-22 22:07:07 +0000918 bts->location_area_code = LAC;
Harald Welte98981882009-01-06 18:59:11 +0000919 bts->trx[0].arfcn = ARFCN;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000920
921 /* Control Channel Description */
922 memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr));
Harald Welte41fbf442009-02-24 22:34:22 +0000923 bts->chan_desc.att = 1;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000924 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
925 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
926 bts->chan_desc.t3212 = 0;
927
Harald Welte98981882009-01-06 18:59:11 +0000928 patch_tables(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000929
Holger Freyther1fd34142009-02-09 23:42:03 +0000930 paging_init(bts);
Harald Welte38c2f132009-01-06 23:10:57 +0000931
Harald Welteedb37782009-05-01 14:59:07 +0000932 return 0;
933}
934
935static int bootstrap_network(void)
936{
937 struct gsm_bts *bts;
938
939 /* initialize our data structures */
940 gsmnet = gsm_network_init(2, BTS_TYPE, MCC, MNC);
941 if (!gsmnet)
942 return -ENOMEM;
943
944 gsmnet->name_long = "OpenBSC";
945 gsmnet->name_short = "OpenBSC";
946
947 bts = &gsmnet->bts[0];
948 bootstrap_bts(bts);
949
Holger Freyther36650b82009-04-19 06:35:16 +0000950 if (db_init(database_name, gsmnet)) {
Holger Freytheref7f7ce2009-04-19 06:35:12 +0000951 printf("DB: Failed to init database. Please check the option settings.\n");
952 return -1;
953 }
954 printf("DB: Database initialized.\n");
955
956 if (db_prepare()) {
957 printf("DB: Failed to prepare database.\n");
958 return -1;
959 }
960 printf("DB: Database prepared.\n");
961
Holger Freyther219518d2009-01-02 22:04:43 +0000962 telnet_init(gsmnet, 4242);
Harald Weltead384642008-12-26 10:20:07 +0000963
Harald Welteb4630602009-05-01 15:43:22 +0000964 register_signal_handler(SS_NM, nm_sig_cb, NULL);
965
Harald Welte1fa60c82009-02-09 18:13:26 +0000966 /* E1 mISDN input setup */
Harald Welteedb37782009-05-01 14:59:07 +0000967 if (BTS_TYPE == GSM_BTS_TYPE_BS11) {
968 gsmnet->num_bts = 1;
Holger Freytherb5c00f52009-04-22 22:08:07 +0000969 return e1_config(bts, cardnr, release_l2);
Harald Welteedb37782009-05-01 14:59:07 +0000970 } else {
971 /* FIXME: do this dynamic */
972 bts->ip_access.site_id = 1801;
973 bts->ip_access.bts_id = 0;
974 bts = &gsmnet->bts[1];
975 bootstrap_bts(bts);
976 bts->ip_access.site_id = 1800;
977 bts->ip_access.bts_id = 0;
Harald Weltecf559782009-05-01 15:43:49 +0000978 return ipaccess_setup(gsmnet);
Harald Welteedb37782009-05-01 14:59:07 +0000979 }
Harald Welte52b1f982008-12-23 20:25:15 +0000980}
Harald Weltef6b7a902008-12-26 00:05:11 +0000981
Holger Freyther9a3ee0f2009-01-02 00:40:15 +0000982static void create_pcap_file(char *file)
983{
984 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
985 int fd = open(file, O_WRONLY|O_TRUNC|O_CREAT, mode);
986
987 if (fd < 0) {
988 perror("Failed to open file for pcap");
989 return;
990 }
991
Holger Freyther0469cf62009-03-31 12:14:16 +0000992 e1_set_pcap_fd(fd);
Holger Freyther9a3ee0f2009-01-02 00:40:15 +0000993}
994
Holger Freytherb332f612008-12-27 12:46:51 +0000995static void print_usage()
996{
997 printf("Usage: bsc_hack\n");
998}
999
1000static void print_help()
1001{
1002 printf(" Some useful help...\n");
1003 printf(" -d option --debug=DRLL:DCC:DMM:DRR:DRSL:DNM enable debugging\n");
Holger Freytherefde7fb2008-12-28 14:14:56 +00001004 printf(" -s --disable-color\n");
1005 printf(" -n --network-code number(MNC) \n");
1006 printf(" -c --country-code number (MCC) \n");
Holger Freyther0a173bf2009-04-22 22:07:07 +00001007 printf(" -L --location-area-code number (LAC) \n");
Harald Welte98981882009-01-06 18:59:11 +00001008 printf(" -f --arfcn number The frequency ARFCN\n");
Holger Freytherbde36102008-12-28 22:51:39 +00001009 printf(" -l --database db-name The database to use\n");
Holger Freyther89824fc2008-12-30 16:18:18 +00001010 printf(" -a --authorize-everyone Allow everyone into the network.\n");
Holger Freythere97f7fb2008-12-31 18:52:11 +00001011 printf(" -r --reject-cause number The reject cause for LOCATION UPDATING REJECT.\n");
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001012 printf(" -p --pcap file The filename of the pcap file\n");
Harald Weltee1bd2412009-02-15 14:40:09 +00001013 printf(" -t --bts-type type The BTS type (bs11, nanobts900, nanobts1800)\n");
Holger Freytherdda22c12009-04-22 22:07:31 +00001014 printf(" -C --cardnr number For bs11 select E1 card number other than 0\n");
Holger Freytherb5c00f52009-04-22 22:08:07 +00001015 printf(" -R --release-l2 Releases mISDN layer 2 after exit, to unload driver.\n");
Holger Freytherb332f612008-12-27 12:46:51 +00001016 printf(" -h --help this text\n");
1017}
1018
1019static void handle_options(int argc, char** argv)
1020{
1021 while (1) {
1022 int option_index = 0, c;
1023 static struct option long_options[] = {
1024 {"help", 0, 0, 'h'},
1025 {"debug", 1, 0, 'd'},
Holger Freytherefde7fb2008-12-28 14:14:56 +00001026 {"disable-color", 0, 0, 's'},
1027 {"network-code", 1, 0, 'n'},
1028 {"country-code", 1, 0, 'c'},
Holger Freyther0a173bf2009-04-22 22:07:07 +00001029 {"location-area-code", 1, 0, 'L'},
Holger Freytherbde36102008-12-28 22:51:39 +00001030 {"database", 1, 0, 'l'},
Holger Freyther89824fc2008-12-30 16:18:18 +00001031 {"authorize-everyone", 0, 0, 'a'},
Holger Freythere97f7fb2008-12-31 18:52:11 +00001032 {"reject-cause", 1, 0, 'r'},
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001033 {"pcap", 1, 0, 'p'},
Harald Welte98981882009-01-06 18:59:11 +00001034 {"arfcn", 1, 0, 'f'},
Harald Welte8c1d0e42009-02-15 03:38:12 +00001035 {"bts-type", 1, 0, 't'},
Holger Freytherdda22c12009-04-22 22:07:31 +00001036 {"cardnr", 1, 0, 'C'},
Holger Freytherb5c00f52009-04-22 22:08:07 +00001037 {"release-l2", 0, 0, 'R'},
Holger Freytherb332f612008-12-27 12:46:51 +00001038 {0, 0, 0, 0}
1039 };
1040
Holger Freytherb5c00f52009-04-22 22:08:07 +00001041 c = getopt_long(argc, argv, "hc:n:d:sar:p:f:t:C:RL:",
Holger Freytherb332f612008-12-27 12:46:51 +00001042 long_options, &option_index);
1043 if (c == -1)
1044 break;
1045
1046 switch (c) {
1047 case 'h':
1048 print_usage();
1049 print_help();
1050 exit(0);
Holger Freytherefde7fb2008-12-28 14:14:56 +00001051 case 's':
Holger Freytherb332f612008-12-27 12:46:51 +00001052 debug_use_color(0);
1053 break;
1054 case 'd':
1055 debug_parse_category_mask(optarg);
1056 break;
Holger Freytherefde7fb2008-12-28 14:14:56 +00001057 case 'n':
1058 MNC = atoi(optarg);
1059 break;
1060 case 'c':
1061 MCC = atoi(optarg);
1062 break;
Holger Freyther0a173bf2009-04-22 22:07:07 +00001063 case 'L':
1064 LAC = atoi(optarg);
1065 break;
Harald Welte98981882009-01-06 18:59:11 +00001066 case 'f':
1067 ARFCN = atoi(optarg);
1068 break;
Harald Welte8965da42009-01-06 18:09:02 +00001069 case 'l':
Holger Freytherbde36102008-12-28 22:51:39 +00001070 database_name = strdup(optarg);
1071 break;
Holger Freyther89824fc2008-12-30 16:18:18 +00001072 case 'a':
1073 gsm0408_allow_everyone(1);
1074 break;
Holger Freythere97f7fb2008-12-31 18:52:11 +00001075 case 'r':
1076 gsm0408_set_reject_cause(atoi(optarg));
1077 break;
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001078 case 'p':
1079 create_pcap_file(optarg);
1080 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +00001081 case 't':
1082 BTS_TYPE = parse_btstype(optarg);
1083 break;
Holger Freytherdda22c12009-04-22 22:07:31 +00001084 case 'C':
1085 cardnr = atoi(optarg);
1086 break;
Holger Freytherb5c00f52009-04-22 22:08:07 +00001087 case 'R':
1088 release_l2 = 1;
1089 break;
Holger Freytherb332f612008-12-27 12:46:51 +00001090 default:
1091 /* ignore */
1092 break;
1093 }
1094 }
1095}
1096
Harald Welted1252502009-01-01 01:50:32 +00001097static void signal_handler(int signal)
1098{
1099 fprintf(stdout, "signal %u received\n", signal);
1100
1101 switch (signal) {
1102 case SIGHUP:
1103 case SIGABRT:
1104 shutdown_net(gsmnet);
1105 break;
1106 default:
1107 break;
1108 }
1109}
1110
Harald Weltef6b7a902008-12-26 00:05:11 +00001111int main(int argc, char **argv)
1112{
Harald Welte1fa60c82009-02-09 18:13:26 +00001113 int rc;
1114
Holger Freytherb332f612008-12-27 12:46:51 +00001115 /* parse options */
1116 handle_options(argc, argv);
1117
Harald Welte65ccf882009-02-24 22:36:20 +00001118 /* seed the PRNG */
1119 srand(time(NULL));
1120
Harald Welte1fa60c82009-02-09 18:13:26 +00001121 rc = bootstrap_network();
1122 if (rc < 0)
1123 exit(1);
Harald Weltef6b7a902008-12-26 00:05:11 +00001124
Harald Welted1252502009-01-01 01:50:32 +00001125 signal(SIGHUP, &signal_handler);
1126 signal(SIGABRT, &signal_handler);
1127
Harald Weltef6b7a902008-12-26 00:05:11 +00001128 while (1) {
1129 bsc_select_main();
1130 }
1131}