bsc: Allow to disable sending ping/pong to the MSC

Some switches do not like to receive the IPA PING/PONG messages.
Allow to disable the handling with "no timeout-ping" and create
test cases that verify the switching between the modes. Change the
code to trat <= 0 as an invalid timeout.

Fixes: SYS#713
This commit is contained in:
Holger Hans Peter Freyther 2014-10-29 10:06:15 +01:00
parent c73a5faec3
commit d2b37c5c4f
4 changed files with 73 additions and 8 deletions

View File

@ -167,7 +167,7 @@ static int complete_layer3(struct gsm_subscriber_connection *conn,
/* Advanced ping/pong handling */
if (osmo_timer_pending(&msc->pong_timer))
send_ping = 0;
if (msc->ping_timeout == 0)
if (msc->ping_timeout <= 0)
send_ping = 0;
if (send_ping && osmo_timer_remaining(&msc->ping_timer, NULL, &tv) == -1)
send_ping = 0;

View File

@ -346,7 +346,7 @@ static void schedule_ping_pong(struct osmo_msc_data *data)
static void msc_ping_timeout_cb(void *_data)
{
struct osmo_msc_data *data = (struct osmo_msc_data *) _data;
if (data->ping_timeout < 0)
if (data->ping_timeout <= 0)
return;
send_ping(data);

View File

@ -110,12 +110,17 @@ static void write_msc(struct vty *vty, struct osmo_msc_data *msc)
vty_out(vty, " core-mobile-country-code %d%s",
msc->core_mcc, VTY_NEWLINE);
vty_out(vty, " ip.access rtp-base %d%s", msc->rtp_base, VTY_NEWLINE);
vty_out(vty, " timeout-ping %d%s", msc->ping_timeout, VTY_NEWLINE);
vty_out(vty, " timeout-pong %d%s", msc->pong_timeout, VTY_NEWLINE);
if (msc->advanced_ping)
vty_out(vty, " timeout-ping advanced%s", VTY_NEWLINE);
else
vty_out(vty, " no timeout-ping advanced%s", VTY_NEWLINE);
if (msc->ping_timeout == -1)
vty_out(vty, " no timeout-ping%s", VTY_NEWLINE);
else {
vty_out(vty, " timeout-ping %d%s", msc->ping_timeout, VTY_NEWLINE);
vty_out(vty, " timeout-pong %d%s", msc->pong_timeout, VTY_NEWLINE);
if (msc->advanced_ping)
vty_out(vty, " timeout-ping advanced%s", VTY_NEWLINE);
else
vty_out(vty, " no timeout-ping advanced%s", VTY_NEWLINE);
}
if (msc->ussd_welcome_txt)
vty_out(vty, " bsc-welcome-text %s%s", msc->ussd_welcome_txt, VTY_NEWLINE);
@ -355,6 +360,16 @@ DEFUN(cfg_net_msc_no_dest,
return CMD_SUCCESS;
}
DEFUN(cfg_net_msc_no_ping_time,
cfg_net_msc_no_ping_time_cmd,
"no timeout-ping",
NO_STR "Disable the ping/pong handling on A-link\n")
{
struct osmo_msc_data *data = osmo_msc_data(vty);
data->ping_timeout = -1;
return CMD_SUCCESS;
}
DEFUN(cfg_net_msc_ping_time,
cfg_net_msc_ping_time_cmd,
"timeout-ping <1-2147483647>",
@ -382,6 +397,13 @@ DEFUN(cfg_net_msc_advanced_ping,
"Ping timeout handling\nEnable advanced mode during SCCP\n")
{
struct osmo_msc_data *data = osmo_msc_data(vty);
if (data->ping_timeout == -1) {
vty_out(vty, "%%ping handling is disabled. Enable it first.%s",
VTY_NEWLINE);
return CMD_WARNING;
}
data->advanced_ping = 1;
return CMD_SUCCESS;
}
@ -741,6 +763,7 @@ int bsc_vty_init_extra(void)
install_element(MSC_NODE, &cfg_net_bsc_codec_list_cmd);
install_element(MSC_NODE, &cfg_net_msc_dest_cmd);
install_element(MSC_NODE, &cfg_net_msc_no_dest_cmd);
install_element(MSC_NODE, &cfg_net_msc_no_ping_time_cmd);
install_element(MSC_NODE, &cfg_net_msc_ping_time_cmd);
install_element(MSC_NODE, &cfg_net_msc_pong_time_cmd);
install_element(MSC_NODE, &cfg_net_msc_advanced_ping_cmd);

View File

@ -419,6 +419,48 @@ class TestVTYBSC(TestVTYGenericBSC):
res = self.vty.command("show network")
self.assert_(res.startswith('BSC is on Country Code') >= 0)
def testPingPongConfiguration(self):
self.vty.enable()
self.vty.verify("configure terminal", [''])
self.vty.verify("network", [''])
self.vty.verify("msc 0", [''])
self.vty.verify("timeout-ping 12", [''])
self.vty.verify("timeout-pong 14", [''])
res = self.vty.command("show running-config")
self.assert_(res.find(" timeout-ping 12") > 0)
self.assert_(res.find(" timeout-pong 14") > 0)
self.assert_(res.find(" no timeout-ping advanced") > 0)
self.vty.verify("timeout-ping advanced", [''])
res = self.vty.command("show running-config")
self.assert_(res.find(" timeout-ping 12") > 0)
self.assert_(res.find(" timeout-pong 14") > 0)
self.assert_(res.find(" timeout-ping advanced") > 0)
self.vty.verify("no timeout-ping advanced", [''])
res = self.vty.command("show running-config")
self.assert_(res.find(" timeout-ping 12") > 0)
self.assert_(res.find(" timeout-pong 14") > 0)
self.assert_(res.find(" no timeout-ping advanced") > 0)
self.vty.verify("no timeout-ping", [''])
res = self.vty.command("show running-config")
self.assertEquals(res.find(" timeout-ping 12"), -1)
self.assertEquals(res.find(" timeout-pong 14"), -1)
self.assertEquals(res.find(" no timeout-ping advanced"), -1)
self.assert_(res.find(" no timeout-ping") > 0)
self.vty.verify("timeout-ping advanced", ['%ping handling is disabled. Enable it first.'])
# And back to enabling it
self.vty.verify("timeout-ping 12", [''])
self.vty.verify("timeout-pong 14", [''])
res = self.vty.command("show running-config")
self.assert_(res.find(" timeout-ping 12") > 0)
self.assert_(res.find(" timeout-pong 14") > 0)
self.assert_(res.find(" timeout-ping advanced") > 0)
class TestVTYNAT(TestVTYGenericBSC):
def vty_command(self):