code: def _decode_next_layer(self, ipv6, proto=None, length=None):
          
          hdr_len = 40                # header length
          raw_len = ipv6['payload']   # payload length
          _protos = list()            # ProtoChain buffer
  
          # traverse if next header is an extensive header
          while proto in EXT_HDR:
              # keep original data after fragment header
              if proto.value == 44:
                  ipv6['fragment'] = self._read_packet(header=hdr_len, payload=raw_len)
  
              # # directly break when No Next Header occurs
              # if proto.name == 'IPv6-NoNxt':
              #     proto = None
              #     break
  
              # make protocol name
              next_ = self._import_next_layer(proto, version=6, extension=True)
              info = next_.info
              name = next_.alias.lstrip('IPv6-').lower()
              ipv6[name] = info
  
              # record protocol name
              # self._protos = ProtoChain(name, chain, alias)
              _protos.append(next_)
              proto = info.next  # pylint: disable=E1101
  
              # update header & payload length
              hdr_len += info.length  # pylint: disable=E1101
              raw_len -= info.length  # pylint: disable=E1101
  
          # record real header & payload length (headers exclude)
          ipv6['hdr_len'] = hdr_len
          ipv6['raw_len'] = raw_len
  
          # update next header
          ipv6['protocol'] = proto
          return super()._decode_next_layer(ipv6, proto, raw_len, ipv6_exthdr=_protos)
docs: Decode next layer extractor.
  
          Positional arguments:
              * ipv6 -- dict, info buffer
              * proto -- str, next layer protocol name
              * length -- int, valid (not padding) length
  
          Returns:
              * dict -- current protocol with next layer extracted