code: def reassembly(self, info):
          
          BUFID = info.bufid  # Buffer Identifier
          FO = info.fo        # Fragment Offset
          IHL = info.ihl      # Internet Header Length
          MF = info.mf        # More Fragments flag
          TL = info.tl        # Total Length
  
          # when non-fragmented (possibly discarded) packet received
          if not FO and not MF:
              if BUFID in self._buffer:
                  self._dtgram += self.submit(self._buffer[BUFID])
                  del self._buffer[BUFID]
                  return
  
          # initialise buffer with BUFID
          if BUFID not in self._buffer:
              self._buffer[BUFID] = dict(
                  TDL=0,                          # Total Data Length
                  RCVBT=bytearray(8191),          # Fragment Received Bit Table
                  index=list(),                   # index record
                  header=bytearray(),             # header buffer
                  datagram=bytearray(65535),      # data buffer
              )
  
          # append packet index
          self._buffer[BUFID]['index'].append(info.num)
  
          # put data into data buffer
          start = FO
          stop = TL - IHL + FO
          self._buffer[BUFID]['datagram'][start:stop] = info.payload
  
          # set RCVBT bits (in 8 octets)
          start = FO // 8
          stop = FO // 8 + (TL - IHL + 7) // 8
          self._buffer[BUFID]['RCVBT'][start:stop] = b'\x01' * (stop - start + 1)
  
          # get total data length (header excludes)
          if not MF:
              TDL = TL - IHL + FO
  
          # put header into header buffer
          if not FO:
              self._buffer[BUFID]['header'] = info.header
  
          # when datagram is reassembled in whole
          start = 0
          stop = (TDL + 7) // 8
          if TDL and all(self._buffer[BUFID]['RCVBT'][start:stop]):
              self._dtgram += self.submit(self._buffer[BUFID], checked=True)
              del self._buffer[BUFID]
docs: Reassembly procedure.
  
          Positional arguments:
              * info -- Info, info dict of packets to be reassembled