| 1234567891011121314151617181920212223242526272829303132333435363738 |
- // Copyright (c) Tailscale Inc & AUTHORS
- // SPDX-License-Identifier: BSD-3-Clause
- //go:build darwin || ios
- package netstack
- import (
- "net/netip"
- "time"
- probing "github.com/prometheus-community/pro-bing"
- )
- // sendOutboundUserPing sends a non-privileged ICMP (or ICMPv6) ping to dstIP with the given timeout.
- func (ns *Impl) sendOutboundUserPing(dstIP netip.Addr, timeout time.Duration) error {
- p, err := probing.NewPinger(dstIP.String())
- if err != nil {
- ns.logf("sendICMPPingToIP failed to create pinger: %v", err)
- return err
- }
- p.Timeout = timeout
- p.Count = 1
- p.SetPrivileged(false)
- p.OnSend = func(pkt *probing.Packet) {
- ns.logf("sendICMPPingToIP: forwarding ping to %s:", p.Addr())
- }
- p.OnRecv = func(pkt *probing.Packet) {
- ns.logf("sendICMPPingToIP: %d bytes pong from %s: icmp_seq=%d time=%v", pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt)
- }
- p.OnFinish = func(stats *probing.Statistics) {
- ns.logf("sendICMPPingToIP: done, %d replies received", stats.PacketsRecv)
- }
- return p.Run()
- }
|