<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12655">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Remove meas_* utils<br><br>The counterparts in OsmoBSC repo are actively maintained and (partially) packaged<br>for .deb - let's drop old versions to minimize user confusion.<br><br>Change-Id: Ia0cedaad4b717c8c5198842e2acd610f8e03f957<br>---<br>M openbsc/src/utils/Makefile.am<br>D openbsc/src/utils/meas_db.c<br>D openbsc/src/utils/meas_db.h<br>D openbsc/src/utils/meas_json.c<br>D openbsc/src/utils/meas_pcap2db.c<br>D openbsc/src/utils/meas_udp2db.c<br>D openbsc/src/utils/meas_vis.c<br>7 files changed, 0 insertions(+), 1,199 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/55/12655/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/openbsc/src/utils/Makefile.am b/openbsc/src/utils/Makefile.am</span><br><span>index 26494e1..76a73a3 100644</span><br><span>--- a/openbsc/src/utils/Makefile.am</span><br><span>+++ b/openbsc/src/utils/Makefile.am</span><br><span>@@ -18,30 +18,10 @@</span><br><span>       $(COVERAGE_LDFLAGS) \</span><br><span>        $(NULL)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-noinst_HEADERS = \</span><br><span style="color: hsl(0, 100%, 40%);">-   meas_db.h \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> bin_PROGRAMS = \</span><br><span>  bs11_config \</span><br><span>        isdnsync \</span><br><span style="color: hsl(0, 100%, 40%);">-      meas_json \</span><br><span>  $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-if HAVE_SQLITE3</span><br><span style="color: hsl(0, 100%, 40%);">-bin_PROGRAMS += \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo-meas-udp2db \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-if HAVE_PCAP</span><br><span style="color: hsl(0, 100%, 40%);">-bin_PROGRAMS += \</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo-meas-pcap2db \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-endif</span><br><span style="color: hsl(0, 100%, 40%);">-endif</span><br><span style="color: hsl(0, 100%, 40%);">-if HAVE_LIBCDK</span><br><span style="color: hsl(0, 100%, 40%);">-bin_PROGRAMS += \</span><br><span style="color: hsl(0, 100%, 40%);">-        meas_vis \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-endif</span><br><span> </span><br><span> if BUILD_SMPP</span><br><span> noinst_PROGRAMS = \</span><br><span>@@ -77,71 +57,3 @@</span><br><span>        $(LIBOSMOGSM_LIBS) \</span><br><span>         $(LIBSMPP34_LIBS) \</span><br><span>  $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-meas_vis_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-     meas_vis.c \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-meas_vis_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    -lcdk \</span><br><span style="color: hsl(0, 100%, 40%);">- -lncurses \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-meas_vis_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_meas_pcap2db_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-    meas_pcap2db.c \</span><br><span style="color: hsl(0, 100%, 40%);">-        meas_db.c \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_meas_pcap2db_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(SQLITE3_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-       -lpcap \</span><br><span style="color: hsl(0, 100%, 40%);">-        $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_meas_pcap2db_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_meas_udp2db_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-     meas_udp2db.c \</span><br><span style="color: hsl(0, 100%, 40%);">- meas_db.c \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_meas_udp2db_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(SQLITE3_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_meas_udp2db_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-meas_json_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-    meas_json.c \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-meas_json_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(top_builddir)/src/libcommon/libcommon.a \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-meas_json_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-     $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/openbsc/src/utils/meas_db.c b/openbsc/src/utils/meas_db.c</span><br><span>deleted file mode 100644</span><br><span>index d81efca..0000000</span><br><span>--- a/openbsc/src/utils/meas_db.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,330 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* Routines for storing measurement reports in SQLite3 database */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2012 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdint.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <sqlite3.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/meas_rep.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "meas_db.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#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 (?,?,?,?,?,?,?,?,?,?)"</span><br><span style="color: hsl(0, 100%, 40%);">-#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 (?,?,?,?,?,?,?)"</span><br><span style="color: hsl(0, 100%, 40%);">-#define UPD_MR "UPDATE meas_rep SET ul_unidir=?, dl_unidir=? WHERE id=?"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct meas_db_state {</span><br><span style="color: hsl(0, 100%, 40%);">-   sqlite3 *db;</span><br><span style="color: hsl(0, 100%, 40%);">-    sqlite3_stmt *stmt_ins_ud;</span><br><span style="color: hsl(0, 100%, 40%);">-      sqlite3_stmt *stmt_ins_mr;</span><br><span style="color: hsl(0, 100%, 40%);">-      sqlite3_stmt *stmt_upd_mr;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* macros to check for SQLite3 result codes */</span><br><span style="color: hsl(0, 100%, 40%);">-#define _SCK_OK(db, call, exp)                                \</span><br><span style="color: hsl(0, 100%, 40%);">-       do {                                            \</span><br><span style="color: hsl(0, 100%, 40%);">-               int rc = call;                          \</span><br><span style="color: hsl(0, 100%, 40%);">-               if (rc != exp) {                        \</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr,"SQL Error in line %u: %s\n",  \</span><br><span style="color: hsl(0, 100%, 40%);">-                               __LINE__, sqlite3_errmsg(db));          \</span><br><span style="color: hsl(0, 100%, 40%);">-                       goto err_io;                                    \</span><br><span style="color: hsl(0, 100%, 40%);">-               }                                                       \</span><br><span style="color: hsl(0, 100%, 40%);">-       } while (0)</span><br><span style="color: hsl(0, 100%, 40%);">-#define SCK_OK(db, call)     _SCK_OK(db, call, SQLITE_OK)</span><br><span style="color: hsl(0, 100%, 40%);">-#define SCK_DONE(db, call)  _SCK_OK(db, call, SQLITE_DONE)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int _insert_ud(struct meas_db_state *st, unsigned long meas_id, int dtx,</span><br><span style="color: hsl(0, 100%, 40%);">-                 int uplink, const struct gsm_meas_rep_unidir *ud)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned long rowid;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 1, meas_id));</span><br><span style="color: hsl(0, 100%, 40%);">-    SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 2,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       rxlev2dbm(ud->full.rx_lev)));</span><br><span style="color: hsl(0, 100%, 40%);">-        SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 3,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       rxlev2dbm(ud->sub.rx_lev)));</span><br><span style="color: hsl(0, 100%, 40%);">- SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 4, ud->full.rx_qual));</span><br><span style="color: hsl(0, 100%, 40%);">-        SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 5, ud->sub.rx_qual));</span><br><span style="color: hsl(0, 100%, 40%);">- SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 6, dtx));</span><br><span style="color: hsl(0, 100%, 40%);">-        SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_ud, 7, uplink));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     SCK_DONE(st->db, sqlite3_step(st->stmt_ins_ud));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  SCK_OK(st->db, sqlite3_reset(st->stmt_ins_ud));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return sqlite3_last_insert_rowid(st->db);</span><br><span style="color: hsl(0, 100%, 40%);">-err_io:</span><br><span style="color: hsl(0, 100%, 40%);">-     exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* insert a measurement report into the database */</span><br><span style="color: hsl(0, 100%, 40%);">-int meas_db_insert(struct meas_db_state *st, const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                 const char *name, unsigned long timestamp,</span><br><span style="color: hsl(0, 100%, 40%);">-              const char *scenario,</span><br><span style="color: hsl(0, 100%, 40%);">-                   const struct gsm_meas_rep *mr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- sqlite3_int64 rowid, ul_rowid, dl_rowid;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 1, timestamp));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-               SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 2,</span><br><span style="color: hsl(0, 100%, 40%);">-                                               imsi, -1, SQLITE_STATIC));</span><br><span style="color: hsl(0, 100%, 40%);">-     else</span><br><span style="color: hsl(0, 100%, 40%);">-            SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 2));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (name)</span><br><span style="color: hsl(0, 100%, 40%);">-               SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 3,</span><br><span style="color: hsl(0, 100%, 40%);">-                                               name, -1, SQLITE_STATIC));</span><br><span style="color: hsl(0, 100%, 40%);">-     else</span><br><span style="color: hsl(0, 100%, 40%);">-            SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 3));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (scenario)</span><br><span style="color: hsl(0, 100%, 40%);">-           SCK_OK(st->db, sqlite3_bind_text(st->stmt_ins_mr, 4,</span><br><span style="color: hsl(0, 100%, 40%);">-                                               scenario, -1, SQLITE_STATIC));</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">-            SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 4));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 5, mr->nr));</span><br><span style="color: hsl(0, 100%, 40%);">-  SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 6, mr->bs_power));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (mr->flags & MEAS_REP_F_MS_TO)</span><br><span style="color: hsl(0, 100%, 40%);">-                SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 7, mr->ms_timing_offset));</span><br><span style="color: hsl(0, 100%, 40%);">-    else</span><br><span style="color: hsl(0, 100%, 40%);">-            SCK_OK(st->db, sqlite3_bind_null(st->stmt_ins_mr, 7));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (mr->flags & MEAS_REP_F_FPC)</span><br><span style="color: hsl(0, 100%, 40%);">-          SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 8, 1));</span><br><span style="color: hsl(0, 100%, 40%);">-  else</span><br><span style="color: hsl(0, 100%, 40%);">-            SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 8, 0));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mr->flags & MEAS_REP_F_MS_L1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 9,</span><br><span style="color: hsl(0, 100%, 40%);">-                                               mr->ms_l1.pwr));</span><br><span style="color: hsl(0, 100%, 40%);">-             SCK_OK(st->db, sqlite3_bind_int(st->stmt_ins_mr, 10,</span><br><span style="color: hsl(0, 100%, 40%);">-                                              mr->ms_l1.ta));</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       SCK_DONE(st->db, sqlite3_step(st->stmt_ins_mr));</span><br><span style="color: hsl(0, 100%, 40%);">-  SCK_OK(st->db, sqlite3_reset(st->stmt_ins_mr));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   rowid = sqlite3_last_insert_rowid(st->db);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* insert uplink measurement */</span><br><span style="color: hsl(0, 100%, 40%);">- ul_rowid = _insert_ud(st, rowid, mr->flags & MEAS_REP_F_UL_DTX,</span><br><span style="color: hsl(0, 100%, 40%);">-                          1, &mr->ul);</span><br><span style="color: hsl(0, 100%, 40%);">-     SCK_OK(st->db, sqlite3_bind_int(st->stmt_upd_mr, 1, ul_rowid));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* insert downlink measurement, if present */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (mr->flags & MEAS_REP_F_DL_VALID) {</span><br><span style="color: hsl(0, 100%, 40%);">-           dl_rowid = _insert_ud(st, rowid, mr->flags & MEAS_REP_F_DL_DTX,</span><br><span style="color: hsl(0, 100%, 40%);">-                                0, &mr->dl);</span><br><span style="color: hsl(0, 100%, 40%);">-               SCK_OK(st->db, sqlite3_bind_int(st->stmt_upd_mr, 2, dl_rowid));</span><br><span style="color: hsl(0, 100%, 40%);">-   } else</span><br><span style="color: hsl(0, 100%, 40%);">-          SCK_OK(st->db, sqlite3_bind_null(st->stmt_upd_mr, 2));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* update meas_rep with the id's of the unidirectional</span><br><span style="color: hsl(0, 100%, 40%);">-       * measurements */</span><br><span style="color: hsl(0, 100%, 40%);">-      SCK_OK(st->db, sqlite3_bind_int(st->stmt_upd_mr, 3, rowid));</span><br><span style="color: hsl(0, 100%, 40%);">-      SCK_DONE(st->db, sqlite3_step(st->stmt_upd_mr));</span><br><span style="color: hsl(0, 100%, 40%);">-  SCK_OK(st->db, sqlite3_reset(st->stmt_upd_mr));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-err_io:</span><br><span style="color: hsl(0, 100%, 40%);">-        return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int meas_db_begin(struct meas_db_state *st)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       SCK_OK(st->db, sqlite3_exec(st->db, "BEGIN", NULL, NULL, NULL));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-err_io:</span><br><span style="color: hsl(0, 100%, 40%);">-        return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int meas_db_commit(struct meas_db_state *st)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      SCK_OK(st->db, sqlite3_exec(st->db, "COMMIT", NULL, NULL, NULL));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-err_io:</span><br><span style="color: hsl(0, 100%, 40%);">-        return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const char *create_stmts[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      "CREATE TABLE IF NOT EXISTS meas_rep ("</span><br><span style="color: hsl(0, 100%, 40%);">-               "id INTEGER PRIMARY KEY AUTOINCREMENT,"</span><br><span style="color: hsl(0, 100%, 40%);">-               "time TIMESTAMP,"</span><br><span style="color: hsl(0, 100%, 40%);">-             "imsi TEXT,"</span><br><span style="color: hsl(0, 100%, 40%);">-          "name TEXT,"</span><br><span style="color: hsl(0, 100%, 40%);">-          "scenario TEXT,"</span><br><span style="color: hsl(0, 100%, 40%);">-              "nr INTEGER,"</span><br><span style="color: hsl(0, 100%, 40%);">-         "bs_power INTEGER NOT NULL,"</span><br><span style="color: hsl(0, 100%, 40%);">-          "ms_timing_offset INTEGER,"</span><br><span style="color: hsl(0, 100%, 40%);">-           "fpc INTEGER NOT NULL DEFAULT 0,"</span><br><span style="color: hsl(0, 100%, 40%);">-             "ul_unidir INTEGER REFERENCES meas_rep_unidir(id),"</span><br><span style="color: hsl(0, 100%, 40%);">-           "dl_unidir INTEGER REFERENCES meas_rep_unidir(id),"</span><br><span style="color: hsl(0, 100%, 40%);">-           "ms_l1_pwr INTEGER,"</span><br><span style="color: hsl(0, 100%, 40%);">-          "ms_l1_ta INTEGER"</span><br><span style="color: hsl(0, 100%, 40%);">-    ")",</span><br><span style="color: hsl(0, 100%, 40%);">-  "CREATE TABLE IF NOT EXISTS meas_rep_unidir ("</span><br><span style="color: hsl(0, 100%, 40%);">-                "id INTEGER PRIMARY KEY AUTOINCREMENT,"</span><br><span style="color: hsl(0, 100%, 40%);">-               "meas_id INTEGER NOT NULL REFERENCES meas_rep(id),"</span><br><span style="color: hsl(0, 100%, 40%);">-           "rx_lev_full INTEGER NOT NULL,"</span><br><span style="color: hsl(0, 100%, 40%);">-               "rx_lev_sub INTEGER NOT NULL,"</span><br><span style="color: hsl(0, 100%, 40%);">-                "rx_qual_full INTEGER NOT NULL,"</span><br><span style="color: hsl(0, 100%, 40%);">-              "rx_qual_sub INTEGER NOT NULL,"</span><br><span style="color: hsl(0, 100%, 40%);">-               "dtx BOOLEAN NOT NULL DEFAULT 0,"</span><br><span style="color: hsl(0, 100%, 40%);">-             "uplink BOOLEAN NOT NULL"</span><br><span style="color: hsl(0, 100%, 40%);">-     ")",</span><br><span style="color: hsl(0, 100%, 40%);">-  "CREATE VIEW IF NOT EXISTS path_loss AS "</span><br><span style="color: hsl(0, 100%, 40%);">-             "SELECT "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "meas_rep.id, "</span><br><span style="color: hsl(0, 100%, 40%);">-                       "datetime(time,'unixepoch') AS timestamp, "</span><br><span style="color: hsl(0, 100%, 40%);">-                   "imsi, "</span><br><span style="color: hsl(0, 100%, 40%);">-                      "name, "</span><br><span style="color: hsl(0, 100%, 40%);">-                      "scenario, "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "ms_timing_offset, "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "ms_l1_ta, "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "fpc, "</span><br><span style="color: hsl(0, 100%, 40%);">-                       "ms_l1_pwr, "</span><br><span style="color: hsl(0, 100%, 40%);">-                 "ud_ul.rx_lev_full AS ul_rx_lev_full, "</span><br><span style="color: hsl(0, 100%, 40%);">-                       "ms_l1_pwr-ud_ul.rx_lev_full AS ul_path_loss_full, "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "ud_ul.rx_lev_sub ul_rx_lev_sub, "</span><br><span style="color: hsl(0, 100%, 40%);">-                    "ms_l1_pwr-ud_ul.rx_lev_sub AS ul_path_loss_sub, "</span><br><span style="color: hsl(0, 100%, 40%);">-                    "ud_ul.rx_qual_full AS ul_rx_qual_full, "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "ud_ul.rx_qual_sub AS ul_rx_qual_sub, "</span><br><span style="color: hsl(0, 100%, 40%);">-                       "bs_power, "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "ud_dl.rx_lev_full AS dl_rx_lev_full, "</span><br><span style="color: hsl(0, 100%, 40%);">-                       "bs_power-ud_dl.rx_lev_full AS dl_path_loss_full, "</span><br><span style="color: hsl(0, 100%, 40%);">-                   "ud_dl.rx_lev_sub AS dl_rx_lev_sub, "</span><br><span style="color: hsl(0, 100%, 40%);">-                 "bs_power-ud_dl.rx_lev_sub AS dl_path_loss_sub, "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "ud_dl.rx_qual_full AS dl_rx_qual_full, "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "ud_dl.rx_qual_sub AS dl_rx_qual_sub "</span><br><span style="color: hsl(0, 100%, 40%);">-                "FROM "</span><br><span style="color: hsl(0, 100%, 40%);">-                       "meas_rep, "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "meas_rep_unidir AS ud_dl, "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "meas_rep_unidir AS ud_ul "</span><br><span style="color: hsl(0, 100%, 40%);">-           "WHERE "</span><br><span style="color: hsl(0, 100%, 40%);">-                      "ud_ul.id = meas_rep.ul_unidir AND "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "ud_dl.id = meas_rep.dl_unidir",</span><br><span style="color: hsl(0, 100%, 40%);">-      "CREATE VIEW IF NOT EXISTS overview AS "</span><br><span style="color: hsl(0, 100%, 40%);">-              "SELECT "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "id,"</span><br><span style="color: hsl(0, 100%, 40%);">-                 "timestamp,"</span><br><span style="color: hsl(0, 100%, 40%);">-                  "imsi,"</span><br><span style="color: hsl(0, 100%, 40%);">-                       "name,"</span><br><span style="color: hsl(0, 100%, 40%);">-                       "scenario,"</span><br><span style="color: hsl(0, 100%, 40%);">-                   "ms_l1_pwr,"</span><br><span style="color: hsl(0, 100%, 40%);">-                  "ul_rx_lev_full,"</span><br><span style="color: hsl(0, 100%, 40%);">-                     "ul_path_loss_full,"</span><br><span style="color: hsl(0, 100%, 40%);">-                  "ul_rx_qual_full,"</span><br><span style="color: hsl(0, 100%, 40%);">-                    "bs_power,"</span><br><span style="color: hsl(0, 100%, 40%);">-                   "dl_rx_lev_full,"</span><br><span style="color: hsl(0, 100%, 40%);">-                     "dl_path_loss_full,"</span><br><span style="color: hsl(0, 100%, 40%);">-                  "dl_rx_qual_full "</span><br><span style="color: hsl(0, 100%, 40%);">-            "FROM path_loss",</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int check_create_tbl(struct meas_db_state *st)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     int i, rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < ARRAY_SIZE(create_stmts); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-             SCK_OK(st->db, sqlite3_exec(st->db, create_stmts[i],</span><br><span style="color: hsl(0, 100%, 40%);">-                                          NULL, NULL, NULL));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-err_io:</span><br><span style="color: hsl(0, 100%, 40%);">-        return -EIO;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define PREP_CHK(db, stmt, ptr)                                            \</span><br><span style="color: hsl(0, 100%, 40%);">-       do {                                                            \</span><br><span style="color: hsl(0, 100%, 40%);">-               int rc;                                                 \</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = sqlite3_prepare_v2(db, stmt, strlen(stmt)+1,       \</span><br><span style="color: hsl(0, 100%, 40%);">-                                       ptr, NULL);                     \</span><br><span style="color: hsl(0, 100%, 40%);">-               if (rc != SQLITE_OK) {                                  \</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, "Error during prepare of '%s': %s\n", \</span><br><span style="color: hsl(0, 100%, 40%);">-                               stmt, sqlite3_errmsg(db));              \</span><br><span style="color: hsl(0, 100%, 40%);">-                       goto err_io;                                    \</span><br><span style="color: hsl(0, 100%, 40%);">-               }                                                       \</span><br><span style="color: hsl(0, 100%, 40%);">-       } while (0)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct meas_db_state *meas_db_open(void *ctx, const char *fname)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct meas_db_state *st = talloc_zero(ctx, struct meas_db_state);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!st)</span><br><span style="color: hsl(0, 100%, 40%);">-                return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = sqlite3_open_v2(fname, &st->db,</span><br><span style="color: hsl(0, 100%, 40%);">-                          SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE,</span><br><span style="color: hsl(0, 100%, 40%);">-                       NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (rc != SQLITE_OK) {</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(stderr, "Unable to open DB: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    sqlite3_errmsg(st->db));</span><br><span style="color: hsl(0, 100%, 40%);">-             goto err_io;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       rc = check_create_tbl(st);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      PREP_CHK(st->db, INS_MR, &st->stmt_ins_mr);</span><br><span style="color: hsl(0, 100%, 40%);">-   PREP_CHK(st->db, INS_UD, &st->stmt_ins_ud);</span><br><span style="color: hsl(0, 100%, 40%);">-   PREP_CHK(st->db, UPD_MR, &st->stmt_upd_mr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return st;</span><br><span style="color: hsl(0, 100%, 40%);">-err_io:</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(st);</span><br><span style="color: hsl(0, 100%, 40%);">-        return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void meas_db_close(struct meas_db_state *st)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      if (sqlite3_finalize(st->stmt_ins_mr) != SQLITE_OK)</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(stderr, "DB insert measurement report finalize error: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  sqlite3_errmsg(st->db));</span><br><span style="color: hsl(0, 100%, 40%);">-     if (sqlite3_finalize(st->stmt_ins_ud) != SQLITE_OK)</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(stderr, "DB insert unidir finalize error: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      sqlite3_errmsg(st->db));</span><br><span style="color: hsl(0, 100%, 40%);">-     if (sqlite3_finalize(st->stmt_upd_mr) != SQLITE_OK)</span><br><span style="color: hsl(0, 100%, 40%);">-          fprintf(stderr, "DB update measurement report finalize error: %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  sqlite3_errmsg(st->db));</span><br><span style="color: hsl(0, 100%, 40%);">-     if (sqlite3_close(st->db) != SQLITE_OK)</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "Unable to close DB, abandoning.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(st);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/openbsc/src/utils/meas_db.h b/openbsc/src/utils/meas_db.h</span><br><span>deleted file mode 100644</span><br><span>index 889e902..0000000</span><br><span>--- a/openbsc/src/utils/meas_db.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,17 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef OPENBSC_MEAS_DB_H</span><br><span style="color: hsl(0, 100%, 40%);">-#define OPENBSC_MEAS_DB_H</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct meas_db_state;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct meas_db_state *meas_db_open(void *ctx, const char *fname);</span><br><span style="color: hsl(0, 100%, 40%);">-void meas_db_close(struct meas_db_state *st);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int meas_db_begin(struct meas_db_state *st);</span><br><span style="color: hsl(0, 100%, 40%);">-int meas_db_commit(struct meas_db_state *st);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int meas_db_insert(struct meas_db_state *st, const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                  const char *name, unsigned long timestamp,</span><br><span style="color: hsl(0, 100%, 40%);">-              const char *scenario,</span><br><span style="color: hsl(0, 100%, 40%);">-                   const struct gsm_meas_rep *mr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>diff --git a/openbsc/src/utils/meas_json.c b/openbsc/src/utils/meas_json.c</span><br><span>deleted file mode 100644</span><br><span>index 51eb6c7..0000000</span><br><span>--- a/openbsc/src/utils/meas_json.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,190 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* Convert measurement report feed into JSON feed printed to stdout.</span><br><span style="color: hsl(0, 100%, 40%);">- * Each measurement report is printed as a separae JSON root entry.</span><br><span style="color: hsl(0, 100%, 40%);">- * All measurement reports are separated by a new line.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2015 by Alexander Chemeris <Alexander.Chemeris@fairwaves.co></span><br><span style="color: hsl(0, 100%, 40%);">- * With parts of code adopted from different places in OpenBSC.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <time.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/gsm_data_shared.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/meas_feed.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_meas_rep_uni_json(struct gsm_meas_rep_unidir *mru)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   printf("\"RXL-FULL\":%d, \"RXL-SUB\":%d, ",</span><br><span style="color: hsl(0, 100%, 40%);">-               rxlev2dbm(mru->full.rx_lev),</span><br><span style="color: hsl(0, 100%, 40%);">-         rxlev2dbm(mru->sub.rx_lev));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\"RXQ-FULL\":%d, \"RXQ-SUB\":%d",</span><br><span style="color: hsl(0, 100%, 40%);">-         mru->full.rx_qual, mru->sub.rx_qual);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_meas_rep_json(struct gsm_meas_rep *mr)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  printf("\"NR\":%d", mr->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (mr->flags & MEAS_REP_F_DL_DTX)</span><br><span style="color: hsl(0, 100%, 40%);">-               printf(", \"DTXd\":true");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  printf(", \"UL_MEAS\":{");</span><br><span style="color: hsl(0, 100%, 40%);">-  print_meas_rep_uni_json(&mr->ul);</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("}");</span><br><span style="color: hsl(0, 100%, 40%);">-  printf(", \"BS_POWER\":%d", mr->bs_power);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (mr->flags & MEAS_REP_F_MS_TO)</span><br><span style="color: hsl(0, 100%, 40%);">-                printf(", \"MS_TO\":%d", mr->ms_timing_offset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mr->flags & MEAS_REP_F_MS_L1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              printf(", \"L1_MS_PWR\":%d", mr->ms_l1.pwr);</span><br><span style="color: hsl(0, 100%, 40%);">-             printf(", \"L1_FPC\":%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                   mr->flags & MEAS_REP_F_FPC ? "true" : "false");</span><br><span style="color: hsl(0, 100%, 40%);">-              printf(", \"L1_TA\":%u", mr->ms_l1.ta);</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (mr->flags & MEAS_REP_F_UL_DTX)</span><br><span style="color: hsl(0, 100%, 40%);">-               printf(", \"DTXu\":true");</span><br><span style="color: hsl(0, 100%, 40%);">-  if (mr->flags & MEAS_REP_F_BA1)</span><br><span style="color: hsl(0, 100%, 40%);">-          printf(", \"BA1\":true");</span><br><span style="color: hsl(0, 100%, 40%);">-   if (mr->flags & MEAS_REP_F_DL_VALID) {</span><br><span style="color: hsl(0, 100%, 40%);">-           printf(", \"DL_MEAS\":{");</span><br><span style="color: hsl(0, 100%, 40%);">-          print_meas_rep_uni_json(&mr->dl);</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("}");</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (mr->num_cell == 7)</span><br><span style="color: hsl(0, 100%, 40%);">-               return;</span><br><span style="color: hsl(0, 100%, 40%);">- printf(", \"NUM_NEIGH\":%u, \"NEIGH\":[", mr->num_cell);</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < mr->num_cell; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-              struct gsm_meas_rep_cell *mrc = &mr->cell[i];</span><br><span style="color: hsl(0, 100%, 40%);">-            if (i!=0) printf(", ");</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("{\"IDX\":%u, \"ARFCN\":%u, \"BSIC\":%u, \"POWER\":%d}",</span><br><span style="color: hsl(0, 100%, 40%);">-                       mrc->neigh_idx, mrc->arfcn, mrc->bsic, rxlev2dbm(mrc->rxlev));</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("]");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_chan_info_json(struct meas_feed_meas *mfm)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    printf("\"lchan_type\":\"%s\", \"pchan_type\":\"%s\", "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "\"bts_nr\":%d, \"trx_nr\":%d, \"ts_nr\":%d, \"ss_nr\":%d",</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_lchant_name(mfm->lchan_type), gsm_pchan_name(mfm->pchan_type),</span><br><span style="color: hsl(0, 100%, 40%);">-        mfm->bts_nr, mfm->trx_nr, mfm->ts_nr, mfm->ss_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_meas_feed_json(struct meas_feed_meas *mfm)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    time_t now = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("{");</span><br><span style="color: hsl(0, 100%, 40%);">-  printf("\"time\":%ld, \"imsi\":\"%s\", \"name\":\"%s\", \"scenario\":\"%s\", ",</span><br><span style="color: hsl(0, 100%, 40%);">-         now, mfm->imsi, mfm->name, mfm->scenario);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     switch (mfm->hdr.version) {</span><br><span style="color: hsl(0, 100%, 40%);">-  case 1:</span><br><span style="color: hsl(0, 100%, 40%);">-         printf("\"chan_info\":{");</span><br><span style="color: hsl(0, 100%, 40%);">-          print_chan_info_json(mfm);</span><br><span style="color: hsl(0, 100%, 40%);">-              printf("}, ");</span><br><span style="color: hsl(0, 100%, 40%);">-                /* no break, fall to version 0 */</span><br><span style="color: hsl(0, 100%, 40%);">-       case 0:</span><br><span style="color: hsl(0, 100%, 40%);">-         printf("\"meas_rep\":{");</span><br><span style="color: hsl(0, 100%, 40%);">-           print_meas_rep_json(&mfm->mr);</span><br><span style="color: hsl(0, 100%, 40%);">-           printf("}");</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("}\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int handle_meas(struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct meas_feed_meas *mfm = (struct meas_feed_meas *) msgb_data(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  print_meas_feed_json(mfm);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int handle_msg(struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct meas_feed_hdr *mfh = (struct meas_feed_hdr *) msgb_data(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (mfh->version != MEAS_FEED_VERSION)</span><br><span style="color: hsl(0, 100%, 40%);">-               return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (mfh->msg_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-     case MEAS_FEED_MEAS:</span><br><span style="color: hsl(0, 100%, 40%);">-            handle_meas(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int udp_fd_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (what & BSC_FD_READ) {</span><br><span style="color: hsl(0, 100%, 40%);">-           struct msgb *msg = msgb_alloc(1024, "UDP Rx");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = read(ofd->fd, msgb_data(msg), msgb_tailroom(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-              if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-              msgb_put(msg, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_msg(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_fd udp_ofd;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- udp_ofd.cb = udp_fd_cb;</span><br><span style="color: hsl(0, 100%, 40%);">- rc =  osmo_sock_init_ofd(&udp_ofd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 8888, OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_select_main(0);</span><br><span style="color: hsl(0, 100%, 40%);">-    };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/openbsc/src/utils/meas_pcap2db.c b/openbsc/src/utils/meas_pcap2db.c</span><br><span>deleted file mode 100644</span><br><span>index b874ac4..0000000</span><br><span>--- a/openbsc/src/utils/meas_pcap2db.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,138 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* read PCAP file with meas_feed data and write it to sqlite3 database */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2012 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/ip.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/udp.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/meas_feed.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <pcap/pcap.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "meas_db.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct meas_db_state *db;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_mfm(const struct pcap_pkthdr *h,</span><br><span style="color: hsl(0, 100%, 40%);">-                  const struct meas_feed_meas *mfm)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       const char *scenario;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (strlen(mfm->scenario))</span><br><span style="color: hsl(0, 100%, 40%);">-           scenario = mfm->scenario;</span><br><span style="color: hsl(0, 100%, 40%);">-    else</span><br><span style="color: hsl(0, 100%, 40%);">-            scenario = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        meas_db_insert(db, mfm->imsi, mfm->name, h->ts.tv_sec,</span><br><span style="color: hsl(0, 100%, 40%);">-                 scenario, &mfm->mr);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void pcap_cb(u_char *user, const struct pcap_pkthdr *h,</span><br><span style="color: hsl(0, 100%, 40%);">-                 const u_char *bytes)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        const char *cur = bytes;</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct iphdr *ip;</span><br><span style="color: hsl(0, 100%, 40%);">- const struct udphdr *udp;</span><br><span style="color: hsl(0, 100%, 40%);">-       const struct meas_feed_meas *mfm;</span><br><span style="color: hsl(0, 100%, 40%);">-       uint16_t udplen;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (h->caplen < 14+20+8)</span><br><span style="color: hsl(0, 100%, 40%);">-          return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Check if there is IPv4 in the Ethernet */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (cur[12] != 0x08 || cur[13] != 0x00)</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- cur += 14;      /* ethernet header */</span><br><span style="color: hsl(0, 100%, 40%);">-   ip = (struct iphdr *) cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (ip->version != 4)</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(0, 100%, 40%);">- cur += ip->ihl * 4;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (ip->protocol != IPPROTO_UDP)</span><br><span style="color: hsl(0, 100%, 40%);">-             return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- udp = (struct udphdr *) cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (udp->dest != htons(8888))</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- udplen = ntohs(udp->len);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (udplen != sizeof(*udp) + sizeof(*mfm))</span><br><span style="color: hsl(0, 100%, 40%);">-              return;</span><br><span style="color: hsl(0, 100%, 40%);">- cur += sizeof(*udp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    mfm = (const struct meas_feed_meas *) cur;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      handle_mfm(h, mfm);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    char errbuf[PCAP_ERRBUF_SIZE+1];</span><br><span style="color: hsl(0, 100%, 40%);">-        char *pcap_fname, *db_fname;</span><br><span style="color: hsl(0, 100%, 40%);">-    pcap_t *pc;</span><br><span style="color: hsl(0, 100%, 40%);">-     int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (argc < 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "You need to specify PCAP and database file\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              exit(2);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       pcap_fname = argv[1];</span><br><span style="color: hsl(0, 100%, 40%);">-   db_fname = argv[2];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     pc = pcap_open_offline(pcap_fname, errbuf);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!pc) {</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "Cannot open %s: %s\n", pcap_fname, errbuf);</span><br><span style="color: hsl(0, 100%, 40%);">-          exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       db = meas_db_open(NULL, db_fname);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!db)</span><br><span style="color: hsl(0, 100%, 40%);">-                exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = meas_db_begin(db);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                fprintf(stderr, "Error during BEGIN\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       pcap_loop(pc, 0 , pcap_cb, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       meas_db_commit(db);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/openbsc/src/utils/meas_udp2db.c b/openbsc/src/utils/meas_udp2db.c</span><br><span>deleted file mode 100644</span><br><span>index 5032d0c..0000000</span><br><span>--- a/openbsc/src/utils/meas_udp2db.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,126 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* liesten to meas_feed on UDP and write it to sqlite3 database */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2012 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <time.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/meas_feed.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include "meas_db.h"</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_fd udp_ofd;</span><br><span style="color: hsl(0, 100%, 40%);">-static struct meas_db_state *db;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int handle_msg(struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct meas_feed_hdr *mfh = (struct meas_feed_hdr *) msgb_data(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-    struct meas_feed_meas *mfm = (struct meas_feed_meas *) msgb_data(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  const char *scenario;</span><br><span style="color: hsl(0, 100%, 40%);">-   time_t now = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (mfh->version != MEAS_FEED_VERSION)</span><br><span style="color: hsl(0, 100%, 40%);">-               return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (mfh->msg_type != MEAS_FEED_MEAS)</span><br><span style="color: hsl(0, 100%, 40%);">-         return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (strlen(mfm->scenario))</span><br><span style="color: hsl(0, 100%, 40%);">-           scenario = mfm->scenario;</span><br><span style="color: hsl(0, 100%, 40%);">-    else</span><br><span style="color: hsl(0, 100%, 40%);">-            scenario = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        meas_db_insert(db, mfm->imsi, mfm->name, now,</span><br><span style="color: hsl(0, 100%, 40%);">-                     scenario, &mfm->mr);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int udp_fd_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (what & BSC_FD_READ) {</span><br><span style="color: hsl(0, 100%, 40%);">-           struct msgb *msg = msgb_alloc(1024, "UDP Rx");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = read(ofd->fd, msgb_data(msg), msgb_tailroom(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-              if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-              msgb_put(msg, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_msg(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      char *db_fname;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- msgb_talloc_ctx_init(NULL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  if (argc < 2) {</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "You have to specify the database file name\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              exit(2);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       db_fname = argv[1];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     udp_ofd.cb = udp_fd_cb;</span><br><span style="color: hsl(0, 100%, 40%);">- rc =  osmo_sock_init_ofd(&udp_ofd, AF_INET, SOCK_DGRAM,</span><br><span style="color: hsl(0, 100%, 40%);">-                              IPPROTO_UDP, NULL, 8888, OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                fprintf(stderr, "Unable to create UDP listen socket\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       db = meas_db_open(NULL, db_fname);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!db) {</span><br><span style="color: hsl(0, 100%, 40%);">-              fprintf(stderr, "Unable to open database\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* FIXME: timer-based BEGIN/COMMIT */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_select_main(0);</span><br><span style="color: hsl(0, 100%, 40%);">-    };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      meas_db_close(db);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/openbsc/src/utils/meas_vis.c b/openbsc/src/utils/meas_vis.c</span><br><span>deleted file mode 100644</span><br><span>index 77194de..0000000</span><br><span>--- a/openbsc/src/utils/meas_vis.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,310 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#include <string.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <errno.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <unistd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdlib.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <netinet/in.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <cdk/cdk.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/socket.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/msgb.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <openbsc/meas_feed.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ms_state_uni {</span><br><span style="color: hsl(0, 100%, 40%);">- CDKSLIDER *cdk;</span><br><span style="color: hsl(0, 100%, 40%);">- CDKLABEL *cdk_label;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    time_t last_update;</span><br><span style="color: hsl(0, 100%, 40%);">-     char label[32];</span><br><span style="color: hsl(0, 100%, 40%);">- char *_lbl[1];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ms_state {</span><br><span style="color: hsl(0, 100%, 40%);">-       struct llist_head list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- char name[31+1];</span><br><span style="color: hsl(0, 100%, 40%);">-        char imsi[15+1];</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_meas_rep mr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct ms_state_uni ul;</span><br><span style="color: hsl(0, 100%, 40%);">- struct ms_state_uni dl;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct state {</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_fd udp_ofd;</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head ms_list;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      CDKSCREEN *cdkscreen;</span><br><span style="color: hsl(0, 100%, 40%);">-   WINDOW *curses_win;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     CDKLABEL *cdk_title;</span><br><span style="color: hsl(0, 100%, 40%);">-    char *title;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    CDKLABEL *cdk_header;</span><br><span style="color: hsl(0, 100%, 40%);">-   char header[256];</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct state g_st;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ms_state *find_ms(const char *imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct ms_state *ms;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_for_each_entry(ms, &g_st.ms_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!strcmp(ms->imsi, imsi))</span><br><span style="color: hsl(0, 100%, 40%);">-                 return ms;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct ms_state *find_alloc_ms(const char *imsi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct ms_state *ms;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    ms = find_ms(imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (!ms) {</span><br><span style="color: hsl(0, 100%, 40%);">-              ms = talloc_zero(NULL, struct ms_state);</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_strlcpy(ms->imsi, imsi, sizeof(ms->imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-           ms->ul._lbl[0] = ms->ul.label;</span><br><span style="color: hsl(0, 100%, 40%);">-            ms->dl._lbl[0] = ms->dl.label;</span><br><span style="color: hsl(0, 100%, 40%);">-            llist_add_tail(&ms->list, &g_st.ms_list);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return ms;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int handle_meas(struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct meas_feed_meas *mfm = (struct meas_feed_meas *) msgb_data(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  struct ms_state *ms = find_alloc_ms(mfm->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-      time_t now = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_strlcpy(ms->name, mfm->name, sizeof(ms->name));</span><br><span style="color: hsl(0, 100%, 40%);">-   memcpy(&ms->mr, &mfm->mr, sizeof(ms->mr));</span><br><span style="color: hsl(0, 100%, 40%);">-     ms->ul.last_update = now;</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ms->mr.flags & MEAS_REP_F_DL_VALID)</span><br><span style="color: hsl(0, 100%, 40%);">-          ms->dl.last_update = now;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* move to head of list */</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_del(&ms->list);</span><br><span style="color: hsl(0, 100%, 40%);">-    llist_add(&ms->list, &g_st.ms_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int handle_msg(struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct meas_feed_hdr *mfh = (struct meas_feed_hdr *) msgb_data(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (mfh->version != MEAS_FEED_VERSION)</span><br><span style="color: hsl(0, 100%, 40%);">-               return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (mfh->msg_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-     case MEAS_FEED_MEAS:</span><br><span style="color: hsl(0, 100%, 40%);">-            handle_meas(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int udp_fd_cb(struct osmo_fd *ofd, unsigned int what)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (what & BSC_FD_READ) {</span><br><span style="color: hsl(0, 100%, 40%);">-           struct msgb *msg = msgb_alloc(1024, "UDP Rx");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = read(ofd->fd, msgb_data(msg), msgb_tailroom(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-              if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-              msgb_put(msg, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_msg(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                msgb_free(msg);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void destroy_dir(struct ms_state_uni *uni)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    if (uni->cdk) {</span><br><span style="color: hsl(0, 100%, 40%);">-              destroyCDKSlider(uni->cdk);</span><br><span style="color: hsl(0, 100%, 40%);">-          uni->cdk = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (uni->cdk_label) {</span><br><span style="color: hsl(0, 100%, 40%);">-                destroyCDKLabel(uni->cdk_label);</span><br><span style="color: hsl(0, 100%, 40%);">-             uni->cdk_label = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define DIR_UL        0</span><br><span style="color: hsl(0, 100%, 40%);">-#define DIR_DL 1</span><br><span style="color: hsl(0, 100%, 40%);">-static const char *dir_str[2] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      [DIR_UL]        = "UL",</span><br><span style="color: hsl(0, 100%, 40%);">-       [DIR_DL]        = "DL",</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int colpair_by_qual(uint8_t rx_qual)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (rx_qual == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-               return 24;</span><br><span style="color: hsl(0, 100%, 40%);">-      else if (rx_qual <= 4)</span><br><span style="color: hsl(0, 100%, 40%);">-               return 32;</span><br><span style="color: hsl(0, 100%, 40%);">-      else</span><br><span style="color: hsl(0, 100%, 40%);">-            return 16;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int colpair_by_lev(int rx_lev)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       if (rx_lev < -95)</span><br><span style="color: hsl(0, 100%, 40%);">-            return 16;</span><br><span style="color: hsl(0, 100%, 40%);">-      else if (rx_lev < -80)</span><br><span style="color: hsl(0, 100%, 40%);">-               return 32;</span><br><span style="color: hsl(0, 100%, 40%);">-      else</span><br><span style="color: hsl(0, 100%, 40%);">-            return 24;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void write_uni(struct ms_state *ms, struct ms_state_uni *msu,</span><br><span style="color: hsl(0, 100%, 40%);">-                struct gsm_rx_lev_qual *lq, int dir, int row)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  char label[128];</span><br><span style="color: hsl(0, 100%, 40%);">-        time_t now = time(NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-        int qual_col = colpair_by_qual(lq->rx_qual);</span><br><span style="color: hsl(0, 100%, 40%);">- int lev_col = colpair_by_lev(rxlev2dbm(lq->rx_lev));</span><br><span style="color: hsl(0, 100%, 40%);">- int color, pwr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (dir == DIR_UL) {</span><br><span style="color: hsl(0, 100%, 40%);">-            pwr = ms->mr.ms_l1.pwr;</span><br><span style="color: hsl(0, 100%, 40%);">-      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                pwr = ms->mr.bs_power;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       color = A_REVERSE | COLOR_PAIR(lev_col) | ' ';</span><br><span style="color: hsl(0, 100%, 40%);">-  snprintf(label, sizeof(label), "%s %s ", ms->imsi, dir_str[dir]);</span><br><span style="color: hsl(0, 100%, 40%);">-  msu->cdk = newCDKSlider(g_st.cdkscreen, 0, row, NULL, label, color,</span><br><span style="color: hsl(0, 100%, 40%);">-                            COLS-40, rxlev2dbm(lq->rx_lev), -110, -47,</span><br><span style="color: hsl(0, 100%, 40%);">-                           1, 2, FALSE, FALSE);</span><br><span style="color: hsl(0, 100%, 40%);">-  //IsVisibleObj(ms->ul.cdk) = FALSE;</span><br><span style="color: hsl(0, 100%, 40%);">-  snprintf(msu->label, sizeof(msu->label), "</%d>%1d<!%d> %3d %2u %2d %4u",</span><br><span style="color: hsl(0, 100%, 40%);">-            qual_col, lq->rx_qual, qual_col, pwr,</span><br><span style="color: hsl(0, 100%, 40%);">-                ms->mr.ms_l1.ta, ms->mr.ms_timing_offset,</span><br><span style="color: hsl(0, 100%, 40%);">-                 now - msu->last_update);</span><br><span style="color: hsl(0, 100%, 40%);">-    msu->cdk_label = newCDKLabel(g_st.cdkscreen, RIGHT, row,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     msu->_lbl, 1, FALSE, FALSE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void update_sliders(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       int num_vis_sliders = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct ms_state *ms;</span><br><span style="color: hsl(0, 100%, 40%);">-#define HEADER_LINES 2</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* remove all sliders */</span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry(ms, &g_st.ms_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             destroy_dir(&ms->ul);</span><br><span style="color: hsl(0, 100%, 40%);">-            destroy_dir(&ms->dl);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry(ms, &g_st.ms_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             struct gsm_rx_lev_qual *lq;</span><br><span style="color: hsl(0, 100%, 40%);">-             unsigned int row = HEADER_LINES + num_vis_sliders*3;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-            if (ms->mr.flags & MEAS_REP_F_UL_DTX)</span><br><span style="color: hsl(0, 100%, 40%);">-                    lq = &ms->mr.ul.sub;</span><br><span style="color: hsl(0, 100%, 40%);">-             else</span><br><span style="color: hsl(0, 100%, 40%);">-                    lq = &ms->mr.ul.full;</span><br><span style="color: hsl(0, 100%, 40%);">-            write_uni(ms, &ms->ul, lq, DIR_UL, row);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         if (ms->mr.flags & MEAS_REP_F_DL_DTX)</span><br><span style="color: hsl(0, 100%, 40%);">-                    lq = &ms->mr.dl.sub;</span><br><span style="color: hsl(0, 100%, 40%);">-             else</span><br><span style="color: hsl(0, 100%, 40%);">-                    lq = &ms->mr.dl.full;</span><br><span style="color: hsl(0, 100%, 40%);">-            write_uni(ms, &ms->dl, lq, DIR_DL, row+1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               num_vis_sliders++;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (num_vis_sliders >= LINES/3)</span><br><span style="color: hsl(0, 100%, 40%);">-                      break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       refreshCDKScreen(g_st.cdkscreen);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-const struct value_string col_strs[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-      { COLOR_WHITE,  "white" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { COLOR_RED,    "red" },</span><br><span style="color: hsl(0, 100%, 40%);">-      { COLOR_GREEN,  "green" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { COLOR_YELLOW, "yellow" },</span><br><span style="color: hsl(0, 100%, 40%);">-   { COLOR_BLUE,   "blue" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { COLOR_MAGENTA,"magenta" },</span><br><span style="color: hsl(0, 100%, 40%);">-  { COLOR_CYAN,   "cyan" },</span><br><span style="color: hsl(0, 100%, 40%);">-     { COLOR_BLACK,  "black" },</span><br><span style="color: hsl(0, 100%, 40%);">-    { 0, NULL }</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- char *header[1];</span><br><span style="color: hsl(0, 100%, 40%);">-        char *title[1];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- msgb_talloc_ctx_init(NULL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  printf("sizeof(gsm_meas_rep)=%u\n", sizeof(struct gsm_meas_rep));</span><br><span style="color: hsl(0, 100%, 40%);">-     printf("sizeof(meas_feed_meas)=%u\n", sizeof(struct meas_feed_meas));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- INIT_LLIST_HEAD(&g_st.ms_list);</span><br><span style="color: hsl(0, 100%, 40%);">-     g_st.curses_win = initscr();</span><br><span style="color: hsl(0, 100%, 40%);">-    g_st.cdkscreen = initCDKScreen(g_st.curses_win);</span><br><span style="color: hsl(0, 100%, 40%);">-        initCDKColor();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- g_st.title = "OpenBSC link quality monitor";</span><br><span style="color: hsl(0, 100%, 40%);">-  title[0] = g_st.title;</span><br><span style="color: hsl(0, 100%, 40%);">-  g_st.cdk_title = newCDKLabel(g_st.cdkscreen, CENTER, 0, title, 1, FALSE, FALSE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        snprintf(g_st.header, sizeof(g_st.header), "Q Pwr TA TO Time");</span><br><span style="color: hsl(0, 100%, 40%);">-       header[0] = g_st.header;</span><br><span style="color: hsl(0, 100%, 40%);">-        g_st.cdk_header = newCDKLabel(g_st.cdkscreen, RIGHT, 1, header, 1, FALSE, FALSE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span style="color: hsl(0, 100%, 40%);">-  int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 0; i < 64; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           short f, b;</span><br><span style="color: hsl(0, 100%, 40%);">-             pair_content(i, &f, &b);</span><br><span style="color: hsl(0, 100%, 40%);">-                attron(COLOR_PAIR(i));</span><br><span style="color: hsl(0, 100%, 40%);">-          printw("%u: %u (%s) ", i, f, get_value_string(col_strs, f));</span><br><span style="color: hsl(0, 100%, 40%);">-          printw("%u (%s)\n\r", b, get_value_string(col_strs, b));</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       refresh();</span><br><span style="color: hsl(0, 100%, 40%);">-      getch();</span><br><span style="color: hsl(0, 100%, 40%);">-        exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  g_st.udp_ofd.cb = udp_fd_cb;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc =  osmo_sock_init_ofd(&g_st.udp_ofd, AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 8888, OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_select_main(0);</span><br><span style="color: hsl(0, 100%, 40%);">-            update_sliders();</span><br><span style="color: hsl(0, 100%, 40%);">-       };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12655">change 12655</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12655"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: openbsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ia0cedaad4b717c8c5198842e2acd610f8e03f957 </div>
<div style="display:none"> Gerrit-Change-Number: 12655 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>