blob: 384da54b82d44177afc33e8e7aff3bd59a2dc308 [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
Harald Welte52b1f982008-12-23 20:25:15 +000052/* global pointer to the gsm network data structure */
Harald Welte879c85a2009-05-01 15:00:20 +000053static struct gsm_network *gsmnet;
Harald Welte52b1f982008-12-23 20:25:15 +000054
Holger Freytherefde7fb2008-12-28 14:14:56 +000055/* MCC and MNC for the Location Area Identifier */
56static int MCC = 1;
57static int MNC = 1;
Holger Freyther0a173bf2009-04-22 22:07:07 +000058static int LAC = 1;
Harald Welte98981882009-01-06 18:59:11 +000059static int ARFCN = HARDCODED_ARFCN;
Holger Freytherdda22c12009-04-22 22:07:31 +000060static int cardnr = 0;
Holger Freytherb5c00f52009-04-22 22:08:07 +000061static int release_l2 = 0;
Harald Welte8c1d0e42009-02-15 03:38:12 +000062static enum gsm_bts_type BTS_TYPE = GSM_BTS_TYPE_BS11;
Harald Weltefcd24452009-06-20 18:15:19 +020063static enum gsm_band BAND = GSM_BAND_900;
Holger Freytherbde36102008-12-28 22:51:39 +000064static const char *database_name = "hlr.sqlite3";
Holger Freytherefde7fb2008-12-28 14:14:56 +000065
Harald Welte52b1f982008-12-23 20:25:15 +000066/* The following definitions are for OM and NM packets that we cannot yet
67 * generate by code but we just pass on */
68
69// BTS Site Manager, SET ATTRIBUTES
70
71/*
72 Object Class: BTS Site Manager
73 Instance 1: FF
74 Instance 2: FF
75 Instance 3: FF
76SET ATTRIBUTES
77 sAbisExternalTime: 2007/09/08 14:36:11
78 omLAPDRelTimer: 30sec
79 shortLAPDIntTimer: 5sec
80 emergencyTimer1: 10 minutes
81 emergencyTimer2: 0 minutes
82*/
83
84unsigned char msg_1[] =
85{
Harald Weltea865f1b2009-06-20 10:42:17 +020086 NM_MT_BS11_SET_ATTR, NM_OC_SITE_MANAGER, 0xFF, 0xFF, 0xFF,
Harald Welte110c0ab2009-05-23 16:27:05 +000087 NM_ATT_BS11_ABIS_EXT_TIME, 0x07,
88 0xD7, 0x09, 0x08, 0x0E, 0x24, 0x0B, 0xCE,
89 0x02,
90 0x00, 0x1E,
91 NM_ATT_BS11_SH_LAPD_INT_TIMER,
92 0x01, 0x05,
Harald Weltecd993872009-02-15 16:16:28 +000093 0x42, 0x02, 0x00, 0x0A,
94 0x44, 0x02, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +000095};
96
97// BTS, SET BTS ATTRIBUTES
98
99/*
100 Object Class: BTS
101 BTS relat. Number: 0
102 Instance 2: FF
103 Instance 3: FF
104SET BTS ATTRIBUTES
105 bsIdentityCode / BSIC:
106 PLMN_colour_code: 7h
107 BS_colour_code: 7h
108 BTS Air Timer T3105: 4 ,unit 10 ms
109 btsIsHopping: FALSE
Harald Welte83282292009-02-01 16:22:19 +0000110 periodCCCHLoadIndication: 1sec
Holger Freyther3b910432009-02-11 00:43:48 +0000111 thresholdCCCHLoadIndication: 0%
Harald Welte52b1f982008-12-23 20:25:15 +0000112 cellAllocationNumber: 00h = GSM 900
113 enableInterferenceClass: 00h = Disabled
114 fACCHQual: 6 (FACCH stealing flags minus 1)
115 intaveParameter: 31 SACCH multiframes
116 interferenceLevelBoundaries:
117 Interference Boundary 1: 0Ah
118 Interference Boundary 2: 0Fh
119 Interference Boundary 3: 14h
120 Interference Boundary 4: 19h
121 Interference Boundary 5: 1Eh
122 mSTxPwrMax: 11
123 GSM range: 2=39dBm, 15=13dBm, stepsize 2 dBm
124 DCS1800 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
125 PCS1900 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
126 30=33dBm, 31=32dBm
127 ny1:
128 Maximum number of repetitions for PHYSICAL INFORMATION message (GSM 04.08): 20
129 powerOutputThresholds:
130 Out Power Fault Threshold: -10 dB
131 Red Out Power Threshold: - 6 dB
132 Excessive Out Power Threshold: 5 dB
133 rACHBusyThreshold: -127 dBm
134 rACHLoadAveragingSlots: 250 ,number of RACH burst periods
135 rfResourceIndicationPeriod: 125 SACCH multiframes
136 T200:
137 SDCCH: 044 in 5 ms
138 FACCH/Full rate: 031 in 5 ms
139 FACCH/Half rate: 041 in 5 ms
140 SACCH with TCH SAPI0: 090 in 10 ms
141 SACCH with SDCCH: 090 in 10 ms
142 SDCCH with SAPI3: 090 in 5 ms
143 SACCH with TCH SAPI3: 135 in 10 ms
144 tSync: 9000 units of 10 msec
145 tTrau: 9000 units of 10 msec
146 enableUmLoopTest: 00h = disabled
147 enableExcessiveDistance: 00h = Disabled
148 excessiveDistance: 64km
149 hoppingMode: 00h = baseband hopping
150 cellType: 00h = Standard Cell
151 BCCH ARFCN / bCCHFrequency: 1
152*/
153
Harald Weltea865f1b2009-06-20 10:42:17 +0200154static unsigned char bs11_attr_bts[] =
Harald Welte52b1f982008-12-23 20:25:15 +0000155{
Harald Welte060f6df2009-05-23 17:50:53 +0000156 NM_ATT_BSIC, HARDCODED_BSIC,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000157 NM_ATT_BTS_AIR_TIMER, 0x04,
Harald Weltecd993872009-02-15 16:16:28 +0000158 NM_ATT_BS11_BTSLS_HOPPING, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000159 NM_ATT_CCCH_L_I_P, 0x01,
160 NM_ATT_CCCH_L_T, 0x00,
Harald Welte7b26bcb2009-05-28 11:39:21 +0000161 NM_ATT_BS11_CELL_ALLOC_NR, NM_BS11_CANR_GSM,
162 NM_ATT_BS11_ENA_INTERF_CLASS, 0x01,
Harald Weltecd993872009-02-15 16:16:28 +0000163 NM_ATT_BS11_FACCH_QUAL, 0x06,
Harald Weltefe609d82009-05-23 18:14:31 +0000164 /* interference avg. period in numbers of SACCH multifr */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000165 NM_ATT_INTAVE_PARAM, 0x1F,
166 NM_ATT_INTERF_BOUND, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x7B,
167 NM_ATT_CCCH_L_T, 0x23,
168 NM_ATT_GSM_TIME, 0x28, 0x00,
169 NM_ATT_ADM_STATE, 0x03,
170 NM_ATT_RACH_B_THRESH, 0x7F,
171 NM_ATT_LDAVG_SLOTS, 0x00, 0xFA,
Harald Weltecd993872009-02-15 16:16:28 +0000172 NM_ATT_BS11_RF_RES_IND_PER, 0x7D,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000173 NM_ATT_T200, 0x2C, 0x1F, 0x29, 0x5A, 0x5A, 0x5A, 0x87,
Harald Weltecd993872009-02-15 16:16:28 +0000174 NM_ATT_BS11_TSYNC, 0x23, 0x28,
175 NM_ATT_BS11_TTRAU, 0x23, 0x28,
176 NM_ATT_TEST_DUR, 0x01, 0x00,
177 NM_ATT_OUTST_ALARM, 0x01, 0x00,
178 NM_ATT_BS11_EXCESSIVE_DISTANCE, 0x01, 0x40,
179 NM_ATT_BS11_HOPPING_MODE, 0x01, 0x00,
180 NM_ATT_BS11_PLL, 0x01, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000181 NM_ATT_BCCH_ARFCN, 0x00, HARDCODED_ARFCN/*0x01*/,
Harald Welte52b1f982008-12-23 20:25:15 +0000182};
183
184// Handover Recognition, SET ATTRIBUTES
185
186/*
187Illegal Contents GSM Formatted O&M Msg
188 Object Class: Handover Recognition
189 BTS relat. Number: 0
190 Instance 2: FF
191 Instance 3: FF
192SET ATTRIBUTES
193 enableDelayPowerBudgetHO: 00h = Disabled
194 enableDistanceHO: 00h = Disabled
195 enableInternalInterCellHandover: 00h = Disabled
196 enableInternalIntraCellHandover: 00h = Disabled
197 enablePowerBudgetHO: 00h = Disabled
198 enableRXLEVHO: 00h = Disabled
199 enableRXQUALHO: 00h = Disabled
200 hoAveragingDistance: 8 SACCH multiframes
201 hoAveragingLev:
202 A_LEV_HO: 8 SACCH multiframes
203 W_LEV_HO: 1 SACCH multiframes
204 hoAveragingPowerBudget: 16 SACCH multiframes
205 hoAveragingQual:
206 A_QUAL_HO: 8 SACCH multiframes
207 W_QUAL_HO: 2 SACCH multiframes
208 hoLowerThresholdLevDL: (10 - 110) dBm
209 hoLowerThresholdLevUL: (5 - 110) dBm
210 hoLowerThresholdQualDL: 06h = 6.4% < BER < 12.8%
211 hoLowerThresholdQualUL: 06h = 6.4% < BER < 12.8%
212 hoThresholdLevDLintra : (20 - 110) dBm
213 hoThresholdLevULintra: (20 - 110) dBm
214 hoThresholdMsRangeMax: 20 km
215 nCell: 06h
216 timerHORequest: 3 ,unit 2 SACCH multiframes
217*/
218
219unsigned char msg_3[] =
220{
Harald Weltea865f1b2009-06-20 10:42:17 +0200221 NM_MT_BS11_SET_ATTR, NM_OC_BS11_HANDOVER, 0x00, 0xFF, 0xFF,
Harald Weltecd993872009-02-15 16:16:28 +0000222 0xD0, 0x00,
223 0x64, 0x00,
224 0x67, 0x00,
225 0x68, 0x00,
226 0x6A, 0x00,
227 0x6C, 0x00,
228 0x6D, 0x00,
229 0x6F, 0x08,
230 0x70, 0x08, 0x01,
231 0x71, 0x10, 0x10, 0x10,
232 0x72, 0x08, 0x02,
233 0x73, 0x0A,
234 0x74, 0x05,
235 0x75, 0x06,
236 0x76, 0x06,
237 0x78, 0x14,
238 0x79, 0x14,
239 0x7A, 0x14,
240 0x7D, 0x06,
241 0x92, 0x03, 0x20, 0x01, 0x00,
242 0x45, 0x01, 0x00,
243 0x48, 0x01, 0x00,
244 0x5A, 0x01, 0x00,
245 0x5B, 0x01, 0x05,
246 0x5E, 0x01, 0x1A,
247 0x5F, 0x01, 0x20,
248 0x9D, 0x01, 0x00,
249 0x47, 0x01, 0x00,
250 0x5C, 0x01, 0x64,
251 0x5D, 0x01, 0x1E,
252 0x97, 0x01, 0x20,
253 0xF7, 0x01, 0x3C,
Harald Welte52b1f982008-12-23 20:25:15 +0000254};
255
256// Power Control, SET ATTRIBUTES
257
258/*
259 Object Class: Power Control
260 BTS relat. Number: 0
261 Instance 2: FF
262 Instance 3: FF
263SET ATTRIBUTES
264 enableMsPowerControl: 00h = Disabled
265 enablePowerControlRLFW: 00h = Disabled
266 pcAveragingLev:
267 A_LEV_PC: 4 SACCH multiframes
268 W_LEV_PC: 1 SACCH multiframes
269 pcAveragingQual:
270 A_QUAL_PC: 4 SACCH multiframes
271 W_QUAL_PC: 2 SACCH multiframes
272 pcLowerThresholdLevDL: 0Fh
273 pcLowerThresholdLevUL: 0Ah
274 pcLowerThresholdQualDL: 05h = 3.2% < BER < 6.4%
275 pcLowerThresholdQualUL: 05h = 3.2% < BER < 6.4%
276 pcRLFThreshold: 0Ch
277 pcUpperThresholdLevDL: 14h
278 pcUpperThresholdLevUL: 0Fh
279 pcUpperThresholdQualDL: 04h = 1.6% < BER < 3.2%
280 pcUpperThresholdQualUL: 04h = 1.6% < BER < 3.2%
281 powerConfirm: 2 ,unit 2 SACCH multiframes
282 powerControlInterval: 2 ,unit 2 SACCH multiframes
283 powerIncrStepSize: 02h = 4 dB
284 powerRedStepSize: 01h = 2 dB
285 radioLinkTimeoutBs: 64 SACCH multiframes
286 enableBSPowerControl: 00h = disabled
287*/
288
289unsigned char msg_4[] =
290{
Harald Weltea865f1b2009-06-20 10:42:17 +0200291 NM_MT_BS11_SET_ATTR, NM_OC_BS11_PWR_CTRL, 0x00, 0xFF, 0xFF,
Harald Weltecd993872009-02-15 16:16:28 +0000292 NM_ATT_BS11_ENA_MS_PWR_CTRL, 0x00,
293 NM_ATT_BS11_ENA_PWR_CTRL_RLFW, 0x00,
294 0x7E, 0x04, 0x01,
295 0x7F, 0x04, 0x02,
296 0x80, 0x0F,
297 0x81, 0x0A,
298 0x82, 0x05,
299 0x83, 0x05,
300 0x84, 0x0C,
301 0x85, 0x14,
302 0x86, 0x0F,
303 0x87, 0x04,
304 0x88, 0x04,
305 0x89, 0x02,
306 0x8A, 0x02,
307 0x8B, 0x02,
308 0x8C, 0x01,
309 0x8D, 0x40,
310 0x65, 0x01, 0x00 // set to 0x01 to enable BSPowerControl
Harald Welte52b1f982008-12-23 20:25:15 +0000311};
312
313
314// Transceiver, SET TRX ATTRIBUTES (TRX 0)
315
316/*
317 Object Class: Transceiver
318 BTS relat. Number: 0
319 Tranceiver number: 0
320 Instance 3: FF
321SET TRX ATTRIBUTES
322 aRFCNList (HEX): 0001
Harald Weltecd993872009-02-15 16:16:28 +0000323 txPwrMaxReduction: 00h = 30dB
Harald Welte52b1f982008-12-23 20:25:15 +0000324 radioMeasGran: 254 SACCH multiframes
325 radioMeasRep: 01h = enabled
326 memberOfEmergencyConfig: 01h = TRUE
327 trxArea: 00h = TRX doesn't belong to a concentric cell
328*/
329
Harald Weltea865f1b2009-06-20 10:42:17 +0200330static unsigned char bs11_attr_radio[] =
Harald Welte52b1f982008-12-23 20:25:15 +0000331{
Harald Weltecd993872009-02-15 16:16:28 +0000332 NM_ATT_ARFCN_LIST, 0x01, 0x00, HARDCODED_ARFCN /*0x01*/,
Harald Welte311d0cf2009-02-17 17:45:59 +0000333 NM_ATT_RF_MAXPOWR_R, 0x00,
Harald Weltecd993872009-02-15 16:16:28 +0000334 NM_ATT_BS11_RADIO_MEAS_GRAN, 0x01, 0xFE,
335 NM_ATT_BS11_RADIO_MEAS_REP, 0x01, 0x01,
336 NM_ATT_BS11_EMRG_CFG_MEMBER, 0x01, 0x01,
337 NM_ATT_BS11_TRX_AREA, 0x01, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000338};
339
Harald Welte8c1d0e42009-02-15 03:38:12 +0000340static unsigned char nanobts_attr_bts[] = {
341 NM_ATT_INTERF_BOUND, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73,
Harald Weltefe609d82009-05-23 18:14:31 +0000342 /* interference avg. period in numbers of SACCH multifr */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000343 NM_ATT_INTAVE_PARAM, 0x06,
Harald Welted0fbab52009-06-09 20:04:44 +0000344 /* conn fail based on SACCH error rate */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000345 NM_ATT_CONN_FAIL_CRIT, 0x00, 0x02, 0x01, 0x10,
346 NM_ATT_T200, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21, 0xa8,
347 NM_ATT_MAX_TA, 0x3f,
Harald Welte311d0cf2009-02-17 17:45:59 +0000348 NM_ATT_OVERL_PERIOD, 0x00, 0x01, 10, /* seconds */
349 NM_ATT_CCCH_L_T, 10, /* percent */
350 NM_ATT_CCCH_L_I_P, 1, /* seconds */
Harald Weltefe609d82009-05-23 18:14:31 +0000351 NM_ATT_RACH_B_THRESH, 10, /* busy threshold in - dBm */
Harald Welted0fbab52009-06-09 20:04:44 +0000352 NM_ATT_LDAVG_SLOTS, 0x03, 0xe8, /* rach load averaging 1000 slots */
Harald Weltefe609d82009-05-23 18:14:31 +0000353 NM_ATT_BTS_AIR_TIMER, 128, /* miliseconds */
354 NM_ATT_NY1, 10, /* 10 retransmissions of physical config */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000355 NM_ATT_BCCH_ARFCN, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
Harald Welte060f6df2009-05-23 17:50:53 +0000356 NM_ATT_BSIC, HARDCODED_BSIC,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000357};
Harald Welte52b1f982008-12-23 20:25:15 +0000358
Harald Welte8c1d0e42009-02-15 03:38:12 +0000359static unsigned char nanobts_attr_radio[] = {
Harald Welted0fbab52009-06-09 20:04:44 +0000360 NM_ATT_RF_MAXPOWR_R, 0x0c, /* number of -2dB reduction steps / Pn */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000361 NM_ATT_ARFCN_LIST, 0x00, 0x02, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
362};
363
Harald Welte5c1e4582009-02-15 11:57:29 +0000364static unsigned char nanobts_attr_e0[] = {
365 0x85, 0x00,
366 0x81, 0x0b, 0xbb, /* TCP PORT for RSL */
367};
368
Harald Welteb4630602009-05-01 15:43:22 +0000369/* Callback function to be called whenever we get a GSM 12.21 state change event */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000370int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
371 struct gsm_nm_state *old_state, struct gsm_nm_state *new_state)
372{
373 struct gsm_bts *bts;
374 struct gsm_bts_trx *trx;
375 struct gsm_bts_trx_ts *ts;
376
377 /* This is currently only required on nanoBTS */
378
379 switch (evt) {
380 case EVT_STATECHG_OPER:
381 switch (obj_class) {
382 case NM_OC_SITE_MANAGER:
383 bts = container_of(obj, struct gsm_bts, site_mgr);
384 if (old_state->operational != 2 && new_state->operational == 2) {
385 abis_nm_opstart(bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
386 }
387 break;
388 case NM_OC_BTS:
389 bts = obj;
390 if (new_state->availability == 5) {
391 abis_nm_set_bts_attr(bts, nanobts_attr_bts,
392 sizeof(nanobts_attr_bts));
393 abis_nm_opstart(bts, NM_OC_BTS,
Harald Welte191280d2009-05-01 13:20:04 +0000394 bts->bts_nr, 0xff, 0xff);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000395 abis_nm_chg_adm_state(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 NM_STATE_UNLOCKED);
398 }
399 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000400 case NM_OC_CHANNEL:
401 ts = obj;
402 trx = ts->trx;
403 if (new_state->availability == 5) {
404 if (ts->nr == 0 && trx == trx->bts->c0)
Harald Weltee1bd2412009-02-15 14:40:09 +0000405 abis_nm_set_channel_attr(ts, NM_CHANC_BCCH_CBCH);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000406 else
407 abis_nm_set_channel_attr(ts, NM_CHANC_TCHFull);
408 abis_nm_opstart(trx->bts, NM_OC_CHANNEL,
Harald Welte191280d2009-05-01 13:20:04 +0000409 trx->bts->bts_nr, trx->nr, ts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000410 abis_nm_chg_adm_state(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 NM_STATE_UNLOCKED);
413 }
414 break;
Harald Weltea994a482009-05-01 15:54:23 +0000415 default:
Harald Welte8c1d0e42009-02-15 03:38:12 +0000416 break;
417 }
418 break;
Harald Weltea994a482009-05-01 15:54:23 +0000419 default:
420 //DEBUGP(DMM, "Unhandled state change in %s:%d\n", __func__, __LINE__);
Holger Freytherff9592f2009-03-09 16:17:14 +0000421 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000422 }
423 return 0;
424}
425
Harald Welteb4630602009-05-01 15:43:22 +0000426/* Callback function to be called every time we receive a 12.21 SW activated report */
427static int sw_activ_rep(struct msgb *mb)
428{
429 struct abis_om_fom_hdr *foh = msgb_l3(mb);
430 struct gsm_bts_trx *trx = mb->trx;
431
432 switch (foh->obj_class) {
433 case NM_OC_BASEB_TRANSC:
434 /* TRX software is active, tell it to initiate RSL Link */
435 abis_nm_ipaccess_msg(trx->bts, 0xe0, NM_OC_BASEB_TRANSC,
436 trx->bts->bts_nr, trx->nr, 0xff,
437 nanobts_attr_e0, sizeof(nanobts_attr_e0));
438 abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC,
439 trx->bts->bts_nr, trx->nr, 0xff);
440 abis_nm_chg_adm_state(trx->bts, NM_OC_BASEB_TRANSC,
441 trx->bts->bts_nr, trx->nr, 0xff,
442 NM_STATE_UNLOCKED);
443 break;
444 case NM_OC_RADIO_CARRIER:
445 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
446 sizeof(nanobts_attr_radio));
447 abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
448 trx->bts->bts_nr, trx->nr, 0xff);
449 abis_nm_chg_adm_state(trx->bts, NM_OC_RADIO_CARRIER,
450 trx->bts->bts_nr, trx->nr, 0xff,
451 NM_STATE_UNLOCKED);
452 break;
453 }
454 return 0;
455}
456
Holger Hans Peter Freyther500f3ca2009-06-10 10:48:14 +0200457/* Callback function for NACK on the OML NM */
458static int oml_msg_nack(int mt)
459{
460 if (mt == NM_MT_SET_BTS_ATTR_NACK) {
461 fprintf(stderr, "Failed to set BTS attributes. That is fatal. "
462 "Was the bts type and frequency properly specified?\n");
463 exit(-1);
464 }
465
466 return 0;
467}
468
Harald Welteb4630602009-05-01 15:43:22 +0000469/* Callback function to be called every time we receive a signal from NM */
470static int nm_sig_cb(unsigned int subsys, unsigned int signal,
471 void *handler_data, void *signal_data)
472{
473 switch (signal) {
474 case S_NM_SW_ACTIV_REP:
475 return sw_activ_rep(signal_data);
Holger Hans Peter Freyther500f3ca2009-06-10 10:48:14 +0200476 case S_NM_NACK:
477 return oml_msg_nack((int)signal_data);
Harald Welteb4630602009-05-01 15:43:22 +0000478 default:
479 break;
480 }
481 return 0;
482}
483
Harald Welte8c1d0e42009-02-15 03:38:12 +0000484static void bootstrap_om_nanobts(struct gsm_bts *bts)
485{
Harald Weltee1bd2412009-02-15 14:40:09 +0000486 /* We don't do callback based bootstrapping, but event driven (see above) */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000487}
488
489static void bootstrap_om_bs11(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000490{
Harald Weltee441d9c2009-06-21 16:17:15 +0200491 struct gsm_bts_trx *trx = bts->c0;
Harald Welte52b1f982008-12-23 20:25:15 +0000492
493 /* stop sending event reports */
494 abis_nm_event_reports(bts, 0);
495
496 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000497 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000498
Harald Welte702d8702008-12-26 20:25:35 +0000499 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000500 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte702d8702008-12-26 20:25:35 +0000501
502 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000503 abis_nm_bs11_reset_resource(bts);
Harald Welte702d8702008-12-26 20:25:35 +0000504
505 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000506 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte702d8702008-12-26 20:25:35 +0000507
Harald Welte52b1f982008-12-23 20:25:15 +0000508 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
Harald Weltea865f1b2009-06-20 10:42:17 +0200509 abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
Harald Welte52b1f982008-12-23 20:25:15 +0000510 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
511 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
512
513 /* Connect signalling of bts0/trx0 to e1_0/ts1/64kbps */
514 abis_nm_conn_terr_sign(trx, 0, 1, 0xff);
Harald Weltea865f1b2009-06-20 10:42:17 +0200515 abis_nm_set_radio_attr(trx, bs11_attr_radio, sizeof(bs11_attr_radio));
Harald Welte52b1f982008-12-23 20:25:15 +0000516
517 /* Use TEI 1 for signalling */
518 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x01);
519 abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH_CBCH);
Harald Weltecd06bfb2009-02-10 17:33:56 +0000520
521#ifdef HAVE_TRX1
Harald Welte52b1f982008-12-23 20:25:15 +0000522 /* TRX 1 */
523 abis_nm_conn_terr_sign(&bts->trx[1], 0, 1, 0xff);
524 /* FIXME: TRX ATTRIBUTE */
525 abis_nm_establish_tei(bts, 0, 0, 1, 0xff, 0x02);
526#endif
527
528 /* SET CHANNEL ATTRIBUTE TS1 */
Harald Welte23887b62009-02-18 03:37:20 +0000529 abis_nm_set_channel_attr(&trx->ts[1], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000530 /* Connect traffic of bts0/trx0/ts1 to e1_0/ts2/b */
531 abis_nm_conn_terr_traf(&trx->ts[1], 0, 2, 1);
532
533 /* SET CHANNEL ATTRIBUTE TS2 */
Harald Welte23887b62009-02-18 03:37:20 +0000534 abis_nm_set_channel_attr(&trx->ts[2], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000535 /* Connect traffic of bts0/trx0/ts2 to e1_0/ts2/c */
536 abis_nm_conn_terr_traf(&trx->ts[2], 0, 2, 2);
537
538 /* SET CHANNEL ATTRIBUTE TS3 */
Harald Welte23887b62009-02-18 03:37:20 +0000539 abis_nm_set_channel_attr(&trx->ts[3], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000540 /* Connect traffic of bts0/trx0/ts3 to e1_0/ts2/d */
541 abis_nm_conn_terr_traf(&trx->ts[3], 0, 2, 3);
542
543 /* SET CHANNEL ATTRIBUTE TS4 */
Harald Welte23887b62009-02-18 03:37:20 +0000544 abis_nm_set_channel_attr(&trx->ts[4], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000545 /* Connect traffic of bts0/trx0/ts4 to e1_0/ts3/a */
546 abis_nm_conn_terr_traf(&trx->ts[4], 0, 3, 0);
547
548 /* SET CHANNEL ATTRIBUTE TS5 */
Harald Welte23887b62009-02-18 03:37:20 +0000549 abis_nm_set_channel_attr(&trx->ts[5], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000550 /* Connect traffic of bts0/trx0/ts5 to e1_0/ts3/b */
551 abis_nm_conn_terr_traf(&trx->ts[5], 0, 3, 1);
552
553 /* SET CHANNEL ATTRIBUTE TS6 */
Harald Welte23887b62009-02-18 03:37:20 +0000554 abis_nm_set_channel_attr(&trx->ts[6], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000555 /* Connect traffic of bts0/trx0/ts6 to e1_0/ts3/c */
556 abis_nm_conn_terr_traf(&trx->ts[6], 0, 3, 2);
557
558 /* SET CHANNEL ATTRIBUTE TS7 */
Harald Welte23887b62009-02-18 03:37:20 +0000559 abis_nm_set_channel_attr(&trx->ts[7], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000560 /* Connect traffic of bts0/trx0/ts7 to e1_0/ts3/d */
561 abis_nm_conn_terr_traf(&trx->ts[7], 0, 3, 3);
562
563 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000564 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000565
566 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000567 abis_nm_bs11_reset_resource(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000568
569 /* restart sending event reports */
570 abis_nm_event_reports(bts, 1);
571}
572
Harald Welte8c1d0e42009-02-15 03:38:12 +0000573static void bootstrap_om(struct gsm_bts *bts)
574{
Harald Welteedb37782009-05-01 14:59:07 +0000575 fprintf(stdout, "bootstrapping OML for BTS %u\n", bts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000576
577 switch (bts->type) {
578 case GSM_BTS_TYPE_BS11:
579 bootstrap_om_bs11(bts);
580 break;
581 case GSM_BTS_TYPE_NANOBTS_900:
582 case GSM_BTS_TYPE_NANOBTS_1800:
583 bootstrap_om_nanobts(bts);
584 break;
585 default:
586 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
587 }
588}
589
Harald Welted1252502009-01-01 01:50:32 +0000590static int shutdown_om(struct gsm_bts *bts)
591{
592 /* stop sending event reports */
593 abis_nm_event_reports(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000594
Harald Welted1252502009-01-01 01:50:32 +0000595 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000596 abis_nm_bs11_db_transmission(bts, 1);
Harald Welted1252502009-01-01 01:50:32 +0000597
598 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000599 abis_nm_bs11_db_transmission(bts, 0);
Harald Welted1252502009-01-01 01:50:32 +0000600
601 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000602 abis_nm_bs11_reset_resource(bts);
Harald Welted1252502009-01-01 01:50:32 +0000603
604 return 0;
605}
606
607static int shutdown_net(struct gsm_network *net)
608{
Harald Weltee441d9c2009-06-21 16:17:15 +0200609 struct gsm_bts *bts;
610
611 llist_for_each_entry(bts, &net->bts_list, list) {
Harald Welted1252502009-01-01 01:50:32 +0000612 int rc;
Harald Weltee441d9c2009-06-21 16:17:15 +0200613 rc = shutdown_om(bts);
Harald Welted1252502009-01-01 01:50:32 +0000614 if (rc < 0)
615 return rc;
616 }
617
618 return 0;
619}
Harald Welte52b1f982008-12-23 20:25:15 +0000620
621struct bcch_info {
622 u_int8_t type;
623 u_int8_t len;
624 const u_int8_t *data;
625};
626
627/*
628SYSTEM INFORMATION TYPE 1
629 Cell channel description
630 Format-ID bit map 0
631 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
632 RACH Control Parameters
633 maximum 7 retransmissions
634 8 slots used to spread transmission
635 cell not barred for access
636 call reestablishment not allowed
637 Access Control Class = 0000
638*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000639static u_int8_t si1[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000640 /* header */0x55, 0x06, 0x19,
641 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
643 /* rach */0xD5, 0x00, 0x00,
644 /* s1 reset*/0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000645};
646
647/*
648 SYSTEM INFORMATION TYPE 2
649 Neighbour Cells Description
650 EXT-IND: Carries the complete BA
651 BA-IND = 0
652 Format-ID bit map 0
653 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
654 NCC permitted (NCC) = FF
655 RACH Control Parameters
656 maximum 7 retransmissions
657 8 slots used to spread transmission
658 cell not barred for access
659 call reestablishment not allowed
660 Access Control Class = 0000
661*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000662static u_int8_t si2[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000663 /* header */0x59, 0x06, 0x1A,
664 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
665 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
666 /* ncc */0xFF,
667 /* rach*/0xD5, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +0000668};
669
670/*
671SYSTEM INFORMATION TYPE 3
672 Cell identity = 00001 (1h)
673 Location area identification
674 Mobile Country Code (MCC): 001
675 Mobile Network Code (MNC): 01
676 Location Area Code (LAC): 00001 (1h)
677 Control Channel Description
678 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
679 0 blocks reserved for access grant
680 1 channel used for CCCH, with SDCCH
681 5 multiframes period for PAGING REQUEST
682 Time-out T3212 = 0
683 Cell Options BCCH
684 Power control indicator: not set
685 MSs shall not use uplink DTX
686 Radio link timeout = 36
687 Cell Selection Parameters
688 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
Harald Welte3b2ec422008-12-29 04:11:14 +0000689 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
Harald Welte52b1f982008-12-23 20:25:15 +0000690 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
691 Half rate support (NECI): New establishment causes are not supported
692 min.RX signal level for MS = 0
693 RACH Control Parameters
694 maximum 7 retransmissions
695 8 slots used to spread transmission
696 cell not barred for access
697 call reestablishment not allowed
698 Access Control Class = 0000
Harald Welte53833f62009-07-05 13:41:40 +0200699 SI 3 Rest Octets (not present)
Harald Welte52b1f982008-12-23 20:25:15 +0000700*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000701static u_int8_t si3[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000702 /* header */0x49, 0x06, 0x1B,
703 /* cell */0x00, 0x01,
704 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
705 /* desc */0x01, 0x03, 0x00,
706 /* option*/0x28,
707 /* selection*/0x62, 0x00,
708 /* rach */0xD5, 0x00, 0x00,
Harald Welte53833f62009-07-05 13:41:40 +0200709 /* rest */ 0x2B, 0x2B, 0x2B, 0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000710};
711
712/*
713SYSTEM INFORMATION TYPE 4
714 Location area identification
715 Mobile Country Code (MCC): 001
716 Mobile Network Code (MNC): 01
717 Location Area Code (LAC): 00001 (1h)
718 Cell Selection Parameters
719 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
720 max.TX power level MS may use for CCH = 2
721 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
722 Half rate support (NECI): New establishment causes are not supported
723 min.RX signal level for MS = 0
724 RACH Control Parameters
725 maximum 7 retransmissions
726 8 slots used to spread transmission
727 cell not barred for access
728 call reestablishment not allowed
729 Access Control Class = 0000
Harald Welte53833f62009-07-05 13:41:40 +0200730 CBCH Channel Description
Harald Welte52b1f982008-12-23 20:25:15 +0000731 Type = SDCCH/4[2]
732 Timeslot Number: 0
733 Training Sequence Code: 7h
734 ARFCN: 1
Harald Welte53833f62009-07-05 13:41:40 +0200735 SI Rest Octets (not present)
Harald Welte52b1f982008-12-23 20:25:15 +0000736*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000737static u_int8_t si4[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000738 /* header */0x41, 0x06, 0x1C,
739 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
740 /* sel */0x62, 0x00,
741 /* rach*/0xD5, 0x00, 0x00,
Harald Welte53833f62009-07-05 13:41:40 +0200742 /* cbch chan desc */ 0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/,
743 /* rest octets */ 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000744};
745
746/*
747 SYSTEM INFORMATION TYPE 5
748 Neighbour Cells Description
749 EXT-IND: Carries the complete BA
750 BA-IND = 0
751 Format-ID bit map 0
752 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
753*/
754
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000755static u_int8_t si5[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000756 /* header without l2 len*/0x06, 0x1D,
757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000759};
760
761// SYSTEM INFORMATION TYPE 6
762
763/*
764SACCH FILLING
765 System Info Type: SYSTEM INFORMATION 6
766 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
767
768SYSTEM INFORMATION TYPE 6
769 Cell identity = 00001 (1h)
770 Location area identification
771 Mobile Country Code (MCC): 001
772 Mobile Network Code (MNC): 01
773 Location Area Code (LAC): 00001 (1h)
774 Cell Options SACCH
775 Power control indicator: not set
776 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
777 Radio link timeout = 36
778 NCC permitted (NCC) = FF
779*/
780
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000781static u_int8_t si6[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000782 /* header */0x06, 0x1E,
783 /* cell id*/ 0x00, 0x01,
784 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
785 /* options */ 0x28,
786 /* ncc */ 0xFF,
Harald Welte52b1f982008-12-23 20:25:15 +0000787};
788
789
790
791static const struct bcch_info bcch_infos[] = {
792 {
793 .type = RSL_SYSTEM_INFO_1,
794 .len = sizeof(si1),
795 .data = si1,
796 }, {
797 .type = RSL_SYSTEM_INFO_2,
798 .len = sizeof(si2),
799 .data = si2,
800 }, {
801 .type = RSL_SYSTEM_INFO_3,
802 .len = sizeof(si3),
803 .data = si3,
804 }, {
805 .type = RSL_SYSTEM_INFO_4,
806 .len = sizeof(si4),
807 .data = si4,
808 },
809};
810
Holger Freyther24287b62008-12-28 16:32:41 +0000811static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
812static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
813static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
814static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
Harald Welte104604e2008-12-28 16:36:11 +0000815static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
816static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
Holger Freyther24287b62008-12-28 16:32:41 +0000817
Harald Welte52b1f982008-12-23 20:25:15 +0000818/* set all system information types */
Harald Weltee79769b2009-02-07 00:48:17 +0000819static int set_system_infos(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000820{
821 int i;
822
823 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
Harald Weltee79769b2009-02-07 00:48:17 +0000824 rsl_bcch_info(trx, bcch_infos[i].type,
Harald Welte52b1f982008-12-23 20:25:15 +0000825 bcch_infos[i].data,
826 bcch_infos[i].len);
827 }
Harald Weltee79769b2009-02-07 00:48:17 +0000828 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
829 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
Harald Weltead384642008-12-26 10:20:07 +0000830
831 return 0;
Harald Welte52b1f982008-12-23 20:25:15 +0000832}
833
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000834/*
835 * Patch the various SYSTEM INFORMATION tables to update
836 * the LAI
837 */
838static void patch_tables(struct gsm_bts *bts)
839{
Harald Weltee441d9c2009-06-21 16:17:15 +0200840 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
841 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000842 /* covert the raw packet to the struct */
843 struct gsm48_system_information_type_3 *type_3 =
844 (struct gsm48_system_information_type_3*)&si3;
845 struct gsm48_system_information_type_4 *type_4 =
846 (struct gsm48_system_information_type_4*)&si4;
847 struct gsm48_system_information_type_6 *type_6 =
848 (struct gsm48_system_information_type_6*)&si6;
Harald Welteb84e2f42008-12-28 23:42:04 +0000849 struct gsm48_loc_area_id lai;
850
851 gsm0408_generate_lai(&lai, bts->network->country_code,
Harald Welte110c0ab2009-05-23 16:27:05 +0000852 bts->network->network_code,
853 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 Weltea865f1b2009-06-20 10:42:17 +0200861 bs11_attr_bts[69] &= 0xf0;
862 bs11_attr_bts[69] |= arfcn_high;
863 bs11_attr_bts[70] = 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 Weltea865f1b2009-06-20 10:42:17 +0200869 bs11_attr_radio[2] &= 0xf0;
870 bs11_attr_radio[2] |= arfcn_high;
871 bs11_attr_radio[3] = 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;
Harald Welte78f2f502009-05-23 16:56:52 +0000882
883 /* patch BSIC */
Harald Weltea865f1b2009-06-20 10:42:17 +0200884 bs11_attr_bts[1] = bts->bsic;
Harald Welte78f2f502009-05-23 16:56:52 +0000885 nanobts_attr_bts[sizeof(nanobts_attr_bts)-1] = bts->bsic;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000886}
887
888
Harald Weltee79769b2009-02-07 00:48:17 +0000889static void bootstrap_rsl(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000890{
Harald Welteedb37782009-05-01 14:59:07 +0000891 fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) "
892 "using MCC=%u MNC=%u\n", trx->nr, trx->bts->nr, MCC, MNC);
Harald Weltee79769b2009-02-07 00:48:17 +0000893 set_system_infos(trx);
Harald Welte52b1f982008-12-23 20:25:15 +0000894}
895
Harald Welte1fa60c82009-02-09 18:13:26 +0000896void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
Harald Weltead384642008-12-26 10:20:07 +0000897{
898 switch (event) {
Harald Welte1fa60c82009-02-09 18:13:26 +0000899 case EVT_E1_TEI_UP:
900 switch (type) {
901 case E1INP_SIGN_OML:
902 bootstrap_om(trx->bts);
903 break;
904 case E1INP_SIGN_RSL:
905 bootstrap_rsl(trx);
906 break;
907 default:
908 break;
909 }
Harald Weltead384642008-12-26 10:20:07 +0000910 break;
Harald Welte1fa60c82009-02-09 18:13:26 +0000911 case EVT_E1_TEI_DN:
912 fprintf(stderr, "Lost some E1 TEI link\n");
913 /* FIXME: deal with TEI or L1 link loss */
Harald Weltead384642008-12-26 10:20:07 +0000914 break;
915 default:
Harald Weltead384642008-12-26 10:20:07 +0000916 break;
917 }
918}
919
Harald Welteedb37782009-05-01 14:59:07 +0000920static int bootstrap_bts(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000921{
Harald Weltefcd24452009-06-20 18:15:19 +0200922 bts->band = BAND;
Holger Freyther0a173bf2009-04-22 22:07:07 +0000923 bts->location_area_code = LAC;
Harald Weltee441d9c2009-06-21 16:17:15 +0200924 bts->c0->arfcn = ARFCN;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000925
926 /* Control Channel Description */
927 memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr));
Harald Welte41fbf442009-02-24 22:34:22 +0000928 bts->chan_desc.att = 1;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000929 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
930 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
931 bts->chan_desc.t3212 = 0;
932
Harald Welte98981882009-01-06 18:59:11 +0000933 patch_tables(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000934
Holger Freyther1fd34142009-02-09 23:42:03 +0000935 paging_init(bts);
Harald Welte38c2f132009-01-06 23:10:57 +0000936
Holger Freytherb8be6542009-06-02 03:25:14 +0000937 if (bts->type == GSM_BTS_TYPE_BS11) {
Harald Weltee441d9c2009-06-21 16:17:15 +0200938 struct gsm_bts_trx *trx = bts->c0;
Holger Freytherb8be6542009-06-02 03:25:14 +0000939 set_ts_e1link(&trx->ts[0], 0, 1, 0xff);
940 set_ts_e1link(&trx->ts[1], 0, 2, 1);
941 set_ts_e1link(&trx->ts[2], 0, 2, 2);
942 set_ts_e1link(&trx->ts[3], 0, 2, 3);
943 set_ts_e1link(&trx->ts[4], 0, 3, 0);
944 set_ts_e1link(&trx->ts[5], 0, 3, 1);
945 set_ts_e1link(&trx->ts[6], 0, 3, 2);
946 set_ts_e1link(&trx->ts[7], 0, 3, 3);
947#ifdef HAVE_TRX1
948 /* TRX 1 */
949 trx = &bts->trx[1];
950 set_ts_e1link(&trx->ts[0], 0, 1, 0xff);
951 set_ts_e1link(&trx->ts[1], 0, 2, 1);
952 set_ts_e1link(&trx->ts[2], 0, 2, 2);
953 set_ts_e1link(&trx->ts[3], 0, 2, 3);
954 set_ts_e1link(&trx->ts[4], 0, 3, 0);
955 set_ts_e1link(&trx->ts[5], 0, 3, 1);
956 set_ts_e1link(&trx->ts[6], 0, 3, 2);
957 set_ts_e1link(&trx->ts[7], 0, 3, 3);
958#endif
959 }
960
Harald Welteedb37782009-05-01 14:59:07 +0000961 return 0;
962}
963
964static int bootstrap_network(void)
965{
966 struct gsm_bts *bts;
967
Holger Hans Peter Freythere91f5782009-06-10 10:20:16 +0200968 switch(BTS_TYPE) {
969 case GSM_BTS_TYPE_NANOBTS_1800:
970 if (ARFCN < 512 || ARFCN > 885) {
971 fprintf(stderr, "GSM1800 channel must be between 512-885.\n");
972 return -EINVAL;
973 }
974 break;
975 case GSM_BTS_TYPE_BS11:
976 case GSM_BTS_TYPE_NANOBTS_900:
977 /* Assume we have a P-GSM900 here */
978 if (ARFCN < 1 || ARFCN > 124) {
979 fprintf(stderr, "GSM900 channel must be between 1-124.\n");
980 return -EINVAL;
981 }
982 break;
983 case GSM_BTS_TYPE_UNKNOWN:
984 fprintf(stderr, "Unknown BTS. Please use the --bts-type switch\n");
985 return -EINVAL;
986 }
987
Harald Welteedb37782009-05-01 14:59:07 +0000988 /* initialize our data structures */
Harald Weltee441d9c2009-06-21 16:17:15 +0200989 gsmnet = gsm_network_init(MCC, MNC, mncc_recv);
Harald Welteedb37782009-05-01 14:59:07 +0000990 if (!gsmnet)
991 return -ENOMEM;
992
993 gsmnet->name_long = "OpenBSC";
994 gsmnet->name_short = "OpenBSC";
995
Harald Weltee441d9c2009-06-21 16:17:15 +0200996 bts = gsm_bts_alloc(gsmnet, BTS_TYPE, HARDCODED_TSC, HARDCODED_BSIC);
Harald Welteedb37782009-05-01 14:59:07 +0000997 bootstrap_bts(bts);
998
Holger Freytherc7b86f92009-06-06 13:54:20 +0000999 if (db_init(database_name)) {
Holger Freytheref7f7ce2009-04-19 06:35:12 +00001000 printf("DB: Failed to init database. Please check the option settings.\n");
1001 return -1;
1002 }
1003 printf("DB: Database initialized.\n");
1004
1005 if (db_prepare()) {
1006 printf("DB: Failed to prepare database.\n");
1007 return -1;
1008 }
1009 printf("DB: Database prepared.\n");
1010
Holger Freyther219518d2009-01-02 22:04:43 +00001011 telnet_init(gsmnet, 4242);
Harald Weltead384642008-12-26 10:20:07 +00001012
Harald Welteb4630602009-05-01 15:43:22 +00001013 register_signal_handler(SS_NM, nm_sig_cb, NULL);
1014
Harald Welte1fa60c82009-02-09 18:13:26 +00001015 /* E1 mISDN input setup */
Harald Welteedb37782009-05-01 14:59:07 +00001016 if (BTS_TYPE == GSM_BTS_TYPE_BS11) {
1017 gsmnet->num_bts = 1;
Holger Freytherb5c00f52009-04-22 22:08:07 +00001018 return e1_config(bts, cardnr, release_l2);
Harald Welteedb37782009-05-01 14:59:07 +00001019 } else {
1020 /* FIXME: do this dynamic */
1021 bts->ip_access.site_id = 1801;
1022 bts->ip_access.bts_id = 0;
Harald Weltefcd24452009-06-20 18:15:19 +02001023
Harald Weltee441d9c2009-06-21 16:17:15 +02001024 bts = gsm_bts_alloc(gsmnet, BTS_TYPE, HARDCODED_TSC, HARDCODED_BSIC);
Harald Welteedb37782009-05-01 14:59:07 +00001025 bootstrap_bts(bts);
1026 bts->ip_access.site_id = 1800;
1027 bts->ip_access.bts_id = 0;
Harald Weltecf559782009-05-01 15:43:49 +00001028 return ipaccess_setup(gsmnet);
Harald Welteedb37782009-05-01 14:59:07 +00001029 }
Harald Welte52b1f982008-12-23 20:25:15 +00001030}
Harald Weltef6b7a902008-12-26 00:05:11 +00001031
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001032static void create_pcap_file(char *file)
1033{
1034 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
1035 int fd = open(file, O_WRONLY|O_TRUNC|O_CREAT, mode);
1036
1037 if (fd < 0) {
1038 perror("Failed to open file for pcap");
1039 return;
1040 }
1041
Holger Freyther0469cf62009-03-31 12:14:16 +00001042 e1_set_pcap_fd(fd);
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001043}
1044
Holger Freytherb332f612008-12-27 12:46:51 +00001045static void print_usage()
1046{
1047 printf("Usage: bsc_hack\n");
1048}
1049
1050static void print_help()
1051{
1052 printf(" Some useful help...\n");
1053 printf(" -d option --debug=DRLL:DCC:DMM:DRR:DRSL:DNM enable debugging\n");
Holger Freytherefde7fb2008-12-28 14:14:56 +00001054 printf(" -s --disable-color\n");
1055 printf(" -n --network-code number(MNC) \n");
1056 printf(" -c --country-code number (MCC) \n");
Holger Freyther0a173bf2009-04-22 22:07:07 +00001057 printf(" -L --location-area-code number (LAC) \n");
Harald Welte98981882009-01-06 18:59:11 +00001058 printf(" -f --arfcn number The frequency ARFCN\n");
Holger Freytherbde36102008-12-28 22:51:39 +00001059 printf(" -l --database db-name The database to use\n");
Holger Freyther89824fc2008-12-30 16:18:18 +00001060 printf(" -a --authorize-everyone Allow everyone into the network.\n");
Holger Freythere97f7fb2008-12-31 18:52:11 +00001061 printf(" -r --reject-cause number The reject cause for LOCATION UPDATING REJECT.\n");
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001062 printf(" -p --pcap file The filename of the pcap file\n");
Harald Weltee1bd2412009-02-15 14:40:09 +00001063 printf(" -t --bts-type type The BTS type (bs11, nanobts900, nanobts1800)\n");
Holger Freytherdda22c12009-04-22 22:07:31 +00001064 printf(" -C --cardnr number For bs11 select E1 card number other than 0\n");
Holger Freytherb5c00f52009-04-22 22:08:07 +00001065 printf(" -R --release-l2 Releases mISDN layer 2 after exit, to unload driver.\n");
Holger Freytherb332f612008-12-27 12:46:51 +00001066 printf(" -h --help this text\n");
1067}
1068
1069static void handle_options(int argc, char** argv)
1070{
1071 while (1) {
Harald Welte2cf161b2009-06-20 22:36:41 +02001072 int option_index = 0, c;
Holger Freytherb332f612008-12-27 12:46:51 +00001073 static struct option long_options[] = {
1074 {"help", 0, 0, 'h'},
1075 {"debug", 1, 0, 'd'},
Holger Freytherefde7fb2008-12-28 14:14:56 +00001076 {"disable-color", 0, 0, 's'},
1077 {"network-code", 1, 0, 'n'},
1078 {"country-code", 1, 0, 'c'},
Holger Freyther0a173bf2009-04-22 22:07:07 +00001079 {"location-area-code", 1, 0, 'L'},
Holger Freytherbde36102008-12-28 22:51:39 +00001080 {"database", 1, 0, 'l'},
Holger Freyther89824fc2008-12-30 16:18:18 +00001081 {"authorize-everyone", 0, 0, 'a'},
Holger Freythere97f7fb2008-12-31 18:52:11 +00001082 {"reject-cause", 1, 0, 'r'},
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001083 {"pcap", 1, 0, 'p'},
Harald Welte98981882009-01-06 18:59:11 +00001084 {"arfcn", 1, 0, 'f'},
Harald Welte8c1d0e42009-02-15 03:38:12 +00001085 {"bts-type", 1, 0, 't'},
Holger Freytherdda22c12009-04-22 22:07:31 +00001086 {"cardnr", 1, 0, 'C'},
Holger Freytherb5c00f52009-04-22 22:08:07 +00001087 {"release-l2", 0, 0, 'R'},
Harald Welted3ff51d2009-06-09 20:21:57 +00001088 {"timestamp", 0, 0, 'T'},
Harald Weltefcd24452009-06-20 18:15:19 +02001089 {"band", 0, 0, 'b'},
Holger Freytherb332f612008-12-27 12:46:51 +00001090 {0, 0, 0, 0}
1091 };
1092
Harald Weltefcd24452009-06-20 18:15:19 +02001093 c = getopt_long(argc, argv, "hc:n:d:sar:p:f:t:C:RL:l:Tb:",
Holger Freytherb332f612008-12-27 12:46:51 +00001094 long_options, &option_index);
1095 if (c == -1)
1096 break;
1097
1098 switch (c) {
1099 case 'h':
1100 print_usage();
1101 print_help();
1102 exit(0);
Holger Freytherefde7fb2008-12-28 14:14:56 +00001103 case 's':
Holger Freytherb332f612008-12-27 12:46:51 +00001104 debug_use_color(0);
1105 break;
1106 case 'd':
1107 debug_parse_category_mask(optarg);
1108 break;
Holger Freytherefde7fb2008-12-28 14:14:56 +00001109 case 'n':
1110 MNC = atoi(optarg);
1111 break;
1112 case 'c':
1113 MCC = atoi(optarg);
1114 break;
Holger Freyther0a173bf2009-04-22 22:07:07 +00001115 case 'L':
1116 LAC = atoi(optarg);
1117 break;
Harald Welte98981882009-01-06 18:59:11 +00001118 case 'f':
1119 ARFCN = atoi(optarg);
1120 break;
Harald Welte8965da42009-01-06 18:09:02 +00001121 case 'l':
Holger Freytherbde36102008-12-28 22:51:39 +00001122 database_name = strdup(optarg);
1123 break;
Holger Freyther89824fc2008-12-30 16:18:18 +00001124 case 'a':
1125 gsm0408_allow_everyone(1);
1126 break;
Holger Freythere97f7fb2008-12-31 18:52:11 +00001127 case 'r':
1128 gsm0408_set_reject_cause(atoi(optarg));
1129 break;
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001130 case 'p':
1131 create_pcap_file(optarg);
1132 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +00001133 case 't':
1134 BTS_TYPE = parse_btstype(optarg);
1135 break;
Holger Freytherdda22c12009-04-22 22:07:31 +00001136 case 'C':
1137 cardnr = atoi(optarg);
1138 break;
Holger Freytherb5c00f52009-04-22 22:08:07 +00001139 case 'R':
1140 release_l2 = 1;
1141 break;
Harald Welted3ff51d2009-06-09 20:21:57 +00001142 case 'T':
1143 debug_timestamp(1);
1144 break;
Harald Weltefcd24452009-06-20 18:15:19 +02001145 case 'b':
1146 BAND = gsm_band_parse(atoi(optarg));
1147 break;
Holger Freytherb332f612008-12-27 12:46:51 +00001148 default:
1149 /* ignore */
1150 break;
1151 }
1152 }
1153}
1154
Harald Welted1252502009-01-01 01:50:32 +00001155static void signal_handler(int signal)
1156{
1157 fprintf(stdout, "signal %u received\n", signal);
1158
1159 switch (signal) {
1160 case SIGHUP:
1161 case SIGABRT:
1162 shutdown_net(gsmnet);
1163 break;
Harald Welte2cf161b2009-06-20 22:36:41 +02001164 case SIGUSR1:
1165 talloc_report_full(tall_bsc_ctx, stderr);
1166 break;
Harald Welted1252502009-01-01 01:50:32 +00001167 default:
1168 break;
1169 }
1170}
1171
Harald Weltef6b7a902008-12-26 00:05:11 +00001172int main(int argc, char **argv)
1173{
Harald Welte1fa60c82009-02-09 18:13:26 +00001174 int rc;
1175
Harald Welte2cf161b2009-06-20 22:36:41 +02001176 tall_bsc_ctx = talloc_named_const(NULL, 1, "openbsc");
1177
Holger Freytherb332f612008-12-27 12:46:51 +00001178 /* parse options */
1179 handle_options(argc, argv);
1180
Harald Welte65ccf882009-02-24 22:36:20 +00001181 /* seed the PRNG */
1182 srand(time(NULL));
1183
Harald Welte1fa60c82009-02-09 18:13:26 +00001184 rc = bootstrap_network();
1185 if (rc < 0)
1186 exit(1);
Harald Weltef6b7a902008-12-26 00:05:11 +00001187
Harald Welted1252502009-01-01 01:50:32 +00001188 signal(SIGHUP, &signal_handler);
1189 signal(SIGABRT, &signal_handler);
Harald Welte2cf161b2009-06-20 22:36:41 +02001190 signal(SIGUSR1, &signal_handler);
Harald Welted1252502009-01-01 01:50:32 +00001191
Harald Weltef6b7a902008-12-26 00:05:11 +00001192 while (1) {
Harald Welte4bfdfe72009-06-10 23:11:52 +08001193 bsc_upqueue(gsmnet);
Harald Welte04d3c922009-05-23 06:07:04 +00001194 bsc_select_main(0);
Harald Weltef6b7a902008-12-26 00:05:11 +00001195 }
1196}