code: func (*protocol) LinkAddressRequest(addr, localAddr tcpip.Address, linkEP stack.LinkEndpoint) *tcpip.Error {
  	snaddr := header.SolicitedNodeAddr(addr)
  	r := &stack.Route{
  		LocalAddress:      localAddr,
  		RemoteAddress:     snaddr,
  		RemoteLinkAddress: broadcastMAC,
  	}
  	hdr := buffer.NewPrependable(int(linkEP.MaxHeaderLength()) + header.IPv6MinimumSize + header.ICMPv6NeighborAdvertSize)
  	pkt := header.ICMPv6(hdr.Prepend(header.ICMPv6NeighborAdvertSize))
  	pkt.SetType(header.ICMPv6NeighborSolicit)
  	copy(pkt[icmpV6OptOffset-len(addr):], addr)
  	pkt[icmpV6OptOffset] = ndpOptSrcLinkAddr
  	pkt[icmpV6LengthOffset] = 1
  	copy(pkt[icmpV6LengthOffset+1:], linkEP.LinkAddress())
  	pkt.SetChecksum(icmpChecksum(pkt, r.LocalAddress, r.RemoteAddress, buffer.VectorisedView{}))
  
  	length := uint16(hdr.UsedLength())
  	ip := header.IPv6(hdr.Prepend(header.IPv6MinimumSize))
  	ip.Encode(&header.IPv6Fields{
  		PayloadLength: length,
  		NextHeader:    uint8(header.ICMPv6ProtocolNumber),
  		HopLimit:      defaultIPv6HopLimit,
  		SrcAddr:       r.LocalAddress,
  		DstAddr:       r.RemoteAddress,
  	})
  
  	// TODO(stijlist): count this in ICMP stats.
  	return linkEP.WritePacket(r, nil /* gso */, hdr, buffer.VectorisedView{}, ProtocolNumber)
  }
docs: // LinkAddressRequest implements stack.LinkAddressResolver.