From: Holger Hans Peter Freyther <zecke(a)selfish.org>
The iPhone5 (US) appears to have some issues with the SIs generated,
or the nanoBTS is not sending them correctly.
Add a configurable hack to put all bands into the SI2/SI5 message.
It is enabled by the bts VTY command 'force-combined-si'.
This is a quick change without much reflection and watching for side
effects. I have verfied that a network with ARFCN 134 and neighbors
ARFCN 130 and 512 do not get generate the SI2ter and announce everything
inside the SI2.
This patch is based on 'si: Add a hack to disable
SI2ter/SI2bis/SI5ter/SI5bis messages'.
Ticket: OW#1062
Sponsored-by: On-Waves ehf
---
openbsc/include/openbsc/gsm_data_shared.h | 3 +++
openbsc/src/libbsc/bsc_vty.c | 27 +++++++++++++++++++++++++++
openbsc/src/libbsc/system_information.c | 3 +++
openbsc/tests/vty_test_runner.py | 18 ++++++++++++++++++
4 files changed, 51 insertions(+)
diff --git a/openbsc/include/openbsc/gsm_data_shared.h
b/openbsc/include/openbsc/gsm_data_shared.h
index b49a539..0922f78 100644
--- a/openbsc/include/openbsc/gsm_data_shared.h
+++ b/openbsc/include/openbsc/gsm_data_shared.h
@@ -670,6 +670,9 @@ struct gsm_bts {
int num_trx;
struct llist_head trx_list;
+ /* SI compatibility hacks */
+ int force_combined_si;
+
#ifdef ROLE_BSC
/* Abis NM queue */
struct llist_head abis_queue;
diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c
index 7fa5ea7..4d09e15 100644
--- a/openbsc/src/libbsc/bsc_vty.c
+++ b/openbsc/src/libbsc/bsc_vty.c
@@ -636,6 +636,9 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts
*bts)
if (bts->excl_from_rf_lock)
vty_out(vty, " rf-lock-exclude%s", VTY_NEWLINE);
+ vty_out(vty, " %sforce-combined-si%s",
+ bts->force_combined_si ? "" : "no ", VTY_NEWLINE);
+
config_write_bts_model(vty, bts);
}
@@ -2658,6 +2661,28 @@ DEFUN(cfg_bts_no_excl_rf_lock,
return CMD_SUCCESS;
}
+#define FORCE_COMB_SI_STR "Force the generation of a single SI (no ter/bis)\n"
+
+DEFUN(cfg_bts_force_comb_si,
+ cfg_bts_force_comb_si_cmd,
+ "force-combined-si",
+ FORCE_COMB_SI_STR)
+{
+ struct gsm_bts *bts = vty->index;
+ bts->force_combined_si = 1;
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_bts_no_force_comb_si,
+ cfg_bts_no_force_comb_si_cmd,
+ "no force-combined-si",
+ NO_STR FORCE_COMB_SI_STR)
+{
+ struct gsm_bts *bts = vty->index;
+ bts->force_combined_si = 0;
+ return CMD_SUCCESS;
+}
+
#define TRX_TEXT "Radio Transceiver\n"
/* per TRX configuration */
@@ -3255,6 +3280,8 @@ int bsc_vty_init(const struct log_info *cat)
install_element(BTS_NODE, &cfg_bts_si5_neigh_cmd);
install_element(BTS_NODE, &cfg_bts_excl_rf_lock_cmd);
install_element(BTS_NODE, &cfg_bts_no_excl_rf_lock_cmd);
+ install_element(BTS_NODE, &cfg_bts_force_comb_si_cmd);
+ install_element(BTS_NODE, &cfg_bts_no_force_comb_si_cmd);
install_element(BTS_NODE, &cfg_trx_cmd);
install_node(&trx_node, dummy_config_write);
diff --git a/openbsc/src/libbsc/system_information.c
b/openbsc/src/libbsc/system_information.c
index c901a4a..5f46bf9 100644
--- a/openbsc/src/libbsc/system_information.c
+++ b/openbsc/src/libbsc/system_information.c
@@ -72,6 +72,9 @@ static int use_arfcn(const struct gsm_bts *bts, const int bis, const int
ter,
{
if (!bis && !ter && band_compatible(bts, arfcn))
return 1;
+ if (bts->force_combined_si)
+ return 0;
+ /* Correct but somehow broken with either the nanoBTS or the iPhone5 */
if (bis && pgsm && band_compatible(bts, arfcn) && (arfcn < 1
|| arfcn > 124))
return 1;
if (ter && !band_compatible(bts, arfcn))
diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py
index 16eb213..47e1ad1 100644
--- a/openbsc/tests/vty_test_runner.py
+++ b/openbsc/tests/vty_test_runner.py
@@ -173,6 +173,24 @@ class TestVTYNITB(TestVTYGenericBSC):
self.assertEquals(res.find('periodic location update 60'), -1)
self.assert_(res.find('no periodic location update') > 0)
+ def testEnableDisableSiHacks(self):
+ self.vty.enable()
+ self.vty.command("configure terminal")
+ self.vty.command("network")
+ self.vty.command("bts 0")
+
+ # Enable periodic lu..
+ self.vty.verify("force-combined-si", [''])
+ res = self.vty.command("write terminal")
+ self.assert_(res.find(' force-combined-si') > 0)
+ self.assertEquals(res.find('no force-combined-si'), -1)
+
+ # Now disable it..
+ self.vty.verify("no force-combined-si", [''])
+ res = self.vty.command("write terminal")
+ self.assertEquals(res.find(' force-combined-si'), -1)
+ self.assert_(res.find('no force-combined-si') > 0)
+
def testRachAccessControlClass(self):
self.vty.enable()
self.vty.command("configure terminal")
--
1.7.9.5