]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: update transfer counters correctly
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 11 Jun 2019 16:13:52 +0000 (18:13 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 11 Jun 2019 16:13:52 +0000 (18:13 +0200)
The rule is to always update them to the full packet size minus UDP/IP
encapsulation for all authenticated packet types.

device/peer.go
device/receive.go
device/send.go

index 815dff4c7d7702d8fc304bfe2fa63049b3dd04f1..4e7f2da21a49a3aca210c83d4937c6305c7f325b 100644 (file)
@@ -10,6 +10,7 @@ import (
        "errors"
        "fmt"
        "sync"
+       "sync/atomic"
        "time"
 )
 
@@ -140,7 +141,11 @@ func (peer *Peer) SendBuffer(buffer []byte) error {
                return errors.New("no known endpoint for peer")
        }
 
-       return peer.device.net.bind.Send(buffer, peer.endpoint)
+       err := peer.device.net.bind.Send(buffer, peer.endpoint)
+       if err == nil {
+               atomic.AddUint64(&peer.stats.txBytes, uint64(len(buffer)))
+       }
+       return err
 }
 
 func (peer *Peer) String() string {
index 32d632b6286ad8400e4810a1062ff0bb58dac99e..62b5ef471f897a2b6a3bfd1b0c2b968a1dd56ad1 100644 (file)
@@ -427,6 +427,7 @@ func (device *Device) RoutineHandshake() {
                        peer.SetEndpointFromPacket(elem.endpoint)
 
                        logDebug.Println(peer, "- Received handshake initiation")
+                       atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet)))
 
                        peer.SendHandshakeResponse()
 
@@ -457,6 +458,7 @@ func (device *Device) RoutineHandshake() {
                        peer.SetEndpointFromPacket(elem.endpoint)
 
                        logDebug.Println(peer, "- Received handshake response")
+                       atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet)))
 
                        // update timers
 
@@ -581,6 +583,7 @@ func (peer *Peer) RoutineSequentialReceiver() {
                peer.keepKeyFreshReceiving()
                peer.timersAnyAuthenticatedPacketTraversal()
                peer.timersAnyAuthenticatedPacketReceived()
+               atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet)+MinMessageSize))
 
                // check for keepalive
 
@@ -656,7 +659,6 @@ func (peer *Peer) RoutineSequentialReceiver() {
                // write to tun device
 
                offset := MessageTransportOffsetContent
-               atomic.AddUint64(&peer.stats.rxBytes, uint64(len(elem.packet)))
                _, err := device.tun.device.Write(elem.buffer[:offset+len(elem.packet)], offset)
                if err == nil {
                        shouldFlush = true
index 21984275c7a0397fc1cca241c58d03e5caeef8d9..c4aa5b93ff31a87814ac876b9ff7ac6cd8b1906f 100644 (file)
@@ -600,7 +600,6 @@ func (peer *Peer) RoutineSequentialSender() {
 
                        // send message and return buffer to pool
 
-                       length := uint64(len(elem.packet))
                        err := peer.SendBuffer(elem.packet)
                        if len(elem.packet) != MessageKeepaliveSize {
                                peer.timersDataSent()
@@ -611,7 +610,6 @@ func (peer *Peer) RoutineSequentialSender() {
                                logError.Println(peer, "- Failed to send data packet", err)
                                continue
                        }
-                       atomic.AddUint64(&peer.stats.txBytes, length)
 
                        peer.keepKeyFreshSending()
                }