code: func (ep *endpoint) HandlePacket(route *stack.Route, netHeader buffer.View, vv buffer.VectorisedView) {
  	ep.rcvMu.Lock()
  
  	// Drop the packet if our buffer is currently full.
  	if ep.rcvClosed || ep.rcvBufSize >= ep.rcvBufSizeMax {
  		ep.stack.Stats().DroppedPackets.Increment()
  		ep.rcvMu.Unlock()
  		return
  	}
  
  	if ep.bound {
  		// If bound to a NIC, only accept data for that NIC.
  		if ep.boundNIC != 0 && ep.boundNIC != route.NICID() {
  			ep.rcvMu.Unlock()
  			return
  		}
  		// If bound to an address, only accept data for that address.
  		if ep.boundAddr != "" && ep.boundAddr != route.RemoteAddress {
  			ep.rcvMu.Unlock()
  			return
  		}
  	}
  
  	// If connected, only accept packets from the remote address we
  	// connected to.
  	if ep.connected && ep.route.RemoteAddress != route.RemoteAddress {
  		ep.rcvMu.Unlock()
  		return
  	}
  
  	wasEmpty := ep.rcvBufSize == 0
  
  	// Push new packet into receive list and increment the buffer size.
  	packet := &packet{
  		senderAddr: tcpip.FullAddress{
  			NIC:  route.NICID(),
  			Addr: route.RemoteAddress,
  		},
  	}
  
  	combinedVV := netHeader.ToVectorisedView()
  	combinedVV.Append(vv)
  	packet.data = combinedVV.Clone(packet.views[:])
  	packet.timestampNS = ep.stack.NowNanoseconds()
  
  	ep.rcvList.PushBack(packet)
  	ep.rcvBufSize += packet.data.Size()
  
  	ep.rcvMu.Unlock()
  
  	// Notify waiters that there's data to be read.
  	if wasEmpty {
  		ep.waiterQueue.Notify(waiter.EventIn)
  	}
  }
docs: // HandlePacket implements stack.RawTransportEndpoint.HandlePacket.