From 40a3c166e72461b651924ec750670c7e211d56e9 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Fri, 1 May 2015 15:25:34 +0300 Subject: [PATCH] Benchmark tests for transport encrypt/decrypt functions Signed-off-by: Sergey Matveev --- makefile | 3 +++ tap.go | 7 ++---- transport.go | 9 +++++-- transport_test.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 transport_test.go diff --git a/makefile b/makefile index 3dec45c..77a12ad 100644 --- a/makefile +++ b/makefile @@ -15,3 +15,6 @@ govpn-client: dependencies govpn-server: dependencies go build -ldflags "$(LDFLAGS)" govpn/cmd/govpn-server + +bench: dependencies + GOMAXPROC=2 go test -bench . diff --git a/tap.go b/tap.go index 4fee83a..6b298f7 100644 --- a/tap.go +++ b/tap.go @@ -20,7 +20,6 @@ package govpn import ( "io" - "log" "golang.org/x/crypto/poly1305" ) @@ -63,8 +62,6 @@ func NewTAP(ifaceName string) (*TAP, error) { return &tap, nil } -func (t *TAP) Write(data []byte) { - if _, err := t.dev.Write(data); err != nil { - log.Println("Error writing to iface: ", err) - } +func (t *TAP) Write(data []byte) (n int, err error) { + return t.dev.Write(data) } diff --git a/transport.go b/transport.go index f337302..2638243 100644 --- a/transport.go +++ b/transport.go @@ -21,6 +21,7 @@ package govpn import ( "crypto/subtle" "encoding/binary" + "io" "log" "net" "time" @@ -227,7 +228,7 @@ func newPeer(addr *net.UDPAddr, id PeerId, nonce int, key *[KeySize]byte) *Peer // ConnListen'es synchronization channel used to tell him that he is // free to receive new packets. Authenticated and decrypted packets // will be written to the interface immediately (except heartbeat ones). -func (p *Peer) UDPProcess(udpPkt []byte, tap *TAP, ready chan struct{}) bool { +func (p *Peer) UDPProcess(udpPkt []byte, tap io.Writer, ready chan struct{}) bool { size := len(udpPkt) copy(p.buf[:KeySize], Emptiness) copy(p.tag[:], udpPkt[size-poly1305.TagSize:]) @@ -265,12 +266,16 @@ func (p *Peer) UDPProcess(udpPkt []byte, tap *TAP, ready chan struct{}) bool { return true } +type WriteToer interface { + WriteTo([]byte, net.Addr) (int, error) +} + // Process incoming Ethernet packet. // ethPkt is received data, conn is our outgoing connection. // ready channel is TAPListen's synchronization channel used to tell him // that he is free to receive new packets. Encrypted and authenticated // packets will be sent to remote Peer side immediately. -func (p *Peer) EthProcess(ethPkt []byte, conn *net.UDPConn, ready chan struct{}) { +func (p *Peer) EthProcess(ethPkt []byte, conn WriteToer, ready chan struct{}) { now := time.Now() size := len(ethPkt) // If this heartbeat is necessary diff --git a/transport_test.go b/transport_test.go new file mode 100644 index 0000000..11fe2c9 --- /dev/null +++ b/transport_test.go @@ -0,0 +1,61 @@ +package govpn + +import ( + "net" + "testing" +) + +var ( + peer *Peer + plaintext []byte + ready chan struct{} + dummy = &Dummy{} + ciphertext []byte + addr *net.UDPAddr + peerId *PeerId +) + +func init() { + MTU = 1500 + Noncediff = 100 + addr, _ = net.ResolveUDPAddr("udp", "[::1]:1") + peerId = IDDecode("ffffffffffffffffffffffffffffffff") + peer = newPeer(addr, *peerId, 128, new([KeySize]byte)) + plaintext = make([]byte, 789) + ready = make(chan struct{}) + go func() { + for { + <-ready + } + }() +} + +type Dummy struct{} + +func (d *Dummy) WriteTo(b []byte, addr net.Addr) (int, error) { + ciphertext = b + return len(b), nil +} + +func (d *Dummy) Write(p []byte) (n int, err error) { + return len(p), nil +} + +func BenchmarkEnc(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + peer.NonceOur = 128 + peer.EthProcess(plaintext, dummy, ready) + } +} + +func BenchmarkDec(b *testing.B) { + peer.EthProcess(plaintext, dummy, ready) + peer = newPeer(addr, *peerId, 128, new([KeySize]byte)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + if !peer.UDPProcess(ciphertext, dummy, ready) { + b.Fail() + } + } +} -- 2.44.0