From c4a49e3e2dca893e52f9432b378fae645386575e Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Fri, 21 Aug 2009 14:44:12 +0200 Subject: [PATCH] [bsc] Store the cell_identity in gsm_bts and set it on the SI3 and SI6 Transfering the cell_identity from BSC to MSC is required for the on-waves.com support. Allow to set the cell_identity in the cfg file and patch the system information tables to set it. --- openbsc/include/openbsc/gsm_04_08.h | 2 +- openbsc/include/openbsc/gsm_data.h | 2 ++ openbsc/src/bsc_init.c | 4 ++++ openbsc/src/openbsc.cfg.1-1 | 1 + openbsc/src/openbsc.cfg.1-2 | 1 + openbsc/src/openbsc.cfg.2-2 | 1 + openbsc/src/vty_interface.c | 23 ++++++++++++++++++++++- 7 files changed, 32 insertions(+), 2 deletions(-) diff --git a/openbsc/include/openbsc/gsm_04_08.h b/openbsc/include/openbsc/gsm_04_08.h index acca100e0..96e12c6cc 100644 --- a/openbsc/include/openbsc/gsm_04_08.h +++ b/openbsc/include/openbsc/gsm_04_08.h @@ -203,7 +203,7 @@ struct gsm48_system_information_type_6 { u_int8_t rr_protocol_discriminator :4, skip_indicator:4; u_int8_t system_information; - u_int8_t cell_identity[2]; + u_int16_t cell_identity; struct gsm48_loc_area_id lai; u_int8_t cell_options; u_int8_t ncc_permitted; diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 1ceb105df..918f30715 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -298,6 +298,8 @@ struct gsm_bts { struct gsm_network *network; /* number of ths BTS in network */ u_int8_t nr; + /* Cell Identity */ + u_int16_t cell_identity; /* location area code of this BTS */ u_int8_t location_area_code; /* Training Sequence Code */ diff --git a/openbsc/src/bsc_init.c b/openbsc/src/bsc_init.c index 9fff4feed..c626415d3 100644 --- a/openbsc/src/bsc_init.c +++ b/openbsc/src/bsc_init.c @@ -916,6 +916,10 @@ static void patch_si_tables(struct gsm_bts *bts) type_4->lai = lai; type_6->lai = lai; + /* set the CI */ + type_3->cell_identity = htons(bts->cell_identity); + type_6->cell_identity = htons(bts->cell_identity); + type_4->data[2] &= 0xf0; type_4->data[2] |= arfcn_high; type_4->data[3] = arfcn_low; diff --git a/openbsc/src/openbsc.cfg.1-1 b/openbsc/src/openbsc.cfg.1-1 index acd6681dc..a8331ddbd 100644 --- a/openbsc/src/openbsc.cfg.1-1 +++ b/openbsc/src/openbsc.cfg.1-1 @@ -14,6 +14,7 @@ network bts 0 type bs11 band GSM900 + cell_identity 1 location_area_code 1 training_sequence_code 7 base_station_id_code 63 diff --git a/openbsc/src/openbsc.cfg.1-2 b/openbsc/src/openbsc.cfg.1-2 index 6bb6522df..10aa7b48b 100644 --- a/openbsc/src/openbsc.cfg.1-2 +++ b/openbsc/src/openbsc.cfg.1-2 @@ -14,6 +14,7 @@ network bts 0 type bs11 band GSM900 + cell_identity 1 location_area_code 1 training_sequence_code 7 base_station_id_code 63 diff --git a/openbsc/src/openbsc.cfg.2-2 b/openbsc/src/openbsc.cfg.2-2 index 461f8e921..0dd9d9b5d 100644 --- a/openbsc/src/openbsc.cfg.2-2 +++ b/openbsc/src/openbsc.cfg.2-2 @@ -14,6 +14,7 @@ network bts 0 type bs11 band GSM900 + cell_identity 1 location_area_code 1 training_sequence_code 7 base_station_id_code 63 diff --git a/openbsc/src/vty_interface.c b/openbsc/src/vty_interface.c index 00decd2b5..b6a9deaba 100644 --- a/openbsc/src/vty_interface.c +++ b/openbsc/src/vty_interface.c @@ -118,9 +118,10 @@ static void e1isl_dump_vty(struct vty *vty, struct e1inp_sign_link *e1l) static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts) { - vty_out(vty, "BTS %u is of %s type in band %s, has LAC %u, " + vty_out(vty, "BTS %u is of %s type in band %s, has CI %u LAC %u, " "BSIC %u, TSC %u and %u TRX%s", bts->nr, btstype2str(bts->type), gsm_band_name(bts->band), + bts->cell_identity, bts->location_area_code, bts->bsic, bts->tsc, bts->num_trx, VTY_NEWLINE); if (bts->cell_barred) @@ -223,6 +224,7 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts) vty_out(vty, " bts %u%s", bts->nr, VTY_NEWLINE); vty_out(vty, " type %s%s", btstype2str(bts->type), VTY_NEWLINE); vty_out(vty, " band %s%s", gsm_band_name(bts->band), VTY_NEWLINE); + vty_out(vty, " cell_identity %u%s", bts->cell_identity, VTY_NEWLINE); vty_out(vty, " location_area_code %u%s", bts->location_area_code, VTY_NEWLINE); vty_out(vty, " training_sequence_code %u%s", bts->tsc, VTY_NEWLINE); @@ -839,6 +841,24 @@ DEFUN(cfg_bts_band, return CMD_SUCCESS; } +DEFUN(cfg_bts_ci, + cfg_bts_ci_cmd, + "cell_identity <0-65535>", + "Set the Cell identity of this BTS\n") +{ + struct gsm_bts *bts = vty->index; + int ci = atoi(argv[0]); + + if (ci < 0 || ci > 0xffff) { + vty_out(vty, "%% CI %d is not in the valid range (0-65535)%s", + ci, VTY_NEWLINE); + return CMD_WARNING; + } + bts->cell_identity = ci; + + return CMD_SUCCESS; +} + DEFUN(cfg_bts_lac, cfg_bts_lac_cmd, "location_area_code <0-255>", @@ -1175,6 +1195,7 @@ int bsc_vty_init(struct gsm_network *net) install_default(BTS_NODE); install_element(BTS_NODE, &cfg_bts_type_cmd); install_element(BTS_NODE, &cfg_bts_band_cmd); + install_element(BTS_NODE, &cfg_bts_ci_cmd); install_element(BTS_NODE, &cfg_bts_lac_cmd); install_element(BTS_NODE, &cfg_bts_tsc_cmd); install_element(BTS_NODE, &cfg_bts_bsic_cmd);