diff --git a/tests/scripts/thread-cert/pcap.py b/tests/scripts/thread-cert/pcap.py index 905a5dd7b..267f14764 100644 --- a/tests/scripts/thread-cert/pcap.py +++ b/tests/scripts/thread-cert/pcap.py @@ -28,19 +28,25 @@ # """ Module to provide codec utilities for .pcap formatters. """ +import os import struct import time -DLT_IEEE802_15_4 = 195 +# https://www.tcpdump.org/linktypes.html +DLT_IEEE802_15_4_WITHFCS = 195 +DLT_IEEE802_15_4_TAP = 283 PCAP_MAGIC_NUMBER = 0xA1B2C3D4 PCAP_VERSION_MAJOR = 2 PCAP_VERSION_MINOR = 4 +PACKET_VERIFICATION = int(os.getenv('PACKET_VERIFICATION', 0)) + class PcapCodec(object): """ Utility class for .pcap formatters. """ def __init__(self, filename): + self._dlt = DLT_IEEE802_15_4_WITHFCS if PACKET_VERIFICATION else DLT_IEEE802_15_4_TAP self._pcap_file = open('%s.pcap' % filename, 'wb') self._pcap_file.write(self.encode_header()) @@ -54,14 +60,28 @@ class PcapCodec(object): 0, 0, 256, - DLT_IEEE802_15_4, + self._dlt, ) def encode_frame(self, frame, sec, usec): """ Returns a pcap encapsulation of the given frame. """ + length = 0 + + if self._dlt == DLT_IEEE802_15_4_TAP: + # Append TLVs according to 802.15.4 TAP specification: + # https://github.com/jkcko/ieee802.15.4-tap + pcap_tap_fcs_tlv = struct.pack("