Skip to content

Commit 56daf53

Browse files
committed
working on pcapng protocol impl (added NRB options)
1 parent dc87cba commit 56daf53

File tree

2 files changed

+178
-3
lines changed

2 files changed

+178
-3
lines changed

pcapkit/protocols/misc/pcapng.py

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1970,6 +1970,88 @@ def _read_option_epb_verdict(self, schema: 'Schema_EPB_VerdictOption', *,
19701970
)
19711971
return option
19721972

1973+
def _read_option_ns_dnsname(self, schema: 'Schema_NS_DNSNameOption', *,
1974+
options: 'Option') -> 'Data_NS_DNSNameOption':
1975+
"""Read PCAP-NG ``ns_dnsname`` option.
1976+
1977+
Args:
1978+
schema: Parsed option schema.
1979+
options: Parsed PCAP-NG options.
1980+
1981+
Returns:
1982+
Constructed option data.
1983+
1984+
"""
1985+
if self._type != Enum_BlockType.Name_Resolution_Block:
1986+
raise ProtocolError(f'PCAP-NG: [ns_dnsname] option must be in Name Resolution Block, '
1987+
f'but found in {self._type} block.')
1988+
if self._opt[schema.type] > 0:
1989+
raise ProtocolError(f'PCAP-NG: [ns_dnsname] option must be only one, '
1990+
f'but {self._opt[schema.type] + 1} found.')
1991+
1992+
option = Data_NS_DNSNameOption(
1993+
type=schema.type,
1994+
length=schema.length,
1995+
name=schema.name,
1996+
)
1997+
return option
1998+
1999+
def _read_option_ns_dnsipv4(self, schema: 'Schema_NS_DNSIP4AddrOption', *,
2000+
options: 'Option') -> 'Data_NS_DNSIP4AddrOption':
2001+
"""Read PCAP-NG ``ns_dnsIP4addr`` option.
2002+
2003+
Args:
2004+
schema: Parsed option schema.
2005+
options: Parsed PCAP-NG options.
2006+
2007+
Returns:
2008+
Constructed option data.
2009+
2010+
"""
2011+
if self._type != Enum_BlockType.Name_Resolution_Block:
2012+
raise ProtocolError(f'PCAP-NG: [ns_dnsIP4addr] option must be in Name Resolution Block, '
2013+
f'but found in {self._type} block.')
2014+
if self._opt[schema.type] > 0:
2015+
raise ProtocolError(f'PCAP-NG: [ns_dnsIP4addr] option must be only one, '
2016+
f'but {self._opt[schema.type] + 1} found.')
2017+
if schema.length != 4:
2018+
raise ProtocolError(f'PCAP-NG [ns_dnsIP4addr] invalid length (expected 4, got {schema.length})')
2019+
2020+
option = Data_NS_DNSIP4AddrOption(
2021+
type=schema.type,
2022+
length=schema.length,
2023+
ip=schema.ip,
2024+
)
2025+
return option
2026+
2027+
def _read_option_ns_dnsipv6(self, schema: 'Schema_NS_DNSIP6AddrOption', *,
2028+
options: 'Option') -> 'Data_NS_DNSIP6AddrOption':
2029+
"""Read PCAP-NG ``ns_dnsIP6addr`` option.
2030+
2031+
Args:
2032+
schema: Parsed option schema.
2033+
options: Parsed PCAP-NG options.
2034+
2035+
Returns:
2036+
Constructed option data.
2037+
2038+
"""
2039+
if self._type != Enum_BlockType.Name_Resolution_Block:
2040+
raise ProtocolError(f'PCAP-NG: [ns_dnsIP6addr] option must be in Name Resolution Block, '
2041+
f'but found in {self._type} block.')
2042+
if self._opt[schema.type] > 0:
2043+
raise ProtocolError(f'PCAP-NG: [ns_dnsIP6addr] option must be only one, '
2044+
f'but {self._opt[schema.type] + 1} found.')
2045+
if schema.length != 16:
2046+
raise ProtocolError(f'PCAP-NG [ns_dnsIP6addr] invalid length (expected 16, got {schema.length})')
2047+
2048+
option = Data_NS_DNSIP6AddrOption(
2049+
type=schema.type,
2050+
length=schema.length,
2051+
ip=schema.ip,
2052+
)
2053+
return option
2054+
19732055

19742056

