From fbead4327188b5e087261a84daeb560fe05a172f Mon Sep 17 00:00:00 2001 From: Michael Iedema Date: Mon, 27 Feb 2023 05:26:53 -0800 Subject: [PATCH] utils: store more fields from meas-feed in db More fields need to be captured from meas-feed to perform meaningful analysis of data from multi-bts and multi-trx systems. This patch adds expands the existing db utils to record nearly all available fields from meas-feed. Change-Id: I509c939524b11a4ee455bcfc3ebee6c5c35b9fba --- src/utils/meas_db.c | 94 +++++++++++++++++++++++++--------------- src/utils/meas_db.h | 6 +-- src/utils/meas_pcap2db.c | 10 +---- src/utils/meas_udp2db.c | 9 +--- 4 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/utils/meas_db.c b/src/utils/meas_db.c index bf3a0939e..1b4f1f3ef 100644 --- a/src/utils/meas_db.c +++ b/src/utils/meas_db.c @@ -29,10 +29,11 @@ #include #include #include +#include #include "meas_db.h" -#define INS_MR "INSERT INTO meas_rep (time, imsi, name, scenario, nr, bs_power, ms_timing_offset, fpc, ms_l1_pwr, ms_l1_ta) VALUES (?,?,?,?,?,?,?,?,?,?)" +#define INS_MR "INSERT INTO meas_rep (time, bts_nr, trx_nr, ts_nr, ss_nr, lchan_type, pchan_type, imsi, name, scenario, nr, bs_power, ms_timing_offset, fpc, ms_l1_pwr, ms_l1_ta) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" #define INS_UD "INSERT INTO meas_rep_unidir (meas_id, rx_lev_full, rx_lev_sub, rx_qual_full, rx_qual_sub, dtx, uplink) VALUES (?,?,?,?,?,?,?)" #define UPD_MR "UPDATE meas_rep SET ul_unidir=?, dl_unidir=? WHERE id=?" @@ -79,52 +80,57 @@ err_io: } /* insert a measurement report into the database */ -int meas_db_insert(struct meas_db_state *st, const char *imsi, - const char *name, unsigned long timestamp, - const char *scenario, - const struct gsm_meas_rep *mr) +int meas_db_insert(struct meas_db_state *st, unsigned long timestamp, + const struct meas_feed_meas *mfm) { sqlite3_int64 rowid, ul_rowid, dl_rowid; SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 1, timestamp)); - if (imsi) - SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 2, - imsi, -1, SQLITE_STATIC)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 2, mfm->bts_nr)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 3, mfm->trx_nr)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 4, mfm->ts_nr)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 5, mfm->ss_nr)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 6, mfm->lchan_type)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 7, mfm->pchan_type)); + + if (mfm->imsi) + SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 8, + mfm->imsi, -1, SQLITE_STATIC)); else - SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 2)); + SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 8)); - if (name) - SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 3, - name, -1, SQLITE_STATIC)); + if (mfm->name) + SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 9, + mfm->name, -1, SQLITE_STATIC)); else - SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 3)); + SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 9)); - if (scenario) - SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 4, - scenario, -1, SQLITE_STATIC)); + if (mfm->scenario) + SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 10, + mfm->scenario, -1, SQLITE_STATIC)); else - SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 4)); + SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 10)); - SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 5, mr->nr)); - SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 6, mr->bs_power_db / 2)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 11, mfm->mr.nr)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 12, mfm->mr.bs_power_db / 2)); - if (mr->flags & MEAS_REP_F_MS_TO) - SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 7, mr->ms_timing_offset)); + if (mfm->mr.flags & MEAS_REP_F_MS_TO) + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 13, mfm->mr.ms_timing_offset)); else - SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 7)); + SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 13)); - if (mr->flags & MEAS_REP_F_FPC) - SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 8, 1)); + if (mfm->mr.flags & MEAS_REP_F_FPC) + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 14, 1)); else - SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 8, 0)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 14, 0)); - if (mr->flags & MEAS_REP_F_MS_L1) { - SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 9, - mr->ms_l1.pwr)); - SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 10, - mr->ms_l1.ta)); + if (mfm->mr.flags & MEAS_REP_F_MS_L1) { + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 15, + mfm->mr.ms_l1.pwr)); + SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 16, + mfm->mr.ms_l1.ta)); } SCK_DONE(st->db, sqlite3_step(st->stmt_ins_mr)); @@ -133,14 +139,14 @@ int meas_db_insert(struct meas_db_state *st, const char *imsi, rowid = sqlite3_last_insert_rowid(st->db); /* insert uplink measurement */ - ul_rowid = _insert_ud(st, rowid, mr->flags & MEAS_REP_F_UL_DTX, - 1, &mr->ul); + ul_rowid = _insert_ud(st, rowid, mfm->mr.flags & MEAS_REP_F_UL_DTX, + 1, &mfm->mr.ul); SCK_OK(st->db, sqlite3_bind_int(st->stmt_upd_mr, 1, ul_rowid)); /* insert downlink measurement, if present */ - if (mr->flags & MEAS_REP_F_DL_VALID) { - dl_rowid = _insert_ud(st, rowid, mr->flags & MEAS_REP_F_DL_DTX, - 0, &mr->dl); + if (mfm->mr.flags & MEAS_REP_F_DL_VALID) { + dl_rowid = _insert_ud(st, rowid, mfm->mr.flags & MEAS_REP_F_DL_DTX, + 0, &mfm->mr.dl); SCK_OK(st->db, sqlite3_bind_int(st->stmt_upd_mr, 2, dl_rowid)); } else SCK_OK(st->db, sqlite3_bind_null(st->stmt_upd_mr, 2)); @@ -181,6 +187,12 @@ static const char *create_stmts[] = { "CREATE TABLE IF NOT EXISTS meas_rep (" "id INTEGER PRIMARY KEY AUTOINCREMENT," "time TIMESTAMP," + "bts_nr INTEGER," + "trx_nr INTEGER," + "ts_nr INTEGER," + "ss_nr INTEGER," + "lchan_type INTEGER," + "pchan_type INTEGER," "imsi TEXT," "name TEXT," "scenario TEXT," @@ -207,6 +219,12 @@ static const char *create_stmts[] = { "SELECT " "meas_rep.id, " "datetime(time,'unixepoch') AS timestamp, " + "bts_nr," + "trx_nr," + "ts_nr," + "ss_nr," + "lchan_type," + "pchan_type," "imsi, " "name, " "scenario, " @@ -238,6 +256,12 @@ static const char *create_stmts[] = { "SELECT " "id," "timestamp," + "bts_nr," + "trx_nr," + "ts_nr," + "ss_nr," + "lchan_type," + "pchan_type," "imsi," "name," "scenario," diff --git a/src/utils/meas_db.h b/src/utils/meas_db.h index 889e9022f..8f8a8c679 100644 --- a/src/utils/meas_db.h +++ b/src/utils/meas_db.h @@ -9,9 +9,7 @@ void meas_db_close(struct meas_db_state *st); int meas_db_begin(struct meas_db_state *st); int meas_db_commit(struct meas_db_state *st); -int meas_db_insert(struct meas_db_state *st, const char *imsi, - const char *name, unsigned long timestamp, - const char *scenario, - const struct gsm_meas_rep *mr); +int meas_db_insert(struct meas_db_state *st, unsigned long timestamp, + const struct meas_feed_meas *mfm); #endif diff --git a/src/utils/meas_pcap2db.c b/src/utils/meas_pcap2db.c index d784ca75d..eb69d506c 100644 --- a/src/utils/meas_pcap2db.c +++ b/src/utils/meas_pcap2db.c @@ -47,15 +47,7 @@ static struct meas_db_state *db; static void handle_mfm(const struct pcap_pkthdr *h, const struct meas_feed_meas *mfm) { - const char *scenario; - - if (strlen(mfm->scenario)) - scenario = mfm->scenario; - else - scenario = NULL; - - meas_db_insert(db, mfm->imsi, mfm->name, h->ts.tv_sec, - scenario, &mfm->mr); + meas_db_insert(db, h->ts.tv_sec, mfm); } static void pcap_cb(u_char *user, const struct pcap_pkthdr *h, diff --git a/src/utils/meas_udp2db.c b/src/utils/meas_udp2db.c index 07023c323..f40f13702 100644 --- a/src/utils/meas_udp2db.c +++ b/src/utils/meas_udp2db.c @@ -47,7 +47,6 @@ static int handle_msg(struct msgb *msg) { struct meas_feed_hdr *mfh = (struct meas_feed_hdr *) msgb_data(msg); struct meas_feed_meas *mfm = (struct meas_feed_meas *) msgb_data(msg); - const char *scenario; time_t now = time(NULL); if (mfh->version != MEAS_FEED_VERSION) @@ -56,13 +55,7 @@ static int handle_msg(struct msgb *msg) if (mfh->msg_type != MEAS_FEED_MEAS) return -EINVAL; - if (strlen(mfm->scenario)) - scenario = mfm->scenario; - else - scenario = NULL; - - meas_db_insert(db, mfm->imsi, mfm->name, now, - scenario, &mfm->mr); + meas_db_insert(db, now, mfm); return 0; }