288 lines
5.2 KiB
Go
288 lines
5.2 KiB
Go
package weave
|
|
|
|
import (
|
|
"bytes"
|
|
"code.google.com/p/go-bit/bit"
|
|
"code.google.com/p/gopacket"
|
|
"code.google.com/p/gopacket/layers"
|
|
"encoding/gob"
|
|
"net"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type Router struct {
|
|
Ourself *Peer
|
|
Iface *net.Interface
|
|
PeersSubscribeChan chan<- chan<- map[string]Peer
|
|
Macs *MacCache
|
|
Peers *PeerCache
|
|
UDPListener *net.UDPConn
|
|
Topology *Topology
|
|
ConnectionMaker *ConnectionMaker
|
|
Password *[]byte
|
|
ConnLimit int
|
|
BufSz int
|
|
LogFrame func(string, []byte, *layers.Ethernet)
|
|
}
|
|
|
|
type Peer struct {
|
|
sync.RWMutex
|
|
Name PeerName
|
|
NameByte []byte
|
|
connections map[PeerName]Connection
|
|
version uint64
|
|
UID uint64
|
|
Router *Router
|
|
localRefCount uint64
|
|
queryChan chan<- *PeerInteraction
|
|
}
|
|
|
|
type PeerInteraction struct {
|
|
Interaction
|
|
payload interface{}
|
|
}
|
|
|
|
type Connection interface {
|
|
Local() *Peer
|
|
Remote() *Peer
|
|
RemoteTCPAddr() string
|
|
Established() bool
|
|
Shutdown()
|
|
}
|
|
|
|
type RemoteConnection struct {
|
|
local *Peer
|
|
remote *Peer
|
|
remoteTCPAddr string
|
|
}
|
|
|
|
type LocalConnection struct {
|
|
sync.RWMutex
|
|
RemoteConnection
|
|
TCPConn *net.TCPConn
|
|
tcpSender TCPSender
|
|
remoteUDPAddr *net.UDPAddr
|
|
established bool
|
|
stackFrag bool
|
|
clientPMTU int
|
|
pmtuVerified bool
|
|
SessionKey *[32]byte
|
|
heartbeatStop chan<- interface{}
|
|
forwardChan chan<- *ForwardedFrame
|
|
forwardChanDF chan<- *ForwardedFrame
|
|
stopForward chan<- interface{}
|
|
stopForwardDF chan<- interface{}
|
|
Decryptor Decryptor
|
|
Router *Router
|
|
UID uint64
|
|
shutdown bool
|
|
queryChan chan<- *ConnectionInteraction
|
|
}
|
|
|
|
type ConnectionInteraction struct {
|
|
Interaction
|
|
payload interface{}
|
|
}
|
|
|
|
type UDPPacket struct {
|
|
Name PeerName
|
|
Packet []byte
|
|
Sender *net.UDPAddr
|
|
}
|
|
|
|
type EthernetDecoder struct {
|
|
eth layers.Ethernet
|
|
ip layers.IPv4
|
|
decoded []gopacket.LayerType
|
|
parser *gopacket.DecodingLayerParser
|
|
}
|
|
|
|
type FrameTooBigError struct {
|
|
PMTU int
|
|
frame *ForwardedFrame
|
|
}
|
|
|
|
type UnknownPeersError struct {
|
|
}
|
|
|
|
type NameCollisionError struct {
|
|
Name PeerName
|
|
}
|
|
|
|
type LocalAddress struct {
|
|
ip net.IP
|
|
network *net.IPNet
|
|
}
|
|
|
|
type ForwardedFrame struct {
|
|
srcPeer *Peer
|
|
dstPeer *Peer
|
|
frame []byte
|
|
}
|
|
|
|
type Interaction struct {
|
|
code int
|
|
resultChan chan<- interface{}
|
|
}
|
|
|
|
type Topology struct {
|
|
sync.RWMutex
|
|
queryChan chan<- *Interaction
|
|
unicast map[PeerName]PeerName
|
|
broadcast map[PeerName][]PeerName
|
|
router *Router
|
|
}
|
|
|
|
type ConnectionMakerInteraction struct {
|
|
Interaction
|
|
foundAt string
|
|
name PeerName
|
|
}
|
|
|
|
type ConnectionMaker struct {
|
|
router *Router
|
|
queryChan chan<- *ConnectionMakerInteraction
|
|
activeConnections map[string]string
|
|
failedConnections map[PeerName]*FailedConnection
|
|
}
|
|
|
|
type FailedConnection struct {
|
|
foundAt map[string]bool
|
|
tryAfter time.Time
|
|
tryInterval time.Duration
|
|
attemptCount int
|
|
}
|
|
|
|
// UDPSender interface and implementations
|
|
|
|
type UDPSender interface {
|
|
Send([]byte) error
|
|
Shutdown() error
|
|
}
|
|
|
|
type SimpleUDPSender struct {
|
|
conn *LocalConnection
|
|
udpConn *net.UDPConn
|
|
}
|
|
|
|
type RawUDPSender struct {
|
|
ipBuf gopacket.SerializeBuffer
|
|
opts gopacket.SerializeOptions
|
|
udpHeader *layers.UDP
|
|
socket *net.IPConn
|
|
conn *LocalConnection
|
|
}
|
|
|
|
// TCPSender interface and implementations
|
|
|
|
type TCPSender interface {
|
|
Send([]byte) error
|
|
}
|
|
|
|
type SimpleTCPSender struct {
|
|
encoder *gob.Encoder
|
|
}
|
|
|
|
type EncryptedTCPSender struct {
|
|
sync.RWMutex
|
|
outerEncoder *gob.Encoder
|
|
innerEncoder *gob.Encoder
|
|
buffer *bytes.Buffer
|
|
conn *LocalConnection
|
|
msgCount int
|
|
}
|
|
|
|
type EncryptedTCPMessage struct {
|
|
Number int
|
|
Body []byte
|
|
}
|
|
|
|
// TCPReceiver interface and implementations
|
|
|
|
type TCPReceiver interface {
|
|
Decode([]byte) ([]byte, error)
|
|
}
|
|
|
|
type SimpleTCPReceiver struct {
|
|
}
|
|
|
|
type EncryptedTCPReceiver struct {
|
|
conn *LocalConnection
|
|
decoder *gob.Decoder
|
|
buffer *bytes.Buffer
|
|
msgCount int
|
|
}
|
|
|
|
// Encryptor interface and implementations
|
|
|
|
type Encryptor interface {
|
|
FrameOverhead() int
|
|
PacketOverhead() int
|
|
IsEmpty() bool
|
|
Bytes() []byte
|
|
AppendFrame(*ForwardedFrame)
|
|
TotalLen() int
|
|
}
|
|
|
|
type NonEncryptor struct {
|
|
buf []byte
|
|
bufTail []byte
|
|
buffered int
|
|
prefixLen int
|
|
}
|
|
|
|
type NaClEncryptor struct {
|
|
NonEncryptor
|
|
buf []byte
|
|
offset uint16
|
|
nonce *[24]byte
|
|
nonceChan chan *[24]byte
|
|
flags uint16
|
|
prefixLen int
|
|
conn *LocalConnection
|
|
df bool
|
|
}
|
|
|
|
// Decryptor interface and implementations
|
|
|
|
type FrameConsumer func(*LocalConnection, *net.UDPAddr, []byte, []byte, uint16, []byte) error
|
|
|
|
type Decryptor interface {
|
|
IterateFrames(FrameConsumer, *UDPPacket) error
|
|
ReceiveNonce([]byte)
|
|
Shutdown()
|
|
}
|
|
|
|
type NonDecryptor struct {
|
|
conn *LocalConnection
|
|
}
|
|
|
|
type NaClDecryptor struct {
|
|
NonDecryptor
|
|
instance *NaClDecryptorInstance
|
|
instanceDF *NaClDecryptorInstance
|
|
}
|
|
|
|
type NaClDecryptorInstance struct {
|
|
nonce *[24]byte
|
|
previousNonce *[24]byte
|
|
usedOffsets *bit.Set
|
|
previousUsedOffsets *bit.Set
|
|
highestOffsetSeen uint16
|
|
nonceChan chan *[24]byte
|
|
}
|
|
|
|
type PacketSource interface {
|
|
ReadPacket() ([]byte, error)
|
|
}
|
|
|
|
type PacketSink interface {
|
|
WritePacket([]byte) error
|
|
}
|
|
|
|
type PacketSourceSink interface {
|
|
PacketSource
|
|
PacketSink
|
|
}
|