19752057
def _make_block_unknown(self, block: 'Optional[Data_UnknownBlock]' = None, *,
@@ -3000,3 +3082,96 @@ def _make_option_epb_verdict(self, type: 'Enum_OptionType', option: 'Optional[Da
30003082
verdict=verdict_val,
30013083
value=value,
30023084
)
3085+
3086+
def _make_option_ns_dnsname(self, type: 'Enum_OptionType', option: 'Optional[Data_NS_DNSNameOption]' = None, *,
3087+
name: 'str' = '',
3088+
**kwargs: 'Any') -> 'Schema_NS_DNSNameOption':
3089+
"""Make PCAP-NG ``ns_dnsname`` option.
3090+
3091+
Args:
3092+
type: Option type.
3093+
option: Option data model.
3094+
name: DNS server name.
3095+
**kwargs: Arbitrary keyword arguments.
3096+
3097+
Returns:
3098+
Constructed option schema.
3099+
3100+
"""
3101+
if self._type != Enum_BlockType.Name_Resolution_Block:
3102+
raise ProtocolError(f'PCAP-NG: [ns_dnsname] option must be in Name Resolution Block, '
3103+
f'but found in {self._type} block.')
3104+
if self._opt[type] > 0:
3105+
raise ProtocolError(f'PCAP-NG: [ns_dnsname] option must be only one, '
3106+
f'but {self._opt[type] + 1} found.')
3107+
3108+
if option is not None:
3109+
name = option.name
3110+
3111+
return Schema_NS_DNSNameOption(
3112+
type=type,
3113+
length=len(name),
3114+
name=name,
3115+
)
3116+
3117+
def _make_option_ns_dnsipv4(self, type: 'Enum_OptionType', option: 'Optional[Data_NS_DNSIP4AddrOption]' = None, *,
3118+
ip: 'str | bytes | IPv4Address | int' = '8.8.8.8',
3119+
**kwargs: 'Any') -> 'Schema_NS_DNSIP4AddrOption':
3120+
"""Make PCAP-NG ``ns_dnsip4addr`` option.
3121+
3122+
Args:
3123+
type: Option type.
3124+
option: Option data model.
3125+
ip: DNS server IPv4 address.
3126+
**kwargs: Arbitrary keyword arguments.
3127+
3128+
Returns:
3129+
Constructed option schema.
3130+
3131+
"""
3132+
if self._type != Enum_BlockType.Name_Resolution_Block:
3133+
raise ProtocolError(f'PCAP-NG: [ns_dnsip4addr] option must be in Name Resolution Block, '
3134+
f'but found in {self._type} block.')
3135+
if self._opt[type] > 0:
3136+
raise ProtocolError(f'PCAP-NG: [ns_dnsip4addr] option must be only one, '
3137+
f'but {self._opt[type] + 1} found.')
3138+
3139+
if option is not None:
3140+
ip = option.ip
3141+
3142+
return Schema_NS_DNSIP4AddrOption(
3143+
type=type,
3144+
length=4,
3145+
ip=ip,
3146+
)
3147+
3148+
def _make_option_ns_dnsipv6(self, type: 'Enum_OptionType', option: 'Optional[Data_NS_DNSIP6AddrOption]' = None, *,
3149+
ip: 'str | bytes | IPv6Address | int' = '8.8.8.8',
3150+
**kwargs: 'Any') -> 'Schema_NS_DNSIP6AddrOption':
3151+
"""Make PCAP-NG ``ns_dnsip6addr`` option.
3152+
3153+
Args:
3154+
type: Option type.
3155+
option: Option data model.
3156+
ip: DNS server IPv6 address.
3157+
**kwargs: Arbitrary keyword arguments.
3158+
3159+
Returns:
3160+
Constructed option schema.
3161+
3162+
"""
3163+
if self._type != Enum_BlockType.Name_Resolution_Block:
3164+
raise ProtocolError(f'PCAP-NG: [ns_dnsip6addr] option must be in Name Resolution Block, '
3165+
f'but found in {self._type} block.')
3166+
if self._opt[type] > 0:
3167+
raise ProtocolError(f'PCAP-NG: [ns_dnsip6addr] option must be only one, '
3168+
f'but {self._opt[type] + 1} found.')
3169+
3170+
if option is not None:
3171+
ip = option.ip
3172+
3173+
return Schema_NS_DNSIP6AddrOption(
3174+
type=type,
3175+
length=16,
3176+
ip=ip,
3177+
)

pcapkit/protocols/schema/misc/pcapng.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,7 +1023,7 @@ class NS_DNSNameOption(_NS_Option):
10231023
name: 'str' = StringField(length=lambda pkt: pkt['length'])
10241024

10251025
if TYPE_CHECKING:
1026-
def __init__(self, code: 'Enum_OptionType', length: 'int', name: 'str') -> 'None': ...
1026+
def __init__(self, type: 'Enum_OptionType', length: 'int', name: 'str') -> 'None': ...
10271027

10281028

10291029
class NS_DNSIP4AddrOption(_NS_Option):
@@ -1033,7 +1033,7 @@ class NS_DNSIP4AddrOption(_NS_Option):
10331033
ip: 'IPv4Address' = IPv4AddressField()
10341034

10351035
if TYPE_CHECKING:
1036-
def __init__(self, code: 'Enum_OptionType', length: 'int', ip: 'IPv4Address') -> 'None': ...
1036+
def __init__(self, type: 'Enum_OptionType', length: 'int', ip: 'IPv4Address | str | bytes | int') -> 'None': ...
10371037

10381038

10391039
class NS_DNSIP6AddrOption(_NS_Option):
@@ -1043,7 +1043,7 @@ class NS_DNSIP6AddrOption(_NS_Option):
10431043
ip: 'IPv6Address' = IPv6AddressField()
10441044

10451045
if TYPE_CHECKING:
1046-
def __init__(self, code: 'Enum_OptionType', length: 'int', ip: 'IPv6Address') -> 'None': ...
1046+
def __init__(self, type: 'Enum_OptionType', length: 'int', ip: 'IPv6Address | bytes | str | int') -> 'None': ...
10471047

10481048

10491049
class NameResolutionBlock(BlockType):

0 commit comments

Comments
 (0)