From a425022b9f1f18ddf1d199ba3c894038bf4672f5 Mon Sep 17 00:00:00 2001
From: Pierre LALET <pierre.lalet@cea.fr>
Date: Tue, 15 Mar 2016 09:42:14 +0100
Subject: [PATCH] Update ls() to display more info about enum fields

---
 scapy/packet.py | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/scapy/packet.py b/scapy/packet.py
index ded9c6b3..64f269c1 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -1231,7 +1231,7 @@ def split_layers(lower, upper, __fval=None, **fval):
 
 
 @conf.commands.register
-def ls(obj=None, case_sensitive=False):
+def ls(obj=None, case_sensitive=False, verbose=False):
     """List  available layers, or infos on a given layer class or name"""
     is_string = isinstance(obj, basestring)
 
@@ -1253,9 +1253,27 @@ def ls(obj=None, case_sensitive=False):
             for f in obj.fields_desc:
                 cur_fld = f
                 attrs = []
+                long_attrs = []
                 while isinstance(cur_fld, (Emph, ConditionalField)):
                     attrs.append(cur_fld.__class__.__name__[:4])
                     cur_fld = cur_fld.fld
+                if verbose and isinstance(cur_fld, EnumField) \
+                   and hasattr(cur_fld, "i2s"):
+                    long_attrs.extend(
+                        "%s: %d" % (strval, numval)
+                        for numval, strval in sorted(cur_fld.i2s.iteritems())
+                    )
+                elif isinstance(cur_fld, MultiEnumField):
+                    fld_depend = cur_fld.depends_on(obj.__class__ if is_pkt else obj)
+                    attrs.append("Depends on %s" % fld_depend.name)
+                    if verbose:
+                        cur_i2s = cur_fld.i2s_multi.get(
+                            cur_fld.depends_on(obj if is_pkt else obj()), {}
+                        )
+                        long_attrs.extend(
+                            "%s: %d" % (strval, numval)
+                            for numval, strval in sorted(cur_i2s.iteritems())
+                        )
                 class_name = "%s (%s)" % (
                     cur_fld.__class__.__name__,
                     ", ".join(attrs)) if attrs else cur_fld.__class__.__name__
@@ -1263,10 +1281,12 @@ def ls(obj=None, case_sensitive=False):
                     class_name += " (%d bit%s)" % (cur_fld.size,
                                                    "s" if cur_fld.size > 1
                                                    else "")
-                print "%-10s : %-25s =" % (f.name, class_name),
+                print "%-10s : %-35s =" % (f.name, class_name),
                 if is_pkt:
                     print "%-15r" % getattr(obj,f.name),
                 print "(%r)" % f.default
+                for attr in long_attrs:
+                    print "%-15s%s" % ("", attr)
             if is_pkt and not isinstance(obj.payload, NoPayload):
                 print "--"
                 ls(obj.payload)
-- 
GitLab