blob: 66d5606019e46655e888242960318b16fa81c13b [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
Harald Welte8406ec22009-10-20 17:31:00 +0200349 /* This event-driven BTS setup is currently only required on nanoBTS */
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200350
Harald Welte8406ec22009-10-20 17:31:00 +0200351 /* EVT_STATECHG_ADM is called after we call chg_adm_state() and would create
352 * endless loop */
353 if (evt != EVT_STATECHG_OPER)
354 return 0;
355
356 switch (obj_class) {
357 case NM_OC_SITE_MANAGER:
358 bts = container_of(obj, struct gsm_bts, site_mgr);
359 if (new_state->operational == 2 &&
360 new_state->availability == NM_AVSTATE_OK)
361 abis_nm_opstart(bts, obj_class, 0xff, 0xff, 0xff);
362 break;
363 case NM_OC_BTS:
364 bts = obj;
365 if (new_state->availability == NM_AVSTATE_DEPENDENCY) {
366 patch_nm_tables(bts);
367 abis_nm_set_bts_attr(bts, nanobts_attr_bts,
368 sizeof(nanobts_attr_bts));
369 abis_nm_chg_adm_state(bts, obj_class,
370 bts->bts_nr, 0xff, 0xff,
371 NM_STATE_UNLOCKED);
372 abis_nm_opstart(bts, obj_class,
373 bts->bts_nr, 0xff, 0xff);
374 }
375 break;
376 case NM_OC_CHANNEL:
377 ts = obj;
378 trx = ts->trx;
379 if (new_state->operational == 1 &&
380 new_state->availability == NM_AVSTATE_DEPENDENCY) {
Harald Welte65bdc912009-10-26 20:14:33 +0100381 patch_nm_tables(trx->bts);
Harald Welte0f890b02009-10-24 09:09:05 +0200382 enum abis_nm_chan_comb ccomb =
383 abis_nm_chcomb4pchan(ts->pchan);
384 abis_nm_set_channel_attr(ts, ccomb);
Harald Welte8406ec22009-10-20 17:31:00 +0200385 abis_nm_chg_adm_state(trx->bts, obj_class,
386 trx->bts->bts_nr, trx->nr, ts->nr,
387 NM_STATE_UNLOCKED);
388 abis_nm_opstart(trx->bts, obj_class,
389 trx->bts->bts_nr, trx->nr, ts->nr);
390 }
391 break;
392 case NM_OC_RADIO_CARRIER:
393 trx = obj;
394 if (new_state->operational == 1 &&
Harald Welte8406ec22009-10-20 17:31:00 +0200395 new_state->availability == NM_AVSTATE_OK)
396 abis_nm_opstart(trx->bts, obj_class, trx->bts->bts_nr,
397 trx->nr, 0xff);
398 break;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200399 default:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200400 break;
401 }
402 return 0;
403}
404
405/* Callback function to be called every time we receive a 12.21 SW activated report */
406static int sw_activ_rep(struct msgb *mb)
407{
408 struct abis_om_fom_hdr *foh = msgb_l3(mb);
Harald Welted004a642009-10-19 21:47:54 +0200409 struct gsm_bts *bts = mb->trx->bts;
410 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
411
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200412
413 switch (foh->obj_class) {
Holger Hans Peter Freyther1ce10f32009-11-19 19:18:29 +0100414 case NM_OC_BASEB_TRANSC:
415 abis_nm_chg_adm_state(trx->bts, foh->obj_class,
416 trx->bts->bts_nr, trx->nr, 0xff,
417 NM_STATE_UNLOCKED);
418 abis_nm_opstart(trx->bts, foh->obj_class,
419 trx->bts->bts_nr, trx->nr, 0xff);
420 /* TRX software is active, tell it to initiate RSL Link */
421 abis_nm_ipaccess_rsl_connect(trx, 0, 3003, trx->rsl_tei);
422 break;
423 case NM_OC_RADIO_CARRIER:
424 /* Patch ARFCN into radio attribute */
425 nanobts_attr_radio[5] &= 0xf0;
426 nanobts_attr_radio[5] |= trx->arfcn >> 8;
427 nanobts_attr_radio[6] = trx->arfcn & 0xff;
428 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
429 sizeof(nanobts_attr_radio));
430 abis_nm_chg_adm_state(trx->bts, foh->obj_class,
431 trx->bts->bts_nr, trx->nr, 0xff,
432 NM_STATE_UNLOCKED);
433 abis_nm_opstart(trx->bts, foh->obj_class, trx->bts->bts_nr,
434 trx->nr, 0xff);
435 break;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200436 }
437 return 0;
438}
439
440/* Callback function for NACK on the OML NM */
Harald Welted8cfc902009-11-17 06:09:56 +0100441static int oml_msg_nack(u_int8_t mt)
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200442{
443 if (mt == NM_MT_SET_BTS_ATTR_NACK) {
444 fprintf(stderr, "Failed to set BTS attributes. That is fatal. "
445 "Was the bts type and frequency properly specified?\n");
446 exit(-1);
447 }
448
449 return 0;
450}
451
452/* Callback function to be called every time we receive a signal from NM */
453static int nm_sig_cb(unsigned int subsys, unsigned int signal,
454 void *handler_data, void *signal_data)
455{
Harald Welted8cfc902009-11-17 06:09:56 +0100456 u_int8_t *msg_type;
457
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200458 switch (signal) {
459 case S_NM_SW_ACTIV_REP:
460 return sw_activ_rep(signal_data);
461 case S_NM_NACK:
Harald Welted8cfc902009-11-17 06:09:56 +0100462 msg_type = signal_data;
463 return oml_msg_nack(*msg_type);
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200464 default:
465 break;
466 }
467 return 0;
468}
469
470static void bootstrap_om_nanobts(struct gsm_bts *bts)
471{
472 /* We don't do callback based bootstrapping, but event driven (see above) */
473}
474
475static void nm_reconfig_ts(struct gsm_bts_trx_ts *ts)
476{
477 enum abis_nm_chan_comb ccomb = abis_nm_chcomb4pchan(ts->pchan);
478 struct gsm_e1_subslot *e1l = &ts->e1_link;
479
480 abis_nm_set_channel_attr(ts, ccomb);
481
482 if (is_ipaccess_bts(ts->trx->bts))
483 return;
484
485 switch (ts->pchan) {
486 case GSM_PCHAN_TCH_F:
487 case GSM_PCHAN_TCH_H:
488 abis_nm_conn_terr_traf(ts, e1l->e1_nr, e1l->e1_ts,
489 e1l->e1_ts_ss);
490 break;
491 default:
492 break;
493 }
494}
495
496static void nm_reconfig_trx(struct gsm_bts_trx *trx)
497{
498 struct gsm_e1_subslot *e1l = &trx->rsl_e1_link;
499 int i;
500
501 patch_nm_tables(trx->bts);
502
503 switch (trx->bts->type) {
504 case GSM_BTS_TYPE_BS11:
505 /* FIXME: discover this by fetching an attribute */
506#if 0
507 trx->nominal_power = 15; /* 15dBm == 30mW PA configuration */
508#else
509 trx->nominal_power = 24; /* 24dBm == 250mW PA configuration */
510#endif
511 abis_nm_conn_terr_sign(trx, e1l->e1_nr, e1l->e1_ts,
512 e1l->e1_ts_ss);
513 abis_nm_establish_tei(trx->bts, trx->nr, e1l->e1_nr,
514 e1l->e1_ts, e1l->e1_ts_ss, trx->rsl_tei);
515
516 /* Set Radio Attributes */
517 if (trx == trx->bts->c0)
518 abis_nm_set_radio_attr(trx, bs11_attr_radio,
519 sizeof(bs11_attr_radio));
520 else {
521 u_int8_t trx1_attr_radio[sizeof(bs11_attr_radio)];
522 u_int8_t arfcn_low = trx->arfcn & 0xff;
523 u_int8_t arfcn_high = (trx->arfcn >> 8) & 0x0f;
524 memcpy(trx1_attr_radio, bs11_attr_radio,
525 sizeof(trx1_attr_radio));
526
527 /* patch ARFCN into TRX Attributes */
528 trx1_attr_radio[2] &= 0xf0;
529 trx1_attr_radio[2] |= arfcn_high;
530 trx1_attr_radio[3] = arfcn_low;
531
532 abis_nm_set_radio_attr(trx, trx1_attr_radio,
533 sizeof(trx1_attr_radio));
534 }
535 break;
Mike Habene2d82272009-10-02 12:19:34 +0100536 case GSM_BTS_TYPE_NANOBTS:
Harald Welteaf7b2fa2009-10-19 21:47:31 +0200537 switch (trx->bts->band) {
538 case GSM_BAND_850:
539 case GSM_BAND_900:
540 trx->nominal_power = 20;
541 break;
542 case GSM_BAND_1800:
543 case GSM_BAND_1900:
544 trx->nominal_power = 23;
545 break;
Holger Hans Peter Freyther555eba12009-10-22 15:46:16 +0200546 default:
Harald Welteaf7b2fa2009-10-19 21:47:31 +0200547 fprintf(stderr, "Unsupported nanoBTS GSM band %s\n",
548 gsm_band_name(trx->bts->band));
549 break;
550 }
551 break;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200552 default:
553 break;
554 }
555
556 for (i = 0; i < TRX_NR_TS; i++)
557 nm_reconfig_ts(&trx->ts[i]);
558}
559
560static void nm_reconfig_bts(struct gsm_bts *bts)
561{
562 struct gsm_bts_trx *trx;
563
564 switch (bts->type) {
565 case GSM_BTS_TYPE_BS11:
566 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
567 abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
568 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
569 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
570 break;
571 default:
572 break;
573 }
574
575 llist_for_each_entry(trx, &bts->trx_list, list)
576 nm_reconfig_trx(trx);
577}
578
579static void bootstrap_om_bs11(struct gsm_bts *bts)
580{
581 /* stop sending event reports */
582 abis_nm_event_reports(bts, 0);
583
584 /* begin DB transmission */
585 abis_nm_bs11_db_transmission(bts, 1);
586
587 /* end DB transmission */
588 abis_nm_bs11_db_transmission(bts, 0);
589
590 /* Reset BTS Site manager resource */
591 abis_nm_bs11_reset_resource(bts);
592
593 /* begin DB transmission */
594 abis_nm_bs11_db_transmission(bts, 1);
595
596 /* reconfigure BTS with all TRX and all TS */
597 nm_reconfig_bts(bts);
598
599 /* end DB transmission */
600 abis_nm_bs11_db_transmission(bts, 0);
601
602 /* Reset BTS Site manager resource */
603 abis_nm_bs11_reset_resource(bts);
604
605 /* restart sending event reports */
606 abis_nm_event_reports(bts, 1);
607}
608
609static void bootstrap_om(struct gsm_bts *bts)
610{
611 fprintf(stdout, "bootstrapping OML for BTS %u\n", bts->nr);
612
613 switch (bts->type) {
614 case GSM_BTS_TYPE_BS11:
615 bootstrap_om_bs11(bts);
616 break;
Mike Habene2d82272009-10-02 12:19:34 +0100617 case GSM_BTS_TYPE_NANOBTS:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200618 bootstrap_om_nanobts(bts);
619 break;
620 default:
621 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
622 }
623}
624
625static int shutdown_om(struct gsm_bts *bts)
626{
627 fprintf(stdout, "shutting down OML for BTS %u\n", bts->nr);
628
629 /* stop sending event reports */
630 abis_nm_event_reports(bts, 0);
631
632 /* begin DB transmission */
633 abis_nm_bs11_db_transmission(bts, 1);
634
635 /* end DB transmission */
636 abis_nm_bs11_db_transmission(bts, 0);
637
638 /* Reset BTS Site manager resource */
639 abis_nm_bs11_reset_resource(bts);
640
641 return 0;
642}
643
644int bsc_shutdown_net(struct gsm_network *net)
645{
646 struct gsm_bts *bts;
647
648 llist_for_each_entry(bts, &net->bts_list, list) {
649 int rc;
650 rc = shutdown_om(bts);
651 if (rc < 0)
652 return rc;
653 }
654
655 return 0;
656}
657
658struct bcch_info {
659 u_int8_t type;
660 u_int8_t len;
661 const u_int8_t *data;
662};
663
664/*
665SYSTEM INFORMATION TYPE 1
666 Cell channel description
667 Format-ID bit map 0
668 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
669 RACH Control Parameters
670 maximum 7 retransmissions
671 8 slots used to spread transmission
672 cell not barred for access
673 call reestablishment not allowed
674 Access Control Class = 0000
675*/
676static u_int8_t si1[] = {
677 /* header */0x55, 0x06, 0x19,
678 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
679 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
680 /* rach */0xD5, 0x04, 0x00,
681 /* s1 reset*/0x2B
682};
683
684/*
685 SYSTEM INFORMATION TYPE 2
686 Neighbour Cells Description
687 EXT-IND: Carries the complete BA
688 BA-IND = 0
689 Format-ID bit map 0
690 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
691 NCC permitted (NCC) = FF
692 RACH Control Parameters
693 maximum 7 retransmissions
694 8 slots used to spread transmission
695 cell not barred for access
696 call reestablishment not allowed
697 Access Control Class = 0000
698*/
699static u_int8_t si2[] = {
700 /* header */0x59, 0x06, 0x1A,
701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
703 /* ncc */0xFF,
704 /* rach*/0xD5, 0x04, 0x00
705};
706
707/*
708SYSTEM INFORMATION TYPE 3
709 Cell identity = 00001 (1h)
710 Location area identification
711 Mobile Country Code (MCC): 001
712 Mobile Network Code (MNC): 01
713 Location Area Code (LAC): 00001 (1h)
714 Control Channel Description
715 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
716 0 blocks reserved for access grant
717 1 channel used for CCCH, with SDCCH
718 5 multiframes period for PAGING REQUEST
719 Time-out T3212 = 0
720 Cell Options BCCH
721 Power control indicator: not set
722 MSs shall not use uplink DTX
723 Radio link timeout = 36
724 Cell Selection Parameters
725 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
726 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
727 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
728 Half rate support (NECI): New establishment causes are not supported
729 min.RX signal level for MS = 0
730 RACH Control Parameters
731 maximum 7 retransmissions
732 8 slots used to spread transmission
733 cell not barred for access
734 call reestablishment not allowed
735 Access Control Class = 0000
736 SI 3 Rest Octets (not present)
737*/
738static u_int8_t si3[] = {
739 /* header */0x49, 0x06, 0x1B,
740 /* cell */0x00, 0x01,
741 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
742 /* desc */0x01, 0x03, 0x00,
743 /* option*/0x28,
744 /* selection*/0x62, 0x00,
745 /* rach */0xD5, 0x04, 0x00,
746 /* rest */ 0x2B, 0x2B, 0x2B, 0x2B
747};
748
749/*
750SYSTEM INFORMATION TYPE 4
751 Location area identification
752 Mobile Country Code (MCC): 001
753 Mobile Network Code (MNC): 01
754 Location Area Code (LAC): 00001 (1h)
755 Cell Selection Parameters
756 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
757 max.TX power level MS may use for CCH = 2
758 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
759 Half rate support (NECI): New establishment causes are not supported
760 min.RX signal level for MS = 0
761 RACH Control Parameters
762 maximum 7 retransmissions
763 8 slots used to spread transmission
764 cell not barred for access
765 call reestablishment not allowed
766 Access Control Class = 0000
767 CBCH Channel Description
768 Type = SDCCH/4[2]
769 Timeslot Number: 0
770 Training Sequence Code: 7h
771 ARFCN: 1
772 SI Rest Octets (not present)
773*/
774static u_int8_t si4[] = {
775 /* header */0x41, 0x06, 0x1C,
776 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
777 /* sel */0x62, 0x00,
778 /* rach*/0xD5, 0x04, 0x00,
779 /* cbch chan desc */ 0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/,
780 /* rest octets */ 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B
781};
782
783/*
784 SYSTEM INFORMATION TYPE 5
785 Neighbour Cells Description
786 EXT-IND: Carries the complete BA
787 BA-IND = 0
788 Format-ID bit map 0
789 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
790*/
791
792static u_int8_t si5[] = {
793 /* header without l2 len*/0x06, 0x1D,
794 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796};
797
798// SYSTEM INFORMATION TYPE 6
799
800/*
801SACCH FILLING
802 System Info Type: SYSTEM INFORMATION 6
803 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
804
805SYSTEM INFORMATION TYPE 6
806 Cell identity = 00001 (1h)
807 Location area identification
808 Mobile Country Code (MCC): 001
809 Mobile Network Code (MNC): 01
810 Location Area Code (LAC): 00001 (1h)
811 Cell Options SACCH
812 Power control indicator: not set
813 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
814 Radio link timeout = 36
815 NCC permitted (NCC) = FF
816*/
817
818static u_int8_t si6[] = {
819 /* header */0x06, 0x1E,
820 /* cell id*/ 0x00, 0x01,
821 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
822 /* options */ 0x28,
823 /* ncc */ 0xFF,
824};
825
826
827
828static const struct bcch_info bcch_infos[] = {
829 {
830 .type = RSL_SYSTEM_INFO_1,
831 .len = sizeof(si1),
832 .data = si1,
833 }, {
834 .type = RSL_SYSTEM_INFO_2,
835 .len = sizeof(si2),
836 .data = si2,
837 }, {
838 .type = RSL_SYSTEM_INFO_3,
839 .len = sizeof(si3),
840 .data = si3,
841 }, {
842 .type = RSL_SYSTEM_INFO_4,
843 .len = sizeof(si4),
844 .data = si4,
845 },
846};
847
848static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
849static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
850static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
851static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
852static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
853static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
854
855/* set all system information types */
856static int set_system_infos(struct gsm_bts_trx *trx)
857{
858 int i;
859
860 if (trx == trx->bts->c0) {
861 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
862 rsl_bcch_info(trx, bcch_infos[i].type,
863 bcch_infos[i].data,
864 bcch_infos[i].len);
865 }
866 }
867 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
868 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
869
870 return 0;
871}
872
873/*
874 * Patch the various SYSTEM INFORMATION tables to update
875 * the LAI
876 */
877static void patch_nm_tables(struct gsm_bts *bts)
878{
879 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
880 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
881
882 /* patch ARFCN into BTS Attributes */
883 bs11_attr_bts[69] &= 0xf0;
884 bs11_attr_bts[69] |= arfcn_high;
885 bs11_attr_bts[70] = arfcn_low;
886 nanobts_attr_bts[42] &= 0xf0;
887 nanobts_attr_bts[42] |= arfcn_high;
888 nanobts_attr_bts[43] = arfcn_low;
889
890 /* patch ARFCN into TRX Attributes */
891 bs11_attr_radio[2] &= 0xf0;
892 bs11_attr_radio[2] |= arfcn_high;
893 bs11_attr_radio[3] = arfcn_low;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200894
895 /* patch BSIC */
896 bs11_attr_bts[1] = bts->bsic;
897 nanobts_attr_bts[sizeof(nanobts_attr_bts)-1] = bts->bsic;
898
899 /* patch the power reduction */
900 bs11_attr_radio[5] = bts->c0->max_power_red / 2;
901 nanobts_attr_radio[1] = bts->c0->max_power_red / 2;
902}
903
904/*
905 * Patch the various SYSTEM INFORMATION tables to update
906 * the LAI
907 */
908static void patch_si_tables(struct gsm_bts *bts)
909{
910 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
911 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
912
913 /* covert the raw packet to the struct */
914 struct gsm48_system_information_type_1 *type_1 =
915 (struct gsm48_system_information_type_1*)&si1;
916 struct gsm48_system_information_type_2 *type_2 =
917 (struct gsm48_system_information_type_2*)&si2;
918 struct gsm48_system_information_type_3 *type_3 =
919 (struct gsm48_system_information_type_3*)&si3;
920 struct gsm48_system_information_type_4 *type_4 =
921 (struct gsm48_system_information_type_4*)&si4;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200922 struct gsm48_system_information_type_6 *type_6 =
923 (struct gsm48_system_information_type_6*)&si6;
924 struct gsm48_loc_area_id lai;
925
926 gsm0408_generate_lai(&lai, bts->network->country_code,
927 bts->network->network_code,
928 bts->location_area_code);
929
930 /* assign the MCC and MNC */
931 type_3->lai = lai;
932 type_4->lai = lai;
933 type_6->lai = lai;
934
Holger Hans Peter Freytherc4a49e32009-08-21 14:44:12 +0200935 /* set the CI */
936 type_3->cell_identity = htons(bts->cell_identity);
937 type_6->cell_identity = htons(bts->cell_identity);
938
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200939 type_4->data[2] &= 0xf0;
940 type_4->data[2] |= arfcn_high;
941 type_4->data[3] = arfcn_low;
942
943 /* patch Control Channel Description 10.5.2.11 */
944 type_3->control_channel_desc = bts->chan_desc;
945
946 /* patch TSC */
947 si4[15] &= ~0xe0;
948 si4[15] |= (bts->tsc & 7) << 5;
949
950 /* patch MS max power for CCH */
951 type_4->cell_sel_par.ms_txpwr_max_ccch =
952 ms_pwr_ctl_lvl(bts->band, bts->ms_max_power);
953
Holger Hans Peter Freytherf7d752f2009-11-16 17:12:38 +0100954 /* Set NECI to influence channel request */
955 type_3->cell_sel_par.neci = bts->network->neci;
956 type_4->cell_sel_par.neci = bts->network->neci;
957
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200958 if (bts->cell_barred) {
959 type_1->rach_control.cell_bar = 1;
960 type_2->rach_control.cell_bar = 1;
961 type_3->rach_control.cell_bar = 1;
962 type_4->rach_control.cell_bar = 1;
963 } else {
964 type_1->rach_control.cell_bar = 0;
965 type_2->rach_control.cell_bar = 0;
966 type_3->rach_control.cell_bar = 0;
967 type_4->rach_control.cell_bar = 0;
968 }
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200969}
970
971
972static void bootstrap_rsl(struct gsm_bts_trx *trx)
973{
974 fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) "
975 "using MCC=%u MNC=%u BSIC=%u TSC=%u\n",
976 trx->bts->nr, trx->nr, bsc_gsmnet->country_code,
977 bsc_gsmnet->network_code, trx->bts->bsic, trx->bts->tsc);
978 patch_si_tables(trx->bts);
979 set_system_infos(trx);
980}
981
982void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
983{
984 switch (event) {
985 case EVT_E1_TEI_UP:
986 switch (type) {
987 case E1INP_SIGN_OML:
988 bootstrap_om(trx->bts);
989 break;
990 case E1INP_SIGN_RSL:
991 bootstrap_rsl(trx);
992 break;
993 default:
994 break;
995 }
996 break;
997 case EVT_E1_TEI_DN:
998 fprintf(stderr, "Lost some E1 TEI link\n");
999 /* FIXME: deal with TEI or L1 link loss */
1000 break;
1001 default:
1002 break;
1003 }
1004}
1005
1006static int bootstrap_bts(struct gsm_bts *bts)
1007{
Mike Habene2d82272009-10-02 12:19:34 +01001008 switch (bts->band) {
1009 case GSM_BAND_1800:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001010 if (bts->c0->arfcn < 512 || bts->c0->arfcn > 885) {
1011 fprintf(stderr, "GSM1800 channel must be between 512-885.\n");
1012 return -EINVAL;
1013 }
1014 break;
Mike Habene2d82272009-10-02 12:19:34 +01001015 case GSM_BAND_1900:
1016 if (bts->c0->arfcn < 512 || bts->c0->arfcn > 810) {
1017 fprintf(stderr, "GSM1900 channel must be between 512-810.\n");
1018 return -EINVAL;
1019 }
1020 break;
1021 case GSM_BAND_900:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001022 if (bts->c0->arfcn < 1 || bts->c0->arfcn > 124) {
1023 fprintf(stderr, "GSM900 channel must be between 1-124.\n");
1024 return -EINVAL;
1025 }
1026 break;
Mike Habene2d82272009-10-02 12:19:34 +01001027 default:
1028 fprintf(stderr, "Unsupported frequency band.\n");
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001029 return -EINVAL;
1030 }
1031
1032 /* Control Channel Description */
1033 bts->chan_desc.att = 1;
1034 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
1035 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
1036 /* T3212 is set from vty/config */
1037
1038 paging_init(bts);
1039
1040 return 0;
1041}
1042
1043int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *),
1044 const char *config_file)
1045{
1046 struct gsm_bts *bts;
1047 int rc;
1048
1049 /* initialize our data structures */
1050 bsc_gsmnet = gsm_network_init(1, 1, mncc_recv);
1051 if (!bsc_gsmnet)
1052 return -ENOMEM;
1053
1054 bsc_gsmnet->name_long = talloc_strdup(bsc_gsmnet, "OpenBSC");
1055 bsc_gsmnet->name_short = talloc_strdup(bsc_gsmnet, "OpenBSC");
1056
1057 telnet_init(bsc_gsmnet, 4242);
1058 rc = vty_read_config_file(config_file);
1059 if (rc < 0) {
1060 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1061 return rc;
1062 }
1063
1064 register_signal_handler(SS_NM, nm_sig_cb, NULL);
1065
1066 llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
1067 bootstrap_bts(bts);
1068 if (!is_ipaccess_bts(bts))
1069 rc = e1_reconfig_bts(bts);
1070
1071 if (rc < 0)
1072 exit (1);
1073 }
1074
1075 /* initialize nanoBTS support omce */
1076 rc = ipaccess_setup(bsc_gsmnet);
1077
1078 return 0;
1079}