Skip to content

Commit 7c20311

Browse files
jwhitedzx2c4
authored andcommitted
device: reduce redundant per-packet overhead in RX path
Peer.RoutineSequentialReceiver() deals with packet vectors and does not need to perform timer and endpoint operations for every packet in a given vector. Changing these per-packet operations to per-vector improves throughput by as much as 10% in some environments. Signed-off-by: Jordan Whited <[email protected]> Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent 4ffa9c2 commit 7c20311

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

device/receive.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,9 @@ func (peer *Peer) RoutineSequentialReceiver(maxBatchSize int) {
445445
return
446446
}
447447
elemsContainer.Lock()
448-
for _, elem := range elemsContainer.elems {
448+
validTailPacket := -1
449+
dataPacketReceived := false
450+
for i, elem := range elemsContainer.elems {
449451
if elem.packet == nil {
450452
// decryption failed
451453
continue
@@ -455,21 +457,19 @@ func (peer *Peer) RoutineSequentialReceiver(maxBatchSize int) {
455457
continue
456458
}
457459

458-
peer.SetEndpointFromPacket(elem.endpoint)
460+
validTailPacket = i
459461
if peer.ReceivedWithKeypair(elem.keypair) {
462+
peer.SetEndpointFromPacket(elem.endpoint)
460463
peer.timersHandshakeComplete()
461464
peer.SendStagedPackets()
462465
}
463-
peer.keepKeyFreshReceiving()
464-
peer.timersAnyAuthenticatedPacketTraversal()
465-
peer.timersAnyAuthenticatedPacketReceived()
466466
peer.rxBytes.Add(uint64(len(elem.packet) + MinMessageSize))
467467

468468
if len(elem.packet) == 0 {
469469
device.log.Verbosef("%v - Receiving keepalive packet", peer)
470470
continue
471471
}
472-
peer.timersDataReceived()
472+
dataPacketReceived = true
473473

474474
switch elem.packet[0] >> 4 {
475475
case 4:
@@ -512,6 +512,15 @@ func (peer *Peer) RoutineSequentialReceiver(maxBatchSize int) {
512512

513513
bufs = append(bufs, elem.buffer[:MessageTransportOffsetContent+len(elem.packet)])
514514
}
515+
if validTailPacket >= 0 {
516+
peer.SetEndpointFromPacket(elemsContainer.elems[validTailPacket].endpoint)
517+
peer.keepKeyFreshReceiving()
518+
peer.timersAnyAuthenticatedPacketTraversal()
519+
peer.timersAnyAuthenticatedPacketReceived()
520+
}
521+
if dataPacketReceived {
522+
peer.timersDataReceived()
523+
}
515524
if len(bufs) > 0 {
516525
_, err := device.tun.device.Write(bufs, MessageTransportOffsetContent)
517526
if err != nil && !device.isClosed() {

0 commit comments

Comments
 (0)