Generate GSMTAP messages from raw received DIAG frames

This forwards the raw DIAG messages via GSMTAP, so the receiver (e.g.
wireshark) will have to do a full DIAG protocol decode.  I currently
prefer this idea to that of converting only the protocol payload to
"native" GSMTAP messages like GSMTAP_UM.

One of the problems is that the LAPDm headers are alrady stripped, and
we would have to re-add fake LAPDm headers to generate GSMTAP_UM.  So
let's rather forward all information we have and let wireshark deal with
it.

I'm not entirely sure if this is  the best strategy, but we can always
implement both modes and switch between them at runtime.
This commit is contained in:
Harald Welte 2017-01-07 16:01:09 +01:00
parent a115fbb1bb
commit a32c769bb7
3 changed files with 17 additions and 0 deletions

View File

@ -23,6 +23,9 @@
#include <string.h>
#include <unistd.h>
#include <osmocom/core/gsmtap.h>
#include <osmocom/core/gsmtap_util.h>
#include "protocol/protocol.h"
#include "diag_io.h"
#include "diag_cmd.h"
@ -45,6 +48,11 @@ int diag_transmit_msgb(struct diag_instance *di, struct msgb *msg)
struct diag_send_desc_type send;
struct diag_hdlc_dest_type enc = { NULL, NULL, 0 };
if (di->flags & DIAG_INST_F_GSMTAP_DIAG && di->gsmtap) {
gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_QC_DIAG, 0, 0, 0,
0, 0, 0, 0, msgb_l2(msg), msgb_l2len(msg));
}
if (di->flags & DIAG_INST_F_HEXDUMP)
printf("Tx: %s\n", msgb_hexdump(msg));
@ -146,6 +154,13 @@ struct msgb *diag_read_msg(struct diag_instance *di)
if (di->flags & DIAG_INST_F_HEXDUMP)
printf("Rx: %s\n", msgb_hexdump(msg));
if (di->flags & DIAG_INST_F_GSMTAP_DIAG && di->gsmtap) {
gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_QC_DIAG,
GSMTAP_ARFCN_F_UPLINK, 0, 0, 0,
0, 0, 0, msgb_l2(msg),
msgb_l2len(msg));
}
return msg;
}

View File

@ -5,6 +5,7 @@
#include <osmocom/core/gsmtap_util.h>
#define DIAG_INST_F_HEXDUMP 0x00000001
#define DIAG_INST_F_GSMTAP_DIAG 0x00000002
struct diag_instance {
int fd;

View File

@ -160,6 +160,7 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
di.gsmtap = gsmtap_source_init("localhost", GSMTAP_UDP_PORT, 0);
di.flags = DIAG_INST_F_GSMTAP_DIAG;
gsmtap_source_add_sink(di.gsmtap);
printf("\n===> CONFIGURING\n");