// Copyright (c) Tailscale Inc & contributors // SPDX-License-Identifier: BSD-3-Clause package main import ( "fmt" "net/netip" "tailscale.com/tailcfg" ) // buildPeerAPIURL returns the HTTP base URL for a peer's peerAPI server, // selecting IPv4 when available and falling back to IPv6. Returns an empty // string if the peer advertises no reachable peerAPI port. func buildPeerAPIURL(p tailcfg.NodeView, selfHave4, selfHave6 bool) string { var pp4, pp6 uint16 for _, s := range p.Hostinfo().Services().All() { switch s.Proto { case tailcfg.PeerAPI4: pp4 = s.Port case tailcfg.PeerAPI6: pp6 = s.Port } } if selfHave4 && pp4 != 0 { for _, a := range p.Addresses().All() { if a.IsSingleIP() && a.Addr().Is4() { return fmt.Sprintf("http://%v", netip.AddrPortFrom(a.Addr(), pp4)) } } } if selfHave6 && pp6 != 0 { for _, a := range p.Addresses().All() { if a.IsSingleIP() && a.Addr().Is6() { return fmt.Sprintf("http://%v", netip.AddrPortFrom(a.Addr(), pp6)) } } } return "" }