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:
parent
a115fbb1bb
commit
a32c769bb7
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue