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
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
index 6ab48d6..36a46f2 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat_vty.c
@@ -1155,6 +1155,18 @@
 	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 @@
 	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);
diff --git a/openbsc/src/osmo-bsc_nat/bsc_ussd.c b/openbsc/src/osmo-bsc_nat/bsc_ussd.c
index f7753fb..d422f9e 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_ussd.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_ussd.c
@@ -69,6 +69,20 @@
 	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 @@
 			}
 			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);