blob: 4010a7f31d5512378312dee88b0621306f08536b [file] [log] [blame]
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001/* A hackish minimal BSC (+MSC +HLR) implementation */
2
3/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
4 * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
5 * 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
23#include <openbsc/gsm_data.h>
24#include <openbsc/gsm_utils.h>
25#include <openbsc/gsm_04_08.h>
26#include <openbsc/abis_rsl.h>
27#include <openbsc/abis_nm.h>
28#include <openbsc/debug.h>
29#include <openbsc/misdn.h>
30#include <openbsc/telnet_interface.h>
31#include <openbsc/paging.h>
32#include <openbsc/signal.h>
33#include <openbsc/talloc.h>
34
35/* global pointer to the gsm network data structure */
36extern struct gsm_network *bsc_gsmnet;
37extern int ipacc_rtp_direct;
38
39static void patch_nm_tables(struct gsm_bts *bts);
40static void patch_si_tables(struct gsm_bts *bts);
41
42/* The following definitions are for OM and NM packets that we cannot yet
43 * generate by code but we just pass on */
44
45// BTS Site Manager, SET ATTRIBUTES
46
47/*
48 Object Class: BTS Site Manager
49 Instance 1: FF
50 Instance 2: FF
51 Instance 3: FF
52SET ATTRIBUTES
53 sAbisExternalTime: 2007/09/08 14:36:11
54 omLAPDRelTimer: 30sec
55 shortLAPDIntTimer: 5sec
56 emergencyTimer1: 10 minutes
57 emergencyTimer2: 0 minutes
58*/
59
60unsigned char msg_1[] =
61{
62 NM_MT_BS11_SET_ATTR, NM_OC_SITE_MANAGER, 0xFF, 0xFF, 0xFF,
63 NM_ATT_BS11_ABIS_EXT_TIME, 0x07,
64 0xD7, 0x09, 0x08, 0x0E, 0x24, 0x0B, 0xCE,
65 0x02,
66 0x00, 0x1E,
67 NM_ATT_BS11_SH_LAPD_INT_TIMER,
68 0x01, 0x05,
69 0x42, 0x02, 0x00, 0x0A,
70 0x44, 0x02, 0x00, 0x00
71};
72
73// BTS, SET BTS ATTRIBUTES
74
75/*
76 Object Class: BTS
77 BTS relat. Number: 0
78 Instance 2: FF
79 Instance 3: FF
80SET BTS ATTRIBUTES
81 bsIdentityCode / BSIC:
82 PLMN_colour_code: 7h
83 BS_colour_code: 7h
84 BTS Air Timer T3105: 4 ,unit 10 ms
85 btsIsHopping: FALSE
86 periodCCCHLoadIndication: 1sec
87 thresholdCCCHLoadIndication: 0%
88 cellAllocationNumber: 00h = GSM 900
89 enableInterferenceClass: 00h = Disabled
90 fACCHQual: 6 (FACCH stealing flags minus 1)
91 intaveParameter: 31 SACCH multiframes
92 interferenceLevelBoundaries:
93 Interference Boundary 1: 0Ah
94 Interference Boundary 2: 0Fh
95 Interference Boundary 3: 14h
96 Interference Boundary 4: 19h
97 Interference Boundary 5: 1Eh
98 mSTxPwrMax: 11
99 GSM range: 2=39dBm, 15=13dBm, stepsize 2 dBm
100 DCS1800 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
101 PCS1900 range: 0=30dBm, 15=0dBm, stepsize 2 dBm
102 30=33dBm, 31=32dBm
103 ny1:
104 Maximum number of repetitions for PHYSICAL INFORMATION message (GSM 04.08): 20
105 powerOutputThresholds:
106 Out Power Fault Threshold: -10 dB
107 Red Out Power Threshold: - 6 dB
108 Excessive Out Power Threshold: 5 dB
109 rACHBusyThreshold: -127 dBm
110 rACHLoadAveragingSlots: 250 ,number of RACH burst periods
111 rfResourceIndicationPeriod: 125 SACCH multiframes
112 T200:
113 SDCCH: 044 in 5 ms
114 FACCH/Full rate: 031 in 5 ms
115 FACCH/Half rate: 041 in 5 ms
116 SACCH with TCH SAPI0: 090 in 10 ms
117 SACCH with SDCCH: 090 in 10 ms
118 SDCCH with SAPI3: 090 in 5 ms
119 SACCH with TCH SAPI3: 135 in 10 ms
120 tSync: 9000 units of 10 msec
121 tTrau: 9000 units of 10 msec
122 enableUmLoopTest: 00h = disabled
123 enableExcessiveDistance: 00h = Disabled
124 excessiveDistance: 64km
125 hoppingMode: 00h = baseband hopping
126 cellType: 00h = Standard Cell
127 BCCH ARFCN / bCCHFrequency: 1
128*/
129
130static unsigned char bs11_attr_bts[] =
131{
132 NM_ATT_BSIC, HARDCODED_BSIC,
133 NM_ATT_BTS_AIR_TIMER, 0x04,
134 NM_ATT_BS11_BTSLS_HOPPING, 0x00,
135 NM_ATT_CCCH_L_I_P, 0x01,
136 NM_ATT_CCCH_L_T, 0x00,
137 NM_ATT_BS11_CELL_ALLOC_NR, NM_BS11_CANR_GSM,
138 NM_ATT_BS11_ENA_INTERF_CLASS, 0x01,
139 NM_ATT_BS11_FACCH_QUAL, 0x06,
140 /* interference avg. period in numbers of SACCH multifr */
141 NM_ATT_INTAVE_PARAM, 0x1F,
142 NM_ATT_INTERF_BOUND, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x7B,
143 NM_ATT_CCCH_L_T, 0x23,
144 NM_ATT_GSM_TIME, 0x28, 0x00,
145 NM_ATT_ADM_STATE, 0x03,
146 NM_ATT_RACH_B_THRESH, 0x7F,
147 NM_ATT_LDAVG_SLOTS, 0x00, 0xFA,
148 NM_ATT_BS11_RF_RES_IND_PER, 0x7D,
149 NM_ATT_T200, 0x2C, 0x1F, 0x29, 0x5A, 0x5A, 0x5A, 0x87,
150 NM_ATT_BS11_TSYNC, 0x23, 0x28,
151 NM_ATT_BS11_TTRAU, 0x23, 0x28,
152 NM_ATT_TEST_DUR, 0x01, 0x00,
153 NM_ATT_OUTST_ALARM, 0x01, 0x00,
154 NM_ATT_BS11_EXCESSIVE_DISTANCE, 0x01, 0x40,
155 NM_ATT_BS11_HOPPING_MODE, 0x01, 0x00,
156 NM_ATT_BS11_PLL, 0x01, 0x00,
157 NM_ATT_BCCH_ARFCN, 0x00, HARDCODED_ARFCN/*0x01*/,
158};
159
160// Handover Recognition, SET ATTRIBUTES
161
162/*
163Illegal Contents GSM Formatted O&M Msg
164 Object Class: Handover Recognition
165 BTS relat. Number: 0
166 Instance 2: FF
167 Instance 3: FF
168SET ATTRIBUTES
169 enableDelayPowerBudgetHO: 00h = Disabled
170 enableDistanceHO: 00h = Disabled
171 enableInternalInterCellHandover: 00h = Disabled
172 enableInternalIntraCellHandover: 00h = Disabled
173 enablePowerBudgetHO: 00h = Disabled
174 enableRXLEVHO: 00h = Disabled
175 enableRXQUALHO: 00h = Disabled
176 hoAveragingDistance: 8 SACCH multiframes
177 hoAveragingLev:
178 A_LEV_HO: 8 SACCH multiframes
179 W_LEV_HO: 1 SACCH multiframes
180 hoAveragingPowerBudget: 16 SACCH multiframes
181 hoAveragingQual:
182 A_QUAL_HO: 8 SACCH multiframes
183 W_QUAL_HO: 2 SACCH multiframes
184 hoLowerThresholdLevDL: (10 - 110) dBm
185 hoLowerThresholdLevUL: (5 - 110) dBm
186 hoLowerThresholdQualDL: 06h = 6.4% < BER < 12.8%
187 hoLowerThresholdQualUL: 06h = 6.4% < BER < 12.8%
188 hoThresholdLevDLintra : (20 - 110) dBm
189 hoThresholdLevULintra: (20 - 110) dBm
190 hoThresholdMsRangeMax: 20 km
191 nCell: 06h
192 timerHORequest: 3 ,unit 2 SACCH multiframes
193*/
194
195unsigned char msg_3[] =
196{
197 NM_MT_BS11_SET_ATTR, NM_OC_BS11_HANDOVER, 0x00, 0xFF, 0xFF,
198 0xD0, 0x00, /* enableDelayPowerBudgetHO */
199 0x64, 0x00, /* enableDistanceHO */
200 0x67, 0x00, /* enableInternalInterCellHandover */
201 0x68, 0x00, /* enableInternalInterCellHandover */
202 0x6A, 0x00, /* enablePowerBudgetHO */
203 0x6C, 0x00, /* enableRXLEVHO */
204 0x6D, 0x00, /* enableRXQUALHO */
205 0x6F, 0x08, /* hoAveragingDistance */
206 0x70, 0x08, 0x01, /* hoAveragingLev */
207 0x71, 0x10, 0x10, 0x10,
208 0x72, 0x08, 0x02, /* hoAveragingQual */
209 0x73, 0x0A, /* hoLowerThresholdLevDL */
210 0x74, 0x05, /* hoLowerThresholdLevUL */
211 0x75, 0x06, /* hoLowerThresholdQualDL */
212 0x76, 0x06, /* hoLowerThresholdQualUL */
213 0x78, 0x14, /* hoThresholdLevDLintra */
214 0x79, 0x14, /* hoThresholdLevULintra */
215 0x7A, 0x14, /* hoThresholdMsRangeMax */
216 0x7D, 0x06, /* nCell */
217 NM_ATT_BS11_TIMER_HO_REQUEST, 0x03,
218 0x20, 0x01, 0x00,
219 0x45, 0x01, 0x00,
220 0x48, 0x01, 0x00,
221 0x5A, 0x01, 0x00,
222 0x5B, 0x01, 0x05,
223 0x5E, 0x01, 0x1A,
224 0x5F, 0x01, 0x20,
225 0x9D, 0x01, 0x00,
226 0x47, 0x01, 0x00,
227 0x5C, 0x01, 0x64,
228 0x5D, 0x01, 0x1E,
229 0x97, 0x01, 0x20,
230 0xF7, 0x01, 0x3C,
231};
232
233// Power Control, SET ATTRIBUTES
234
235/*
236 Object Class: Power Control
237 BTS relat. Number: 0
238 Instance 2: FF
239 Instance 3: FF
240SET ATTRIBUTES
241 enableMsPowerControl: 00h = Disabled
242 enablePowerControlRLFW: 00h = Disabled
243 pcAveragingLev:
244 A_LEV_PC: 4 SACCH multiframes
245 W_LEV_PC: 1 SACCH multiframes
246 pcAveragingQual:
247 A_QUAL_PC: 4 SACCH multiframes
248 W_QUAL_PC: 2 SACCH multiframes
249 pcLowerThresholdLevDL: 0Fh
250 pcLowerThresholdLevUL: 0Ah
251 pcLowerThresholdQualDL: 05h = 3.2% < BER < 6.4%
252 pcLowerThresholdQualUL: 05h = 3.2% < BER < 6.4%
253 pcRLFThreshold: 0Ch
254 pcUpperThresholdLevDL: 14h
255 pcUpperThresholdLevUL: 0Fh
256 pcUpperThresholdQualDL: 04h = 1.6% < BER < 3.2%
257 pcUpperThresholdQualUL: 04h = 1.6% < BER < 3.2%
258 powerConfirm: 2 ,unit 2 SACCH multiframes
259 powerControlInterval: 2 ,unit 2 SACCH multiframes
260 powerIncrStepSize: 02h = 4 dB
261 powerRedStepSize: 01h = 2 dB
262 radioLinkTimeoutBs: 64 SACCH multiframes
263 enableBSPowerControl: 00h = disabled
264*/
265
266unsigned char msg_4[] =
267{
268 NM_MT_BS11_SET_ATTR, NM_OC_BS11_PWR_CTRL, 0x00, 0xFF, 0xFF,
269 NM_ATT_BS11_ENA_MS_PWR_CTRL, 0x00,
270 NM_ATT_BS11_ENA_PWR_CTRL_RLFW, 0x00,
271 0x7E, 0x04, 0x01, /* pcAveragingLev */
272 0x7F, 0x04, 0x02, /* pcAveragingQual */
273 0x80, 0x0F, /* pcLowerThresholdLevDL */
274 0x81, 0x0A, /* pcLowerThresholdLevUL */
275 0x82, 0x05, /* pcLowerThresholdQualDL */
276 0x83, 0x05, /* pcLowerThresholdQualUL */
277 0x84, 0x0C, /* pcRLFThreshold */
278 0x85, 0x14, /* pcUpperThresholdLevDL */
279 0x86, 0x0F, /* pcUpperThresholdLevUL */
280 0x87, 0x04, /* pcUpperThresholdQualDL */
281 0x88, 0x04, /* pcUpperThresholdQualUL */
282 0x89, 0x02, /* powerConfirm */
283 0x8A, 0x02, /* powerConfirmInterval */
284 0x8B, 0x02, /* powerIncrStepSize */
285 0x8C, 0x01, /* powerRedStepSize */
286 0x8D, 0x40, /* radioLinkTimeoutBs */
287 0x65, 0x01, 0x00 // set to 0x01 to enable BSPowerControl
288};
289
290
291// Transceiver, SET TRX ATTRIBUTES (TRX 0)
292
293/*
294 Object Class: Transceiver
295 BTS relat. Number: 0
296 Tranceiver number: 0
297 Instance 3: FF
298SET TRX ATTRIBUTES
299 aRFCNList (HEX): 0001
300 txPwrMaxReduction: 00h = 30dB
301 radioMeasGran: 254 SACCH multiframes
302 radioMeasRep: 01h = enabled
303 memberOfEmergencyConfig: 01h = TRUE
304 trxArea: 00h = TRX doesn't belong to a concentric cell
305*/
306
307static unsigned char bs11_attr_radio[] =
308{
309 NM_ATT_ARFCN_LIST, 0x01, 0x00, HARDCODED_ARFCN /*0x01*/,
310 NM_ATT_RF_MAXPOWR_R, 0x00,
311 NM_ATT_BS11_RADIO_MEAS_GRAN, 0x01, 0x05,
312 NM_ATT_BS11_RADIO_MEAS_REP, 0x01, 0x01,
313 NM_ATT_BS11_EMRG_CFG_MEMBER, 0x01, 0x01,
314 NM_ATT_BS11_TRX_AREA, 0x01, 0x00,
315};
316
317static unsigned char nanobts_attr_bts[] = {
318 NM_ATT_INTERF_BOUND, 0x55, 0x5b, 0x61, 0x67, 0x6d, 0x73,
319 /* interference avg. period in numbers of SACCH multifr */
320 NM_ATT_INTAVE_PARAM, 0x06,
321 /* conn fail based on SACCH error rate */
322 NM_ATT_CONN_FAIL_CRIT, 0x00, 0x02, 0x01, 0x10,
323 NM_ATT_T200, 0x1e, 0x24, 0x24, 0xa8, 0x34, 0x21, 0xa8,
324 NM_ATT_MAX_TA, 0x3f,
325 NM_ATT_OVERL_PERIOD, 0x00, 0x01, 10, /* seconds */
326 NM_ATT_CCCH_L_T, 10, /* percent */
327 NM_ATT_CCCH_L_I_P, 1, /* seconds */
328 NM_ATT_RACH_B_THRESH, 10, /* busy threshold in - dBm */
329 NM_ATT_LDAVG_SLOTS, 0x03, 0xe8, /* rach load averaging 1000 slots */
330 NM_ATT_BTS_AIR_TIMER, 128, /* miliseconds */
331 NM_ATT_NY1, 10, /* 10 retransmissions of physical config */
332 NM_ATT_BCCH_ARFCN, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
333 NM_ATT_BSIC, HARDCODED_BSIC,
334};
335
336static unsigned char nanobts_attr_radio[] = {
337 NM_ATT_RF_MAXPOWR_R, 0x0c, /* number of -2dB reduction steps / Pn */
338 NM_ATT_ARFCN_LIST, 0x00, 0x02, HARDCODED_ARFCN >> 8, HARDCODED_ARFCN & 0xff,
339};
340
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200341/* Callback function to be called whenever we get a GSM 12.21 state change event */
342int nm_state_event(enum nm_evt evt, u_int8_t obj_class, void *obj,
343 struct gsm_nm_state *old_state, struct gsm_nm_state *new_state)
344{
345 struct gsm_bts *bts;
346 struct gsm_bts_trx *trx;
347 struct gsm_bts_trx_ts *ts;
348
349 /* This is currently only required on nanoBTS */
350
351 switch (evt) {
352 case EVT_STATECHG_OPER:
353 switch (obj_class) {
354 case NM_OC_SITE_MANAGER:
355 bts = container_of(obj, struct gsm_bts, site_mgr);
356 if (old_state->operational != 2 && new_state->operational == 2) {
357 abis_nm_opstart(bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);
358 }
359 break;
360 case NM_OC_BTS:
361 bts = obj;
Harald Welte4d0481d2009-10-08 20:53:42 +0200362 if (new_state->availability == NM_AVSTATE_DEPENDENCY) {
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200363 patch_nm_tables(bts);
364 abis_nm_set_bts_attr(bts, nanobts_attr_bts,
365 sizeof(nanobts_attr_bts));
366 abis_nm_opstart(bts, NM_OC_BTS,
367 bts->bts_nr, 0xff, 0xff);
368 abis_nm_chg_adm_state(bts, NM_OC_BTS,
369 bts->bts_nr, 0xff, 0xff,
370 NM_STATE_UNLOCKED);
371 }
372 break;
373 case NM_OC_CHANNEL:
374 ts = obj;
375 trx = ts->trx;
Harald Welte4d0481d2009-10-08 20:53:42 +0200376 if (new_state->availability == NM_AVSTATE_DEPENDENCY) {
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200377 if (ts->nr == 0 && trx == trx->bts->c0)
378 abis_nm_set_channel_attr(ts, NM_CHANC_BCCHComb);
379 else
380 abis_nm_set_channel_attr(ts, NM_CHANC_TCHFull);
381 abis_nm_opstart(trx->bts, NM_OC_CHANNEL,
382 trx->bts->bts_nr, trx->nr, ts->nr);
383 abis_nm_chg_adm_state(trx->bts, NM_OC_CHANNEL,
384 trx->bts->bts_nr, trx->nr, ts->nr,
385 NM_STATE_UNLOCKED);
386 }
387 break;
388 default:
389 break;
390 }
391 break;
392 default:
393 //DEBUGP(DMM, "Unhandled state change in %s:%d\n", __func__, __LINE__);
394 break;
395 }
396 return 0;
397}
398
399/* Callback function to be called every time we receive a 12.21 SW activated report */
400static int sw_activ_rep(struct msgb *mb)
401{
402 struct abis_om_fom_hdr *foh = msgb_l3(mb);
Harald Welted004a642009-10-19 21:47:54 +0200403 struct gsm_bts *bts = mb->trx->bts;
404 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
405
406 if (!trx)
407 return -ENODEV;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200408
409 switch (foh->obj_class) {
410 case NM_OC_BASEB_TRANSC:
411 /* TRX software is active, tell it to initiate RSL Link */
Harald Welte77a838d2009-10-20 00:51:01 +0200412 abis_nm_ipaccess_rsl_connect(trx, 0, 3003, trx->rsl_tei);
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200413 abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC,
414 trx->bts->bts_nr, trx->nr, 0xff);
415 abis_nm_chg_adm_state(trx->bts, NM_OC_BASEB_TRANSC,
416 trx->bts->bts_nr, trx->nr, 0xff,
417 NM_STATE_UNLOCKED);
418 break;
419 case NM_OC_RADIO_CARRIER:
420 patch_nm_tables(trx->bts);
421 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
422 sizeof(nanobts_attr_radio));
423 abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
424 trx->bts->bts_nr, trx->nr, 0xff);
425 abis_nm_chg_adm_state(trx->bts, NM_OC_RADIO_CARRIER,
426 trx->bts->bts_nr, trx->nr, 0xff,
427 NM_STATE_UNLOCKED);
428 break;
429 }
430 return 0;
431}
432
433/* Callback function for NACK on the OML NM */
434static int oml_msg_nack(int mt)
435{
436 if (mt == NM_MT_SET_BTS_ATTR_NACK) {
437 fprintf(stderr, "Failed to set BTS attributes. That is fatal. "
438 "Was the bts type and frequency properly specified?\n");
439 exit(-1);
440 }
441
442 return 0;
443}
444
445/* Callback function to be called every time we receive a signal from NM */
446static int nm_sig_cb(unsigned int subsys, unsigned int signal,
447 void *handler_data, void *signal_data)
448{
449 switch (signal) {
450 case S_NM_SW_ACTIV_REP:
451 return sw_activ_rep(signal_data);
452 case S_NM_NACK:
453 return oml_msg_nack((int)signal_data);
454 default:
455 break;
456 }
457 return 0;
458}
459
460static void bootstrap_om_nanobts(struct gsm_bts *bts)
461{
462 /* We don't do callback based bootstrapping, but event driven (see above) */
463}
464
465static void nm_reconfig_ts(struct gsm_bts_trx_ts *ts)
466{
467 enum abis_nm_chan_comb ccomb = abis_nm_chcomb4pchan(ts->pchan);
468 struct gsm_e1_subslot *e1l = &ts->e1_link;
469
470 abis_nm_set_channel_attr(ts, ccomb);
471
472 if (is_ipaccess_bts(ts->trx->bts))
473 return;
474
475 switch (ts->pchan) {
476 case GSM_PCHAN_TCH_F:
477 case GSM_PCHAN_TCH_H:
478 abis_nm_conn_terr_traf(ts, e1l->e1_nr, e1l->e1_ts,
479 e1l->e1_ts_ss);
480 break;
481 default:
482 break;
483 }
484}
485
486static void nm_reconfig_trx(struct gsm_bts_trx *trx)
487{
488 struct gsm_e1_subslot *e1l = &trx->rsl_e1_link;
489 int i;
490
491 patch_nm_tables(trx->bts);
492
493 switch (trx->bts->type) {
494 case GSM_BTS_TYPE_BS11:
495 /* FIXME: discover this by fetching an attribute */
496#if 0
497 trx->nominal_power = 15; /* 15dBm == 30mW PA configuration */
498#else
499 trx->nominal_power = 24; /* 24dBm == 250mW PA configuration */
500#endif
501 abis_nm_conn_terr_sign(trx, e1l->e1_nr, e1l->e1_ts,
502 e1l->e1_ts_ss);
503 abis_nm_establish_tei(trx->bts, trx->nr, e1l->e1_nr,
504 e1l->e1_ts, e1l->e1_ts_ss, trx->rsl_tei);
505
506 /* Set Radio Attributes */
507 if (trx == trx->bts->c0)
508 abis_nm_set_radio_attr(trx, bs11_attr_radio,
509 sizeof(bs11_attr_radio));
510 else {
511 u_int8_t trx1_attr_radio[sizeof(bs11_attr_radio)];
512 u_int8_t arfcn_low = trx->arfcn & 0xff;
513 u_int8_t arfcn_high = (trx->arfcn >> 8) & 0x0f;
514 memcpy(trx1_attr_radio, bs11_attr_radio,
515 sizeof(trx1_attr_radio));
516
517 /* patch ARFCN into TRX Attributes */
518 trx1_attr_radio[2] &= 0xf0;
519 trx1_attr_radio[2] |= arfcn_high;
520 trx1_attr_radio[3] = arfcn_low;
521
522 abis_nm_set_radio_attr(trx, trx1_attr_radio,
523 sizeof(trx1_attr_radio));
524 }
525 break;
Mike Habene2d82272009-10-02 12:19:34 +0100526 case GSM_BTS_TYPE_NANOBTS:
Harald Welteaf7b2fa2009-10-19 21:47:31 +0200527 switch (trx->bts->band) {
528 case GSM_BAND_850:
529 case GSM_BAND_900:
530 trx->nominal_power = 20;
531 break;
532 case GSM_BAND_1800:
533 case GSM_BAND_1900:
534 trx->nominal_power = 23;
535 break;
536 dedfault:
537 fprintf(stderr, "Unsupported nanoBTS GSM band %s\n",
538 gsm_band_name(trx->bts->band));
539 break;
540 }
541 break;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200542 default:
543 break;
544 }
545
546 for (i = 0; i < TRX_NR_TS; i++)
547 nm_reconfig_ts(&trx->ts[i]);
548}
549
550static void nm_reconfig_bts(struct gsm_bts *bts)
551{
552 struct gsm_bts_trx *trx;
553
554 switch (bts->type) {
555 case GSM_BTS_TYPE_BS11:
556 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
557 abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
558 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
559 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
560 break;
561 default:
562 break;
563 }
564
565 llist_for_each_entry(trx, &bts->trx_list, list)
566 nm_reconfig_trx(trx);
567}
568
569static void bootstrap_om_bs11(struct gsm_bts *bts)
570{
571 /* stop sending event reports */
572 abis_nm_event_reports(bts, 0);
573
574 /* begin DB transmission */
575 abis_nm_bs11_db_transmission(bts, 1);
576
577 /* end DB transmission */
578 abis_nm_bs11_db_transmission(bts, 0);
579
580 /* Reset BTS Site manager resource */
581 abis_nm_bs11_reset_resource(bts);
582
583 /* begin DB transmission */
584 abis_nm_bs11_db_transmission(bts, 1);
585
586 /* reconfigure BTS with all TRX and all TS */
587 nm_reconfig_bts(bts);
588
589 /* end DB transmission */
590 abis_nm_bs11_db_transmission(bts, 0);
591
592 /* Reset BTS Site manager resource */
593 abis_nm_bs11_reset_resource(bts);
594
595 /* restart sending event reports */
596 abis_nm_event_reports(bts, 1);
597}
598
599static void bootstrap_om(struct gsm_bts *bts)
600{
601 fprintf(stdout, "bootstrapping OML for BTS %u\n", bts->nr);
602
603 switch (bts->type) {
604 case GSM_BTS_TYPE_BS11:
605 bootstrap_om_bs11(bts);
606 break;
Mike Habene2d82272009-10-02 12:19:34 +0100607 case GSM_BTS_TYPE_NANOBTS:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200608 bootstrap_om_nanobts(bts);
609 break;
610 default:
611 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
612 }
613}
614
615static int shutdown_om(struct gsm_bts *bts)
616{
617 fprintf(stdout, "shutting down OML for BTS %u\n", bts->nr);
618
619 /* stop sending event reports */
620 abis_nm_event_reports(bts, 0);
621
622 /* begin DB transmission */
623 abis_nm_bs11_db_transmission(bts, 1);
624
625 /* end DB transmission */
626 abis_nm_bs11_db_transmission(bts, 0);
627
628 /* Reset BTS Site manager resource */
629 abis_nm_bs11_reset_resource(bts);
630
631 return 0;
632}
633
634int bsc_shutdown_net(struct gsm_network *net)
635{
636 struct gsm_bts *bts;
637
638 llist_for_each_entry(bts, &net->bts_list, list) {
639 int rc;
640 rc = shutdown_om(bts);
641 if (rc < 0)
642 return rc;
643 }
644
645 return 0;
646}
647
648struct bcch_info {
649 u_int8_t type;
650 u_int8_t len;
651 const u_int8_t *data;
652};
653
654/*
655SYSTEM INFORMATION TYPE 1
656 Cell channel description
657 Format-ID bit map 0
658 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
659 RACH Control Parameters
660 maximum 7 retransmissions
661 8 slots used to spread transmission
662 cell not barred for access
663 call reestablishment not allowed
664 Access Control Class = 0000
665*/
666static u_int8_t si1[] = {
667 /* header */0x55, 0x06, 0x19,
668 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
669 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
670 /* rach */0xD5, 0x04, 0x00,
671 /* s1 reset*/0x2B
672};
673
674/*
675 SYSTEM INFORMATION TYPE 2
676 Neighbour Cells Description
677 EXT-IND: Carries the complete BA
678 BA-IND = 0
679 Format-ID bit map 0
680 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
681 NCC permitted (NCC) = FF
682 RACH Control Parameters
683 maximum 7 retransmissions
684 8 slots used to spread transmission
685 cell not barred for access
686 call reestablishment not allowed
687 Access Control Class = 0000
688*/
689static u_int8_t si2[] = {
690 /* header */0x59, 0x06, 0x1A,
691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
693 /* ncc */0xFF,
694 /* rach*/0xD5, 0x04, 0x00
695};
696
697/*
698SYSTEM INFORMATION TYPE 3
699 Cell identity = 00001 (1h)
700 Location area identification
701 Mobile Country Code (MCC): 001
702 Mobile Network Code (MNC): 01
703 Location Area Code (LAC): 00001 (1h)
704 Control Channel Description
705 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
706 0 blocks reserved for access grant
707 1 channel used for CCCH, with SDCCH
708 5 multiframes period for PAGING REQUEST
709 Time-out T3212 = 0
710 Cell Options BCCH
711 Power control indicator: not set
712 MSs shall not use uplink DTX
713 Radio link timeout = 36
714 Cell Selection Parameters
715 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
716 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
717 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
718 Half rate support (NECI): New establishment causes are not supported
719 min.RX signal level for MS = 0
720 RACH Control Parameters
721 maximum 7 retransmissions
722 8 slots used to spread transmission
723 cell not barred for access
724 call reestablishment not allowed
725 Access Control Class = 0000
726 SI 3 Rest Octets (not present)
727*/
728static u_int8_t si3[] = {
729 /* header */0x49, 0x06, 0x1B,
730 /* cell */0x00, 0x01,
731 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
732 /* desc */0x01, 0x03, 0x00,
733 /* option*/0x28,
734 /* selection*/0x62, 0x00,
735 /* rach */0xD5, 0x04, 0x00,
736 /* rest */ 0x2B, 0x2B, 0x2B, 0x2B
737};
738
739/*
740SYSTEM INFORMATION TYPE 4
741 Location area identification
742 Mobile Country Code (MCC): 001
743 Mobile Network Code (MNC): 01
744 Location Area Code (LAC): 00001 (1h)
745 Cell Selection Parameters
746 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
747 max.TX power level MS may use for CCH = 2
748 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
749 Half rate support (NECI): New establishment causes are not supported
750 min.RX signal level for MS = 0
751 RACH Control Parameters
752 maximum 7 retransmissions
753 8 slots used to spread transmission
754 cell not barred for access
755 call reestablishment not allowed
756 Access Control Class = 0000
757 CBCH Channel Description
758 Type = SDCCH/4[2]
759 Timeslot Number: 0
760 Training Sequence Code: 7h
761 ARFCN: 1
762 SI Rest Octets (not present)
763*/
764static u_int8_t si4[] = {
765 /* header */0x41, 0x06, 0x1C,
766 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
767 /* sel */0x62, 0x00,
768 /* rach*/0xD5, 0x04, 0x00,
769 /* cbch chan desc */ 0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/,
770 /* rest octets */ 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B
771};
772
773/*
774 SYSTEM INFORMATION TYPE 5
775 Neighbour Cells Description
776 EXT-IND: Carries the complete BA
777 BA-IND = 0
778 Format-ID bit map 0
779 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
780*/
781
782static u_int8_t si5[] = {
783 /* header without l2 len*/0x06, 0x1D,
784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786};
787
788// SYSTEM INFORMATION TYPE 6
789
790/*
791SACCH FILLING
792 System Info Type: SYSTEM INFORMATION 6
793 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
794
795SYSTEM INFORMATION TYPE 6
796 Cell identity = 00001 (1h)
797 Location area identification
798 Mobile Country Code (MCC): 001
799 Mobile Network Code (MNC): 01
800 Location Area Code (LAC): 00001 (1h)
801 Cell Options SACCH
802 Power control indicator: not set
803 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
804 Radio link timeout = 36
805 NCC permitted (NCC) = FF
806*/
807
808static u_int8_t si6[] = {
809 /* header */0x06, 0x1E,
810 /* cell id*/ 0x00, 0x01,
811 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
812 /* options */ 0x28,
813 /* ncc */ 0xFF,
814};
815
816
817
818static const struct bcch_info bcch_infos[] = {
819 {
820 .type = RSL_SYSTEM_INFO_1,
821 .len = sizeof(si1),
822 .data = si1,
823 }, {
824 .type = RSL_SYSTEM_INFO_2,
825 .len = sizeof(si2),
826 .data = si2,
827 }, {
828 .type = RSL_SYSTEM_INFO_3,
829 .len = sizeof(si3),
830 .data = si3,
831 }, {
832 .type = RSL_SYSTEM_INFO_4,
833 .len = sizeof(si4),
834 .data = si4,
835 },
836};
837
838static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
839static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
840static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
841static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
842static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
843static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
844
845/* set all system information types */
846static int set_system_infos(struct gsm_bts_trx *trx)
847{
848 int i;
849
850 if (trx == trx->bts->c0) {
851 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
852 rsl_bcch_info(trx, bcch_infos[i].type,
853 bcch_infos[i].data,
854 bcch_infos[i].len);
855 }
856 }
857 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
858 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
859
860 return 0;
861}
862
863/*
864 * Patch the various SYSTEM INFORMATION tables to update
865 * the LAI
866 */
867static void patch_nm_tables(struct gsm_bts *bts)
868{
869 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
870 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
871
872 /* patch ARFCN into BTS Attributes */
873 bs11_attr_bts[69] &= 0xf0;
874 bs11_attr_bts[69] |= arfcn_high;
875 bs11_attr_bts[70] = arfcn_low;
876 nanobts_attr_bts[42] &= 0xf0;
877 nanobts_attr_bts[42] |= arfcn_high;
878 nanobts_attr_bts[43] = arfcn_low;
879
880 /* patch ARFCN into TRX Attributes */
881 bs11_attr_radio[2] &= 0xf0;
882 bs11_attr_radio[2] |= arfcn_high;
883 bs11_attr_radio[3] = arfcn_low;
884 nanobts_attr_radio[5] &= 0xf0;
885 nanobts_attr_radio[5] |= arfcn_high;
886 nanobts_attr_radio[6] = arfcn_low;
887
888 /* patch BSIC */
889 bs11_attr_bts[1] = bts->bsic;
890 nanobts_attr_bts[sizeof(nanobts_attr_bts)-1] = bts->bsic;
891
892 /* patch the power reduction */
893 bs11_attr_radio[5] = bts->c0->max_power_red / 2;
894 nanobts_attr_radio[1] = bts->c0->max_power_red / 2;
895}
896
897/*
898 * Patch the various SYSTEM INFORMATION tables to update
899 * the LAI
900 */
901static void patch_si_tables(struct gsm_bts *bts)
902{
903 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
904 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
905
906 /* covert the raw packet to the struct */
907 struct gsm48_system_information_type_1 *type_1 =
908 (struct gsm48_system_information_type_1*)&si1;
909 struct gsm48_system_information_type_2 *type_2 =
910 (struct gsm48_system_information_type_2*)&si2;
911 struct gsm48_system_information_type_3 *type_3 =
912 (struct gsm48_system_information_type_3*)&si3;
913 struct gsm48_system_information_type_4 *type_4 =
914 (struct gsm48_system_information_type_4*)&si4;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200915 struct gsm48_system_information_type_6 *type_6 =
916 (struct gsm48_system_information_type_6*)&si6;
917 struct gsm48_loc_area_id lai;
918
919 gsm0408_generate_lai(&lai, bts->network->country_code,
920 bts->network->network_code,
921 bts->location_area_code);
922
923 /* assign the MCC and MNC */
924 type_3->lai = lai;
925 type_4->lai = lai;
926 type_6->lai = lai;
927
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200928 /* set the CI */
929 type_3->cell_identity = htons(bts->cell_identity);
930 type_6->cell_identity = htons(bts->cell_identity);
931
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200932 type_4->data[2] &= 0xf0;
933 type_4->data[2] |= arfcn_high;
934 type_4->data[3] = arfcn_low;
935
936 /* patch Control Channel Description 10.5.2.11 */
937 type_3->control_channel_desc = bts->chan_desc;
938
939 /* patch TSC */
940 si4[15] &= ~0xe0;
941 si4[15] |= (bts->tsc & 7) << 5;
942
943 /* patch MS max power for CCH */
944 type_4->cell_sel_par.ms_txpwr_max_ccch =
945 ms_pwr_ctl_lvl(bts->band, bts->ms_max_power);
946
947 if (bts->cell_barred) {
948 type_1->rach_control.cell_bar = 1;
949 type_2->rach_control.cell_bar = 1;
950 type_3->rach_control.cell_bar = 1;
951 type_4->rach_control.cell_bar = 1;
952 } else {
953 type_1->rach_control.cell_bar = 0;
954 type_2->rach_control.cell_bar = 0;
955 type_3->rach_control.cell_bar = 0;
956 type_4->rach_control.cell_bar = 0;
957 }
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200958}
959
960
961static void bootstrap_rsl(struct gsm_bts_trx *trx)
962{
963 fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) "
964 "using MCC=%u MNC=%u BSIC=%u TSC=%u\n",
965 trx->bts->nr, trx->nr, bsc_gsmnet->country_code,
966 bsc_gsmnet->network_code, trx->bts->bsic, trx->bts->tsc);
967 patch_si_tables(trx->bts);
968 set_system_infos(trx);
969}
970
971void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
972{
973 switch (event) {
974 case EVT_E1_TEI_UP:
975 switch (type) {
976 case E1INP_SIGN_OML:
977 bootstrap_om(trx->bts);
978 break;
979 case E1INP_SIGN_RSL:
980 bootstrap_rsl(trx);
981 break;
982 default:
983 break;
984 }
985 break;
986 case EVT_E1_TEI_DN:
987 fprintf(stderr, "Lost some E1 TEI link\n");
988 /* FIXME: deal with TEI or L1 link loss */
989 break;
990 default:
991 break;
992 }
993}
994
995static int bootstrap_bts(struct gsm_bts *bts)
996{
Mike Habene2d82272009-10-02 12:19:34 +0100997 switch (bts->band) {
998 case GSM_BAND_1800:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200999 if (bts->c0->arfcn < 512 || bts->c0->arfcn > 885) {
1000 fprintf(stderr, "GSM1800 channel must be between 512-885.\n");
1001 return -EINVAL;
1002 }
1003 break;
Mike Habene2d82272009-10-02 12:19:34 +01001004 case GSM_BAND_1900:
1005 if (bts->c0->arfcn < 512 || bts->c0->arfcn > 810) {
1006 fprintf(stderr, "GSM1900 channel must be between 512-810.\n");
1007 return -EINVAL;
1008 }
1009 break;
1010 case GSM_BAND_900:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001011 if (bts->c0->arfcn < 1 || bts->c0->arfcn > 124) {
1012 fprintf(stderr, "GSM900 channel must be between 1-124.\n");
1013 return -EINVAL;
1014 }
1015 break;
Mike Habene2d82272009-10-02 12:19:34 +01001016 default:
1017 fprintf(stderr, "Unsupported frequency band.\n");
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001018 return -EINVAL;
1019 }
1020
1021 /* Control Channel Description */
1022 bts->chan_desc.att = 1;
1023 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
1024 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
1025 /* T3212 is set from vty/config */
1026
1027 paging_init(bts);
1028
1029 return 0;
1030}
1031
1032int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *),
1033 const char *config_file)
1034{
1035 struct gsm_bts *bts;
1036 int rc;
1037
1038 /* initialize our data structures */
1039 bsc_gsmnet = gsm_network_init(1, 1, mncc_recv);
1040 if (!bsc_gsmnet)
1041 return -ENOMEM;
1042
1043 bsc_gsmnet->name_long = talloc_strdup(bsc_gsmnet, "OpenBSC");
1044 bsc_gsmnet->name_short = talloc_strdup(bsc_gsmnet, "OpenBSC");
1045
1046 telnet_init(bsc_gsmnet, 4242);
1047 rc = vty_read_config_file(config_file);
1048 if (rc < 0) {
1049 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1050 return rc;
1051 }
1052
1053 register_signal_handler(SS_NM, nm_sig_cb, NULL);
1054
1055 llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
1056 bootstrap_bts(bts);
1057 if (!is_ipaccess_bts(bts))
1058 rc = e1_reconfig_bts(bts);
1059
1060 if (rc < 0)
1061 exit (1);
1062 }
1063
1064 /* initialize nanoBTS support omce */
1065 rc = ipaccess_setup(bsc_gsmnet);
1066
1067 return 0;
1068}