code: func (c *IPHAConn) readIPv4Packet() (*packet, error) {
  	b := recvBuffer
  	n, err := c.recvConn.Read(b)
  	if err != nil {
  		return nil, err
  	}
  	if n < 20 {
  		return nil, fmt.Errorf("IPHAConn.readIPv4Packet: Packet len %d is too small", n)
  	} else if int(b[0])>>4 != 4 {
  		return nil, fmt.Errorf("IPHAConn.readIPv4Packet: Expected an IPv4 packet")
  	}
  	hdrLen := (int(b[0]) & 0x0f) << 2
  	if hdrLen > n {
  		return nil, fmt.Errorf("IPHAConn.readIPv4Packet: Header len %d > total len %d", hdrLen, n)
  	}
  	return &packet{
  		src:     net.IP{b[12], b[13], b[14], b[15]},
  		dst:     net.IP{b[16], b[17], b[18], b[19]},
  		ttl:     b[8],
  		payload: b[hdrLen:n],
  	}, nil
  }
docs: // readIPv4Packet reads an IPv4 packet. For IPv4, Read() includes the IP
  // header, so the TTL, source and destination addresses directly are read
  // directly from the header.