From 78c70023d89565eaf2c043bad721e8c36e4d364d Mon Sep 17 00:00:00 2001 From: David Wragg Date: Fri, 27 Mar 2015 17:45:56 +0000 Subject: [PATCH] Don't pass the sender UDPAddr through the crypto layer The crypto layer doesn't need it, and the cost of an additional closure allocation for each incoming UDP packet is modest. Also, make the FrameConsumer the last parameter to IterateFrames. It seems a more natural ordering. --- router/crypto.go | 13 ++++++------- router/router.go | 7 +++---- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/router/crypto.go b/router/crypto.go index 0f788d76..3d7cad9e 100644 --- a/router/crypto.go +++ b/router/crypto.go @@ -11,7 +11,6 @@ import ( "encoding/gob" "fmt" "log" - "net" "sync" ) @@ -244,10 +243,10 @@ func (ne *NaClEncryptor) TotalLen() int { // Frame Decryptors -type FrameConsumer func(conn *LocalConnection, sender *net.UDPAddr, src []byte, dst []byte, frame []byte) +type FrameConsumer func(conn *LocalConnection, src []byte, dst []byte, frame []byte) type Decryptor interface { - IterateFrames(FrameConsumer, []byte, *net.UDPAddr) error + IterateFrames([]byte, FrameConsumer) error ReceiveNonce([]byte) Shutdown() } @@ -280,7 +279,7 @@ func NewNonDecryptor(conn *LocalConnection) *NonDecryptor { return &NonDecryptor{conn: conn} } -func (nd *NonDecryptor) IterateFrames(consumer FrameConsumer, packet []byte, sender *net.UDPAddr) error { +func (nd *NonDecryptor) IterateFrames(packet []byte, consumer FrameConsumer) error { for len(packet) >= (2 + NameSize + NameSize) { srcNameByte := packet[:NameSize] packet = packet[NameSize:] @@ -293,7 +292,7 @@ func (nd *NonDecryptor) IterateFrames(consumer FrameConsumer, packet []byte, sen } frame := packet[:length] packet = packet[length:] - consumer(nd.conn, sender, srcNameByte, dstNameByte, frame) + consumer(nd.conn, srcNameByte, dstNameByte, frame) } if len(packet) > 0 { return PacketDecodingError{Desc: fmt.Sprintf("%d octets of trailing garbage", len(packet))} @@ -343,12 +342,12 @@ func (nd *NaClDecryptor) ReceiveNonce(msg []byte) { } } -func (nd *NaClDecryptor) IterateFrames(consumer FrameConsumer, packet []byte, sender *net.UDPAddr) error { +func (nd *NaClDecryptor) IterateFrames(packet []byte, consumer FrameConsumer) error { buf, err := nd.decrypt(packet) if err != nil { return PacketDecodingError{Fatal: true, Desc: fmt.Sprint("decryption failed; ", err)} } - return nd.NonDecryptor.IterateFrames(consumer, buf, sender) + return nd.NonDecryptor.IterateFrames(buf, consumer) } func (nd *NaClDecryptor) decrypt(buf []byte) ([]byte, error) { diff --git a/router/router.go b/router/router.go index ad3f1899..922c1009 100644 --- a/router/router.go +++ b/router/router.go @@ -216,7 +216,6 @@ func (router *Router) listenUDP(localPort int, po PacketSink) *net.UDPConn { func (router *Router) udpReader(conn *net.UDPConn, po PacketSink) { defer conn.Close() dec := NewEthernetDecoder() - handleUDPPacket := router.handleUDPPacketFunc(dec, po) buf := make([]byte, MaxUDPPacketSize) for { n, sender, err := conn.ReadFromUDP(buf) @@ -240,7 +239,7 @@ func (router *Router) udpReader(conn *net.UDPConn, po PacketSink) { if !ok { continue } - err = relayConn.Decryptor.IterateFrames(handleUDPPacket, packet, sender) + err = relayConn.Decryptor.IterateFrames(packet, router.handleUDPPacketFunc(dec, sender, po)) if pde, ok := err.(PacketDecodingError); ok { if pde.Fatal { relayConn.Shutdown(pde) @@ -253,8 +252,8 @@ func (router *Router) udpReader(conn *net.UDPConn, po PacketSink) { } } -func (router *Router) handleUDPPacketFunc(dec *EthernetDecoder, po PacketSink) FrameConsumer { - return func(relayConn *LocalConnection, sender *net.UDPAddr, srcNameByte, dstNameByte []byte, frame []byte) { +func (router *Router) handleUDPPacketFunc(dec *EthernetDecoder, sender *net.UDPAddr, po PacketSink) FrameConsumer { + return func(relayConn *LocalConnection, srcNameByte, dstNameByte []byte, frame []byte) { srcPeer, found := router.Peers.Fetch(PeerNameFromBin(srcNameByte)) if !found { return