Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pcapkit/protocols/internet/ipv6.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,8 +330,8 @@ def _read_ip_hextet(self) -> 'tuple[int, int, int]':
"""
_htet = self._read_fileng(4).hex()
_vers = int(_htet[0], base=16) # version number (6)
_tcls = int(_htet[0:2], base=16) # traffic class
_flow = int(_htet[2:], base=16) # flow label
_tcls = int(_htet[1:3], base=16) # traffic class
_flow = int(_htet[3:], base=16) # flow label

return (_vers, _tcls, _flow)

Expand Down
49 changes: 49 additions & 0 deletions tests/protocols/internet/test_ipv6_read_ip_hextet_unit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from __future__ import annotations

import importlib.util
import unittest
from unittest import mock

from tests._support import reimport_once_per_class

RUNTIME_DEPS = ('tbtrim', 'aenum', 'chardet', 'dictdumper')
HAS_RUNTIME = all(importlib.util.find_spec(name) is not None for name in RUNTIME_DEPS)


@unittest.skipUnless(HAS_RUNTIME, 'runtime dependencies not installed')
class IPv6ReadIPHextetUnitTests(unittest.TestCase):
"""GitHub issue #1094: the traffic class and flow label exclude the version nibble."""

def setUp(self) -> None:
reimport_once_per_class(self)

def test_read_ip_hextet_splits_version_class_and_label(self) -> None:
from pcapkit.protocols.internet.ipv6 import IPv6

proto = object.__new__(IPv6)
proto._read_fileng = mock.Mock(return_value=bytes.fromhex('6abcdef0'))

self.assertEqual(proto._read_ip_hextet(), (6, 0xab, 0xcdef0))
proto._read_fileng.assert_called_once_with(4)

def test_read_ip_hextet_agrees_with_schema_packing(self) -> None:
from pcapkit.const.reg.transtype import TransType
from pcapkit.protocols.internet.ipv6 import IPv6

proto = object.__new__(IPv6)
header = proto.make(
traffic_class=0xff,
flow_label=0xfffff,
next=TransType.UDP,
hop_limit=64,
src='2001:db8::1',
dst='2001:db8::2',
payload=b'',
).pack()

proto._read_fileng = mock.Mock(return_value=header[:4])
self.assertEqual(proto._read_ip_hextet(), (6, 0xff, 0xfffff))


if __name__ == '__main__':
unittest.main()
2 changes: 1 addition & 1 deletion tests/protocols/internet/test_ipv6_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def test_ipv6_properties_read_and_low_level_field_readers(self) -> None:
bytes.fromhex('6abcdef0'),
ip_address('2001:db8::5').packed,
])
self.assertEqual(proto._read_ip_hextet(), (6, 0x6a, 0xbcdef0))
self.assertEqual(proto._read_ip_hextet(), (6, 0xab, 0xcdef0))
self.assertEqual(proto._read_ip_addr(), ip_address('2001:db8::5'))

def test_ipv6_decode_next_layer_handles_extension_headers_and_fragments(self) -> None:
Expand Down
Loading