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