wireshark: add support for an IEEE 802.15.4 TAP Header, using a new ZIGBEE_TAP link type

This check for an optional "channel" key in the pmt dict, and adds an
additional TLV to the TAP header.
This commit is contained in:
Mathieu Rene
2024-08-16 21:49:53 -04:00
committed by Bastian Bloessl
parent 7c154d97f7
commit 4190fcd94a
6 changed files with 107 additions and 38 deletions
+2 -2
View File
@@ -9,8 +9,8 @@ parameters:
label: Technology
dtype: enum
default: '127'
options: ['127', '195']
option_labels: [WiFi, ZigBee]
options: ['127', '195', '283']
option_labels: [WiFi, ZigBee, ZigBeeTap]
- id: debug
label: Debug
dtype: bool
+2 -1
View File
@@ -25,7 +25,8 @@ namespace foo {
enum LinkType {
WIFI = 127,
ZIGBEE = 195
ZIGBEE = 195,
ZIGBEE_TAP = 283
};
class FOO_API wireshark_connector : virtual public gr::block
+53
View File
@@ -16,6 +16,7 @@
*/
#include "wireshark_connector_impl.h"
#include <foo/wireshark_connector.h>
#include <pmt/pmt.h>
#include <gnuradio/io_signature.h>
#include <gnuradio/block_detail.h>
@@ -144,6 +145,58 @@ wireshark_connector_impl::handle_pdu(pmt::pmt_t pdu) {
offset += sizeof(pcap_hdr);
break;
}
case ZIGBEE_TAP:{
const size_t max_extra_size = sizeof(tap_hdr) + sizeof(tap_tlv_fcs) + sizeof(tap_tlv_channel);
size_t extra_size = sizeof(tap_hdr) + sizeof(tap_tlv_fcs);
d_msg = reinterpret_cast<char*>(std::malloc(len + sizeof(pcap_hdr) + max_extra_size));
pcap_hdr *hdr = reinterpret_cast<pcap_hdr*>(d_msg);
hdr->ts_sec = ts_sec;
hdr->ts_usec = ts_usec;
// hdr->incl_len is set at the end of the scope
// hdr->orig_len is set at the end of the scope
offset += sizeof(pcap_hdr);
tap_hdr *tap = reinterpret_cast<tap_hdr*>(d_msg + offset);
tap->version = 0;
tap->reserved = 0;
// tap->length is set at the end of the scope
offset += sizeof(tap_hdr);
tap_tlv_fcs *fcs = reinterpret_cast<tap_tlv_fcs*>(d_msg + offset);
fcs->type = 0; // FCS_TYPE
fcs->length = 1;
fcs->fcs_type = 1; // 16 bit crc
for (int i = 0; i < 3; i++) {
fcs->padding[i] = 0;
}
offset += sizeof(tap_tlv_fcs);
pmt::pmt_t dict = pmt::car(pdu);
if(pmt::dict_has_key(dict, pmt::mp("channel"))) {
pmt::pmt_t s = pmt::dict_ref(dict, pmt::mp("channel"), pmt::PMT_NIL);
if(pmt::is_integer(s)) {
tap_tlv_channel *chan = reinterpret_cast<tap_tlv_channel*>(d_msg + offset);
chan->type = 3; // CHANNEL_ASSIGNMENT
chan->length = 3;
chan->channel_number = (uint16_t)pmt::to_long(s);
chan->channel_page = 0;
chan->padding = 0;
offset += sizeof(tap_tlv_channel);
extra_size += sizeof(tap_tlv_channel);
}
}
tap->length = extra_size;
hdr->incl_len = len + extra_size;
hdr->orig_len = len + extra_size;
break;
}
}
memcpy(d_msg + offset, buf, len);
+29
View File
@@ -75,6 +75,35 @@ namespace foo {
};
#pragma pack(pop)
#pragma pack(push, 1)
// An 802.15.4 TAP header as defined in https://gitlab.com/exegin/ieee802-15-4-tap/
struct tap_hdr {
uint8_t version;
uint8_t reserved;
uint16_t length;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct tap_tlv_fcs {
uint16_t type; // FCS_TYPE = 0
uint16_t length; // 1
uint8_t fcs_type; // 0 = None, 1 = 16-bit CRC, 2 = 32-bit CRC
uint8_t padding[3]; // Should be 0 padded
};
#pragma pack(pop)
#pragma pack(push, 1)
struct tap_tlv_channel {
uint16_t type; // CHANNEL_ASSIGNMENT = 3
uint16_t length; // 3
uint16_t channel_number;
uint8_t channel_page;
uint8_t padding; // Should be 0 padded
};
#pragma pack(pop)
} // namespace foo
} // namespace gr
@@ -1,5 +1,5 @@
/*
* Copyright 2021 Free Software Foundation, Inc.
* Copyright 2024 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -7,7 +7,7 @@
*
*/
#include "pydoc_macros.h"
#define D(...) DOC(gr,foo, __VA_ARGS__ )
#define D(...) DOC(gr, foo, __VA_ARGS__)
/*
This file contains placeholders for docstrings for the Python bindings.
Do not edit! These were automatically extracted during the binding process
@@ -15,13 +15,10 @@
*/
static const char *__doc_gr_foo_wireshark_connector = R"doc()doc";
static const char* __doc_gr_foo_wireshark_connector = R"doc()doc";
static const char *__doc_gr_foo_wireshark_connector_wireshark_connector = R"doc()doc";
static const char *__doc_gr_foo_wireshark_connector_make = R"doc()doc";
static const char* __doc_gr_foo_wireshark_connector_wireshark_connector_0 = R"doc()doc";
static const char* __doc_gr_foo_wireshark_connector_make = R"doc()doc";
+13 -24
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2021 Free Software Foundation, Inc.
* Copyright 2024 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -14,7 +14,7 @@
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(wireshark_connector.h) */
/* BINDTOOL_HEADER_FILE_HASH(10414a436e555bc27b41e65120989433) */
/* BINDTOOL_HEADER_FILE_HASH(fcd645d2eb8f7772de5e8ded1ce89be8) */
/***********************************************************************************/
#include <pybind11/complex.h>
@@ -33,36 +33,25 @@ void bind_wireshark_connector(py::module& m)
using wireshark_connector = ::gr::foo::wireshark_connector;
py::class_<wireshark_connector, gr::block, gr::basic_block,
std::shared_ptr<wireshark_connector>>(m, "wireshark_connector", D(wireshark_connector))
py::class_<wireshark_connector,
gr::block,
gr::basic_block,
std::shared_ptr<wireshark_connector>>(
m, "wireshark_connector", D(wireshark_connector))
.def(py::init(&wireshark_connector::make),
py::arg("type"),
py::arg("debug") = false,
D(wireshark_connector,make)
)
D(wireshark_connector, make))
;
py::enum_<::gr::foo::LinkType>(m,"LinkType")
.value("WIFI", ::gr::foo::WIFI) // 127
.value("ZIGBEE", ::gr::foo::ZIGBEE) // 195
.export_values()
;
py::enum_<::gr::foo::LinkType>(m, "LinkType")
.value("WIFI", ::gr::foo::LinkType::WIFI) // 127
.value("ZIGBEE", ::gr::foo::LinkType::ZIGBEE) // 195
.value("ZIGBEE_TAP", ::gr::foo::LinkType::ZIGBEE_TAP) // 283
.export_values();
py::implicitly_convertible<int, ::gr::foo::LinkType>();
}