Skip to content

Commit 44f475c

Browse files
committed
nclient6: Use cenkalti/backoff/v4 library to replace backoff algorithm in #296
Signed-off-by: Heinz Boehmer Fiehn <[email protected]>
1 parent d11e07c commit 44f475c

File tree

3 files changed

+10
-26
lines changed

3 files changed

+10
-26
lines changed

dhcpv6/nclient6/client.go

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"sync/atomic"
1818
"time"
1919

20+
"github.com/cenkalti/backoff/v4"
2021
"github.com/insomniacslk/dhcp/dhcpv6"
2122
)
2223

@@ -52,7 +53,7 @@ type Client struct {
5253
ifaceHWAddr net.HardwareAddr
5354
conn net.PacketConn
5455
timeout time.Duration
55-
retry int
56+
retry uint64
5657
logger logger
5758

5859
// bufferCap is the channel capacity for each TransactionID.
@@ -272,7 +273,7 @@ func WithLogDroppedPackets() ClientOpt {
272273
// WithRetry configures the number of retransmissions to attempt.
273274
//
274275
// Default is 3.
275-
func WithRetry(r int) ClientOpt {
276+
func WithRetry(r uint64) ClientOpt {
276277
return func(c *Client) {
277278
c.retry = r
278279
}
@@ -443,7 +444,8 @@ var errDeadlineExceeded = errors.New("INTERNAL ERROR: deadline exceeded")
443444
// If match is nil, the first packet matching the Transaction ID is returned.
444445
func (c *Client) SendAndRead(ctx context.Context, dest *net.UDPAddr, msg *dhcpv6.Message, match Matcher) (*dhcpv6.Message, error) {
445446
var response *dhcpv6.Message
446-
err := c.retryFn(func(timeout time.Duration) error {
447+
timeout := c.timeout
448+
err := backoff.Retry(func() error {
447449
ch, rem, err := c.send(dest, msg)
448450
if err != nil {
449451
return err
@@ -457,6 +459,7 @@ func (c *Client) SendAndRead(ctx context.Context, dest *net.UDPAddr, msg *dhcpv6
457459
return ErrNoResponse
458460

459461
case <-time.After(timeout):
462+
timeout *= 2
460463
return errDeadlineExceeded
461464

462465
case <-ctx.Done():
@@ -470,7 +473,7 @@ func (c *Client) SendAndRead(ctx context.Context, dest *net.UDPAddr, msg *dhcpv6
470473
}
471474
}
472475
}
473-
})
476+
}, backoff.WithContext(backoff.WithMaxRetries(backoff.NewExponentialBackOff(), c.retry), ctx))
474477
if err == errDeadlineExceeded {
475478
return nil, ErrNoResponse
476479
}
@@ -479,25 +482,3 @@ func (c *Client) SendAndRead(ctx context.Context, dest *net.UDPAddr, msg *dhcpv6
479482
}
480483
return response, nil
481484
}
482-
483-
func (c *Client) retryFn(fn func(timeout time.Duration) error) error {
484-
timeout := c.timeout
485-
486-
// Each retry takes the amount of timeout at worst.
487-
for i := 0; i < c.retry || c.retry < 0; i++ {
488-
switch err := fn(timeout); err {
489-
case nil:
490-
// Got it!
491-
return nil
492-
493-
case errDeadlineExceeded:
494-
// Double timeout, then retry.
495-
timeout *= 2
496-
497-
default:
498-
return err
499-
}
500-
}
501-
502-
return errDeadlineExceeded
503-
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/insomniacslk/dhcp
33
go 1.13
44

55
require (
6+
github.com/cenkalti/backoff/v4 v4.1.1 // indirect
67
github.com/fanliao/go-promise v0.0.0-20141029170127-1890db352a72
78
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714
89
github.com/jsimonetti/rtnetlink v0.0.0-20201110080708-d2c240429e6c

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ=
2+
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
13
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
24
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35
github.com/fanliao/go-promise v0.0.0-20141029170127-1890db352a72 h1:0eU/faU2oDIB2BkQVM02hgRLJjGzzUuRf19HUhp0394=

0 commit comments

Comments
 (0)