1#!/usr/bin/env python3 2# 3# Copyright (c) 2019, The OpenThread Authors. 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 3. Neither the name of the copyright holder nor the 14# names of its contributors may be used to endorse or promote products 15# derived from this software without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' 18# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27# POSSIBILITY OF SUCH DAMAGE. 28# 29import logging 30import os 31import subprocess 32from typing import Optional 33 34import pyshark 35 36from pktverify import consts, utils 37from pktverify.packet import Packet 38from pktverify.packet_filter import PacketFilter 39 40 41class PcapReader(object): 42 """ 43 Implements Pcap reading utilities. 44 """ 45 46 @classmethod 47 def read(cls, 48 filename: str, 49 override_prefs: Optional[dict] = None, 50 tshark_path: Optional[str] = None) -> PacketFilter: 51 """ 52 Read packets from a given Pcap file. 53 54 :param filename: The Pcap file. 55 :param override_prefs: Preferences settings for wireshark 56 :param tshark_path: The optional path to the `tshark`. 57 :return: A PacketFilter containing all packets of the Pcap file. 58 """ 59 if override_prefs is None: 60 override_prefs = consts.WIRESHARK_OVERRIDE_PREFS 61 if tshark_path is None: 62 tshark_path = utils.which_tshark() 63 64 logging.info("Using tshark path: %s", tshark_path) 65 subprocess.check_call(f"{tshark_path} -v", shell=True) 66 os.system(f"ls -l {filename}") 67 filecap = pyshark.FileCapture(filename, 68 tshark_path=tshark_path, 69 override_prefs=override_prefs, 70 decode_as=consts.WIRESHARK_DECODE_AS_ENTRIES) 71 filecap.load_packets() 72 return PacketFilter(tuple(map(Packet, filecap._packets))) 73 74 75if __name__ == '__main__': 76 pkts = PcapReader.read("../../../../merged.pcap") 77 print(len(pkts), 'packets loaded') 78 for p in pkts: 79 if not p.mle: 80 break 81 82 print("mle.cmd=%r" % p.mle.cmd) 83