Fix MS TO measurement representation

* set proper flag when saving MS Timing Offset
* use gsm_subscriber's IMSI or lchan's name if bsc_subscriber is unknown
* add comments with spec reference
* store/display MS Timing Offset instead of raw Timing Offset field from
  RSL
* Compute MS Timing Offset [-63; 192] from Timing Offset field [0; 255],
  adjust structure gsm_meas_rep with proper type to store it

Change-Id: I7e003d23a6edb714c5f17688fd6a8edac131161d
Related: OS#1574
This commit is contained in:
Max 2017-04-20 13:07:58 +02:00
parent 7636c0833b
commit 11e4e41ffc
6 changed files with 22 additions and 13 deletions

View File

@ -39,7 +39,8 @@ struct gsm_meas_rep {
struct gsm_meas_rep_unidir dl;
uint8_t bs_power;
uint8_t ms_timing_offset;
/* according to 3GPP TS 48.058 § MS Timing Offset [-63; 192] */
int16_t ms_timing_offset;
struct {
int8_t pwr; /* MS power in dBm */
uint8_t ta; /* MS timing advance */

View File

@ -41,6 +41,7 @@
#include <openbsc/signal.h>
#include <openbsc/meas_rep.h>
#include <openbsc/rtp_proxy.h>
#include <openbsc/gsm_subscriber.h>
#include <osmocom/abis/e1_input.h>
#include <osmocom/gsm/rsl.h>
#include <osmocom/core/talloc.h>
@ -1369,8 +1370,14 @@ static void print_meas_rep(struct gsm_lchan *lchan, struct gsm_meas_rep *mr)
int i;
const char *name = "";
if (lchan && lchan->conn)
name = bsc_subscr_name(lchan->conn->bsub);
if (lchan && lchan->conn) {
if (lchan->conn->bsub)
name = bsc_subscr_name(lchan->conn->bsub);
else if (lchan->conn->subscr)
name = lchan->conn->subscr->imsi;
else
name = lchan->name;
}
DEBUGP(DMEAS, "[%s] MEASUREMENT RESULT NR=%d ", name, mr->nr);
@ -1379,6 +1386,7 @@ static void print_meas_rep(struct gsm_lchan *lchan, struct gsm_meas_rep *mr)
print_meas_rep_uni(&mr->ul, "ul");
DEBUGPC(DMEAS, "BS_POWER=%d ", mr->bs_power);
if (mr->flags & MEAS_REP_F_MS_TO)
DEBUGPC(DMEAS, "MS_TO=%d ", mr->ms_timing_offset);
@ -1452,9 +1460,11 @@ static int rsl_rx_meas_res(struct msgb *msg)
mr->bs_power = *TLVP_VAL(&tp, RSL_IE_BS_POWER);
/* Optional Parts */
if (TLVP_PRESENT(&tp, RSL_IE_MS_TIMING_OFFSET))
mr->ms_timing_offset =
*TLVP_VAL(&tp, RSL_IE_MS_TIMING_OFFSET);
if (TLVP_PRESENT(&tp, RSL_IE_MS_TIMING_OFFSET)) {
/* According to 3GPP TS 48.058 § MS Timing Offset = Timing Offset field - 63 */
mr->ms_timing_offset = *TLVP_VAL(&tp, RSL_IE_MS_TIMING_OFFSET) - 63;
mr->flags |= MEAS_REP_F_MS_TO;
}
if (TLVP_PRESENT(&tp, RSL_IE_L1_INFO)) {
struct e1inp_sign_link *sign_link = msg->dst;

View File

@ -1062,8 +1062,7 @@ static void meas_rep_dump_vty(struct vty *vty, struct gsm_meas_rep *mr,
mr->flags & MEAS_REP_F_DL_VALID ? " " : "DLinval ",
VTY_NEWLINE);
if (mr->flags & MEAS_REP_F_MS_TO)
vty_out(vty, "%s MS Timing Offset: %u%s", prefix,
mr->ms_timing_offset, VTY_NEWLINE);
vty_out(vty, "%s MS Timing Offset: %d%s", prefix, mr->ms_timing_offset, VTY_NEWLINE);
if (mr->flags & MEAS_REP_F_MS_L1)
vty_out(vty, "%s L1 MS Power: %u dBm, Timing Advance: %u%s",
prefix, mr->ms_l1.pwr, mr->ms_l1.ta, VTY_NEWLINE);

View File

@ -437,8 +437,8 @@ static void append_osmo_tlvs(tlv_t **req_tlv, const struct gsm_lchan *lchan)
append_tlv_u8(req_tlv, TLVID_osmo_ta, mr->ms_l1.ta);
ms_dbm = ms_pwr_dbm(lchan->ts->trx->bts->band, mr->ms_l1.pwr);
append_tlv_u8(req_tlv, TLVID_osmo_ms_l1_txpwr, ms_dbm);
} else if (mr->flags & MEAS_REP_F_MS_TO)
append_tlv_u8(req_tlv, TLVID_osmo_ta, mr->ms_timing_offset);
} else if (mr->flags & MEAS_REP_F_MS_TO) /* Save Timing Offset field = MS Timing Offset + 63 */
append_tlv_u8(req_tlv, TLVID_osmo_ta, mr->ms_timing_offset + 63);
append_tlv_u16(req_tlv, TLVID_osmo_rxlev_ul,
rxlev2dbm(ul_meas->full.rx_lev));

View File

@ -114,8 +114,7 @@ int meas_db_insert(struct meas_db_state *st, const char *imsi,
SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 6, mr->bs_power));
if (mr->flags & MEAS_REP_F_MS_TO)
SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 7,
mr->ms_timing_offset));
SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 7, mr->ms_timing_offset));
else
SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 7));

View File

@ -200,7 +200,7 @@ void write_uni(struct ms_state *ms, struct ms_state_uni *msu,
COLS-40, rxlev2dbm(lq->rx_lev), -110, -47,
1, 2, FALSE, FALSE);
//IsVisibleObj(ms->ul.cdk) = FALSE;
snprintf(msu->label, sizeof(msu->label), "</%d>%1d<!%d> %3d %2u %2u %4u",
snprintf(msu->label, sizeof(msu->label), "</%d>%1d<!%d> %3d %2u %2d %4u",
qual_col, lq->rx_qual, qual_col, pwr,
ms->mr.ms_l1.ta, ms->mr.ms_timing_offset,
now - msu->last_update);