docs: def getlayer(self, cls, nb=1, _track=None, _subclass=None, **flt):
          """Return the nb^th layer that is an instance of cls, matching flt
  values.
          """
          if _subclass is None:
              _subclass = self.match_subclass or None
          if _subclass:
              match = lambda cls1, cls2: issubclass(cls1, cls2)
          else:
              match = lambda cls1, cls2: cls1 == cls2
          if isinstance(cls, int):
              nb = cls + 1
              cls = None
          if isinstance(cls, str) and "." in cls:
              ccls, fld = cls.split(".", 1)
          else:
              ccls, fld = cls, None
          if cls is None or match(self.__class__, cls) \
             or ccls in [self.__class__.__name__, self._name]:
              if all(self.getfieldval(fldname) == fldvalue
                     for fldname, fldvalue in six.iteritems(flt)):
                  if nb == 1:
                      if fld is None:
                          return self
                      else:
                          return self.getfieldval(fld)
                  else:
                      nb -= 1
          for f in self.packetfields:
              fvalue_gen = self.getfieldval(f.name)
              if fvalue_gen is None:
                  continue
              if not f.islist:
                  fvalue_gen = SetGen(fvalue_gen, _iterpacket=0)
              for fvalue in fvalue_gen:
                  if isinstance(fvalue, Packet):
                      track = []
                      ret = fvalue.getlayer(cls, nb=nb, _track=track,
                                            _subclass=_subclass, **flt)
                      if ret is not None:
                          return ret
                      nb = track[0]
          return self.payload.getlayer(cls, nb=nb, _track=_track,
                                       _subclass=_subclass, **flt)