def ipv4_reassembly(frame):
    """Make data for IPv4 reassembly.

    Args:
        frame (pcapkit.protocols.pcap.frame.Frame): PCAP frame.

    Returns:
        Tuple[bool, Dict[str, Any]]: A tuple of data for IPv4 reassembly.

        * If the ``frame`` can be used for IPv4 reassembly. A frame can be reassembled
          if it contains IPv4 layer (:class:`pcapkit.protocols.internet.ipv4.IPv4`) and
          the **DF** (:attr:`IPv4.flags.df <pcapkit.protocols.internet.ipv4.DataType_IPv4_Flags.df>`)
          flag is :data:`False`.
        * If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for IPv4
          reassembly (c.f. :term:`ipv4.packet`) will be returned; otherwise, returns :data:`None`.

    See Also:
        :class:`~pcapkit.reassembly.ipv4.IPv4Reassembly`

    """
    if 'IPv4' in frame:
        ipv4 = frame['IPv4'].info
        if ipv4.flags.df:       # dismiss not fragmented frame
            return False, None
        data = dict(
            bufid=(
                ipv4.src,                                   # source IP address
                ipv4.dst,                                   # destination IP address
                ipv4.id,                                    # identification
                ipv4.proto.name,                            # payload protocol type
            ),
            num=frame.info.number,                          # original packet range number
            fo=ipv4.frag_offset,                            # fragment offset
            ihl=ipv4.hdr_len,                               # internet header length
            mf=ipv4.flags.mf,                               # more fragment flag
            tl=ipv4.len,                                    # total length, header includes
            header=bytearray(ipv4.packet.header),           # raw bytearray type header
            payload=bytearray(ipv4.packet.payload or b''),  # raw bytearray type payload
        )
        return True, data
    return False, None