From dd093b185aa6ccd4a5a362674dc966a59a386814 Mon Sep 17 00:00:00 2001
From: Phil <phil@secdev.org>
Date: Mon, 9 Mar 2009 18:23:12 +0100
Subject: [PATCH] Added MultiEnumField for fields whose text also depends on
 another field

ex: ICMP code field
---
 scapy/fields.py | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/scapy/fields.py b/scapy/fields.py
index 2253cd89..a8793d1f 100644
--- a/scapy/fields.py
+++ b/scapy/fields.py
@@ -769,6 +769,36 @@ class XShortEnumField(ShortEnumField):
             return self.i2s[x]
         return lhex(x)
 
+class MultiEnumField(EnumField):
+    def __init__(self, name, default, enum, depends_on, fmt = "H"):
+        
+        self.depends_on = depends_on
+        self.i2s_multi = enum
+        self.s2i_multi = {}
+        self.s2i_all = {}
+        for m in enum:
+            self.s2i_multi[m] = s2i = {}
+            for k,v in enum[m].iteritems():
+                s2i[v] = k
+                self.s2i_all[v] = k
+        Field.__init__(self, name, default, fmt)
+    def any2i_one(self, pkt, x):
+        if type (x) is str:
+            v = self.depends_on(pkt)
+            if v in self.s2i_multi:
+                s2i = self.s2i_multi[v]
+                if x in s2i:
+                    return s2i[x]
+            return self.s2i_all[x]
+        return x
+    def i2repr_one(self, pkt, x):
+        v = self.depends_on(pkt)
+        if v in self.i2s_multi:
+            return self.i2s_multi[v].get(x,x)
+        return x
+
+
+
 # Little endian long field
 class LELongField(Field):
     def __init__(self, name, default):
-- 
GitLab