def read_l2tp(self, length):
if length is None:<EOL><INDENT>length = len(self)<EOL><DEDENT>_flag = self._read_binary(<NUM_LIT:1>)<EOL>_vers = self._read_fileng(<NUM_LIT:1>).hex()[<NUM_LIT:1>]<EOL>_hlen = self._read_unpack(<NUM_LIT:2>) if int(_flag[<NUM_LIT:1>]) else None<EOL>_tnnl = self._read_unpack(<NUM_LIT:2>)<EOL>_sssn = self._read_unpack(<NUM_LIT:2>)<EOL>_nseq = self._read_unpack(<NUM_LIT:2>) if int(_flag[<NUM_LIT:4>]) else None<EOL>_nrec = self._read_unpack(<NUM_LIT:2>) if int(_flag[<NUM_LIT:4>]) else None<EOL>_size = self._read_unpack(<NUM_LIT:2>) if int(_flag[<NUM_LIT:6>]) else <NUM_LIT:0><EOL>l2tp = dict(<EOL>flags=dict(<EOL>type='<STR_LIT>' if int(_flag[<NUM_LIT:0>]) else '<STR_LIT>',<EOL>len=True if int(_flag[<NUM_LIT:1>]) else False,<EOL>seq=True if int(_flag[<NUM_LIT:4>]) else False,<EOL>offset=True if int(_flag[<NUM_LIT:6>]) else False,<EOL>prio=True if int(_flag[<NUM_LIT:7>]) else False,<EOL>),<EOL>ver=int(_vers, base=<NUM_LIT:16>),<EOL>length=_hlen,<EOL>tunnelid=_tnnl,<EOL>sessionid=_sssn,<EOL>ns=_nseq,<EOL>nr=_nrec,<EOL>offset=<NUM_LIT:8>*_size or None,<EOL>)<EOL>hdr_len = _hlen or (<NUM_LIT:6> + <NUM_LIT:2>*(int(_flag[<NUM_LIT:1>]) + <NUM_LIT:2>*int(_flag[<NUM_LIT:4>]) + int(_flag[<NUM_LIT:6>])))<EOL>l2tp['<STR_LIT>'] = hdr_len + _size * <NUM_LIT:8><EOL>length -= l2tp['<STR_LIT>']<EOL>l2tp['<STR_LIT>'] = self._read_packet(header=l2tp['<STR_LIT>'], payload=length)<EOL>return self._decode_next_layer(l2tp, length)<EOL>
Read Layer Two Tunnelling Protocol.

        Structure of L2TP header [RFC 2661]:
             0                   1                   2                   3
             0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |T|L|x|x|S|x|O|P|x|x|x|x|  Ver  |          Length (opt)         |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |           Tunnel ID           |           Session ID          |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Ns (opt)          |             Nr (opt)          |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |      Offset Size (opt)        |    Offset pad... (opt)
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

            Octets      Bits        Name                    Description
              0           0     l2tp.flags              Flags and Version Info
              0           0     l2tp.flags.type         Type (0/1)
              0           1     l2tp.flags.len          Length
              0           2     -                       Reserved (must be zero)
              0           4     l2tp.flags.seq          Sequence
              0           5     -                       Reserved (must be zero)
              0           6     l2tp.flags.offset       Offset
              0           7     l2tp.flags.prio         Priority
              1           8     -                       Reserved (must be zero)
              1          12     l2tp.ver                Version (2)
              2          16     l2tp.length             Length (optional by len)
              4          32     l2tp.tunnelid           Tunnel ID
              6          48     l2tp.sessionid          Session ID
              8          64     l2tp.ns                 Sequence Number (optional by seq)
              10         80     l2tp.nr                 Next Sequence Number (optional by seq)
              12         96     l2tp.offset             Offset Size (optional by offset)