Skip to content
Snippets Groups Projects
Commit 455feebb authored by Pierre LALET's avatar Pierre LALET
Browse files

LLTD: implement LLTDQueryLargeTlv & LLTDQueryLargeTlvResp

parent 6c1c8596
No related branches found
No related tags found
No related merge requests found
...@@ -12,9 +12,9 @@ https://msdn.microsoft.com/en-us/library/cc233983.aspx ...@@ -12,9 +12,9 @@ https://msdn.microsoft.com/en-us/library/cc233983.aspx
import struct import struct
from scapy.fields import BitField, FlagsField, ByteField, ByteEnumField, \ from scapy.fields import BitField, FlagsField, ByteField, ByteEnumField, \
ShortField, ShortEnumField, IntField, IntEnumField, LongField, \ ShortField, ShortEnumField, ThreeBytesField, IntField, IntEnumField, \
MultiEnumField, FieldLenField, FieldListField, PacketListField, \ LongField, MultiEnumField, FieldLenField, FieldListField, \
StrLenField, StrLenFieldUtf16, ConditionalField, MACField PacketListField, StrLenField, StrLenFieldUtf16, ConditionalField, MACField
from scapy.packet import Packet, Padding, bind_layers from scapy.packet import Packet, Padding, bind_layers
from scapy.layers.l2 import Ether from scapy.layers.l2 import Ether
from scapy.layers.inet import IPField from scapy.layers.inet import IPField
...@@ -181,6 +181,48 @@ class LLTDQueryResp(Packet): ...@@ -181,6 +181,48 @@ class LLTDQueryResp(Packet):
), [LLTD] ), [LLTD]
class LLTDQueryLargeTlv(Packet):
name = "LLTD - Query Large Tlv"
fields_desc = [
ByteEnumField("type", 14, {
14: "Icon image",
17: "Friendly Name",
19: "Hardware ID",
22: "AP Association Table",
24: "Detailed Icon Image",
26: "Component Table",
28: "Repeater AP Table",
}),
ThreeBytesField("offset", 0),
]
def mysummary(self):
return self.sprintf("%type% (offset %offset%)"), [LLTD]
class LLTDQueryLargeTlvResp(Packet):
name = "LLTD - Query Large Tlv Response"
fields_desc = [
FlagsField("flags", 0, 2, "RM"),
BitField("len", None, 14),
StrLenField("value", "", length_from=lambda pkt: pkt.len)
]
def post_build(self, pkt, pay):
if self.len is None:
# len should be a FieldLenField but has an unsupported
# format (14 bits)
flags = ord(pkt[0]) & 0xc0
length = len(self.value)
pkt = chr(flags + (length >> 8)) + chr(length % 256) + pkt[2:]
return pkt + pay
def mysummary(self):
return self.sprintf("%%len%% bytes%s" % (
" (last)" if not self.flags & 2 else ""
)), [LLTD]
class LLTDAttribute(Packet): class LLTDAttribute(Packet):
name = "LLTD Attribute" name = "LLTD Attribute"
show_indent = False show_indent = False
...@@ -668,6 +710,8 @@ bind_layers(LLTD, LLTDHello, tos=0, function=1) ...@@ -668,6 +710,8 @@ bind_layers(LLTD, LLTDHello, tos=0, function=1)
bind_layers(LLTD, LLTDHello, tos=1, function=1) bind_layers(LLTD, LLTDHello, tos=1, function=1)
bind_layers(LLTD, LLTDEmit, tos=0, function=2) bind_layers(LLTD, LLTDEmit, tos=0, function=2)
bind_layers(LLTD, LLTDQueryResp, tos=0, function=7) bind_layers(LLTD, LLTDQueryResp, tos=0, function=7)
bind_layers(LLTD, LLTDQueryLargeTlv, tos=0, function=11)
bind_layers(LLTD, LLTDQueryLargeTlvResp, tos=0, function=12)
bind_layers(LLTDHello, LLTDAttribute) bind_layers(LLTDHello, LLTDAttribute)
bind_layers(LLTDAttribute, LLTDAttribute) bind_layers(LLTDAttribute, LLTDAttribute)
bind_layers(LLTDAttribute, Padding, type=0) bind_layers(LLTDAttribute, Padding, type=0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment