diff options
Diffstat (limited to 'gsm-receiver/src/lib/decoder/gsmstack.c')
-rw-r--r-- | gsm-receiver/src/lib/decoder/gsmstack.c | 61 |
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; |