def read_hopopt(self, length, extension):
if length is None:<EOL><INDENT>length = len(self)<EOL><DEDENT>_next = self._read_protos(<NUM_LIT:1>)<EOL>_hlen = self._read_unpack(<NUM_LIT:1>)<EOL>hopopt = dict(<EOL>next=_next,<EOL>length=(_hlen + <NUM_LIT:1>) * <NUM_LIT:8>,<EOL>)<EOL>options = self._read_hopopt_options(_hlen * <NUM_LIT:8> + <NUM_LIT:6>)<EOL>hopopt['<STR_LIT>'] = options[<NUM_LIT:0>]      <EOL>hopopt.update(options[<NUM_LIT:1>])           <EOL>length -= hopopt['<STR_LIT>']<EOL>hopopt['<STR_LIT>'] = self._read_packet(header=hopopt['<STR_LIT>'], payload=length)<EOL>if extension:<EOL><INDENT>self._protos = None<EOL>return hopopt<EOL><DEDENT>return self._decode_next_layer(hopopt, _next, length)<EOL>
Read IPv6 Hop-by-Hop Options.

        Structure of HOPOPT header [RFC 8200]:
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |  Next Header  |  Hdr Ext Len  |                               |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
            |                                                               |
            .                                                               .
            .                            Options                            .
            .                                                               .
            |                                                               |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

            Octets      Bits        Name                    Description
              0           0     hopopt.next             Next Header
              1           8     hopopt.length           Header Extensive Length
              2          16     hopopt.options          Options