Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
Source code for pcapkit.protocols.schema.link.ospf
# -*- coding: utf-8 -*-
# mypy: disable-error-code=assignment
"""header schema for OSPF protocol"""
from typing import TYPE_CHECKING
from pcapkit.const.ospf.authentication import Authentication as Enum_Authentication
from pcapkit.const.ospf.packet import Packet as Enum_Packet
from pcapkit.corekit.fields.ipaddress import IPv4AddressField
from pcapkit.corekit.fields.misc import PayloadField , SchemaField , SwitchField
from pcapkit.corekit.fields.numbers import EnumField , UInt8Field , UInt16Field , UInt32Field
from pcapkit.corekit.fields.strings import BytesField , PaddingField
from pcapkit.protocols.schema.schema import Schema , schema_final
__all__ = [ 'OSPF' , 'CrytographicAuthentication' ]
if TYPE_CHECKING :
from ipaddress import IPv4Address
from typing import Any
from pcapkit.corekit.fields.field import FieldBase as Field
from pcapkit.protocols.protocol import ProtocolBase as Protocol
[docs]
def ospf_auth_data_selector ( pkt : 'dict[str, Any]' ) -> 'Field' :
"""Selector function for :attr:`OSPF.auth_data` field.
Args:
pkt: Packet data.
Returns:
* If :attr:`OSPF.auth_type` is 2, a :class:`~pcapkit.corekit.fields.misc.SchemaField`
wrapped :class:`~pcapkit.protocols.schema.link.ospf.CrytographicAuthentication` instance.
* Otherwise, a :class:`~pcapkit.corekit.fields.strings.BytesField` instance.
"""
if pkt [ 'auth_type' ] == Enum_Authentication . Cryptographic_authentication :
return SchemaField ( length = 8 , schema = CrytographicAuthentication )
return BytesField ( length = 8 )
[docs]
@schema_final
class CrytographicAuthentication ( Schema ):
"""Header schema for OSPF cryptographic authentication."""
#: Reserved bytes.
reserved : 'bytes' = PaddingField ( length = 2 )
#: Key ID.
key_id : 'int' = UInt8Field ()
#: Length.
len : 'int' = UInt8Field ()
#: Sequence number.
seq : 'int' = UInt32Field ()
if TYPE_CHECKING :
def __init__ ( self , key_id : 'int' , len : 'int' , seq : 'int' ) -> 'None' : ...
[docs]
@schema_final
class OSPF ( Schema ):
"""Header schema for OSPF packet."""
#: Version.
version : 'int' = UInt8Field ()
#: Type.
type : 'Enum_Packet' = EnumField ( length = 1 , namespace = Enum_Packet )
#: Length.
length : 'int' = UInt16Field ()
#: Router ID.
router_id : 'IPv4Address' = IPv4AddressField ()
#: Area ID.
area_id : 'IPv4Address' = IPv4AddressField ()
#: Checksum.
checksum : 'bytes' = BytesField ( length = 2 )
#: Authentication type.
auth_type : 'Enum_Authentication' = EnumField ( length = 2 , namespace = Enum_Authentication )
#: Authentication data.
auth_data : 'bytes | CrytographicAuthentication' = SwitchField (
selector = ospf_auth_data_selector ,
)
#: Payload.
payload : 'bytes' = PayloadField ()
if TYPE_CHECKING :
def __init__ ( self , version : 'int' , type : 'Enum_Packet' , length : 'int' ,
router_id : 'IPv4Address | bytes | str | int' ,
area_id : 'IPv4Address | bytes | str | int' ,
checksum : 'bytes' , auth_type : 'Enum_Authentication' ,
auth_data : 'bytes | CrytographicAuthentication' ,
payload : 'bytes | Protocol | Schema' ) -> 'None' : ...