diff options
author | Harald Welte <laforge@gnumonks.org> | 2018-01-24 16:48:17 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-02-09 02:20:47 +0100 |
commit | 66a301e65d6d1379de1e7ab0963b94ab335e3668 (patch) | |
tree | 6e4047ddba0effa4a609168d4dc6053667f9d6f5 | |
parent | 4c5737776647b421daac7602ffb2ae0a187003c1 (diff) |
VTY: Add 'show connections' and 'show transactions' commands
It is quite important to have some way of runtime state introspection
about the major objects inside osmo-msc. This patch adds some basic
capabilities to dump the most important information about
subscriber_connections and transactions (like calls/sms).
OsmoMSC> show connection
--ConnId ------------Subscriber RAN --LAC Use --Tokens CSA A5 State
00000001 IMSI:26242000000006 A 23 1 00000004 --- /0 SUBSCR_CONN_S_COMMUNICATING
Change-Id: I1c457c1eac20188f67b8379a36cfda3a085fcef4
-rw-r--r-- | src/libmsc/vty_interface_layer3.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/libmsc/vty_interface_layer3.c b/src/libmsc/vty_interface_layer3.c index fb6d32ac4..9a3ff019a 100644 --- a/src/libmsc/vty_interface_layer3.c +++ b/src/libmsc/vty_interface_layer3.c @@ -48,6 +48,7 @@ #include <osmocom/msc/sms_queue.h> #include <osmocom/msc/mncc_int.h> #include <osmocom/msc/vlr.h> +#include <osmocom/msc/transaction.h> #include <osmocom/vty/logging.h> @@ -55,8 +56,102 @@ extern struct gsm_network *gsmnet_from_vty(struct vty *v); +static void vty_conn_hdr(struct vty *vty) +{ + vty_out(vty, "--ConnId ------------Subscriber RAN --LAC Use --Tokens CSA A5 State%s", + VTY_NEWLINE); +} + +static void vty_dump_one_conn(struct vty *vty, const struct gsm_subscriber_connection *conn) +{ + vty_out(vty, "%08x %22s %3s %5u %3u %08x %c%c%c /%1u %27s %s", + conn->a.conn_id, + conn->vsub ? vlr_subscr_name(conn->vsub) : "-", + conn->via_ran == RAN_UTRAN_IU ? "Iu" : "A", + conn->lac, + conn->use_count, + conn->use_tokens, + conn->received_cm_service_request ? 'C' : '-', + conn->sec_operation ? 'S' : '-', + conn->anch_operation ? 'A' : '-', + conn->encr.alg_id, + conn->conn_fsm ? osmo_fsm_inst_state_name(conn->conn_fsm) : "-", + VTY_NEWLINE); +} + +DEFUN(show_msc_conn, show_msc_conn_cmd, + "show connection", SHOW_STR "Subscriber Connections\n") +{ + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_subscriber_connection *conn; + + vty_conn_hdr(vty); + llist_for_each_entry(conn, &gsmnet->subscr_conns, entry) + vty_dump_one_conn(vty, conn); + + return CMD_SUCCESS; +} + +static void vty_trans_hdr(struct vty *vty) +{ + vty_out(vty, "------------Subscriber --ConnId -P TI -CallRef Proto%s", + VTY_NEWLINE); +} + +static const char *get_trans_proto_str(const struct gsm_trans *trans) +{ + static char buf[256]; + + switch (trans->protocol) { + case GSM48_PDISC_CC: + snprintf(buf, sizeof(buf), "%s %4u %4u", + gsm48_cc_state_name(trans->cc.state), + trans->cc.Tcurrent, + trans->cc.T308_second); + break; + case GSM48_PDISC_SMS: + snprintf(buf, sizeof(buf), "%s %s", + gsm411_cp_state_name(trans->sms.smc_inst.cp_state), + gsm411_rp_state_name(trans->sms.smr_inst.rp_state)); + break; + default: + buf[0] = '\0'; + break; + } + + return buf; +} + +static void vty_dump_one_trans(struct vty *vty, const struct gsm_trans *trans) +{ + vty_out(vty, "%22s %08x %s %02u %08x %s%s", + trans->vsub ? vlr_subscr_name(trans->vsub) : "-", + trans->conn ? trans->conn->a.conn_id : 0, + gsm48_pdisc_name(trans->protocol), + trans->transaction_id, + trans->callref, + get_trans_proto_str(trans), VTY_NEWLINE); +} + +DEFUN(show_msc_transaction, show_msc_transaction_cmd, + "show transaction", SHOW_STR "Transactions\n") +{ + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_trans *trans; + + vty_trans_hdr(vty); + llist_for_each_entry(trans, &gsmnet->trans_list, entry) + vty_dump_one_trans(vty, trans); + + return CMD_SUCCESS; +} + + + static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub) { + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_trans *trans; int reqs; struct llist_head *entry; @@ -110,6 +205,21 @@ static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub) vty_out(vty, " Paging: %s paging for %d requests%s", vsub->cs.is_paging ? "is" : "not", reqs, VTY_NEWLINE); vty_out(vty, " Use count: %u%s", vsub->use_count, VTY_NEWLINE); + + /* Connection */ + if (vsub->msc_conn_ref) { + struct gsm_subscriber_connection *conn = vsub->msc_conn_ref; + vty_conn_hdr(vty); + vty_dump_one_conn(vty, conn); + } + + /* Transactions */ + vty_trans_hdr(vty); + llist_for_each_entry(trans, &gsmnet->trans_list, entry) { + if (trans->vsub != vsub) + continue; + vty_dump_one_trans(vty, trans); + } } @@ -897,6 +1007,8 @@ int bsc_vty_init_extra(void) install_element_ve(&show_subscr_cmd); install_element_ve(&show_subscr_cache_cmd); + install_element_ve(&show_msc_conn_cmd); + install_element_ve(&show_msc_transaction_cmd); install_element_ve(&sms_send_pend_cmd); install_element_ve(&sms_delete_expired_cmd); |