diff --git a/scapy/config.py b/scapy/config.py index 44a73edd8bdd3acc194cef8b489dc12aebc01f4e..5e80beb30793b10471afed2080529d8a9e3b8423 100644 --- a/scapy/config.py +++ b/scapy/config.py @@ -60,21 +60,35 @@ class ProgPath(ConfClass): tcpreplay = "tcpreplay" hexedit = "hexer" wireshark = "wireshark" - -class Resolve: + + +class ConfigFieldList: def __init__(self): - self.fields = {} + self.fields = set() + self.layers = set() + @staticmethod + def _is_field(f): + return hasattr(f, "owners") + def _recalc_layer_list(self): + self.layers = set([owner for f in self.fields for owner in f.owners]) def add(self, *flds): - for fld in flds: - self.fields[fld]=None + self.fields |= set([f for f in flds if self._is_field(f)]) + self._recalc_layer_list() def remove(self, *flds): - for fld in flds: - if fld in self.fields: - del(self.fields[fld]) + self.fields -= set(flds) + self._recalc_layer_list() def __contains__(self, elt): + if isinstance(elt, base_classes.Packet_metaclass): + return elt in self.layers return elt in self.fields def __repr__(self): - return "<Resolve [%s]>" % " ".join(str(x) for x in self.fields) + return "<%s [%s]>" % (self.__class__.__name__," ".join(str(x) for x in self.fields)) + +class Emphasize(ConfigFieldList): + pass + +class Resolve(ConfigFieldList): + pass class Num2Layer: @@ -336,6 +350,7 @@ extensions_paths: path or list of paths where extensions are to be looked for prog = ProgPath() resolve = Resolve() noenum = Resolve() + emph = Emphasize() use_pcap = False use_dnet = False ipv6_enabled = socket.has_ipv6