nat/ussd: Add 'show ussd-connection' vty command
This command returns the current state of the connection to the USSD side channel provider. It shows whether a provider has been connected and authorized or not. Fixes: OW#953
This commit is contained in:
parent
deff65a9de
commit
4684eb64cc
|
@ -1155,6 +1155,18 @@ DEFUN(cfg_pgroup_no_lac, cfg_pgroup_no_lac_cmd,
|
|||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN(show_ussd_connection,
|
||||
show_ussd_connection_cmd,
|
||||
"show ussd-connection",
|
||||
SHOW_STR "USSD connection related information\n")
|
||||
{
|
||||
vty_out(vty, "The USSD side channel provider is %sconnected and %sauthorized.%s",
|
||||
_nat->ussd_con ? "" : "not ",
|
||||
_nat->ussd_con && _nat->ussd_con->authorized? "" : "not ",
|
||||
VTY_NEWLINE);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
int bsc_nat_vty_init(struct bsc_nat *nat)
|
||||
{
|
||||
_nat = nat;
|
||||
|
@ -1172,6 +1184,7 @@ int bsc_nat_vty_init(struct bsc_nat *nat)
|
|||
install_element_ve(&show_acc_lst_cmd);
|
||||
install_element_ve(&show_bar_lst_cmd);
|
||||
install_element_ve(&show_prefix_tree_cmd);
|
||||
install_element_ve(&show_ussd_connection_cmd);
|
||||
|
||||
install_element(ENABLE_NODE, &set_last_endp_cmd);
|
||||
install_element(ENABLE_NODE, &block_new_conn_cmd);
|
||||
|
|
|
@ -69,6 +69,20 @@ static void bsc_nat_ussd_destroy(struct bsc_nat_ussd_con *con)
|
|||
talloc_free(con);
|
||||
}
|
||||
|
||||
static void ussd_pong(struct bsc_nat_ussd_con *conn)
|
||||
{
|
||||
struct msgb *msg;
|
||||
|
||||
msg = msgb_alloc_headroom(4096, 128, "pong message");
|
||||
if (!msg) {
|
||||
LOGP(DNAT, LOGL_ERROR, "Failed to allocate pong msg\n");
|
||||
return;
|
||||
}
|
||||
|
||||
msgb_v_put(msg, IPAC_MSGT_PONG);
|
||||
bsc_do_write(&conn->queue, msg, IPAC_PROTO_IPACCESS);
|
||||
}
|
||||
|
||||
static int forward_sccp(struct bsc_nat *nat, struct msgb *msg)
|
||||
{
|
||||
struct nat_sccp_connection *con;
|
||||
|
@ -133,6 +147,11 @@ static int ussd_read_cb(struct osmo_fd *bfd)
|
|||
}
|
||||
if (TLVP_PRESENT(&tvp, IPAC_IDTAG_UNITNAME))
|
||||
ussd_auth_con(&tvp, conn);
|
||||
} else if (msg->l2h[0] == IPAC_MSGT_PING) {
|
||||
LOGP(DNAT, LOGL_DEBUG, "Got USSD ping request.\n");
|
||||
ussd_pong(conn);
|
||||
} else {
|
||||
LOGP(DNAT, LOGL_NOTICE, "Got unknown IPACCESS message 0x%02x.\n", msg->l2h[0]);
|
||||
}
|
||||
|
||||
msgb_free(msg);
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
import os
|
||||
import time
|
||||
import unittest
|
||||
import socket
|
||||
|
||||
import osmopy.obscvty as obscvty
|
||||
import osmopy.osmoutil as osmoutil
|
||||
|
@ -132,6 +133,54 @@ class TestVTYNAT(TestVTYBase):
|
|||
res = self.vty.command("show prefix-tree")
|
||||
self.assertEqual(res, "% there is now prefix tree loaded.")
|
||||
|
||||
def testUssdSideChannelProvider(self):
|
||||
self.vty.command("end")
|
||||
self.vty.enable()
|
||||
self.vty.command("configure terminal")
|
||||
self.vty.command("nat")
|
||||
self.vty.command("ussd-token key")
|
||||
self.vty.command("end")
|
||||
|
||||
res = self.vty.verify("show ussd-connection", ['The USSD side channel provider is not connected and not authorized.'])
|
||||
self.assertTrue(res)
|
||||
|
||||
ussdSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ussdSocket.connect(('127.0.0.1', 5001))
|
||||
ussdSocket.settimeout(2.0)
|
||||
print "Connected to %s:%d" % ussdSocket.getpeername()
|
||||
|
||||
print "Expecting ID_GET request"
|
||||
data = ussdSocket.recv(4)
|
||||
self.assertEqual(data, "\x00\x01\xfe\x04")
|
||||
|
||||
print "Going to send ID_RESP response"
|
||||
res = ussdSocket.send("\x00\x07\xfe\x05\x00\x04\x01\x6b\x65\x79")
|
||||
self.assertEqual(res, 10)
|
||||
|
||||
# initiating PING/PONG cycle to know, that the ID_RESP message has been processed
|
||||
|
||||
print "Going to send PING request"
|
||||
res = ussdSocket.send("\x00\x01\xfe\x00")
|
||||
self.assertEqual(res, 4)
|
||||
|
||||
print "Expecting PONG response"
|
||||
data = ussdSocket.recv(4)
|
||||
self.assertEqual(data, "\x00\x01\xfe\x01")
|
||||
|
||||
res = self.vty.verify("show ussd-connection", ['The USSD side channel provider is connected and authorized.'])
|
||||
self.assertTrue(res)
|
||||
|
||||
print "Going to shut down connection"
|
||||
ussdSocket.shutdown(socket.SHUT_WR)
|
||||
|
||||
print "Expecting EOF"
|
||||
data = ussdSocket.recv(4)
|
||||
self.assertEqual(data, "")
|
||||
|
||||
ussdSocket.close()
|
||||
|
||||
res = self.vty.verify("show ussd-connection", ['The USSD side channel provider is not connected and not authorized.'])
|
||||
self.assertTrue(res)
|
||||
|
||||
def add_nat_test(suite, workdir):
|
||||
if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")):
|
||||
|
|
Loading…
Reference in New Issue