summaryrefslogtreecommitdiffstats
path: root/src/gsmtap_util.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-06-29 22:31:21 +0200
committerHarald Welte <laforge@gnumonks.org>2010-06-29 22:31:21 +0200
commite34a94054227bb8b21a6082f7954fea980e2fead (patch)
treee2e25c734e2aba03dd01f330c26d40dd9b2df261 /src/gsmtap_util.c
parente779c364ac7eb1f6bcf42e507972bc3322e6f908 (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/gsmtap_util.c')
-rw-r--r--src/gsmtap_util.c31
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;