From eea93509ba16843852444bd6f11ed001bf5130d7 Mon Sep 17 00:00:00 2001
From: Pierre LALET <pierre.lalet@cea.fr>
Date: Sat, 16 Sep 2017 20:28:47 +0200
Subject: [PATCH] VXLAN: clean ConditionalField flag-based conditions

---
 scapy/fields.py       |  5 +++++
 scapy/layers/vxlan.py | 18 +++++++++---------
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/scapy/fields.py b/scapy/fields.py
index e97e485c..4a5411ac 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -1153,6 +1153,11 @@ class FlagsField(BitField):
             return type(x)(None if v is None else FlagValue(v, self.names)
                            for v in x)
         return None if x is None else FlagValue(x, self.names)
+    def i2h(self, pkt, x):
+        if isinstance(x, (list, tuple)):
+            return type(x)(None if v is None else FlagValue(v, self.names)
+                           for v in x)
+        return None if x is None else FlagValue(x, self.names)
     def i2repr(self, pkt, x):
         if isinstance(x, (list, tuple)):
             return repr(type(x)(
diff --git a/scapy/layers/vxlan.py b/scapy/layers/vxlan.py
index 1d1d9ae4..1a715534 100644
--- a/scapy/layers/vxlan.py
+++ b/scapy/layers/vxlan.py
@@ -26,7 +26,7 @@ class VXLAN(Packet):
                     'V1', 'V2', 'R', 'G']),
         ConditionalField(
             ShortField("reserved0", 0),
-            lambda pkt: pkt.flags & 0x04,
+            lambda pkt: pkt.flags.NextProtocol,
         ),
         ConditionalField(
             ByteEnumField('NextProtocol', 0,
@@ -35,22 +35,22 @@ class VXLAN(Packet):
                            2: 'IPv6',
                            3: 'Ethernet',
                            4: 'NSH'}),
-            lambda pkt: pkt.flags & 0x04,
+            lambda pkt: pkt.flags.NextProtocol,
         ),
         ConditionalField(
-            ThreeBytesField("reserved1", 0x000000),
-            lambda pkt: (not pkt.flags & 0x80) and (not pkt.flags & 0x04),
+            ThreeBytesField("reserved1", 0),
+            lambda pkt: (not pkt.flags.G) and (not pkt.flags.NextProtocol),
         ),
         ConditionalField(
-            FlagsField("gpflags", 0x0, 8, _GP_FLAGS),
-            lambda pkt: pkt.flags & 0x80,
+            FlagsField("gpflags", 0, 8, _GP_FLAGS),
+            lambda pkt: pkt.flags.G,
         ),
         ConditionalField(
             ShortField("gpid", 0),
-            lambda pkt: pkt.flags & 0x80,
+            lambda pkt: pkt.flags.G,
         ),
         X3BytesField("vni", 0),
-        XByteField("reserved2", 0x00),
+        XByteField("reserved2", 0),
     ]
 
     # Use default linux implementation port
@@ -59,7 +59,7 @@ class VXLAN(Packet):
     }
 
     def mysummary(self):
-        if self.flags & 0x80:
+        if self.flags.G:
             return self.sprintf("VXLAN (vni=%VXLAN.vni% gpid=%VXLAN.gpid%)")
         else:
             return self.sprintf("VXLAN (vni=%VXLAN.vni%)")
-- 
GitLab