| 1544 | |
| 1545 | |
| 1546 | class PcapReader(RawPcapReader): |
| 1547 | def __init__(self, filename, fdesc=None, magic=None): # type: ignore |
| 1548 | # type: (str, IO[bytes], bytes) -> None |
| 1549 | RawPcapReader.__init__(self, filename, fdesc, magic) |
| 1550 | try: |
| 1551 | self.LLcls = conf.l2types.num2layer[ |
| 1552 | self.linktype |
| 1553 | ] # type: Type[Packet] |
| 1554 | except KeyError: |
| 1555 | warning("PcapReader: unknown LL type [%i]/[%#x]. Using Raw packets" % (self.linktype, self.linktype)) # noqa: E501 |
| 1556 | if conf.raw_layer is None: |
| 1557 | # conf.raw_layer is set on import |
| 1558 | import scapy.packet # noqa: F401 |
| 1559 | self.LLcls = conf.raw_layer |
| 1560 | |
| 1561 | def __enter__(self): |
| 1562 | # type: () -> PcapReader |
| 1563 | return self |
| 1564 | |
| 1565 | def read_packet(self, size=MTU, **kwargs): |
| 1566 | # type: (int, **Any) -> Packet |
| 1567 | rp = super(PcapReader, self)._read_packet(size=size) |
| 1568 | if rp is None: |
| 1569 | raise EOFError |
| 1570 | s, pkt_info = rp |
| 1571 | |
| 1572 | try: |
| 1573 | p = self.LLcls(s, **kwargs) # type: Packet |
| 1574 | except KeyboardInterrupt: |
| 1575 | raise |
| 1576 | except Exception: |
| 1577 | if conf.debug_dissector: |
| 1578 | from scapy.sendrecv import debug |
| 1579 | debug.crashed_on = (self.LLcls, s) |
| 1580 | raise |
| 1581 | if conf.raw_layer is None: |
| 1582 | # conf.raw_layer is set on import |
| 1583 | import scapy.packet # noqa: F401 |
| 1584 | p = conf.raw_layer(s) |
| 1585 | power = Decimal(10) ** Decimal(-9 if self.nano else -6) |
| 1586 | p.time = EDecimal(pkt_info.sec + power * pkt_info.usec) |
| 1587 | p.wirelen = pkt_info.wirelen |
| 1588 | return p |
| 1589 | |
| 1590 | def recv(self, size=MTU, **kwargs): # type: ignore |
| 1591 | # type: (int, **Any) -> Packet |
| 1592 | return self.read_packet(size=size, **kwargs) |
| 1593 | |
| 1594 | def __iter__(self): |
| 1595 | # type: () -> PcapReader |
| 1596 | return self |
| 1597 | |
| 1598 | def __next__(self): # type: ignore |
| 1599 | # type: () -> Packet |
| 1600 | try: |
| 1601 | return self.read_packet() |
| 1602 | except EOFError: |
| 1603 | raise StopIteration |