bsc_vty: include dyn TS info in vty show lchan

Extend both 'show lchan <bts> <trx> <lchan>' and 'show lchan summary' to
include information on dynamic timeslots.

Have one common function that prints " as foo" or " switching foo -> bar" to
the vty, use it in lchan_dump_full_vty() and lchan_dump_short_vty().

In lchan_dump_short_vty(), split the vty_out call in two in order to interleave
the dyn ts info right after the pchan.

The summary hence looks e.g. like this for osmocom style dyn ts:

    BTS 0, TRX 0, Timeslot 5 TCH/F_TCH/H_PDCH as PDCH, Lchan 0, Type NONE, State ACTIVE - L1 MS Power: 0 dBm RXL-FULL-dl: -110 dBm RXL-FULL-ul: -110 dBm

or

    BTS 0, TRX 0, Timeslot 4 TCH/F_TCH/H_PDCH switching NONE -> PDCH, Lchan 0, Type NONE, State BROKEN UNUSABLE - L1 MS Power: 0 dBm RXL-FULL-dl: -110 dBm RXL-FULL-ul: -110 dBm

Change-Id: I3eb72ac7f0a520a8eefe171b9fb357f149aa3fda
This commit is contained in:
Neels Hofmeyr 2016-11-02 14:28:15 +01:00 committed by Harald Welte
parent 350f93e1e4
commit b748012d31
1 changed files with 53 additions and 3 deletions

View File

@ -1078,6 +1078,38 @@ static const struct value_string gsm48_cmode_names[] = {
{ 0, NULL }
};
/* call vty_out() to print a string like " as TCH/H" for dynamic timeslots.
* Don't do anything if the ts is not dynamic. */
static void vty_out_dyn_ts_status(struct vty *vty, struct gsm_bts_trx_ts *ts)
{
switch (ts->pchan) {
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
if (ts->dyn.pchan_is == ts->dyn.pchan_want)
vty_out(vty, " as %s",
gsm_pchan_name(ts->dyn.pchan_is));
else
vty_out(vty, " switching %s -> %s",
gsm_pchan_name(ts->dyn.pchan_is),
gsm_pchan_name(ts->dyn.pchan_want));
break;
case GSM_PCHAN_TCH_F_PDCH:
if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)
vty_out(vty, " as %s",
(ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
: "TCH/F");
else
vty_out(vty, " switching %s -> %s",
(ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
: "TCH/F",
(ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"
: "TCH/F");
break;
default:
/* no dyn ts */
break;
}
}
static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
{
int idx;
@ -1085,6 +1117,22 @@ static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan)
vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s",
lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE);
/* show dyn TS details, if applicable */
switch (lchan->ts->pchan) {
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
vty_out(vty, " Osmocom Dyn TS:");
vty_out_dyn_ts_status(vty, lchan->ts);
vty_out(vty, VTY_NEWLINE);
break;
case GSM_PCHAN_TCH_F_PDCH:
vty_out(vty, " IPACC Dyn PDCH TS:");
vty_out_dyn_ts_status(vty, lchan->ts);
vty_out(vty, VTY_NEWLINE);
break;
default:
/* no dyn ts */
break;
}
vty_out(vty, " Connection: %u, State: %s%s%s%s",
lchan->conn ? 1: 0,
gsm_lchans_name(lchan->state),
@ -1129,10 +1177,12 @@ static void lchan_dump_short_vty(struct vty *vty, struct gsm_lchan *lchan)
lchan->meas_rep_idx, 1);
mr = &lchan->meas_rep[idx];
vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s, Lchan %u, Type %s, State %s - "
"L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
vty_out(vty, "BTS %u, TRX %u, Timeslot %u %s",
lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,
gsm_pchan_name(lchan->ts->pchan),
gsm_pchan_name(lchan->ts->pchan));
vty_out_dyn_ts_status(vty, lchan->ts);
vty_out(vty, ", Lchan %u, Type %s, State %s - "
"L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",
lchan->nr,
gsm_lchant_name(lchan->type), gsm_lchans_name(lchan->state),
mr->ms_l1.pwr,