[PATCH 1/2] utils: 'meas_json' utility to convert measurement feed into a JSON feed.

Alexander Chemeris alexander.chemeris at gmail.com
Mon Apr 18 18:52:26 UTC 2016


Dear all,

Just wondering if this could be merged. I haven't seen any comments on the
patch - probably fallen through the cracks of the patchwork again.

Please excuse typos. Written with a touchscreen keyboard.

--
Regards,
Alexander Chemeris
CEO Fairwaves, Inc.
https://fairwaves.co
On Dec 12, 2015 5:44 PM, "Alexander Chemeris" <alexander.chemeris at gmail.com>
wrote:

> ---
>  openbsc/src/utils/Makefile.am |   6 +-
>  openbsc/src/utils/meas_json.c | 169
> ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 174 insertions(+), 1 deletion(-)
>  create mode 100644 openbsc/src/utils/meas_json.c
>
> diff --git a/openbsc/src/utils/Makefile.am b/openbsc/src/utils/Makefile.am
> index f6255a0..89f2dfb 100644
> --- a/openbsc/src/utils/Makefile.am
> +++ b/openbsc/src/utils/Makefile.am
> @@ -4,7 +4,7 @@ AM_LDFLAGS = $(COVERAGE_LDFLAGS)
>
>  noinst_HEADERS = meas_db.h
>
> -bin_PROGRAMS = bs11_config isdnsync
> +bin_PROGRAMS = bs11_config isdnsync meas_json
>  if HAVE_SQLITE3
>  bin_PROGRAMS += osmo-meas-pcap2db osmo-meas-udp2db
>  endif
> @@ -32,6 +32,10 @@ meas_vis_SOURCES = meas_vis.c
>  meas_vis_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) -lcdk -lncurses
>  meas_vis_CFLAGS = $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS)
>
> +meas_json_SOURCES = meas_json.c
> +meas_json_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
> +meas_json_CFLAGS = $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS)
> +
>  osmo_meas_pcap2db_SOURCES = meas_pcap2db.c meas_db.c
>  osmo_meas_pcap2db_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) -lpcap
> $(SQLITE3_LIBS)
>  osmo_meas_pcap2db_CFLAGS = $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS)
> diff --git a/openbsc/src/utils/meas_json.c b/openbsc/src/utils/meas_json.c
> new file mode 100644
> index 0000000..940e5e7
> --- /dev/null
> +++ b/openbsc/src/utils/meas_json.c
> @@ -0,0 +1,169 @@
> +/* Convert measurement report feed into JSON feed printed to stdout.
> + * Each measurement report is printed as a separae JSON root entry.
> + * All measurement reports are separated by a new line.
> + */
> +
> +/* (C) 2015 by Alexander Chemeris <Alexander.Chemeris at fairwaves.co>
> + * With parts of code adopted from different places in OpenBSC.
> + *
> + * All Rights Reserved
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Affero General Public License as
> published by
> + * the Free Software Foundation; either version 3 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Affero General Public License for more details.
> + *
> + * You should have received a copy of the GNU Affero General Public
> License
> + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
> + *
> + */
> +#include <string.h>
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +
> +#include <netinet/in.h>
> +
> +#include <osmocom/core/socket.h>
> +#include <osmocom/core/msgb.h>
> +#include <osmocom/core/select.h>
> +
> +#include <osmocom/gsm/gsm_utils.h>
> +
> +#include <openbsc/meas_feed.h>
> +
> +static void print_meas_rep_uni_json(struct gsm_meas_rep_unidir *mru)
> +{
> +       printf("\"RXL-FULL\":%d, \"RXL-SUB\":%d, ",
> +               rxlev2dbm(mru->full.rx_lev),
> +               rxlev2dbm(mru->sub.rx_lev));
> +       printf("\"RXQ-FULL\":%d, \"RXQ-SUB\":%d",
> +               mru->full.rx_qual, mru->sub.rx_qual);
> +}
> +
> +static void print_meas_rep_json(struct gsm_meas_rep *mr)
> +{
> +       int i;
> +
> +       printf("\"NR\":%d", mr->nr);
> +
> +       if (mr->flags & MEAS_REP_F_DL_DTX)
> +               printf(", \"DTXd\":true");
> +
> +       printf(", \"UL_MEAS\":{");
> +       print_meas_rep_uni_json(&mr->ul);
> +       printf("}");
> +       printf(", \"BS_POWER\":%d", mr->bs_power);
> +       if (mr->flags & MEAS_REP_F_MS_TO)
> +               printf(", \"MS_TO\":%d", mr->ms_timing_offset);
> +
> +       if (mr->flags & MEAS_REP_F_MS_L1) {
> +               printf(", \"L1_MS_PWR\":%d", mr->ms_l1.pwr);
> +               printf(", \"L1_FPC\":%s",
> +                       mr->flags & MEAS_REP_F_FPC ? "true" : "false");
> +               printf(", \"L1_TA\":%u", mr->ms_l1.ta);
> +       }
> +
> +       if (mr->flags & MEAS_REP_F_UL_DTX)
> +               printf(", \"DTXu\":true");
> +       if (mr->flags & MEAS_REP_F_BA1)
> +               printf(", \"BA1\":true");
> +       if (mr->flags & MEAS_REP_F_DL_VALID) {
> +               printf(", \"DL_MEAS\":{");
> +               print_meas_rep_uni_json(&mr->dl);
> +               printf("}");
> +       }
> +
> +       if (mr->num_cell == 7)
> +               return;
> +       printf(", \"NUM_NEIGH\":%u, \"NEIGH\":[", mr->num_cell);
> +       for (i = 0; i < mr->num_cell; i++) {
> +               struct gsm_meas_rep_cell *mrc = &mr->cell[i];
> +               if (i!=0) printf(", ");
> +               printf("\"IDX\":%u, \"ARFCN\":%u, \"BSIC\":%u,
> \"POWER\":%d",
> +                       mrc->neigh_idx, mrc->arfcn, mrc->bsic,
> rxlev2dbm(mrc->rxlev));
> +       }
> +       printf("]");
> +}
> +
> +static void print_meas_feed_json(struct meas_feed_meas *mfm)
> +{
> +       time_t now = time(NULL);
> +
> +       printf("{");
> +       printf("\"time\":%ld, \"imsi\":\"%s\", \"name\":\"%s\",
> \"scenario\":\"%s\", ",
> +               now, mfm->imsi, mfm->name, mfm->scenario);
> +
> +       printf("\"meas_rep\":{");
> +       print_meas_rep_json(&mfm->mr);
> +       printf("}");
> +
> +       printf("}\n");
> +
> +}
> +
> +static int handle_meas(struct msgb *msg)
> +{
> +       struct meas_feed_meas *mfm = (struct meas_feed_meas *)
> msgb_data(msg);
> +
> +       print_meas_feed_json(mfm);
> +
> +       return 0;
> +}
> +
> +static int handle_msg(struct msgb *msg)
> +{
> +       struct meas_feed_hdr *mfh = (struct meas_feed_hdr *)
> msgb_data(msg);
> +
> +       if (mfh->version != MEAS_FEED_VERSION)
> +               return -EINVAL;
> +
> +       switch (mfh->msg_type) {
> +       case MEAS_FEED_MEAS:
> +               handle_meas(msg);
> +               break;
> +       default:
> +               break;
> +       }
> +}
> +
> +static int udp_fd_cb(struct osmo_fd *ofd, unsigned int what)
> +{
> +       int rc;
> +
> +       if (what & BSC_FD_READ) {
> +               struct msgb *msg = msgb_alloc(1024, "UDP Rx");
> +
> +               rc = read(ofd->fd, msgb_data(msg), msgb_tailroom(msg));
> +               if (rc < 0)
> +                       return rc;
> +               msgb_put(msg, rc);
> +               handle_msg(msg);
> +               msgb_free(msg);
> +       }
> +
> +       return 0;
> +}
> +
> +int main(int argc, char **argv)
> +{
> +       int rc;
> +       struct osmo_fd udp_ofd;
> +
> +       udp_ofd.cb = udp_fd_cb;
> +       rc =  osmo_sock_init_ofd(&udp_ofd, AF_INET, SOCK_DGRAM,
> IPPROTO_UDP, NULL, 8888, OSMO_SOCK_F_BIND);
> +       if (rc < 0)
> +               exit(1);
> +
> +       while (1) {
> +               osmo_select_main(0);
> +       };
> +
> +       exit(0);
> +}
> --
> 1.9.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/openbsc/attachments/20160418/6bbb041c/attachment-0001.html>


More information about the OpenBSC mailing list