blob: adf37ed7f5003ea655c4f691d1e57a53c657ef0f [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);
Harald Welted004a642009-10-19 21:47:54 +0200408 struct gsm_bts *bts = mb->trx->bts;
409 struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
410
411 if (!trx)
412 return -ENODEV;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200413
414 switch (foh->obj_class) {
415 case NM_OC_BASEB_TRANSC:
416 /* TRX software is active, tell it to initiate RSL Link */
417 abis_nm_ipaccess_msg(trx->bts, 0xe0, NM_OC_BASEB_TRANSC,
418 trx->bts->bts_nr, trx->nr, 0xff,
419 nanobts_attr_e0, sizeof(nanobts_attr_e0));
420 abis_nm_opstart(trx->bts, NM_OC_BASEB_TRANSC,
421 trx->bts->bts_nr, trx->nr, 0xff);
422 abis_nm_chg_adm_state(trx->bts, NM_OC_BASEB_TRANSC,
423 trx->bts->bts_nr, trx->nr, 0xff,
424 NM_STATE_UNLOCKED);
425 break;
426 case NM_OC_RADIO_CARRIER:
427 patch_nm_tables(trx->bts);
428 abis_nm_set_radio_attr(trx, nanobts_attr_radio,
429 sizeof(nanobts_attr_radio));
430 abis_nm_opstart(trx->bts, NM_OC_RADIO_CARRIER,
431 trx->bts->bts_nr, trx->nr, 0xff);
432 abis_nm_chg_adm_state(trx->bts, NM_OC_RADIO_CARRIER,
433 trx->bts->bts_nr, trx->nr, 0xff,
434 NM_STATE_UNLOCKED);
435 break;
436 }
437 return 0;
438}
439
440/* Callback function for NACK on the OML NM */
441static int oml_msg_nack(int mt)
442{
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{
456 switch (signal) {
457 case S_NM_SW_ACTIV_REP:
458 return sw_activ_rep(signal_data);
459 case S_NM_NACK:
460 return oml_msg_nack((int)signal_data);
461 default:
462 break;
463 }
464 return 0;
465}
466
467static void bootstrap_om_nanobts(struct gsm_bts *bts)
468{
469 /* We don't do callback based bootstrapping, but event driven (see above) */
470}
471
472static void nm_reconfig_ts(struct gsm_bts_trx_ts *ts)
473{
474 enum abis_nm_chan_comb ccomb = abis_nm_chcomb4pchan(ts->pchan);
475 struct gsm_e1_subslot *e1l = &ts->e1_link;
476
477 abis_nm_set_channel_attr(ts, ccomb);
478
479 if (is_ipaccess_bts(ts->trx->bts))
480 return;
481
482 switch (ts->pchan) {
483 case GSM_PCHAN_TCH_F:
484 case GSM_PCHAN_TCH_H:
485 abis_nm_conn_terr_traf(ts, e1l->e1_nr, e1l->e1_ts,
486 e1l->e1_ts_ss);
487 break;
488 default:
489 break;
490 }
491}
492
493static void nm_reconfig_trx(struct gsm_bts_trx *trx)
494{
495 struct gsm_e1_subslot *e1l = &trx->rsl_e1_link;
496 int i;
497
498 patch_nm_tables(trx->bts);
499
500 switch (trx->bts->type) {
501 case GSM_BTS_TYPE_BS11:
502 /* FIXME: discover this by fetching an attribute */
503#if 0
504 trx->nominal_power = 15; /* 15dBm == 30mW PA configuration */
505#else
506 trx->nominal_power = 24; /* 24dBm == 250mW PA configuration */
507#endif
508 abis_nm_conn_terr_sign(trx, e1l->e1_nr, e1l->e1_ts,
509 e1l->e1_ts_ss);
510 abis_nm_establish_tei(trx->bts, trx->nr, e1l->e1_nr,
511 e1l->e1_ts, e1l->e1_ts_ss, trx->rsl_tei);
512
513 /* Set Radio Attributes */
514 if (trx == trx->bts->c0)
515 abis_nm_set_radio_attr(trx, bs11_attr_radio,
516 sizeof(bs11_attr_radio));
517 else {
518 u_int8_t trx1_attr_radio[sizeof(bs11_attr_radio)];
519 u_int8_t arfcn_low = trx->arfcn & 0xff;
520 u_int8_t arfcn_high = (trx->arfcn >> 8) & 0x0f;
521 memcpy(trx1_attr_radio, bs11_attr_radio,
522 sizeof(trx1_attr_radio));
523
524 /* patch ARFCN into TRX Attributes */
525 trx1_attr_radio[2] &= 0xf0;
526 trx1_attr_radio[2] |= arfcn_high;
527 trx1_attr_radio[3] = arfcn_low;
528
529 abis_nm_set_radio_attr(trx, trx1_attr_radio,
530 sizeof(trx1_attr_radio));
531 }
532 break;
Mike Habene2d82272009-10-02 12:19:34 +0100533 case GSM_BTS_TYPE_NANOBTS:
Harald Welteaf7b2fa2009-10-19 21:47:31 +0200534 switch (trx->bts->band) {
535 case GSM_BAND_850:
536 case GSM_BAND_900:
537 trx->nominal_power = 20;
538 break;
539 case GSM_BAND_1800:
540 case GSM_BAND_1900:
541 trx->nominal_power = 23;
542 break;
543 dedfault:
544 fprintf(stderr, "Unsupported nanoBTS GSM band %s\n",
545 gsm_band_name(trx->bts->band));
546 break;
547 }
548 break;
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200549 default:
550 break;
551 }
552
553 for (i = 0; i < TRX_NR_TS; i++)
554 nm_reconfig_ts(&trx->ts[i]);
555}
556
557static void nm_reconfig_bts(struct gsm_bts *bts)
558{
559 struct gsm_bts_trx *trx;
560
561 switch (bts->type) {
562 case GSM_BTS_TYPE_BS11:
563 abis_nm_raw_msg(bts, sizeof(msg_1), msg_1); /* set BTS SiteMgr attr*/
564 abis_nm_set_bts_attr(bts, bs11_attr_bts, sizeof(bs11_attr_bts));
565 abis_nm_raw_msg(bts, sizeof(msg_3), msg_3); /* set BTS handover attr */
566 abis_nm_raw_msg(bts, sizeof(msg_4), msg_4); /* set BTS power control attr */
567 break;
568 default:
569 break;
570 }
571
572 llist_for_each_entry(trx, &bts->trx_list, list)
573 nm_reconfig_trx(trx);
574}
575
576static void bootstrap_om_bs11(struct gsm_bts *bts)
577{
578 /* stop sending event reports */
579 abis_nm_event_reports(bts, 0);
580
581 /* begin DB transmission */
582 abis_nm_bs11_db_transmission(bts, 1);
583
584 /* end DB transmission */
585 abis_nm_bs11_db_transmission(bts, 0);
586
587 /* Reset BTS Site manager resource */
588 abis_nm_bs11_reset_resource(bts);
589
590 /* begin DB transmission */
591 abis_nm_bs11_db_transmission(bts, 1);
592
593 /* reconfigure BTS with all TRX and all TS */
594 nm_reconfig_bts(bts);
595
596 /* end DB transmission */
597 abis_nm_bs11_db_transmission(bts, 0);
598
599 /* Reset BTS Site manager resource */
600 abis_nm_bs11_reset_resource(bts);
601
602 /* restart sending event reports */
603 abis_nm_event_reports(bts, 1);
604}
605
606static void bootstrap_om(struct gsm_bts *bts)
607{
608 fprintf(stdout, "bootstrapping OML for BTS %u\n", bts->nr);
609
610 switch (bts->type) {
611 case GSM_BTS_TYPE_BS11:
612 bootstrap_om_bs11(bts);
613 break;
Mike Habene2d82272009-10-02 12:19:34 +0100614 case GSM_BTS_TYPE_NANOBTS:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200615 bootstrap_om_nanobts(bts);
616 break;
617 default:
618 fprintf(stderr, "Unable to bootstrap OML: Unknown BTS type %d\n", bts->type);
619 }
620}
621
622static int shutdown_om(struct gsm_bts *bts)
623{
624 fprintf(stdout, "shutting down OML for BTS %u\n", bts->nr);
625
626 /* stop sending event reports */
627 abis_nm_event_reports(bts, 0);
628
629 /* begin DB transmission */
630 abis_nm_bs11_db_transmission(bts, 1);
631
632 /* end DB transmission */
633 abis_nm_bs11_db_transmission(bts, 0);
634
635 /* Reset BTS Site manager resource */
636 abis_nm_bs11_reset_resource(bts);
637
638 return 0;
639}
640
641int bsc_shutdown_net(struct gsm_network *net)
642{
643 struct gsm_bts *bts;
644
645 llist_for_each_entry(bts, &net->bts_list, list) {
646 int rc;
647 rc = shutdown_om(bts);
648 if (rc < 0)
649 return rc;
650 }
651
652 return 0;
653}
654
655struct bcch_info {
656 u_int8_t type;
657 u_int8_t len;
658 const u_int8_t *data;
659};
660
661/*
662SYSTEM INFORMATION TYPE 1
663 Cell channel description
664 Format-ID bit map 0
665 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01
666 RACH Control Parameters
667 maximum 7 retransmissions
668 8 slots used to spread transmission
669 cell not barred for access
670 call reestablishment not allowed
671 Access Control Class = 0000
672*/
673static u_int8_t si1[] = {
674 /* header */0x55, 0x06, 0x19,
675 /* ccdesc */0x04 /*0x00*/, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
676 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /*0x01*/,
677 /* rach */0xD5, 0x04, 0x00,
678 /* s1 reset*/0x2B
679};
680
681/*
682 SYSTEM INFORMATION TYPE 2
683 Neighbour Cells Description
684 EXT-IND: Carries the complete BA
685 BA-IND = 0
686 Format-ID bit map 0
687 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
688 NCC permitted (NCC) = FF
689 RACH Control Parameters
690 maximum 7 retransmissions
691 8 slots used to spread transmission
692 cell not barred for access
693 call reestablishment not allowed
694 Access Control Class = 0000
695*/
696static u_int8_t si2[] = {
697 /* header */0x59, 0x06, 0x1A,
698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
699 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
700 /* ncc */0xFF,
701 /* rach*/0xD5, 0x04, 0x00
702};
703
704/*
705SYSTEM INFORMATION TYPE 3
706 Cell identity = 00001 (1h)
707 Location area identification
708 Mobile Country Code (MCC): 001
709 Mobile Network Code (MNC): 01
710 Location Area Code (LAC): 00001 (1h)
711 Control Channel Description
712 Attach-detach: MSs in the cell are not allowed to apply IMSI attach /detach
713 0 blocks reserved for access grant
714 1 channel used for CCCH, with SDCCH
715 5 multiframes period for PAGING REQUEST
716 Time-out T3212 = 0
717 Cell Options BCCH
718 Power control indicator: not set
719 MSs shall not use uplink DTX
720 Radio link timeout = 36
721 Cell Selection Parameters
722 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
723 max.TX power level MS may use for CCH = 2 <- according to GSM05.05 39dBm (max)
724 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
725 Half rate support (NECI): New establishment causes are not supported
726 min.RX signal level for MS = 0
727 RACH Control Parameters
728 maximum 7 retransmissions
729 8 slots used to spread transmission
730 cell not barred for access
731 call reestablishment not allowed
732 Access Control Class = 0000
733 SI 3 Rest Octets (not present)
734*/
735static u_int8_t si3[] = {
736 /* header */0x49, 0x06, 0x1B,
737 /* cell */0x00, 0x01,
738 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
739 /* desc */0x01, 0x03, 0x00,
740 /* option*/0x28,
741 /* selection*/0x62, 0x00,
742 /* rach */0xD5, 0x04, 0x00,
743 /* rest */ 0x2B, 0x2B, 0x2B, 0x2B
744};
745
746/*
747SYSTEM INFORMATION TYPE 4
748 Location area identification
749 Mobile Country Code (MCC): 001
750 Mobile Network Code (MNC): 01
751 Location Area Code (LAC): 00001 (1h)
752 Cell Selection Parameters
753 Cell reselect hysteresis = 6 dB RXLEV hysteresis for LA re-selection
754 max.TX power level MS may use for CCH = 2
755 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
756 Half rate support (NECI): New establishment causes are not supported
757 min.RX signal level for MS = 0
758 RACH Control Parameters
759 maximum 7 retransmissions
760 8 slots used to spread transmission
761 cell not barred for access
762 call reestablishment not allowed
763 Access Control Class = 0000
764 CBCH Channel Description
765 Type = SDCCH/4[2]
766 Timeslot Number: 0
767 Training Sequence Code: 7h
768 ARFCN: 1
769 SI Rest Octets (not present)
770*/
771static u_int8_t si4[] = {
772 /* header */0x41, 0x06, 0x1C,
773 /* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
774 /* sel */0x62, 0x00,
775 /* rach*/0xD5, 0x04, 0x00,
776 /* cbch chan desc */ 0x64, 0x30, 0xE0, HARDCODED_ARFCN/*0x01*/,
777 /* rest octets */ 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B
778};
779
780/*
781 SYSTEM INFORMATION TYPE 5
782 Neighbour Cells Description
783 EXT-IND: Carries the complete BA
784 BA-IND = 0
785 Format-ID bit map 0
786 CA-ARFCN Bit 124...001 (Hex): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
787*/
788
789static u_int8_t si5[] = {
790 /* header without l2 len*/0x06, 0x1D,
791 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
792 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
793};
794
795// SYSTEM INFORMATION TYPE 6
796
797/*
798SACCH FILLING
799 System Info Type: SYSTEM INFORMATION 6
800 L3 Information (Hex): 06 1E 00 01 xx xx 10 00 01 28 FF
801
802SYSTEM INFORMATION TYPE 6
803 Cell identity = 00001 (1h)
804 Location area identification
805 Mobile Country Code (MCC): 001
806 Mobile Network Code (MNC): 01
807 Location Area Code (LAC): 00001 (1h)
808 Cell Options SACCH
809 Power control indicator: not set
810 MSs shall not use uplink DTX on a TCH-F. MS shall not use uplink DTX on TCH-H.
811 Radio link timeout = 36
812 NCC permitted (NCC) = FF
813*/
814
815static u_int8_t si6[] = {
816 /* header */0x06, 0x1E,
817 /* cell id*/ 0x00, 0x01,
818 /* lai */ 0x00, 0xF1, 0x10, 0x00, 0x01,
819 /* options */ 0x28,
820 /* ncc */ 0xFF,
821};
822
823
824
825static const struct bcch_info bcch_infos[] = {
826 {
827 .type = RSL_SYSTEM_INFO_1,
828 .len = sizeof(si1),
829 .data = si1,
830 }, {
831 .type = RSL_SYSTEM_INFO_2,
832 .len = sizeof(si2),
833 .data = si2,
834 }, {
835 .type = RSL_SYSTEM_INFO_3,
836 .len = sizeof(si3),
837 .data = si3,
838 }, {
839 .type = RSL_SYSTEM_INFO_4,
840 .len = sizeof(si4),
841 .data = si4,
842 },
843};
844
845static_assert(sizeof(si1) == sizeof(struct gsm48_system_information_type_1), type1)
846static_assert(sizeof(si2) == sizeof(struct gsm48_system_information_type_2), type2)
847static_assert(sizeof(si3) == sizeof(struct gsm48_system_information_type_3), type3)
848static_assert(sizeof(si4) >= sizeof(struct gsm48_system_information_type_4), type4)
849static_assert(sizeof(si5) == sizeof(struct gsm48_system_information_type_5), type5)
850static_assert(sizeof(si6) >= sizeof(struct gsm48_system_information_type_6), type6)
851
852/* set all system information types */
853static int set_system_infos(struct gsm_bts_trx *trx)
854{
855 int i;
856
857 if (trx == trx->bts->c0) {
858 for (i = 0; i < ARRAY_SIZE(bcch_infos); i++) {
859 rsl_bcch_info(trx, bcch_infos[i].type,
860 bcch_infos[i].data,
861 bcch_infos[i].len);
862 }
863 }
864 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_5, si5, sizeof(si5));
865 rsl_sacch_filling(trx, RSL_SYSTEM_INFO_6, si6, sizeof(si6));
866
867 return 0;
868}
869
870/*
871 * Patch the various SYSTEM INFORMATION tables to update
872 * the LAI
873 */
874static void patch_nm_tables(struct gsm_bts *bts)
875{
876 u_int8_t arfcn_low = bts->c0->arfcn & 0xff;
877 u_int8_t arfcn_high = (bts->c0->arfcn >> 8) & 0x0f;
878
879 /* patch ARFCN into BTS Attributes */
880 bs11_attr_bts[69] &= 0xf0;
881 bs11_attr_bts[69] |= arfcn_high;
882 bs11_attr_bts[70] = arfcn_low;
883 nanobts_attr_bts[42] &= 0xf0;
884 nanobts_attr_bts[42] |= arfcn_high;
885 nanobts_attr_bts[43] = arfcn_low;
886
887 /* patch ARFCN into TRX Attributes */
888 bs11_attr_radio[2] &= 0xf0;
889 bs11_attr_radio[2] |= arfcn_high;
890 bs11_attr_radio[3] = arfcn_low;
891 nanobts_attr_radio[5] &= 0xf0;
892 nanobts_attr_radio[5] |= arfcn_high;
893 nanobts_attr_radio[6] = arfcn_low;
894
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
954 if (bts->cell_barred) {
955 type_1->rach_control.cell_bar = 1;
956 type_2->rach_control.cell_bar = 1;
957 type_3->rach_control.cell_bar = 1;
958 type_4->rach_control.cell_bar = 1;
959 } else {
960 type_1->rach_control.cell_bar = 0;
961 type_2->rach_control.cell_bar = 0;
962 type_3->rach_control.cell_bar = 0;
963 type_4->rach_control.cell_bar = 0;
964 }
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +0200965}
966
967
968static void bootstrap_rsl(struct gsm_bts_trx *trx)
969{
970 fprintf(stdout, "bootstrapping RSL for BTS/TRX (%u/%u) "
971 "using MCC=%u MNC=%u BSIC=%u TSC=%u\n",
972 trx->bts->nr, trx->nr, bsc_gsmnet->country_code,
973 bsc_gsmnet->network_code, trx->bts->bsic, trx->bts->tsc);
974 patch_si_tables(trx->bts);
975 set_system_infos(trx);
976}
977
978void input_event(int event, enum e1inp_sign_type type, struct gsm_bts_trx *trx)
979{
980 switch (event) {
981 case EVT_E1_TEI_UP:
982 switch (type) {
983 case E1INP_SIGN_OML:
984 bootstrap_om(trx->bts);
985 break;
986 case E1INP_SIGN_RSL:
987 bootstrap_rsl(trx);
988 break;
989 default:
990 break;
991 }
992 break;
993 case EVT_E1_TEI_DN:
994 fprintf(stderr, "Lost some E1 TEI link\n");
995 /* FIXME: deal with TEI or L1 link loss */
996 break;
997 default:
998 break;
999 }
1000}
1001
1002static int bootstrap_bts(struct gsm_bts *bts)
1003{
Mike Habene2d82272009-10-02 12:19:34 +01001004 switch (bts->band) {
1005 case GSM_BAND_1800:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001006 if (bts->c0->arfcn < 512 || bts->c0->arfcn > 885) {
1007 fprintf(stderr, "GSM1800 channel must be between 512-885.\n");
1008 return -EINVAL;
1009 }
1010 break;
Mike Habene2d82272009-10-02 12:19:34 +01001011 case GSM_BAND_1900:
1012 if (bts->c0->arfcn < 512 || bts->c0->arfcn > 810) {
1013 fprintf(stderr, "GSM1900 channel must be between 512-810.\n");
1014 return -EINVAL;
1015 }
1016 break;
1017 case GSM_BAND_900:
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001018 if (bts->c0->arfcn < 1 || bts->c0->arfcn > 124) {
1019 fprintf(stderr, "GSM900 channel must be between 1-124.\n");
1020 return -EINVAL;
1021 }
1022 break;
Mike Habene2d82272009-10-02 12:19:34 +01001023 default:
1024 fprintf(stderr, "Unsupported frequency band.\n");
Holger Hans Peter Freyther8b457fb2009-08-17 06:55:10 +02001025 return -EINVAL;
1026 }
1027
1028 /* Control Channel Description */
1029 bts->chan_desc.att = 1;
1030 bts->chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;
1031 bts->chan_desc.bs_pa_mfrms = RSL_BS_PA_MFRMS_5;
1032 /* T3212 is set from vty/config */
1033
1034 paging_init(bts);
1035
1036 return 0;
1037}
1038
1039int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, int, void *),
1040 const char *config_file)
1041{
1042 struct gsm_bts *bts;
1043 int rc;
1044
1045 /* initialize our data structures */
1046 bsc_gsmnet = gsm_network_init(1, 1, mncc_recv);
1047 if (!bsc_gsmnet)
1048 return -ENOMEM;
1049
1050 bsc_gsmnet->name_long = talloc_strdup(bsc_gsmnet, "OpenBSC");
1051 bsc_gsmnet->name_short = talloc_strdup(bsc_gsmnet, "OpenBSC");
1052
1053 telnet_init(bsc_gsmnet, 4242);
1054 rc = vty_read_config_file(config_file);
1055 if (rc < 0) {
1056 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1057 return rc;
1058 }
1059
1060 register_signal_handler(SS_NM, nm_sig_cb, NULL);
1061
1062 llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {
1063 bootstrap_bts(bts);
1064 if (!is_ipaccess_bts(bts))
1065 rc = e1_reconfig_bts(bts);
1066
1067 if (rc < 0)
1068 exit (1);
1069 }
1070
1071 /* initialize nanoBTS support omce */
1072 rc = ipaccess_setup(bsc_gsmnet);
1073
1074 return 0;
1075}