diff --git a/cmd/ping/ping.go b/cmd/ping/ping.go index 3fe330e..576781f 100644 --- a/cmd/ping/ping.go +++ b/cmd/ping/ping.go @@ -92,6 +92,7 @@ func main() { pinger.Size = *size pinger.Interval = *interval pinger.Timeout = *timeout + pinger.PacketTimeout = time.Second * 10 pinger.TTL = *ttl pinger.SetPrivileged(*privileged) diff --git a/ping.go b/ping.go index 36507c0..568087d 100644 --- a/ping.go +++ b/ping.go @@ -92,12 +92,13 @@ func New(addr string) *Pinger { var firstSequence = map[uuid.UUID]map[int]InFlightPacket{} firstSequence[firstUUID] = make(map[int]InFlightPacket) return &Pinger{ - Count: -1, - Interval: time.Second, - RecordRtts: true, - Size: timeSliceLength + trackerLength, - Timeout: time.Duration(math.MaxInt64), - Tracker: r.Uint64(), + Count: -1, + Interval: time.Second, + RecordRtts: true, + Size: timeSliceLength + trackerLength, + Timeout: time.Duration(math.MaxInt64), + PacketTimeout: time.Duration(math.MaxInt64), + Tracker: r.Uint64(), addr: addr, done: make(chan interface{}), @@ -128,6 +129,10 @@ type Pinger struct { // packets have been received. Timeout time.Duration + // PacketTimeout specifies a timeout before the OnTimeout function is called + // for a packet not being received + PacketTimeout time.Duration + // Count tells pinger to stop after sending (and receiving) Count echo // packets. If this option is not specified, pinger will operate until // interrupted. @@ -517,13 +522,13 @@ func (p *Pinger) runLoop( func (p *Pinger) CheckInFlightPackets() { // Loop through each item in map - if time.Duration(p.TTL) == maxPacketTimeout { + if p.PacketTimeout == maxPacketTimeout { return } currentTime := time.Now() for id, inflight := range p.InFlightPackets { for seq, pkt := range inflight { - if pkt.DispatchedTime.Add(time.Duration(p.TTL)).Before(currentTime) { + if pkt.DispatchedTime.Add(p.PacketTimeout).Before(currentTime) { delete(p.InFlightPackets[id], seq) if p.OnTimeout != nil { p.OnTimeout(seq, &pkt)