diff options
author | Harald Welte <laforge@gnumonks.org> | 2010-06-29 22:31:21 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2010-06-29 22:31:21 +0200 |
commit | e34a94054227bb8b21a6082f7954fea980e2fead (patch) | |
tree | e2e25c734e2aba03dd01f330c26d40dd9b2df261 /src | |
parent | e779c364ac7eb1f6bcf42e507972bc3322e6f908 (diff) |
[gsmtap] add new gsmtap_makemsg() function
This generates a gsmtap message without actually enqueueing to a
bsc_select style queue.
Diffstat (limited to 'src')
-rw-r--r-- | src/gsmtap_util.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c index 5da43690..abee4dac 100644 --- a/src/gsmtap_util.c +++ b/src/gsmtap_util.c @@ -81,21 +81,17 @@ uint8_t chantype_rsl2gsmtap(uint8_t rsl_chantype, uint8_t link_id) } /* receive a message from L1/L2 and put it in GSMTAP */ -int gsmtap_sendmsg(uint16_t arfcn, uint8_t ts, uint8_t chan_type, uint8_t ss, - uint32_t fn, int8_t signal_dbm, uint8_t snr, - const uint8_t *data, unsigned int len) +struct msgb *gsmtap_makemsg(uint16_t arfcn, uint8_t ts, uint8_t chan_type, + uint8_t ss, uint32_t fn, int8_t signal_dbm, + uint8_t snr, const uint8_t *data, unsigned int len) { struct msgb *msg; struct gsmtap_hdr *gh; uint8_t *dst; - /* gsmtap was never initialized, so don't try to send anything */ - if (gsmtap_bfd.fd == -1) - return 0; - msg = msgb_alloc(sizeof(*gh) + len, "gsmtap_tx"); if (!msg) - return -ENOMEM; + return NULL; gh = (struct gsmtap_hdr *) msgb_put(msg, sizeof(*gh)); @@ -114,6 +110,25 @@ int gsmtap_sendmsg(uint16_t arfcn, uint8_t ts, uint8_t chan_type, uint8_t ss, dst = msgb_put(msg, len); memcpy(dst, data, len); + return msg; +} + +/* receive a message from L1/L2 and put it in GSMTAP */ +int gsmtap_sendmsg(uint16_t arfcn, uint8_t ts, uint8_t chan_type, uint8_t ss, + uint32_t fn, int8_t signal_dbm, uint8_t snr, + const uint8_t *data, unsigned int len) +{ + struct msgb *msg; + + /* gsmtap was never initialized, so don't try to send anything */ + if (gsmtap_bfd.fd == -1) + return 0; + + msg = gsmtap_makemsg(arfcn, ts, chan_type, ss, fn, signal_dbm, + snr, data, len); + if (!msg) + return -ENOMEM; + msgb_enqueue(&gsmtap_txqueue, msg); gsmtap_bfd.when |= BSC_FD_WRITE; |