From c679c2c3b7fc255225992466afa883d959970441 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 5 Jul 2011 16:41:47 +0200 Subject: Also open + process the DSP trace messages This patch now includes the encapsulation of sysmobts L1 dsp trace messages in the 'standard' osmocom style logging framework (DDSP subsystem) --- src/osmo-bts-sysmo/l1_fwd.h | 1 + src/osmo-bts-sysmo/l1_fwd_main.c | 30 +++++++++++++++----- src/osmo-bts-sysmo/l1_if.c | 10 +++++++ src/osmo-bts-sysmo/l1_if.h | 1 + src/osmo-bts-sysmo/l1_transp.h | 1 + src/osmo-bts-sysmo/l1_transp_fwd.c | 58 +++++++++++++++++++++++++++++++++++--- src/osmo-bts-sysmo/l1_transp_hw.c | 15 ++++++++-- 7 files changed, 102 insertions(+), 14 deletions(-) diff --git a/src/osmo-bts-sysmo/l1_fwd.h b/src/osmo-bts-sysmo/l1_fwd.h index 0c355499..c18e2d55 100644 --- a/src/osmo-bts-sysmo/l1_fwd.h +++ b/src/osmo-bts-sysmo/l1_fwd.h @@ -1,3 +1,4 @@ #define L1FWD_L1_PORT 9999 #define L1FWD_SYS_PORT 9998 +#define L1FWD_DBG_PORT 9997 diff --git a/src/osmo-bts-sysmo/l1_fwd_main.c b/src/osmo-bts-sysmo/l1_fwd_main.c index 2f9bf217..5a437049 100644 --- a/src/osmo-bts-sysmo/l1_fwd_main.c +++ b/src/osmo-bts-sysmo/l1_fwd_main.c @@ -52,16 +52,24 @@ #include "l1_transp.h" #include "l1_fwd.h" -static const uint16_t fwd_udp_ports[_NUM_MQ_WRITE] = { +static const uint16_t fwd_udp_ports[_NUM_MQ_READ] = { [MQ_SYS_READ] = L1FWD_SYS_PORT, [MQ_L1_READ] = L1FWD_L1_PORT, + [MQ_DBG_READ] = L1FWD_DBG_PORT, +}; + +static const struct value_string l1t_mq_names[] = { + { MQ_SYS_READ, "SYS" }, + { MQ_L1_READ, "L1" }, + { MQ_DBG_READ, "DBG" }, + { 0, NULL } }; struct l1fwd_hdl { struct sockaddr_storage remote_sa; socklen_t remote_sa_len; - struct osmo_wqueue udp_wq[_NUM_MQ_WRITE]; + struct osmo_wqueue udp_wq[_NUM_MQ_READ]; struct femtol1_hdl *fl1h; }; @@ -73,7 +81,7 @@ int l1if_handle_l1prim(struct femtol1_hdl *fl1h, struct msgb *msg) struct l1fwd_hdl *l1fh = fl1h->priv; /* Enqueue message to UDP socket */ - return osmo_wqueue_enqueue(&l1fh->udp_wq[MQ_L1_WRITE], msg); + return osmo_wqueue_enqueue(&l1fh->udp_wq[MQ_L1_READ], msg); } /* callback when there's a new SYS primitive coming in from the HW */ @@ -82,9 +90,17 @@ int l1if_handle_sysprim(struct femtol1_hdl *fl1h, struct msgb *msg) struct l1fwd_hdl *l1fh = fl1h->priv; /* Enqueue message to UDP socket */ - return osmo_wqueue_enqueue(&l1fh->udp_wq[MQ_SYS_WRITE], msg); + return osmo_wqueue_enqueue(&l1fh->udp_wq[MQ_SYS_READ], msg); } +/* callback when there's a new DBG primitive coming in from the HW */ +int l1if_handle_dbg(struct femtol1_hdl *fl1h, struct msgb *msg) +{ + struct l1fwd_hdl *l1fh = fl1h->priv; + + /* Enqueue message to UDP socket */ + return osmo_wqueue_enqueue(&l1fh->udp_wq[MQ_DBG_READ], msg); +} /* data has arrived on the udp socket */ static int udp_read_cb(struct osmo_fd *ofd) @@ -114,7 +130,7 @@ static int udp_read_cb(struct osmo_fd *ofd) msgb_put(msg, rc); DEBUGP(DL1C, "UDP: Received %u bytes for %s queue\n", rc, - ofd->priv_nr == MQ_SYS_WRITE ? "SYS" : "L1"); + get_value_string(l1t_mq_names, ofd->priv_nr)); /* put the message into the right queue */ if (ofd->priv_nr == MQ_SYS_WRITE) @@ -132,7 +148,7 @@ static int udp_write_cb(struct osmo_fd *ofd, struct msgb *msg) struct l1fwd_hdl *l1fh = ofd->data; DEBUGP(DL1C, "UDP: Writing %u bytes for %s queue\n", msgb_l1len(msg), - ofd->priv_nr == MQ_SYS_WRITE ? "SYS" : "L1"); + get_value_string(l1t_mq_names, ofd->priv_nr)); rc = sendto(ofd->fd, msg->l1h, msgb_l1len(msg), 0, (const struct sockaddr *)&l1fh->remote_sa, l1fh->remote_sa_len); @@ -176,7 +192,7 @@ int main(int argc, char **argv) fl1h->priv = l1fh; /* Open UDP */ - for (i = 0; i < 2; i++) { + for (i = 0; i < 3; i++) { struct osmo_wqueue *wq = &l1fh->udp_wq[i]; osmo_wqueue_init(wq, 10); diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c index b87cfdce..2fcf8940 100644 --- a/src/osmo-bts-sysmo/l1_if.c +++ b/src/osmo-bts-sysmo/l1_if.c @@ -589,6 +589,16 @@ int l1if_handle_sysprim(struct femtol1_hdl *fl1h, struct msgb *msg) return l1if_handle_ind(fl1h, msg); } +int l1if_handle_dbg(struct femtol1_hdl *fl1h, struct msgb *msg) +{ + /* the msgb simply contains a zero-terminated string, print it + * to the log file */ + LOGP(DDSP, LOGL_DEBUG, "%s", msg->data); + msgb_free(msg); + + return 0; +} + #if 0 /* called by RSL if the BCCH SI has been modified */ int sysinfo_has_changed(struct gsm_bts *bts, int si) diff --git a/src/osmo-bts-sysmo/l1_if.h b/src/osmo-bts-sysmo/l1_if.h index 18934201..a83c45a0 100644 --- a/src/osmo-bts-sysmo/l1_if.h +++ b/src/osmo-bts-sysmo/l1_if.h @@ -8,6 +8,7 @@ enum { MQ_SYS_READ, MQ_L1_READ, + MQ_DBG_READ, _NUM_MQ_READ }; diff --git a/src/osmo-bts-sysmo/l1_transp.h b/src/osmo-bts-sysmo/l1_transp.h index 5226961d..989cdc9b 100644 --- a/src/osmo-bts-sysmo/l1_transp.h +++ b/src/osmo-bts-sysmo/l1_transp.h @@ -6,6 +6,7 @@ /* functions a transport calls on arrival of primitive from BTS */ int l1if_handle_l1prim(struct femtol1_hdl *fl1h, struct msgb *msg); int l1if_handle_sysprim(struct femtol1_hdl *fl1h, struct msgb *msg); +int l1if_handle_dbg(struct femtol1_hdl *fl1h, struct msgb *msg); /* functions exported by a transport */ int l1if_transport_open(struct femtol1_hdl *fl1h); diff --git a/src/osmo-bts-sysmo/l1_transp_fwd.c b/src/osmo-bts-sysmo/l1_transp_fwd.c index aad7f9b0..dd66db99 100644 --- a/src/osmo-bts-sysmo/l1_transp_fwd.c +++ b/src/osmo-bts-sysmo/l1_transp_fwd.c @@ -54,8 +54,16 @@ #include "l1_fwd.h" static const uint16_t fwd_udp_ports[] = { - [MQ_SYS_WRITE] = L1FWD_SYS_PORT, - [MQ_L1_WRITE] = L1FWD_L1_PORT, + [MQ_SYS_READ] = L1FWD_SYS_PORT, + [MQ_L1_READ] = L1FWD_L1_PORT, + [MQ_DBG_READ] = L1FWD_DBG_PORT, +}; + +static const struct value_string l1t_mq_names[] = { + { MQ_SYS_READ, "SYS" }, + { MQ_L1_READ, "L1" }, + { MQ_DBG_READ, "DBG" }, + { 0, NULL } }; static int fwd_read_cb(struct osmo_fd *ofd) @@ -80,14 +88,29 @@ static int fwd_read_cb(struct osmo_fd *ofd) } msgb_put(msg, rc); - if (ofd->priv_nr == MQ_SYS_WRITE) + switch (ofd->priv_nr) { + case MQ_SYS_WRITE: rc = l1if_handle_sysprim(fl1h, msg); - else + break; + case MQ_L1_READ: rc = l1if_handle_l1prim(fl1h, msg); + break; + case MQ_DBG_READ: + rc = l1if_handle_dbg(fl1h, msg); + break; + } return rc; } +static int fwd_read_cb_bfd(struct osmo_fd *ofd, unsigned int what) +{ + if (what & BSC_FD_READ) + return fwd_read_cb(ofd); + + return 0; +} + static int prim_write_cb(struct osmo_fd *ofd, struct msgb *msg) { /* write to the fd */ @@ -127,6 +150,25 @@ int l1if_transport_open(struct femtol1_hdl *fl1h) return rc; } } + /* special case: debug is read-only and has no write_q */ + i = MQ_DBG_READ; + { + struct osmo_fd *ofd = &fl1h->read_ofd[i]; + + ofd->data = fl1h; + ofd->priv_nr = i; + ofd->when |= BSC_FD_READ; + ofd->cb = fwd_read_cb_bfd; + + rc = osmo_sock_init_ofd(ofd, AF_UNSPEC, SOCK_DGRAM, + IPPROTO_UDP, bts_host, + fwd_udp_ports[i], + OSMO_SOCK_F_CONNECT); + if (rc < 0) { + talloc_free(fl1h); + return rc; + } + } return 0; } @@ -143,6 +185,14 @@ int l1if_transport_close(struct femtol1_hdl *fl1h) osmo_fd_unregister(ofd); close(ofd->fd); } + /* special case: debug is read-only and has no write_q */ + i = MQ_DBG_READ; + { + struct osmo_fd *ofd = &fl1h->read_ofd[i]; + + osmo_fd_unregister(ofd); + close(ofd->fd); + } return 0; } diff --git a/src/osmo-bts-sysmo/l1_transp_hw.c b/src/osmo-bts-sysmo/l1_transp_hw.c index d7e01e92..a4fb2fc4 100644 --- a/src/osmo-bts-sysmo/l1_transp_hw.c +++ b/src/osmo-bts-sysmo/l1_transp_hw.c @@ -48,12 +48,14 @@ #define DEV_SYS_DSP2ARM_NAME "/dev/msgq/femtobts_dsp2arm" #define DEV_SYS_ARM2DSP_NAME "/dev/msgq/femtobts_arm2dsp" +#define DEV_DBG_DSP2ARM_NAME "/dev/rtfifo/dsp_trace" #define DEV_L1_DSP2ARM_NAME "/dev/msgq/gsml1_dsp2arm" #define DEV_L1_ARM2DSP_NAME "/dev/msgq/gsml1_arm2dsp" static const char *rd_devnames[] = { [MQ_SYS_READ] = DEV_SYS_DSP2ARM_NAME, [MQ_L1_READ] = DEV_L1_DSP2ARM_NAME, + [MQ_DBG_READ] = DEV_DBG_DSP2ARM_NAME, }; static const char *wr_devnames[] = { @@ -70,7 +72,7 @@ static int l1if_fd_cb(struct osmo_fd *ofd, unsigned int what) int rc; msg->l1h = msg->data; - rc = read(ofd->fd, msg->l1h, sizeof(GsmL1_Prim_t)); + rc = read(ofd->fd, msg->l1h, msgb_tailroom(msg)); if (rc < 0) { if (rc != -1) LOGP(DL1C, LOGL_ERROR, "error reading from L1 msg_queue: %s\n", @@ -80,10 +82,17 @@ static int l1if_fd_cb(struct osmo_fd *ofd, unsigned int what) } msgb_put(msg, rc); - if (ofd->priv_nr == MQ_L1_WRITE) + switch (ofd->priv_nr) { + case MQ_L1_READ: return l1if_handle_l1prim(fl1h, msg); - else + case MQ_SYS_READ: return l1if_handle_sysprim(fl1h, msg); + case MQ_DBG_READ: + return l1if_handle_dbg(fl1h, msg); + default: + msgb_free(msg); + return 0; + } }; /* callback when we can write to one of the l1 msg_queue devices */ -- cgit v1.2.3