code: func NewFragmentation(highMemoryLimit, lowMemoryLimit int, reassemblingTimeout time.Duration) *Fragmentation {
  	if lowMemoryLimit >= highMemoryLimit {
  		lowMemoryLimit = highMemoryLimit
  	}
  
  	if lowMemoryLimit < 0 {
  		lowMemoryLimit = 0
  	}
  
  	return &Fragmentation{
  		reassemblers: make(map[uint32]*reassembler),
  		highLimit:    highMemoryLimit,
  		lowLimit:     lowMemoryLimit,
  		timeout:      reassemblingTimeout,
  	}
  }
docs: // NewFragmentation creates a new Fragmentation.
  //
  // highMemoryLimit specifies the limit on the memory consumed
  // by the fragments stored by Fragmentation (overhead of internal data-structures
  // is not accounted). Fragments are dropped when the limit is reached.
  //
  // lowMemoryLimit specifies the limit on which we will reach by dropping
  // fragments after reaching highMemoryLimit.
  //
  // reassemblingTimeout specifes the maximum time allowed to reassemble a packet.
  // Fragments are lazily evicted only when a new a packet with an
  // already existing fragmentation-id arrives after the timeout.