blob: 34313102895d00963357cf82c61d584db3637257 [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 Weltef8d536d2009-07-21 22:12:23 +020059static int TSC = HARDCODED_TSC;
60static int BSIC = HARDCODED_BSIC;
Harald Welte98981882009-01-06 18:59:11 +000061static int ARFCN = HARDCODED_ARFCN;
Holger Freytherdda22c12009-04-22 22:07:31 +000062static int cardnr = 0;
Holger Freytherb5c00f52009-04-22 22:08:07 +000063static int release_l2 = 0;
Harald Welte67b4c302009-07-29 16:42:16 +020064static int bs11_has_trx1 = 0;
Harald Welte8c1d0e42009-02-15 03:38:12 +000065static enum gsm_bts_type BTS_TYPE = GSM_BTS_TYPE_BS11;
Harald Weltefcd24452009-06-20 18:15:19 +020066static enum gsm_band BAND = GSM_BAND_900;
Holger Freytherbde36102008-12-28 22:51:39 +000067static const char *database_name = "hlr.sqlite3";
Harald Welte805f6442009-07-28 18:25:29 +020068extern int ipacc_rtp_direct;
Holger Freytherefde7fb2008-12-28 14:14:56 +000069
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +020070struct nano_bts_id {
71 struct llist_head entry;
72 int site_id;
73 int bts_id;
74};
75
76static LLIST_HEAD(nanobts_ids);
77
78
Harald Welte52b1f982008-12-23 20:25:15 +000079/* The following definitions are for OM and NM packets that we cannot yet
80 * generate by code but we just pass on */
81
82// BTS Site Manager, SET ATTRIBUTES
83
84/*
85 Object Class: BTS Site Manager
86 Instance 1: FF
87 Instance 2: FF
88 Instance 3: FF
89SET ATTRIBUTES
90 sAbisExternalTime: 2007/09/08 14:36:11
91 omLAPDRelTimer: 30sec
92 shortLAPDIntTimer: 5sec
93 emergencyTimer1: 10 minutes
94 emergencyTimer2: 0 minutes
95*/
96
97unsigned char msg_1[] =
98{
Harald Weltea865f1b2009-06-20 10:42:17 +020099 NM_MT_BS11_SET_ATTR, NM_OC_SITE_MANAGER, 0xFF, 0xFF, 0xFF,
Harald Welte110c0ab2009-05-23 16:27:05 +0000100 NM_ATT_BS11_ABIS_EXT_TIME, 0x07,
101 0xD7, 0x09, 0x08, 0x0E, 0x24, 0x0B, 0xCE,
102 0x02,
103 0x00, 0x1E,
104 NM_ATT_BS11_SH_LAPD_INT_TIMER,
105 0x01, 0x05,
Harald Weltecd993872009-02-15 16:16:28 +0000106 0x42, 0x02, 0x00, 0x0A,
107 0x44, 0x02, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +0000108};
109
110// BTS, SET BTS ATTRIBUTES
111
112/*
113 Object Class: BTS
114 BTS relat. Number: 0
115 Instance 2: FF
116 Instance 3: FF
117SET BTS ATTRIBUTES
118 bsIdentityCode / BSIC:
119 PLMN_colour_code: 7h
120 BS_colour_code: 7h
121 BTS Air Timer T3105: 4 ,unit 10 ms
122 btsIsHopping: FALSE
Harald Welte83282292009-02-01 16:22:19 +0000123 periodCCCHLoadIndication: 1sec
Holger Freyther3b910432009-02-11 00:43:48 +0000124 thresholdCCCHLoadIndication: 0%
Harald Welte52b1f982008-12-23 20:25:15 +0000125 cellAllocationNumber: 00h = GSM 900
126 enableInterferenceClass: 00h = Disabled
127 fACCHQual: 6 (FACCH stealing flags minus 1)
128 intaveParameter: 31 SACCH multiframes
129 interferenceLevelBoundaries:
130 Interference Boundary 1: 0Ah
131 Interference Boundary 2: 0Fh
132 Interference Boundary 3: 14h
133 Interference Boundary 4: 19h
134 Interference Boundary 5: 1Eh
135 mSTxPwrMax: 11
136 GSM range: 2=39dBm, 15=13dBm, stepsize 2 dBm
137 DCS1800 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
138 PCS1900 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
139 30=33dBm, 31=32dBm
140 ny1:
141 Maximum number of repetitions for PHYSICAL INFORMATION message (GSM 04.08): 20
142 powerOutputThresholds:
143 Out Power Fault Threshold: -10 dB
144 Red Out Power Threshold: - 6 dB
145 Excessive Out Power Threshold: 5 dB
146 rACHBusyThreshold: -127 dBm
147 rACHLoadAveragingSlots: 250 ,number of RACH burst periods
148 rfResourceIndicationPeriod: 125 SACCH multiframes
149 T200:
150 SDCCH: 044 in 5 ms
151 FACCH/Full rate: 031 in 5 ms
152 FACCH/Half rate: 041 in 5 ms
153 SACCH with TCH SAPI0: 090 in 10 ms
154 SACCH with SDCCH: 090 in 10 ms
155 SDCCH with SAPI3: 090 in 5 ms
156 SACCH with TCH SAPI3: 135 in 10 ms
157 tSync: 9000 units of 10 msec
158 tTrau: 9000 units of 10 msec
159 enableUmLoopTest: 00h = disabled
160 enableExcessiveDistance: 00h = Disabled
161 excessiveDistance: 64km
162 hoppingMode: 00h = baseband hopping
163 cellType: 00h = Standard Cell
164 BCCH ARFCN / bCCHFrequency: 1
165*/
166
Harald Weltea865f1b2009-06-20 10:42:17 +0200167static unsigned char bs11_attr_bts[] =
Harald Welte52b1f982008-12-23 20:25:15 +0000168{
Harald Welte060f6df2009-05-23 17:50:53 +0000169 NM_ATT_BSIC, HARDCODED_BSIC,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000170 NM_ATT_BTS_AIR_TIMER, 0x04,
Harald Weltecd993872009-02-15 16:16:28 +0000171 NM_ATT_BS11_BTSLS_HOPPING, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000172 NM_ATT_CCCH_L_I_P, 0x01,
173 NM_ATT_CCCH_L_T, 0x00,
Harald Welte7b26bcb2009-05-28 11:39:21 +0000174 NM_ATT_BS11_CELL_ALLOC_NR, NM_BS11_CANR_GSM,
175 NM_ATT_BS11_ENA_INTERF_CLASS, 0x01,
Harald Weltecd993872009-02-15 16:16:28 +0000176 NM_ATT_BS11_FACCH_QUAL, 0x06,
Harald Weltefe609d82009-05-23 18:14:31 +0000177 /* interference avg. period in numbers of SACCH multifr */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000178 NM_ATT_INTAVE_PARAM, 0x1F,
179 NM_ATT_INTERF_BOUND, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x7B,
180 NM_ATT_CCCH_L_T, 0x23,
181 NM_ATT_GSM_TIME, 0x28, 0x00,
182 NM_ATT_ADM_STATE, 0x03,
183 NM_ATT_RACH_B_THRESH, 0x7F,
184 NM_ATT_LDAVG_SLOTS, 0x00, 0xFA,
Harald Weltecd993872009-02-15 16:16:28 +0000185 NM_ATT_BS11_RF_RES_IND_PER, 0x7D,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000186 NM_ATT_T200, 0x2C, 0x1F, 0x29, 0x5A, 0x5A, 0x5A, 0x87,
Harald Weltecd993872009-02-15 16:16:28 +0000187 NM_ATT_BS11_TSYNC, 0x23, 0x28,
188 NM_ATT_BS11_TTRAU, 0x23, 0x28,
189 NM_ATT_TEST_DUR, 0x01, 0x00,
190 NM_ATT_OUTST_ALARM, 0x01, 0x00,
191 NM_ATT_BS11_EXCESSIVE_DISTANCE, 0x01, 0x40,
192 NM_ATT_BS11_HOPPING_MODE, 0x01, 0x00,
193 NM_ATT_BS11_PLL, 0x01, 0x00,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000194 NM_ATT_BCCH_ARFCN, 0x00, HARDCODED_ARFCN/*0x01*/,
Harald Welte52b1f982008-12-23 20:25:15 +0000195};
196
197// Handover Recognition, SET ATTRIBUTES
198
199/*
200Illegal Contents GSM Formatted O&M Msg
201 Object Class: Handover Recognition
202 BTS relat. Number: 0
203 Instance 2: FF
204 Instance 3: FF
205SET ATTRIBUTES
206 enableDelayPowerBudgetHO: 00h = Disabled
207 enableDistanceHO: 00h = Disabled
208 enableInternalInterCellHandover: 00h = Disabled
209 enableInternalIntraCellHandover: 00h = Disabled
210 enablePowerBudgetHO: 00h = Disabled
211 enableRXLEVHO: 00h = Disabled
212 enableRXQUALHO: 00h = Disabled
213 hoAveragingDistance: 8 SACCH multiframes
214 hoAveragingLev:
215 A_LEV_HO: 8 SACCH multiframes
216 W_LEV_HO: 1 SACCH multiframes
217 hoAveragingPowerBudget: 16 SACCH multiframes
218 hoAveragingQual:
219 A_QUAL_HO: 8 SACCH multiframes
220 W_QUAL_HO: 2 SACCH multiframes
221 hoLowerThresholdLevDL: (10 - 110) dBm
222 hoLowerThresholdLevUL: (5 - 110) dBm
223 hoLowerThresholdQualDL: 06h = 6.4% < BER < 12.8%
224 hoLowerThresholdQualUL: 06h = 6.4% < BER < 12.8%
225 hoThresholdLevDLintra : (20 - 110) dBm
226 hoThresholdLevULintra: (20 - 110) dBm
227 hoThresholdMsRangeMax: 20 km
228 nCell: 06h
229 timerHORequest: 3 ,unit 2 SACCH multiframes
230*/
231
232unsigned char msg_3[] =
233{
Harald Weltea865f1b2009-06-20 10:42:17 +0200234 NM_MT_BS11_SET_ATTR, NM_OC_BS11_HANDOVER, 0x00, 0xFF, 0xFF,
Harald Welte56554712009-07-18 16:18:11 +0200235 0xD0, 0x00, /* enableDelayPowerBudgetHO */
236 0x64, 0x00, /* enableDistanceHO */
237 0x67, 0x00, /* enableInternalInterCellHandover */
238 0x68, 0x00, /* enableInternalInterCellHandover */
239 0x6A, 0x00, /* enablePowerBudgetHO */
240 0x6C, 0x00, /* enableRXLEVHO */
241 0x6D, 0x00, /* enableRXQUALHO */
242 0x6F, 0x08, /* hoAveragingDistance */
243 0x70, 0x08, 0x01, /* hoAveragingLev */
Harald Weltecd993872009-02-15 16:16:28 +0000244 0x71, 0x10, 0x10, 0x10,
Harald Welte56554712009-07-18 16:18:11 +0200245 0x72, 0x08, 0x02, /* hoAveragingQual */
246 0x73, 0x0A, /* hoLowerThresholdLevDL */
247 0x74, 0x05, /* hoLowerThresholdLevUL */
248 0x75, 0x06, /* hoLowerThresholdQualDL */
249 0x76, 0x06, /* hoLowerThresholdQualUL */
250 0x78, 0x14, /* hoThresholdLevDLintra */
251 0x79, 0x14, /* hoThresholdLevULintra */
252 0x7A, 0x14, /* hoThresholdMsRangeMax */
253 0x7D, 0x06, /* nCell */
254 NM_ATT_BS11_TIMER_HO_REQUEST, 0x03,
255 0x20, 0x01, 0x00,
Harald Weltecd993872009-02-15 16:16:28 +0000256 0x45, 0x01, 0x00,
257 0x48, 0x01, 0x00,
258 0x5A, 0x01, 0x00,
259 0x5B, 0x01, 0x05,
260 0x5E, 0x01, 0x1A,
261 0x5F, 0x01, 0x20,
262 0x9D, 0x01, 0x00,
263 0x47, 0x01, 0x00,
264 0x5C, 0x01, 0x64,
265 0x5D, 0x01, 0x1E,
266 0x97, 0x01, 0x20,
267 0xF7, 0x01, 0x3C,
Harald Welte52b1f982008-12-23 20:25:15 +0000268};
269
270// Power Control, SET ATTRIBUTES
271
272/*
273 Object Class: Power Control
274 BTS relat. Number: 0
275 Instance 2: FF
276 Instance 3: FF
277SET ATTRIBUTES
278 enableMsPowerControl: 00h = Disabled
279 enablePowerControlRLFW: 00h = Disabled
280 pcAveragingLev:
281 A_LEV_PC: 4 SACCH multiframes
282 W_LEV_PC: 1 SACCH multiframes
283 pcAveragingQual:
284 A_QUAL_PC: 4 SACCH multiframes
285 W_QUAL_PC: 2 SACCH multiframes
286 pcLowerThresholdLevDL: 0Fh
287 pcLowerThresholdLevUL: 0Ah
288 pcLowerThresholdQualDL: 05h = 3.2% < BER < 6.4%
289 pcLowerThresholdQualUL: 05h = 3.2% < BER < 6.4%
290 pcRLFThreshold: 0Ch
291 pcUpperThresholdLevDL: 14h
292 pcUpperThresholdLevUL: 0Fh
293 pcUpperThresholdQualDL: 04h = 1.6% < BER < 3.2%
294 pcUpperThresholdQualUL: 04h = 1.6% < BER < 3.2%
295 powerConfirm: 2 ,unit 2 SACCH multiframes
296 powerControlInterval: 2 ,unit 2 SACCH multiframes
297 powerIncrStepSize: 02h = 4 dB
298 powerRedStepSize: 01h = 2 dB
299 radioLinkTimeoutBs: 64 SACCH multiframes
300 enableBSPowerControl: 00h = disabled
301*/
302
303unsigned char msg_4[] =
304{
Harald Weltea865f1b2009-06-20 10:42:17 +0200305 NM_MT_BS11_SET_ATTR, NM_OC_BS11_PWR_CTRL, 0x00, 0xFF, 0xFF,
Harald Weltecd993872009-02-15 16:16:28 +0000306 NM_ATT_BS11_ENA_MS_PWR_CTRL, 0x00,
307 NM_ATT_BS11_ENA_PWR_CTRL_RLFW, 0x00,
Harald Welte56554712009-07-18 16:18:11 +0200308 0x7E, 0x04, 0x01, /* pcAveragingLev */
309 0x7F, 0x04, 0x02, /* pcAveragingQual */
310 0x80, 0x0F, /* pcLowerThresholdLevDL */
311 0x81, 0x0A, /* pcLowerThresholdLevUL */
312 0x82, 0x05, /* pcLowerThresholdQualDL */
313 0x83, 0x05, /* pcLowerThresholdQualUL */
314 0x84, 0x0C, /* pcRLFThreshold */
315 0x85, 0x14, /* pcUpperThresholdLevDL */
316 0x86, 0x0F, /* pcUpperThresholdLevUL */
317 0x87, 0x04, /* pcUpperThresholdQualDL */
318 0x88, 0x04, /* pcUpperThresholdQualUL */
319 0x89, 0x02, /* powerConfirm */
320 0x8A, 0x02, /* powerConfirmInterval */
321 0x8B, 0x02, /* powerIncrStepSize */
322 0x8C, 0x01, /* powerRedStepSize */
323 0x8D, 0x40, /* radioLinkTimeoutBs */
Harald Weltecd993872009-02-15 16:16:28 +0000324 0x65, 0x01, 0x00 // set to 0x01 to enable BSPowerControl
Harald Welte52b1f982008-12-23 20:25:15 +0000325};
326
327
328// Transceiver, SET TRX ATTRIBUTES (TRX 0)
329
330/*
331 Object Class: Transceiver
332 BTS relat. Number: 0
333 Tranceiver number: 0
334 Instance 3: FF
335SET TRX ATTRIBUTES
336 aRFCNList (HEX): 0001
Harald Weltecd993872009-02-15 16:16:28 +0000337 txPwrMaxReduction: 00h = 30dB
Harald Welte52b1f982008-12-23 20:25:15 +0000338 radioMeasGran: 254 SACCH multiframes
339 radioMeasRep: 01h = enabled
340 memberOfEmergencyConfig: 01h = TRUE
341 trxArea: 00h = TRX doesn't belong to a concentric cell
342*/
343
Harald Weltea865f1b2009-06-20 10:42:17 +0200344static unsigned char bs11_attr_radio[] =
Harald Welte52b1f982008-12-23 20:25:15 +0000345{
Harald Weltecd993872009-02-15 16:16:28 +0000346 NM_ATT_ARFCN_LIST, 0x01, 0x00, HARDCODED_ARFCN /*0x01*/,
Harald Welte311d0cf2009-02-17 17:45:59 +0000347 NM_ATT_RF_MAXPOWR_R, 0x00,
Harald Weltecd993872009-02-15 16:16:28 +0000348 NM_ATT_BS11_RADIO_MEAS_GRAN, 0x01, 0xFE,
349 NM_ATT_BS11_RADIO_MEAS_REP, 0x01, 0x01,
350 NM_ATT_BS11_EMRG_CFG_MEMBER, 0x01, 0x01,
351 NM_ATT_BS11_TRX_AREA, 0x01, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000352};
353
Harald Welte8c1d0e42009-02-15 03:38:12 +0000354static unsigned char nanobts_attr_bts[] = {
355 NM_ATT_INTERF_BOUND, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73,
Harald Weltefe609d82009-05-23 18:14:31 +0000356 /* interference avg. period in numbers of SACCH multifr */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000357 NM_ATT_INTAVE_PARAM, 0x06,
Harald Welted0fbab52009-06-09 20:04:44 +0000358 /* conn fail based on SACCH error rate */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000359 NM_ATT_CONN_FAIL_CRIT, 0x00, 0x02, 0x01, 0x10,
360 NM_ATT_T200, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21, 0xa8,
361 NM_ATT_MAX_TA, 0x3f,
Harald Welte311d0cf2009-02-17 17:45:59 +0000362 NM_ATT_OVERL_PERIOD, 0x00, 0x01, 10, /* seconds */
363 NM_ATT_CCCH_L_T, 10, /* percent */
364 NM_ATT_CCCH_L_I_P, 1, /* seconds */
Harald Weltefe609d82009-05-23 18:14:31 +0000365 NM_ATT_RACH_B_THRESH, 10, /* busy threshold in - dBm */
Harald Welted0fbab52009-06-09 20:04:44 +0000366 NM_ATT_LDAVG_SLOTS, 0x03, 0xe8, /* rach load averaging 1000 slots */
Harald Weltefe609d82009-05-23 18:14:31 +0000367 NM_ATT_BTS_AIR_TIMER, 128, /* miliseconds */
368 NM_ATT_NY1, 10, /* 10 retransmissions of physical config */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000369 NM_ATT_BCCH_ARFCN, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
Harald Welte060f6df2009-05-23 17:50:53 +0000370 NM_ATT_BSIC, HARDCODED_BSIC,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000371};
Harald Welte52b1f982008-12-23 20:25:15 +0000372
Harald Welte8c1d0e42009-02-15 03:38:12 +0000373static unsigned char nanobts_attr_radio[] = {
Harald Welted0fbab52009-06-09 20:04:44 +0000374 NM_ATT_RF_MAXPOWR_R, 0x0c, /* number of -2dB reduction steps / Pn */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000375 NM_ATT_ARFCN_LIST, 0x00, 0x02, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
376};
377
Harald Welte5c1e4582009-02-15 11:57:29 +0000378static unsigned char nanobts_attr_e0[] = {
Harald Welte0efe9b72009-07-12 09:33:54 +0200379 NM_ATT_IPACC_STREAM_ID, 0x00,
380 NM_ATT_IPACC_DST_IP_PORT, 0x0b, 0xbb, /* TCP PORT for RSL */
Harald Welte5c1e4582009-02-15 11:57:29 +0000381};
382
Harald Welteb4630602009-05-01 15:43:22 +0000383/* Callback function to be called whenever we get a GSM 12.21 state change event */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000384int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
385 struct gsm_nm_state *old_state, struct gsm_nm_state *new_state)
386{
387 struct gsm_bts *bts;
388 struct gsm_bts_trx *trx;
389 struct gsm_bts_trx_ts *ts;
390
391 /* This is currently only required on nanoBTS */
392
393 switch (evt) {
394 case EVT_STATECHG_OPER:
395 switch (obj_class) {
396 case NM_OC_SITE_MANAGER:
397 bts = container_of(obj, struct gsm_bts, site_mgr);
398 if (old_state->operational != 2 && new_state->operational == 2) {
399 abis_nm_opstart(bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
400 }
401 break;
402 case NM_OC_BTS:
403 bts = obj;
404 if (new_state->availability == 5) {
405 abis_nm_set_bts_attr(bts, nanobts_attr_bts,
406 sizeof(nanobts_attr_bts));
407 abis_nm_opstart(bts, NM_OC_BTS,
Harald Welte191280d2009-05-01 13:20:04 +0000408 bts->bts_nr, 0xff, 0xff);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000409 abis_nm_chg_adm_state(bts, NM_OC_BTS,
Harald Welte191280d2009-05-01 13:20:04 +0000410 bts->bts_nr, 0xff, 0xff,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000411 NM_STATE_UNLOCKED);
412 }
413 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000414 case NM_OC_CHANNEL:
415 ts = obj;
416 trx = ts->trx;
417 if (new_state->availability == 5) {
418 if (ts->nr == 0 && trx == trx->bts->c0)
Harald Weltee1bd2412009-02-15 14:40:09 +0000419 abis_nm_set_channel_attr(ts, NM_CHANC_BCCH_CBCH);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000420 else
421 abis_nm_set_channel_attr(ts, NM_CHANC_TCHFull);
422 abis_nm_opstart(trx->bts, NM_OC_CHANNEL,
Harald Welte191280d2009-05-01 13:20:04 +0000423 trx->bts->bts_nr, trx->nr, ts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000424 abis_nm_chg_adm_state(trx->bts, NM_OC_CHANNEL,
Harald Welte191280d2009-05-01 13:20:04 +0000425 trx->bts->bts_nr, trx->nr, ts->nr,
Harald Welte8c1d0e42009-02-15 03:38:12 +0000426 NM_STATE_UNLOCKED);
427 }
428 break;
Harald Weltea994a482009-05-01 15:54:23 +0000429 default:
Harald Welte8c1d0e42009-02-15 03:38:12 +0000430 break;
431 }
432 break;
Harald Weltea994a482009-05-01 15:54:23 +0000433 default:
434 //DEBUGP(DMM, "Unhandled state change in %s:%d\n", __func__, __LINE__);
Holger Freytherff9592f2009-03-09 16:17:14 +0000435 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +0000436 }
437 return 0;
438}
439
Harald Welteb4630602009-05-01 15:43:22 +0000440/* Callback function to be called every time we receive a 12.21 SW activated report */
441static int sw_activ_rep(struct msgb *mb)
442{
443 struct abis_om_fom_hdr *foh = msgb_l3(mb);
444 struct gsm_bts_trx *trx = mb->trx;
445
446 switch (foh->obj_class) {
447 case NM_OC_BASEB_TRANSC:
448 /* TRX software is active, tell it to initiate RSL Link */
449 abis_nm_ipaccess_msg(trx->bts, 0xe0, NM_OC_BASEB_TRANSC,
450 trx->bts->bts_nr, trx->nr, 0xff,
451 nanobts_attr_e0, sizeof(nanobts_attr_e0));
452 abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC,
453 trx->bts->bts_nr, trx->nr, 0xff);
454 abis_nm_chg_adm_state(trx->bts, NM_OC_BASEB_TRANSC,
455 trx->bts->bts_nr, trx->nr, 0xff,
456 NM_STATE_UNLOCKED);
457 break;
458 case NM_OC_RADIO_CARRIER:
459 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
460 sizeof(nanobts_attr_radio));
461 abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
462 trx->bts->bts_nr, trx->nr, 0xff);
463 abis_nm_chg_adm_state(trx->bts, NM_OC_RADIO_CARRIER,
464 trx->bts->bts_nr, trx->nr, 0xff,
465 NM_STATE_UNLOCKED);
466 break;
467 }
468 return 0;
469}
470
Holger Hans Peter Freyther500f3ca2009-06-10 10:48:14 +0200471/* Callback function for NACK on the OML NM */
472static int oml_msg_nack(int mt)
473{
474 if (mt == NM_MT_SET_BTS_ATTR_NACK) {
475 fprintf(stderr, "Failed to set BTS attributes. That is fatal. "
476 "Was the bts type and frequency properly specified?\n");
477 exit(-1);
478 }
479
480 return 0;
481}
482
Harald Welteb4630602009-05-01 15:43:22 +0000483/* Callback function to be called every time we receive a signal from NM */
484static int nm_sig_cb(unsigned int subsys, unsigned int signal,
485 void *handler_data, void *signal_data)
486{
487 switch (signal) {
488 case S_NM_SW_ACTIV_REP:
489 return sw_activ_rep(signal_data);
Holger Hans Peter Freyther500f3ca2009-06-10 10:48:14 +0200490 case S_NM_NACK:
491 return oml_msg_nack((int)signal_data);
Harald Welteb4630602009-05-01 15:43:22 +0000492 default:
493 break;
494 }
495 return 0;
496}
497
Harald Welte8c1d0e42009-02-15 03:38:12 +0000498static void bootstrap_om_nanobts(struct gsm_bts *bts)
499{
Harald Weltee1bd2412009-02-15 14:40:09 +0000500 /* We don't do callback based bootstrapping, but event driven (see above) */
Harald Welte8c1d0e42009-02-15 03:38:12 +0000501}
502
503static void bootstrap_om_bs11(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +0000504{
Harald Weltee441d9c2009-06-21 16:17:15 +0200505 struct gsm_bts_trx *trx = bts->c0;
Harald Welteac56e8b2009-08-06 17:40:24 +0200506 int base_ts;
507
508 switch (bts->nr) {
509 case 0:
510 /* First BTS uses E1 TS 01,02,03,04,05 */
511 base_ts = HARDCODED_BTS0_TS - 1;
512 break;
513 case 1:
514 /* Second BTS uses E1 TS 06,07,08,09,10 */
515 base_ts = HARDCODED_BTS1_TS - 1;
516 break;
517 case 2:
518 /* Third BTS uses E1 TS 11,12,13,14,15 */
519 base_ts = HARDCODED_BTS2_TS - 1;
520 default:
521 return;
522 }
Harald Welte52b1f982008-12-23 20:25:15 +0000523
524 /* stop sending event reports */
525 abis_nm_event_reports(bts, 0);
526
527 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000528 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000529
Harald Welte702d8702008-12-26 20:25:35 +0000530 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000531 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte702d8702008-12-26 20:25:35 +0000532
533 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000534 abis_nm_bs11_reset_resource(bts);
Harald Welte702d8702008-12-26 20:25:35 +0000535
536 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000537 abis_nm_bs11_db_transmission(bts, 1);
Harald Welte702d8702008-12-26 20:25:35 +0000538
Harald Welte52b1f982008-12-23 20:25:15 +0000539 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
Harald Weltea865f1b2009-06-20 10:42:17 +0200540 abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
Harald Welte52b1f982008-12-23 20:25:15 +0000541 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
542 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
543
544 /* Connect signalling of bts0/trx0 to e1_0/ts1/64kbps */
Harald Welteac56e8b2009-08-06 17:40:24 +0200545 abis_nm_conn_terr_sign(trx, 0, base_ts+1, 0xff);
Harald Weltea865f1b2009-06-20 10:42:17 +0200546 abis_nm_set_radio_attr(trx, bs11_attr_radio, sizeof(bs11_attr_radio));
Harald Welte52b1f982008-12-23 20:25:15 +0000547
548 /* Use TEI 1 for signalling */
Harald Welteac56e8b2009-08-06 17:40:24 +0200549 abis_nm_establish_tei(bts, 0, 0, base_ts+1, 0xff, 0x01);
Harald Welte52b1f982008-12-23 20:25:15 +0000550 abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_SDCCH_CBCH);
Harald Weltecd06bfb2009-02-10 17:33:56 +0000551
Harald Welte52b1f982008-12-23 20:25:15 +0000552 /* SET CHANNEL ATTRIBUTE TS1 */
Harald Welte23887b62009-02-18 03:37:20 +0000553 abis_nm_set_channel_attr(&trx->ts[1], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000554 /* Connect traffic of bts0/trx0/ts1 to e1_0/ts2/b */
Harald Welteac56e8b2009-08-06 17:40:24 +0200555 abis_nm_conn_terr_traf(&trx->ts[1], 0, base_ts+2, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000556
557 /* SET CHANNEL ATTRIBUTE TS2 */
Harald Welte23887b62009-02-18 03:37:20 +0000558 abis_nm_set_channel_attr(&trx->ts[2], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000559 /* Connect traffic of bts0/trx0/ts2 to e1_0/ts2/c */
Harald Welteac56e8b2009-08-06 17:40:24 +0200560 abis_nm_conn_terr_traf(&trx->ts[2], 0, base_ts+2, 2);
Harald Welte52b1f982008-12-23 20:25:15 +0000561
562 /* SET CHANNEL ATTRIBUTE TS3 */
Harald Welte23887b62009-02-18 03:37:20 +0000563 abis_nm_set_channel_attr(&trx->ts[3], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000564 /* Connect traffic of bts0/trx0/ts3 to e1_0/ts2/d */
Harald Welteac56e8b2009-08-06 17:40:24 +0200565 abis_nm_conn_terr_traf(&trx->ts[3], 0, base_ts+2, 3);
Harald Welte52b1f982008-12-23 20:25:15 +0000566
567 /* SET CHANNEL ATTRIBUTE TS4 */
Harald Welte23887b62009-02-18 03:37:20 +0000568 abis_nm_set_channel_attr(&trx->ts[4], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000569 /* Connect traffic of bts0/trx0/ts4 to e1_0/ts3/a */
Harald Welteac56e8b2009-08-06 17:40:24 +0200570 abis_nm_conn_terr_traf(&trx->ts[4], 0, base_ts+3, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000571
572 /* SET CHANNEL ATTRIBUTE TS5 */
Harald Welte23887b62009-02-18 03:37:20 +0000573 abis_nm_set_channel_attr(&trx->ts[5], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000574 /* Connect traffic of bts0/trx0/ts5 to e1_0/ts3/b */
Harald Welteac56e8b2009-08-06 17:40:24 +0200575 abis_nm_conn_terr_traf(&trx->ts[5], 0, base_ts+3, 1);
Harald Welte52b1f982008-12-23 20:25:15 +0000576
577 /* SET CHANNEL ATTRIBUTE TS6 */
Harald Welte23887b62009-02-18 03:37:20 +0000578 abis_nm_set_channel_attr(&trx->ts[6], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000579 /* Connect traffic of bts0/trx0/ts6 to e1_0/ts3/c */
Harald Welteac56e8b2009-08-06 17:40:24 +0200580 abis_nm_conn_terr_traf(&trx->ts[6], 0, base_ts+3, 2);
Harald Welte52b1f982008-12-23 20:25:15 +0000581
582 /* SET CHANNEL ATTRIBUTE TS7 */
Harald Welte23887b62009-02-18 03:37:20 +0000583 abis_nm_set_channel_attr(&trx->ts[7], NM_CHANC_TCHFull);
Harald Welte52b1f982008-12-23 20:25:15 +0000584 /* Connect traffic of bts0/trx0/ts7 to e1_0/ts3/d */
Harald Welteac56e8b2009-08-06 17:40:24 +0200585 abis_nm_conn_terr_traf(&trx->ts[7], 0, base_ts+3, 3);
Harald Welte52b1f982008-12-23 20:25:15 +0000586
Harald Welte67b4c302009-07-29 16:42:16 +0200587 trx = gsm_bts_trx_num(bts, 1);
588 if (trx) {
589 u_int8_t trx1_attr_radio[sizeof(bs11_attr_radio)];
590 u_int8_t arfcn_low = trx->arfcn & 0xff;
591 u_int8_t arfcn_high = (trx->arfcn >> 8) & 0x0f;
592 memcpy(trx1_attr_radio, bs11_attr_radio,
593 sizeof(trx1_attr_radio));
594
595 /* patch ARFCN into TRX Attributes */
596 trx1_attr_radio[2] &= 0xf0;
597 trx1_attr_radio[2] |= arfcn_high;
598 trx1_attr_radio[3] = arfcn_low;
599
600 /* Connect signalling of TRX1 to e1_0/ts1/64kbps */
Harald Welteac56e8b2009-08-06 17:40:24 +0200601 abis_nm_conn_terr_sign(trx, 0, base_ts+1, 0xff);
Harald Welte67b4c302009-07-29 16:42:16 +0200602 /* FIXME: TRX ATTRIBUTE */
603 abis_nm_set_radio_attr(trx, trx1_attr_radio,
604 sizeof(trx1_attr_radio));
605
606 /* Use TEI 2 for signalling */
Harald Welteac56e8b2009-08-06 17:40:24 +0200607 abis_nm_establish_tei(bts, 1, 0, base_ts+1, 0xff, 0x02);
Harald Welte67b4c302009-07-29 16:42:16 +0200608
Harald Weltefad05592009-08-04 01:31:53 +0200609 /* SET CHANNEL ATTRIBUTE TS0 */
610 abis_nm_set_channel_attr(&trx->ts[0], NM_CHANC_TCHFull);
611 /* Connect traffic of bts0/trx0/ts0 to e1_0/ts4/a */
Harald Welteac56e8b2009-08-06 17:40:24 +0200612 abis_nm_conn_terr_traf(&trx->ts[0], 0, base_ts+4, 0);
Harald Welte67b4c302009-07-29 16:42:16 +0200613
614 /* SET CHANNEL ATTRIBUTE TS1 */
615 abis_nm_set_channel_attr(&trx->ts[1], NM_CHANC_TCHFull);
616 /* Connect traffic of bts0/trx0/ts1 to e1_0/ts4/b */
Harald Welteac56e8b2009-08-06 17:40:24 +0200617 abis_nm_conn_terr_traf(&trx->ts[1], 0, base_ts+4, 1);
Harald Welte67b4c302009-07-29 16:42:16 +0200618
619 /* SET CHANNEL ATTRIBUTE TS2 */
620 abis_nm_set_channel_attr(&trx->ts[2], NM_CHANC_TCHFull);
621 /* Connect traffic of bts0/trx0/ts2 to e1_0/ts4/c */
Harald Welteac56e8b2009-08-06 17:40:24 +0200622 abis_nm_conn_terr_traf(&trx->ts[2], 0, base_ts+4, 2);
Harald Welte67b4c302009-07-29 16:42:16 +0200623
624 /* SET CHANNEL ATTRIBUTE TS3 */
625 abis_nm_set_channel_attr(&trx->ts[3], NM_CHANC_TCHFull);
626 /* Connect traffic of bts0/trx0/ts3 to e1_0/ts4/d */
Harald Welteac56e8b2009-08-06 17:40:24 +0200627 abis_nm_conn_terr_traf(&trx->ts[3], 0, base_ts+4, 3);
Harald Welte67b4c302009-07-29 16:42:16 +0200628
629 /* SET CHANNEL ATTRIBUTE TS4 */
630 abis_nm_set_channel_attr(&trx->ts[4], NM_CHANC_TCHFull);
631 /* Connect traffic of bts0/trx0/ts4 to e1_0/ts5/a */
Harald Welteac56e8b2009-08-06 17:40:24 +0200632 abis_nm_conn_terr_traf(&trx->ts[4], 0, base_ts+5, 0);
Harald Welte67b4c302009-07-29 16:42:16 +0200633
634 /* SET CHANNEL ATTRIBUTE TS5 */
635 abis_nm_set_channel_attr(&trx->ts[5], NM_CHANC_TCHFull);
636 /* Connect traffic of bts0/trx0/ts5 to e1_0/ts5/b */
Harald Welteac56e8b2009-08-06 17:40:24 +0200637 abis_nm_conn_terr_traf(&trx->ts[5], 0, base_ts+5, 1);
Harald Welte67b4c302009-07-29 16:42:16 +0200638
639 /* SET CHANNEL ATTRIBUTE TS6 */
640 abis_nm_set_channel_attr(&trx->ts[6], NM_CHANC_TCHFull);
641 /* Connect traffic of bts0/trx0/ts6 to e1_0/ts5/c */
Harald Welteac56e8b2009-08-06 17:40:24 +0200642 abis_nm_conn_terr_traf(&trx->ts[6], 0, base_ts+5, 2);
Harald Welte67b4c302009-07-29 16:42:16 +0200643
644 /* SET CHANNEL ATTRIBUTE TS7 */
645 abis_nm_set_channel_attr(&trx->ts[7], NM_CHANC_TCHFull);
646 /* Connect traffic of bts0/trx0/ts7 to e1_0/ts5/d */
Harald Welteac56e8b2009-08-06 17:40:24 +0200647 abis_nm_conn_terr_traf(&trx->ts[7], 0, base_ts+5, 3);
Harald Welte67b4c302009-07-29 16:42:16 +0200648 }
649
Harald Welte52b1f982008-12-23 20:25:15 +0000650 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000651 abis_nm_bs11_db_transmission(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000652
653 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000654 abis_nm_bs11_reset_resource(bts);
Harald Welte52b1f982008-12-23 20:25:15 +0000655
656 /* restart sending event reports */
657 abis_nm_event_reports(bts, 1);
658}
659
Harald Welte8c1d0e42009-02-15 03:38:12 +0000660static void bootstrap_om(struct gsm_bts *bts)
661{
Harald Welteedb37782009-05-01 14:59:07 +0000662 fprintf(stdout, "bootstrapping OML for BTS %u\n", bts->nr);
Harald Welte8c1d0e42009-02-15 03:38:12 +0000663
664 switch (bts->type) {
665 case GSM_BTS_TYPE_BS11:
666 bootstrap_om_bs11(bts);
667 break;
668 case GSM_BTS_TYPE_NANOBTS_900:
669 case GSM_BTS_TYPE_NANOBTS_1800:
670 bootstrap_om_nanobts(bts);
671 break;
672 default:
673 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
674 }
675}
676
Harald Welted1252502009-01-01 01:50:32 +0000677static int shutdown_om(struct gsm_bts *bts)
678{
679 /* stop sending event reports */
680 abis_nm_event_reports(bts, 0);
Harald Welte52b1f982008-12-23 20:25:15 +0000681
Harald Welted1252502009-01-01 01:50:32 +0000682 /* begin DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000683 abis_nm_bs11_db_transmission(bts, 1);
Harald Welted1252502009-01-01 01:50:32 +0000684
685 /* end DB transmission */
Harald Welte05188ee2009-01-18 11:39:08 +0000686 abis_nm_bs11_db_transmission(bts, 0);
Harald Welted1252502009-01-01 01:50:32 +0000687
688 /* Reset BTS Site manager resource */
Harald Welte78374892009-01-18 19:09:22 +0000689 abis_nm_bs11_reset_resource(bts);
Harald Welted1252502009-01-01 01:50:32 +0000690
691 return 0;
692}
693
694static int shutdown_net(struct gsm_network *net)
695{
Harald Weltee441d9c2009-06-21 16:17:15 +0200696 struct gsm_bts *bts;
697
698 llist_for_each_entry(bts, &net->bts_list, list) {
Harald Welted1252502009-01-01 01:50:32 +0000699 int rc;
Harald Weltee441d9c2009-06-21 16:17:15 +0200700 rc = shutdown_om(bts);
Harald Welted1252502009-01-01 01:50:32 +0000701 if (rc < 0)
702 return rc;
703 }
704
705 return 0;
706}
Harald Welte52b1f982008-12-23 20:25:15 +0000707
708struct bcch_info {
709 u_int8_t type;
710 u_int8_t len;
711 const u_int8_t *data;
712};
713
714/*
715SYSTEM INFORMATION TYPE 1
716 Cell channel description
717 Format-ID bit map 0
718 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
719 RACH Control Parameters
720 maximum 7 retransmissions
721 8 slots used to spread transmission
722 cell not barred for access
723 call reestablishment not allowed
724 Access Control Class = 0000
725*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000726static u_int8_t si1[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000727 /* header */0x55, 0x06, 0x19,
728 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
730 /* rach */0xD5, 0x00, 0x00,
731 /* s1 reset*/0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000732};
733
734/*
735 SYSTEM INFORMATION TYPE 2
736 Neighbour Cells Description
737 EXT-IND: Carries the complete BA
738 BA-IND = 0
739 Format-ID bit map 0
740 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
741 NCC permitted (NCC) = FF
742 RACH Control Parameters
743 maximum 7 retransmissions
744 8 slots used to spread transmission
745 cell not barred for access
746 call reestablishment not allowed
747 Access Control Class = 0000
748*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000749static u_int8_t si2[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000750 /* header */0x59, 0x06, 0x1A,
751 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
752 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
753 /* ncc */0xFF,
754 /* rach*/0xD5, 0x00, 0x00
Harald Welte52b1f982008-12-23 20:25:15 +0000755};
756
757/*
758SYSTEM INFORMATION TYPE 3
759 Cell identity = 00001 (1h)
760 Location area identification
761 Mobile Country Code (MCC): 001
762 Mobile Network Code (MNC): 01
763 Location Area Code (LAC): 00001 (1h)
764 Control Channel Description
765 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
766 0 blocks reserved for access grant
767 1 channel used for CCCH, with SDCCH
768 5 multiframes period for PAGING REQUEST
769 Time-out T3212 = 0
770 Cell Options BCCH
771 Power control indicator: not set
772 MSs shall not use uplink DTX
773 Radio link timeout = 36
774 Cell Selection Parameters
775 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
Harald Welte3b2ec422008-12-29 04:11:14 +0000776 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
Harald Welte52b1f982008-12-23 20:25:15 +0000777 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
778 Half rate support (NECI): New establishment causes are not supported
779 min.RX signal level for MS = 0
780 RACH Control Parameters
781 maximum 7 retransmissions
782 8 slots used to spread transmission
783 cell not barred for access
784 call reestablishment not allowed
785 Access Control Class = 0000
Harald Welte53833f62009-07-05 13:41:40 +0200786 SI 3 Rest Octets (not present)
Harald Welte52b1f982008-12-23 20:25:15 +0000787*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000788static u_int8_t si3[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000789 /* header */0x49, 0x06, 0x1B,
790 /* cell */0x00, 0x01,
791 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
792 /* desc */0x01, 0x03, 0x00,
793 /* option*/0x28,
794 /* selection*/0x62, 0x00,
795 /* rach */0xD5, 0x00, 0x00,
Harald Welte53833f62009-07-05 13:41:40 +0200796 /* rest */ 0x2B, 0x2B, 0x2B, 0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000797};
798
799/*
800SYSTEM INFORMATION TYPE 4
801 Location area identification
802 Mobile Country Code (MCC): 001
803 Mobile Network Code (MNC): 01
804 Location Area Code (LAC): 00001 (1h)
805 Cell Selection Parameters
806 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
807 max.TX power level MS may use for CCH = 2
808 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
809 Half rate support (NECI): New establishment causes are not supported
810 min.RX signal level for MS = 0
811 RACH Control Parameters
812 maximum 7 retransmissions
813 8 slots used to spread transmission
814 cell not barred for access
815 call reestablishment not allowed
816 Access Control Class = 0000
Harald Welte53833f62009-07-05 13:41:40 +0200817 CBCH Channel Description
Harald Welte52b1f982008-12-23 20:25:15 +0000818 Type = SDCCH/4[2]
819 Timeslot Number: 0
820 Training Sequence Code: 7h
821 ARFCN: 1
Harald Welte53833f62009-07-05 13:41:40 +0200822 SI Rest Octets (not present)
Harald Welte52b1f982008-12-23 20:25:15 +0000823*/
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000824static u_int8_t si4[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000825 /* header */0x41, 0x06, 0x1C,
826 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
827 /* sel */0x62, 0x00,
828 /* rach*/0xD5, 0x00, 0x00,
Harald Welte53833f62009-07-05 13:41:40 +0200829 /* cbch chan desc */ 0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/,
830 /* rest octets */ 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B
Harald Welte52b1f982008-12-23 20:25:15 +0000831};
832
833/*
834 SYSTEM INFORMATION TYPE 5
835 Neighbour Cells Description
836 EXT-IND: Carries the complete BA
837 BA-IND = 0
838 Format-ID bit map 0
839 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
840*/
841
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000842static u_int8_t si5[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000843 /* header without l2 len*/0x06, 0x1D,
844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Harald Welte52b1f982008-12-23 20:25:15 +0000846};
847
848// SYSTEM INFORMATION TYPE 6
849
850/*
851SACCH FILLING
852 System Info Type: SYSTEM INFORMATION 6
853 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
854
855SYSTEM INFORMATION TYPE 6
856 Cell identity = 00001 (1h)
857 Location area identification
858 Mobile Country Code (MCC): 001
859 Mobile Network Code (MNC): 01
860 Location Area Code (LAC): 00001 (1h)
861 Cell Options SACCH
862 Power control indicator: not set
863 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
864 Radio link timeout = 36
865 NCC permitted (NCC) = FF
866*/
867
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000868static u_int8_t si6[] = {
Holger Freyther4d505472008-12-28 16:32:42 +0000869 /* header */0x06, 0x1E,
870 /* cell id*/ 0x00, 0x01,
871 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
872 /* options */ 0x28,
873 /* ncc */ 0xFF,
Harald Welte52b1f982008-12-23 20:25:15 +0000874};
875
876
877
878static const struct bcch_info bcch_infos[] = {
879 {
880 .type = RSL_SYSTEM_INFO_1,
881 .len = sizeof(si1),
882 .data = si1,
883 }, {
884 .type = RSL_SYSTEM_INFO_2,
885 .len = sizeof(si2),
886 .data = si2,
887 }, {
888 .type = RSL_SYSTEM_INFO_3,
889 .len = sizeof(si3),
890 .data = si3,
891 }, {
892 .type = RSL_SYSTEM_INFO_4,
893 .len = sizeof(si4),
894 .data = si4,
895 },
896};
897
Holger Freyther24287b62008-12-28 16:32:41 +0000898static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
899static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
900static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
901static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
Harald Welte104604e2008-12-28 16:36:11 +0000902static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
903static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
Holger Freyther24287b62008-12-28 16:32:41 +0000904
Harald Welte52b1f982008-12-23 20:25:15 +0000905/* set all system information types */
Harald Weltee79769b2009-02-07 00:48:17 +0000906static int set_system_infos(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000907{
908 int i;
909
Harald Welted1586052009-08-06 17:41:19 +0200910 if (trx == trx->bts->c0) {
911 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
912 rsl_bcch_info(trx, bcch_infos[i].type,
913 bcch_infos[i].data,
914 bcch_infos[i].len);
915 }
Harald Welte52b1f982008-12-23 20:25:15 +0000916 }
Harald Weltee79769b2009-02-07 00:48:17 +0000917 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
918 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
Harald Weltead384642008-12-26 10:20:07 +0000919
920 return 0;
Harald Welte52b1f982008-12-23 20:25:15 +0000921}
922
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000923/*
924 * Patch the various SYSTEM INFORMATION tables to update
925 * the LAI
926 */
927static void patch_tables(struct gsm_bts *bts)
928{
Harald Weltee441d9c2009-06-21 16:17:15 +0200929 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
930 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000931 /* covert the raw packet to the struct */
932 struct gsm48_system_information_type_3 *type_3 =
933 (struct gsm48_system_information_type_3*)&si3;
934 struct gsm48_system_information_type_4 *type_4 =
935 (struct gsm48_system_information_type_4*)&si4;
936 struct gsm48_system_information_type_6 *type_6 =
937 (struct gsm48_system_information_type_6*)&si6;
Harald Welteb84e2f42008-12-28 23:42:04 +0000938 struct gsm48_loc_area_id lai;
939
940 gsm0408_generate_lai(&lai, bts->network->country_code,
Harald Welte110c0ab2009-05-23 16:27:05 +0000941 bts->network->network_code,
942 bts->location_area_code);
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000943
944 /* assign the MCC and MNC */
Harald Welteb84e2f42008-12-28 23:42:04 +0000945 type_3->lai = lai;
946 type_4->lai = lai;
947 type_6->lai = lai;
Harald Welte98981882009-01-06 18:59:11 +0000948
Harald Welte94009322009-02-15 15:38:42 +0000949 /* patch ARFCN into BTS Attributes */
Harald Weltea865f1b2009-06-20 10:42:17 +0200950 bs11_attr_bts[69] &= 0xf0;
951 bs11_attr_bts[69] |= arfcn_high;
952 bs11_attr_bts[70] = arfcn_low;
Harald Welte94009322009-02-15 15:38:42 +0000953 nanobts_attr_bts[42] &= 0xf0;
954 nanobts_attr_bts[42] |= arfcn_high;
955 nanobts_attr_bts[43] = arfcn_low;
Harald Welte98981882009-01-06 18:59:11 +0000956
Harald Welte94009322009-02-15 15:38:42 +0000957 /* patch ARFCN into TRX Attributes */
Harald Weltea865f1b2009-06-20 10:42:17 +0200958 bs11_attr_radio[2] &= 0xf0;
959 bs11_attr_radio[2] |= arfcn_high;
960 bs11_attr_radio[3] = arfcn_low;
Harald Welte94009322009-02-15 15:38:42 +0000961 nanobts_attr_radio[5] &= 0xf0;
962 nanobts_attr_radio[5] |= arfcn_high;
963 nanobts_attr_radio[6] = arfcn_low;
Harald Welte98981882009-01-06 18:59:11 +0000964
965 type_4->data[2] &= 0xf0;
966 type_4->data[2] |= arfcn_high;
967 type_4->data[3] = arfcn_low;
Holger Freyther1adb4ff2009-02-04 00:04:52 +0000968
969 /* patch Control Channel Description 10.5.2.11 */
970 type_3->control_channel_desc = bts->chan_desc;
Harald Welte78f2f502009-05-23 16:56:52 +0000971
972 /* patch BSIC */
Harald Weltea865f1b2009-06-20 10:42:17 +0200973 bs11_attr_bts[1] = bts->bsic;
Harald Welte78f2f502009-05-23 16:56:52 +0000974 nanobts_attr_bts[sizeof(nanobts_attr_bts)-1] = bts->bsic;
Harald Weltef8d536d2009-07-21 22:12:23 +0200975
976 /* patch TSC */
977 si4[15] &= ~0xe0;
978 si4[15] |= (bts->tsc & 7) << 5;
Holger Freytherb9ddfd02008-12-28 16:32:45 +0000979}
980
981
Harald Weltee79769b2009-02-07 00:48:17 +0000982static void bootstrap_rsl(struct gsm_bts_trx *trx)
Harald Welte52b1f982008-12-23 20:25:15 +0000983{
Harald Welteedb37782009-05-01 14:59:07 +0000984 fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) "
Harald Weltef8d536d2009-07-21 22:12:23 +0200985 "using MCC=%u MNC=%u BSIC=%u TSC=%u\n",
Harald Weltefad05592009-08-04 01:31:53 +0200986 trx->bts->nr, trx->nr, MCC, MNC, BSIC, TSC);
Harald Weltee79769b2009-02-07 00:48:17 +0000987 set_system_infos(trx);
Harald Welte52b1f982008-12-23 20:25:15 +0000988}
989
Harald Welte1fa60c82009-02-09 18:13:26 +0000990void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
Harald Weltead384642008-12-26 10:20:07 +0000991{
992 switch (event) {
Harald Welte1fa60c82009-02-09 18:13:26 +0000993 case EVT_E1_TEI_UP:
994 switch (type) {
995 case E1INP_SIGN_OML:
996 bootstrap_om(trx->bts);
997 break;
998 case E1INP_SIGN_RSL:
999 bootstrap_rsl(trx);
1000 break;
1001 default:
1002 break;
1003 }
Harald Weltead384642008-12-26 10:20:07 +00001004 break;
Harald Welte1fa60c82009-02-09 18:13:26 +00001005 case EVT_E1_TEI_DN:
1006 fprintf(stderr, "Lost some E1 TEI link\n");
1007 /* FIXME: deal with TEI or L1 link loss */
Harald Weltead384642008-12-26 10:20:07 +00001008 break;
1009 default:
Harald Weltead384642008-12-26 10:20:07 +00001010 break;
1011 }
1012}
1013
Harald Welteedb37782009-05-01 14:59:07 +00001014static int bootstrap_bts(struct gsm_bts *bts)
Harald Welte52b1f982008-12-23 20:25:15 +00001015{
Harald Weltefcd24452009-06-20 18:15:19 +02001016 bts->band = BAND;
Holger Freyther0a173bf2009-04-22 22:07:07 +00001017 bts->location_area_code = LAC;
Harald Weltee441d9c2009-06-21 16:17:15 +02001018 bts->c0->arfcn = ARFCN;
Holger Freyther1adb4ff2009-02-04 00:04:52 +00001019
1020 /* Control Channel Description */
1021 memset(&bts->chan_desc, 0, sizeof(struct gsm48_control_channel_descr));
Harald Welte41fbf442009-02-24 22:34:22 +00001022 bts->chan_desc.att = 1;
Holger Freyther1adb4ff2009-02-04 00:04:52 +00001023 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
1024 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
1025 bts->chan_desc.t3212 = 0;
1026
Harald Welte98981882009-01-06 18:59:11 +00001027 patch_tables(bts);
Harald Welte52b1f982008-12-23 20:25:15 +00001028
Holger Freyther1fd34142009-02-09 23:42:03 +00001029 paging_init(bts);
Harald Welte38c2f132009-01-06 23:10:57 +00001030
Holger Freytherb8be6542009-06-02 03:25:14 +00001031 if (bts->type == GSM_BTS_TYPE_BS11) {
Harald Weltee441d9c2009-06-21 16:17:15 +02001032 struct gsm_bts_trx *trx = bts->c0;
Holger Freytherb8be6542009-06-02 03:25:14 +00001033 set_ts_e1link(&trx->ts[0], 0, 1, 0xff);
1034 set_ts_e1link(&trx->ts[1], 0, 2, 1);
1035 set_ts_e1link(&trx->ts[2], 0, 2, 2);
1036 set_ts_e1link(&trx->ts[3], 0, 2, 3);
1037 set_ts_e1link(&trx->ts[4], 0, 3, 0);
1038 set_ts_e1link(&trx->ts[5], 0, 3, 1);
1039 set_ts_e1link(&trx->ts[6], 0, 3, 2);
1040 set_ts_e1link(&trx->ts[7], 0, 3, 3);
Harald Welte67b4c302009-07-29 16:42:16 +02001041
Holger Freytherb8be6542009-06-02 03:25:14 +00001042 /* TRX 1 */
Harald Welte67b4c302009-07-29 16:42:16 +02001043 trx = gsm_bts_trx_num(bts, 1);
1044 if (trx) {
1045 trx = gsm_bts_trx_num(bts, 1);
1046 set_ts_e1link(&trx->ts[0], 0, 4, 0);
1047 set_ts_e1link(&trx->ts[1], 0, 4, 1);
1048 set_ts_e1link(&trx->ts[2], 0, 4, 2);
1049 set_ts_e1link(&trx->ts[3], 0, 4, 3);
1050 set_ts_e1link(&trx->ts[4], 0, 5, 0);
1051 set_ts_e1link(&trx->ts[5], 0, 5, 1);
1052 set_ts_e1link(&trx->ts[6], 0, 5, 2);
1053 set_ts_e1link(&trx->ts[7], 0, 5, 3);
1054 }
Holger Freytherb8be6542009-06-02 03:25:14 +00001055 }
1056
Harald Welteedb37782009-05-01 14:59:07 +00001057 return 0;
1058}
1059
1060static int bootstrap_network(void)
1061{
Holger Hans Peter Freythere91f5782009-06-10 10:20:16 +02001062 switch(BTS_TYPE) {
1063 case GSM_BTS_TYPE_NANOBTS_1800:
1064 if (ARFCN < 512 || ARFCN > 885) {
1065 fprintf(stderr, "GSM1800 channel must be between 512-885.\n");
1066 return -EINVAL;
1067 }
1068 break;
1069 case GSM_BTS_TYPE_BS11:
1070 case GSM_BTS_TYPE_NANOBTS_900:
1071 /* Assume we have a P-GSM900 here */
1072 if (ARFCN < 1 || ARFCN > 124) {
1073 fprintf(stderr, "GSM900 channel must be between 1-124.\n");
1074 return -EINVAL;
1075 }
1076 break;
1077 case GSM_BTS_TYPE_UNKNOWN:
1078 fprintf(stderr, "Unknown BTS. Please use the --bts-type switch\n");
1079 return -EINVAL;
1080 }
1081
Harald Welteedb37782009-05-01 14:59:07 +00001082 /* initialize our data structures */
Harald Weltee441d9c2009-06-21 16:17:15 +02001083 gsmnet = gsm_network_init(MCC, MNC, mncc_recv);
Harald Welteedb37782009-05-01 14:59:07 +00001084 if (!gsmnet)
1085 return -ENOMEM;
1086
1087 gsmnet->name_long = "OpenBSC";
1088 gsmnet->name_short = "OpenBSC";
1089
Holger Freytherc7b86f92009-06-06 13:54:20 +00001090 if (db_init(database_name)) {
Holger Freytheref7f7ce2009-04-19 06:35:12 +00001091 printf("DB: Failed to init database. Please check the option settings.\n");
1092 return -1;
1093 }
1094 printf("DB: Database initialized.\n");
1095
1096 if (db_prepare()) {
1097 printf("DB: Failed to prepare database.\n");
1098 return -1;
1099 }
1100 printf("DB: Database prepared.\n");
1101
Holger Freyther219518d2009-01-02 22:04:43 +00001102 telnet_init(gsmnet, 4242);
Harald Weltead384642008-12-26 10:20:07 +00001103
Harald Welteb4630602009-05-01 15:43:22 +00001104 register_signal_handler(SS_NM, nm_sig_cb, NULL);
1105
Harald Welte1fa60c82009-02-09 18:13:26 +00001106 /* E1 mISDN input setup */
Harald Welteedb37782009-05-01 14:59:07 +00001107 if (BTS_TYPE == GSM_BTS_TYPE_BS11) {
Harald Weltef8d536d2009-07-21 22:12:23 +02001108 struct gsm_bts *bts = gsm_bts_alloc(gsmnet, BTS_TYPE, TSC, BSIC);
Harald Welte67b4c302009-07-29 16:42:16 +02001109
1110 if (bs11_has_trx1) {
1111 struct gsm_bts_trx *trx1;
1112 trx1 = gsm_bts_trx_alloc(bts);
1113 trx1->arfcn = ARFCN + 2;
1114 }
1115
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001116 bootstrap_bts(bts);
1117
Harald Welteedb37782009-05-01 14:59:07 +00001118 gsmnet->num_bts = 1;
Holger Freytherb5c00f52009-04-22 22:08:07 +00001119 return e1_config(bts, cardnr, release_l2);
Harald Welteedb37782009-05-01 14:59:07 +00001120 } else {
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001121 struct nano_bts_id *bts_id;
1122 struct gsm_bts *bts;
Harald Weltefcd24452009-06-20 18:15:19 +02001123
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001124 if (llist_empty(&nanobts_ids)) {
1125 fprintf(stderr, "You need to specify -i DEVICE_1 -i DEVICE_2 for nanoBTS.\n");
1126 return -EINVAL;
1127 }
1128
1129 llist_for_each_entry(bts_id, &nanobts_ids, entry) {
Harald Weltef8d536d2009-07-21 22:12:23 +02001130 bts = gsm_bts_alloc(gsmnet, BTS_TYPE, TSC, BSIC);
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001131 bootstrap_bts(bts);
1132 bts->ip_access.site_id = bts_id->site_id;
1133 bts->ip_access.bts_id = 0;
1134 }
1135
Harald Weltecf559782009-05-01 15:43:49 +00001136 return ipaccess_setup(gsmnet);
Harald Welteedb37782009-05-01 14:59:07 +00001137 }
Harald Welte52b1f982008-12-23 20:25:15 +00001138}
Harald Weltef6b7a902008-12-26 00:05:11 +00001139
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001140static void create_pcap_file(char *file)
1141{
1142 mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
1143 int fd = open(file, O_WRONLY|O_TRUNC|O_CREAT, mode);
1144
1145 if (fd < 0) {
1146 perror("Failed to open file for pcap");
1147 return;
1148 }
1149
Holger Freyther0469cf62009-03-31 12:14:16 +00001150 e1_set_pcap_fd(fd);
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001151}
1152
Holger Freytherb332f612008-12-27 12:46:51 +00001153static void print_usage()
1154{
1155 printf("Usage: bsc_hack\n");
1156}
1157
1158static void print_help()
1159{
1160 printf(" Some useful help...\n");
1161 printf(" -d option --debug=DRLL:DCC:DMM:DRR:DRSL:DNM enable debugging\n");
Holger Freytherefde7fb2008-12-28 14:14:56 +00001162 printf(" -s --disable-color\n");
1163 printf(" -n --network-code number(MNC) \n");
1164 printf(" -c --country-code number (MCC) \n");
Holger Freyther0a173bf2009-04-22 22:07:07 +00001165 printf(" -L --location-area-code number (LAC) \n");
Harald Welte98981882009-01-06 18:59:11 +00001166 printf(" -f --arfcn number The frequency ARFCN\n");
Holger Freytherbde36102008-12-28 22:51:39 +00001167 printf(" -l --database db-name The database to use\n");
Holger Freyther89824fc2008-12-30 16:18:18 +00001168 printf(" -a --authorize-everyone Allow everyone into the network.\n");
Holger Freythere97f7fb2008-12-31 18:52:11 +00001169 printf(" -r --reject-cause number The reject cause for LOCATION UPDATING REJECT.\n");
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001170 printf(" -p --pcap file The filename of the pcap file\n");
Harald Weltee1bd2412009-02-15 14:40:09 +00001171 printf(" -t --bts-type type The BTS type (bs11, nanobts900, nanobts1800)\n");
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001172 printf(" -i --bts-id=NUMBER The known nanoBTS device numbers. Can be specified multiple times.\n");
Holger Freytherdda22c12009-04-22 22:07:31 +00001173 printf(" -C --cardnr number For bs11 select E1 card number other than 0\n");
Holger Freytherb5c00f52009-04-22 22:08:07 +00001174 printf(" -R --release-l2 Releases mISDN layer 2 after exit, to unload driver.\n");
Holger Freytherb332f612008-12-27 12:46:51 +00001175 printf(" -h --help this text\n");
1176}
1177
1178static void handle_options(int argc, char** argv)
1179{
1180 while (1) {
Harald Welte2cf161b2009-06-20 22:36:41 +02001181 int option_index = 0, c;
Holger Freytherb332f612008-12-27 12:46:51 +00001182 static struct option long_options[] = {
1183 {"help", 0, 0, 'h'},
1184 {"debug", 1, 0, 'd'},
Holger Freytherefde7fb2008-12-28 14:14:56 +00001185 {"disable-color", 0, 0, 's'},
1186 {"network-code", 1, 0, 'n'},
1187 {"country-code", 1, 0, 'c'},
Holger Freyther0a173bf2009-04-22 22:07:07 +00001188 {"location-area-code", 1, 0, 'L'},
Holger Freytherbde36102008-12-28 22:51:39 +00001189 {"database", 1, 0, 'l'},
Holger Freyther89824fc2008-12-30 16:18:18 +00001190 {"authorize-everyone", 0, 0, 'a'},
Holger Freythere97f7fb2008-12-31 18:52:11 +00001191 {"reject-cause", 1, 0, 'r'},
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001192 {"pcap", 1, 0, 'p'},
Harald Welte98981882009-01-06 18:59:11 +00001193 {"arfcn", 1, 0, 'f'},
Harald Welte8c1d0e42009-02-15 03:38:12 +00001194 {"bts-type", 1, 0, 't'},
Holger Freytherdda22c12009-04-22 22:07:31 +00001195 {"cardnr", 1, 0, 'C'},
Holger Freytherb5c00f52009-04-22 22:08:07 +00001196 {"release-l2", 0, 0, 'R'},
Harald Welted3ff51d2009-06-09 20:21:57 +00001197 {"timestamp", 0, 0, 'T'},
Harald Weltefcd24452009-06-20 18:15:19 +02001198 {"band", 0, 0, 'b'},
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001199 {"bts-id", 1, 0, 'i'},
Harald Weltef8d536d2009-07-21 22:12:23 +02001200 {"tsc", 1, 0, 'S'},
1201 {"bsic", 1, 0, 'B'},
Harald Welte805f6442009-07-28 18:25:29 +02001202 {"rtp-proxy", 0, 0, 'P'},
Harald Welte67b4c302009-07-29 16:42:16 +02001203 {"trx1", 0, 0, '1'},
Holger Freytherb332f612008-12-27 12:46:51 +00001204 {0, 0, 0, 0}
1205 };
1206
Harald Welte67b4c302009-07-29 16:42:16 +02001207 c = getopt_long(argc, argv, "hc:n:d:sar:p:f:t:C:RL:l:Tb:i:S:B:P1",
Holger Freytherb332f612008-12-27 12:46:51 +00001208 long_options, &option_index);
1209 if (c == -1)
1210 break;
1211
1212 switch (c) {
1213 case 'h':
1214 print_usage();
1215 print_help();
1216 exit(0);
Holger Freytherefde7fb2008-12-28 14:14:56 +00001217 case 's':
Holger Freytherb332f612008-12-27 12:46:51 +00001218 debug_use_color(0);
1219 break;
1220 case 'd':
1221 debug_parse_category_mask(optarg);
1222 break;
Holger Freytherefde7fb2008-12-28 14:14:56 +00001223 case 'n':
1224 MNC = atoi(optarg);
1225 break;
1226 case 'c':
1227 MCC = atoi(optarg);
1228 break;
Holger Freyther0a173bf2009-04-22 22:07:07 +00001229 case 'L':
1230 LAC = atoi(optarg);
1231 break;
Harald Welte98981882009-01-06 18:59:11 +00001232 case 'f':
1233 ARFCN = atoi(optarg);
1234 break;
Harald Welte8965da42009-01-06 18:09:02 +00001235 case 'l':
Holger Freytherbde36102008-12-28 22:51:39 +00001236 database_name = strdup(optarg);
1237 break;
Holger Freyther89824fc2008-12-30 16:18:18 +00001238 case 'a':
1239 gsm0408_allow_everyone(1);
1240 break;
Holger Freythere97f7fb2008-12-31 18:52:11 +00001241 case 'r':
1242 gsm0408_set_reject_cause(atoi(optarg));
1243 break;
Holger Freyther9a3ee0f2009-01-02 00:40:15 +00001244 case 'p':
1245 create_pcap_file(optarg);
1246 break;
Harald Welte8c1d0e42009-02-15 03:38:12 +00001247 case 't':
1248 BTS_TYPE = parse_btstype(optarg);
1249 break;
Holger Freytherdda22c12009-04-22 22:07:31 +00001250 case 'C':
1251 cardnr = atoi(optarg);
1252 break;
Holger Freytherb5c00f52009-04-22 22:08:07 +00001253 case 'R':
1254 release_l2 = 1;
1255 break;
Harald Welted3ff51d2009-06-09 20:21:57 +00001256 case 'T':
1257 debug_timestamp(1);
1258 break;
Harald Weltefcd24452009-06-20 18:15:19 +02001259 case 'b':
1260 BAND = gsm_band_parse(atoi(optarg));
1261 break;
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001262 case 'i': {
1263 struct nano_bts_id *bts_id = talloc_zero(tall_bsc_ctx, struct nano_bts_id);
1264 if (!bts_id) {
1265 fprintf(stderr, "Failed to allocate bts id\n");
1266 exit(-1);
1267 }
1268
1269 bts_id->site_id = atoi(optarg);
1270 llist_add(&bts_id->entry, &nanobts_ids);
1271 break;
Harald Weltef8d536d2009-07-21 22:12:23 +02001272 case 'S':
1273 TSC = atoi(optarg);
1274 break;
1275 case 'B':
1276 BSIC = atoi(optarg);
1277 break;
Harald Welte805f6442009-07-28 18:25:29 +02001278 case 'P':
1279 ipacc_rtp_direct = 0;
1280 break;
Harald Welte67b4c302009-07-29 16:42:16 +02001281 case '1':
1282 bs11_has_trx1 = 1;
1283 break;
Holger Hans Peter Freyther03582a82009-07-16 15:24:27 +02001284 }
Holger Freytherb332f612008-12-27 12:46:51 +00001285 default:
1286 /* ignore */
1287 break;
1288 }
1289 }
1290}
1291
Harald Welted1252502009-01-01 01:50:32 +00001292static void signal_handler(int signal)
1293{
1294 fprintf(stdout, "signal %u received\n", signal);
1295
1296 switch (signal) {
1297 case SIGHUP:
1298 case SIGABRT:
1299 shutdown_net(gsmnet);
1300 break;
Harald Welte2cf161b2009-06-20 22:36:41 +02001301 case SIGUSR1:
1302 talloc_report_full(tall_bsc_ctx, stderr);
1303 break;
Harald Welted1252502009-01-01 01:50:32 +00001304 default:
1305 break;
1306 }
1307}
1308
Harald Weltef6b7a902008-12-26 00:05:11 +00001309int main(int argc, char **argv)
1310{
Harald Welte1fa60c82009-02-09 18:13:26 +00001311 int rc;
1312
Harald Welte2cf161b2009-06-20 22:36:41 +02001313 tall_bsc_ctx = talloc_named_const(NULL, 1, "openbsc");
1314
Holger Freytherb332f612008-12-27 12:46:51 +00001315 /* parse options */
1316 handle_options(argc, argv);
1317
Harald Welte65ccf882009-02-24 22:36:20 +00001318 /* seed the PRNG */
1319 srand(time(NULL));
1320
Harald Welte1fa60c82009-02-09 18:13:26 +00001321 rc = bootstrap_network();
1322 if (rc < 0)
1323 exit(1);
Harald Weltef6b7a902008-12-26 00:05:11 +00001324
Harald Welted1252502009-01-01 01:50:32 +00001325 signal(SIGHUP, &signal_handler);
1326 signal(SIGABRT, &signal_handler);
Harald Welte2cf161b2009-06-20 22:36:41 +02001327 signal(SIGUSR1, &signal_handler);
Harald Welted1252502009-01-01 01:50:32 +00001328
Harald Weltef6b7a902008-12-26 00:05:11 +00001329 while (1) {
Harald Welte4bfdfe72009-06-10 23:11:52 +08001330 bsc_upqueue(gsmnet);
Harald Welte04d3c922009-05-23 06:07:04 +00001331 bsc_select_main(0);
Harald Weltef6b7a902008-12-26 00:05:11 +00001332 }
1333}