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