code: func (c *linkAddrCache) get(k tcpip.FullAddress, linkRes LinkAddressResolver, localAddr tcpip.Address, linkEP LinkEndpoint, waker *sleep.Waker) (tcpip.LinkAddress, <-chan struct{}, *tcpip.Error) {
  	if linkRes != nil {
  		if addr, ok := linkRes.ResolveStaticAddress(k.Addr); ok {
  			return addr, nil, nil
  		}
  	}
  
  	c.mu.Lock()
  	defer c.mu.Unlock()
  	if entry, ok := c.cache[k]; ok {
  		switch s := entry.state(); s {
  		case expired:
  		case ready:
  			return entry.linkAddr, nil, nil
  		case failed:
  			return "", nil, tcpip.ErrNoLinkAddress
  		case incomplete:
  			// Address resolution is still in progress.
  			entry.addWaker(waker)
  			return "", entry.done, tcpip.ErrWouldBlock
  		default:
  			panic(fmt.Sprintf("invalid cache entry state: %s", s))
  		}
  	}
  
  	if linkRes == nil {
  		return "", nil, tcpip.ErrNoLinkAddress
  	}
  
  	// Add 'incomplete' entry in the cache to mark that resolution is in progress.
  	e := c.makeAndAddEntry(k, "")
  	e.addWaker(waker)
  
  	go c.startAddressResolution(k, linkRes, localAddr, linkEP, e.done)
  
  	return "", e.done, tcpip.ErrWouldBlock
  }
docs: // get reports any known link address for k.