code: def _decode_next_layer(self, dict_, proto=None, length=None, *, version=4, ipv6_exthdr=None):
          
          if self._onerror:
              next_ = beholder(self._import_next_layer)(self, proto, length, version=version)
          else:
              next_ = self._import_next_layer(proto, length, version=version)
          info, chain = next_.info, next_.protochain
  
          # make next layer protocol name
          layer = next_.alias.lower()
          # proto = next_.__class__.__name__
  
          # write info and protocol chain into dict
          dict_[layer] = info
          self._next = next_
          if ipv6_exthdr is not None:
              for proto in reversed(ipv6_exthdr):
                  chain = ProtoChain(proto.__class__, proto.alias, basis=chain)
          self._protos = ProtoChain(self.__class__, self.alias, basis=chain)
          return dict_
docs: Decode next layer extractor.
  
          Positional arguments:
              * dict_ -- dict, info buffer
              * proto -- str, next layer protocol name
              * length -- int, valid (not padding) length
  
          Keyword Arguments:
              * version -- int, IP version (4 in default)
                              <keyword> 4 / 6
              * ext_proto -- ProtoChain, ProtoChain of IPv6 extension headers
  
          Returns:
              * dict -- current protocol with next layer extracted