86890704fd
todo: add documentation & wireshark dissector
60 lines
2.6 KiB
Python
Executable file
60 lines
2.6 KiB
Python
Executable file
# This file is part of Scapy
|
|
# Scapy is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 2 of the License, or
|
|
# any later version.
|
|
#
|
|
# Scapy is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Scapy. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# scapy.contrib.description = Cisco HDLC and SLARP
|
|
# scapy.contrib.status = loads
|
|
|
|
# This layer is based on information from http://www.nethelp.no/net/cisco-hdlc.txt # noqa: E501
|
|
|
|
from scapy.data import DLT_C_HDLC
|
|
from scapy.packet import Packet, bind_layers
|
|
from scapy.fields import ByteEnumField, ByteField, ConditionalField, \
|
|
IntEnumField, IntField, IPField, XShortField
|
|
from scapy.layers.l2 import Dot3, STP
|
|
from scapy.layers.inet import IP
|
|
from scapy.layers.inet6 import IPv6
|
|
from scapy.config import conf
|
|
|
|
|
|
class CHDLC(Packet):
|
|
name = "Cisco HDLC"
|
|
fields_desc = [ByteEnumField("address", 0x0f, {0x0f: "unicast", 0x8f: "multicast"}), # noqa: E501
|
|
ByteField("control", 0),
|
|
XShortField("proto", 0x0800)]
|
|
|
|
|
|
class SLARP(Packet):
|
|
name = "SLARP"
|
|
fields_desc = [IntEnumField("type", 2, {0: "request", 1: "reply", 2: "line keepalive"}), # noqa: E501
|
|
ConditionalField(IPField("address", "192.168.0.1"),
|
|
lambda pkt: pkt.type == 0 or pkt.type == 1), # noqa: E501
|
|
ConditionalField(IPField("mask", "255.255.255.0"),
|
|
lambda pkt: pkt.type == 0 or pkt.type == 1), # noqa: E501
|
|
ConditionalField(XShortField("unused", 0),
|
|
lambda pkt: pkt.type == 0 or pkt.type == 1), # noqa: E501
|
|
ConditionalField(IntField("mysequence", 0),
|
|
lambda pkt: pkt.type == 2),
|
|
ConditionalField(IntField("yoursequence", 0),
|
|
lambda pkt: pkt.type == 2),
|
|
ConditionalField(XShortField("reliability", 0xffff),
|
|
lambda pkt: pkt.type == 2)]
|
|
|
|
|
|
bind_layers(CHDLC, Dot3, proto=0x6558)
|
|
bind_layers(CHDLC, IP, proto=0x800)
|
|
bind_layers(CHDLC, IPv6, proto=0x86dd)
|
|
bind_layers(CHDLC, SLARP, proto=0x8035)
|
|
bind_layers(CHDLC, STP, proto=0x4242)
|
|
|
|
conf.l2types.register(DLT_C_HDLC, CHDLC)
|