From 300298d1c37216599fbb91f9bf675114dfd1501f Mon Sep 17 00:00:00 2001
From: Pierre LALET <pierre.lalet@cea.fr>
Date: Sat, 6 Feb 2016 23:54:22 +0100
Subject: [PATCH] LLTD: support LLTD Emit messages

---
 scapy/layers/lltd.py | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/scapy/layers/lltd.py b/scapy/layers/lltd.py
index 5d19cf52..ed886fbd 100644
--- a/scapy/layers/lltd.py
+++ b/scapy/layers/lltd.py
@@ -13,8 +13,8 @@ import struct
 
 from scapy.fields import BitField, FlagsField, ByteField, ByteEnumField, \
     ShortField, IntField, IntEnumField, LongField, MultiEnumField, \
-    FieldLenField, FieldListField, StrLenField, MACField, StrLenFieldUtf16, \
-    ConditionalField
+    FieldLenField, FieldListField, PacketListField, StrLenField, \
+    StrLenFieldUtf16, ConditionalField, MACField
 from scapy.packet import Packet, Padding, bind_layers
 from scapy.layers.l2 import Ether
 from scapy.layers.inet import IPField
@@ -122,6 +122,30 @@ class LLTDDiscover(Packet):
                 if self.stations_list else "No station", [LLTD])
 
 
+class LLTDEmiteeDesc(Packet):
+    name = "LLTD - Emitee Desc"
+    fields_desc = [
+        ByteEnumField("type", 0, {0: "Train", 1: "Probe"}),
+        ByteField("pause", 0),
+        MACField("src", None),
+        MACField("dst", ETHER_ANY),
+    ]
+
+
+class LLTDEmit(Packet):
+    name = "LLTD - Emit"
+    fields_desc = [
+        FieldLenField("descs_count", None, count_of="descs_list",
+                      fmt="H"),
+        PacketListField("descs_list", [], LLTDEmiteeDesc,
+                        count_from=lambda pkt: pkt.descs_count),
+    ]
+
+    def mysummary(self):
+        return ", ".join(desc.sprintf("%src% > %dst%")
+                         for desc in self.descs_list), [LLTD]
+
+
 class LLTDAttribute(Packet):
     name = "LLTD Attribute"
     show_indent = False
@@ -607,6 +631,7 @@ bind_layers(LLTD, LLTDDiscover, tos=0, function=0)
 bind_layers(LLTD, LLTDDiscover, tos=1, function=0)
 bind_layers(LLTD, LLTDHello, tos=0, function=1)
 bind_layers(LLTD, LLTDHello, tos=1, function=1)
+bind_layers(LLTD, LLTDEmit, tos=0, function=2)
 bind_layers(LLTDHello, LLTDAttribute)
 bind_layers(LLTDAttribute, LLTDAttribute)
 bind_layers(LLTDAttribute, Padding, type=0)
-- 
GitLab