summaryrefslogtreecommitdiff
path: root/gsm-receiver/src/lib/decoder/gsmstack.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsm-receiver/src/lib/decoder/gsmstack.c')
-rw-r--r--gsm-receiver/src/lib/decoder/gsmstack.c61
1 files changed, 40 insertions, 21 deletions
diff --git a/gsm-receiver/src/lib/decoder/gsmstack.c b/gsm-receiver/src/lib/decoder/gsmstack.c
index c3f1921..6c91395 100644
--- a/gsm-receiver/src/lib/decoder/gsmstack.c
+++ b/gsm-receiver/src/lib/decoder/gsmstack.c
@@ -6,6 +6,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
+#include <unistd.h>
#include <string.h>
#include "gsmstack.h"
//#include "gsm_constants.h"
@@ -13,9 +14,16 @@
//#include "sch.h"
#include "cch.h"
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <osmocore/msgb.h>
+#include <osmocore/gsmtap.h>
+#include <osmocore/gsmtap_util.h>
+
static const int USEFUL_BITS = 142;
-//#include "out_pcap.h"
enum BURST_TYPE {
UNKNOWN,
FCCH,
@@ -79,22 +87,31 @@ diff_decode(char *dst, char *src, int len)
int
GS_new(GS_CTX *ctx)
{
+ int rc;
+ struct sockaddr_in sin;
+
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(GSMTAP_UDP_PORT);
+ inet_aton("127.0.0.1", &sin.sin_addr);
+
memset(ctx, 0, sizeof *ctx);
interleave_init(&ctx->interleave_ctx, 456, 114);
ctx->fn = -1;
ctx->bsic = -1;
+ ctx->gsmtap_fd = -1;
- ctx->tun_fd = mktun("gsm", ctx->ether_addr);
- if (ctx->tun_fd < 0)
- fprintf(stderr, "cannot open 'gsm' tun device, did you create it?\n");
-
- ctx->pcap_fd = open_pcap_file("gsm-receiver.pcap");
- if (ctx->pcap_fd < 0)
- fprintf(stderr, "cannot open PCAP file: %s\n", strerror(errno));
-
- ctx->burst_pcap_fd = open_pcap_file("gsm-receiver-burst.pcap");
- if (ctx->burst_pcap_fd < 0)
- fprintf(stderr, "cannot open burst PCAP file: %s\n", strerror(errno));
+ rc = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ if (rc < 0) {
+ perror("creating UDP socket\n");
+ return rc;
+ }
+ ctx->gsmtap_fd = rc;
+ rc = connect(rc, (struct sockaddr *)&sin, sizeof(sin));
+ if (rc < 0) {
+ perror("connectiong UDP socket");
+ close(ctx->gsmtap_fd);
+ return rc;
+ }
return 0;
}
@@ -112,15 +129,9 @@ GS_process(GS_CTX *ctx, int ts, int type, const unsigned char *src, int fn)
unsigned char *data;
int len;
struct gs_ts_ctx *ts_ctx = &ctx->ts_ctx[ts];
- unsigned char octified[BURST_BYTES];
memset(ctx->msg, 0, sizeof(ctx->msg));
- /* write burst to burst PCAP file */
- burst_octify(octified, src, USEFUL_BITS);
- write_pcap_packet(ctx->burst_pcap_fd, 0 /* arfcn */, ts, ctx->fn,
- 1, type, octified, BURST_BYTES);
-
#if 0
if (ts != 0) {
/* non-0 timeslots should end up in PCAP */
@@ -177,9 +188,17 @@ GS_process(GS_CTX *ctx, int ts, int type, const unsigned char *src, int fn)
//DEBUGF("OK TS %d, len %d\n", ts, len);
out_gsmdecode(0, 0, ts, ctx->fn - 4, data, len);
- write_interface(ctx->tun_fd, data+1, len-1, ctx->ether_addr);
- write_pcap_packet(ctx->pcap_fd, 0 /* arfcn */, ts, ctx->fn,
- 0, NORMAL, data, len);
+
+ if (ctx->gsmtap_fd >= 0) {
+ struct msgb *msg;
+ /* arfcn, ts, chan_type, ss, fn, signal, snr, data, len */
+ msg = gsmtap_makemsg(0, ts, GSMTAP_CHANNEL_BCCH, 0,
+ ctx->fn-4, 0, 0, data, len);
+ if (msg)
+ write(ctx->gsmtap_fd, msg->data,
+ msg->len);
+ }
+
#if 0
if (ctx->fn % 51 != 0) && ( (((ctx->fn % 51 + 5) % 10 == 0) || (((ctx->fn % 51) + 1) % 10 ==0) ) )
ready = 1;
personal git repositories of Harald Welte. Your mileage may vary