diff --git a/README.md b/README.md index b27207e..6fc4a23 100644 --- a/README.md +++ b/README.md @@ -85,3 +85,13 @@ $ zigpy ota dump-firmware 10047227-1.2-TRADFRI-cv-cct-unified-2.3.050.ota.ota.si | grep 'Ember Version' Ember Version: 6.3.1.1 ``` + + +# PCAP +Re-calculate the FCS on a packet capture due to a bug in current EmberZNet SDK releases: +```console +$ # Fix an existing capture +$ zigpy pcap fix-fcs input.pcap fixed.pcap +$ # Fix a capture from stdin and send it to stdout +$ bellows -d /dev/cu.GoControl_zigbee dump -w /dev/stdout | zigpy pcap fix-fcs - - | wireshark -k -S -i - +``` diff --git a/setup.py b/setup.py index acf0a58..7414d33 100644 --- a/setup.py +++ b/setup.py @@ -21,6 +21,7 @@ "zigpy", "click", "coloredlogs", + "scapy", ], extras_require={ # [all] pulls in all radio libraries diff --git a/zigpy_cli/__main__.py b/zigpy_cli/__main__.py index 430e072..b70be0d 100644 --- a/zigpy_cli/__main__.py +++ b/zigpy_cli/__main__.py @@ -1,3 +1,4 @@ import zigpy_cli.ota # noqa: F401 +import zigpy_cli.pcap # noqa: F401 import zigpy_cli.radio # noqa: F401 from zigpy_cli.cli import cli # noqa: F401 diff --git a/zigpy_cli/pcap.py b/zigpy_cli/pcap.py new file mode 100644 index 0000000..ed7a7e5 --- /dev/null +++ b/zigpy_cli/pcap.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +import logging + +import click +from scapy.utils import PcapReader, PcapWriter +from scapy.config import conf as scapy_conf +from scapy.layers.dot15d4 import Dot15d4 # NOQA: F401 + +from zigpy_cli.cli import cli + +scapy_conf.dot15d4_protocol = "zigbee" + +LOGGER = logging.getLogger(__name__) + + +@cli.group() +def pcap(): + pass + + +@pcap.command() +@click.argument("input", type=click.File("rb")) +@click.argument("output", type=click.File("wb")) +def fix_fcs(input, output): + reader = PcapReader(input.raw) + writer = PcapWriter(output.raw) + + for packet in reader: + packet.fcs = None + writer.write(packet)