govpn-server: dependencies
go build -ldflags "$(LDFLAGS)" govpn/cmd/govpn-server
+
+bench: dependencies
+ GOMAXPROC=2 go test -bench .
import (
"io"
- "log"
"golang.org/x/crypto/poly1305"
)
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)
}
import (
"crypto/subtle"
"encoding/binary"
+ "io"
"log"
"net"
"time"
// 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:])
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
--- /dev/null
+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()
+ }
+ }
+}