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.
This commit is contained in:
David Wragg committed 2015-03-27 18:05:00 +00:00
1 parent 0d30df165f
commit 78c70023d8
2 files changed
+9 -11

No files matched your search

+6 -7
View File
@@ -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) {
+3 -4
View File
@@ -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