def read_ipv4(self, length):
if length is None:<EOL><INDENT>length = len(self)<EOL><DEDENT>_vihl = self._read_fileng(<NUM_LIT:1>).hex()<EOL>_dscp = self._read_binary(<NUM_LIT:1>)<EOL>_tlen = self._read_unpack(<NUM_LIT:2>)<EOL>_iden = self._read_unpack(<NUM_LIT:2>)<EOL>_frag = self._read_binary(<NUM_LIT:2>)<EOL>_ttol = self._read_unpack(<NUM_LIT:1>)<EOL>_prot = self._read_protos(<NUM_LIT:1>)<EOL>_csum = self._read_fileng(<NUM_LIT:2>)<EOL>_srca = self._read_ipv4_addr()<EOL>_dsta = self._read_ipv4_addr()<EOL>ipv4 = dict(<EOL>version=_vihl[<NUM_LIT:0>],<EOL>hdr_len=int(_vihl[<NUM_LIT:1>], base=<NUM_LIT:16>) * <NUM_LIT:4>,<EOL>dsfield=dict(<EOL>dscp=(<EOL>TOS_PRE.get(int(_dscp[:<NUM_LIT:3>], base=<NUM_LIT:2>)),<EOL>TOS_DEL.get(int(_dscp[<NUM_LIT:3>], base=<NUM_LIT:2>)),<EOL>TOS_THR.get(int(_dscp[<NUM_LIT:4>], base=<NUM_LIT:2>)),<EOL>TOS_REL.get(int(_dscp[<NUM_LIT:5>], base=<NUM_LIT:2>)),<EOL>),<EOL>ecn=TOS_ECN.get(int(_dscp[-<NUM_LIT:2>:], base=<NUM_LIT:2>)),<EOL>),<EOL>len=_tlen,<EOL>id=_iden,<EOL>flags=dict(<EOL>df=True if int(_frag[<NUM_LIT:1>]) else False,<EOL>mf=True if int(_frag[<NUM_LIT:2>]) else False,<EOL>),<EOL>frag_offset=int(_frag[<NUM_LIT:3>:], base=<NUM_LIT:2>) * <NUM_LIT:8>,<EOL>ttl=_ttol,<EOL>proto=_prot,<EOL>checksum=_csum,<EOL>src=_srca,<EOL>dst=_dsta,<EOL>)<EOL>_optl = ipv4['<STR_LIT>'] - <NUM_LIT:20><EOL>if _optl:<EOL><INDENT>options = self._read_ipv4_options(_optl)<EOL>ipv4['<STR_LIT>'] = options[<NUM_LIT:0>]    <EOL>ipv4.update(options[<NUM_LIT:1>])     <EOL><DEDENT>hdr_len = ipv4['<STR_LIT>']<EOL>raw_len = ipv4['<STR_LIT>'] - hdr_len<EOL>ipv4['<STR_LIT>'] = self._read_packet(header=hdr_len, payload=raw_len)<EOL>return self._decode_next_layer(ipv4, _prot, raw_len)<EOL>
Read Internet Protocol version 4 (IPv4).

        Structure of IPv4 header [RFC 791]:

             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
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |Version|  IHL  |Type of Service|          Total Length         |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |         Identification        |Flags|      Fragment Offset    |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |  Time to Live |    Protocol   |         Header Checksum       |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                       Source Address                          |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                    Destination Address                        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                    Options                    |    Padding    |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

            Octets      Bits        Name                    Description
              0           0     ip.version              Version (4)
              0           4     ip.hdr_len              Internal Header Length (IHL)
              1           8     ip.dsfield.dscp         Differentiated Services Code Point (DSCP)
              1          14     ip.dsfield.ecn          Explicit Congestion Notification (ECN)
              2          16     ip.len                  Total Length
              4          32     ip.id                   Identification
              6          48     -                       Reserved Bit (must be zero)
              6          49     ip.flags.df             Don't Fragment (DF)
              6          50     ip.flags.mf             More Fragments (MF)
              6          51     ip.frag_offset          Fragment Offset
              8          64     ip.ttl                  Time To Live (TTL)
              9          72     ip.proto                Protocol (Transport Layer)
              10         80     ip.checksum             Header Checksum
              12         96     ip.src                  Source IP Address
              16        128     ip.dst                  Destination IP Address
              20        160     ip.options              IP Options (if IHL > 5)