code: func (e *endpoint) HandlePacket(r *stack.Route, vv buffer.VectorisedView) {
  	headerView := vv.First()
  	h := header.IPv4(headerView)
  	if !h.IsValid(vv.Size()) {
  		return
  	}
  
  	hlen := int(h.HeaderLength())
  	tlen := int(h.TotalLength())
  	vv.TrimFront(hlen)
  	vv.CapLength(tlen - hlen)
  
  	more := (h.Flags() & header.IPv4FlagMoreFragments) != 0
  	if more || h.FragmentOffset() != 0 {
  		// The packet is a fragment, let's try to reassemble it.
  		last := h.FragmentOffset() + uint16(vv.Size()) - 1
  		var ready bool
  		vv, ready = e.fragmentation.Process(hash.IPv4FragmentHash(h), h.FragmentOffset(), last, more, vv)
  		if !ready {
  			return
  		}
  	}
  	p := h.TransportProtocol()
  	if p == header.ICMPv4ProtocolNumber {
  		headerView.CapLength(hlen)
  		e.handleICMP(r, headerView, vv)
  		return
  	}
  	r.Stats().IP.PacketsDelivered.Increment()
  	e.dispatcher.DeliverTransportPacket(r, p, headerView, vv)
  }
docs: // HandlePacket is called by the link layer when new ipv4 packets arrive for
  // this endpoint.