Files
weave/router/interhost.go
T

81 lines
2.1 KiB
Go

package router
import (
"net"
)
// Interface to inter-host (i.e. overlay network) packet handling
type InterHost interface {
// Start consuming forwarded packets.
ConsumePackets(*Peer, *Peers, InterHostConsumer) error
// Form a packet-forwarding connection. The remote UDPAddr
// can be nil if unknown (in which case the implementation
// needs to discover it).
MakeForwarder(remotePeer *Peer, localIP net.IP, remote *net.UDPAddr,
connUID uint64, crypto InterHostCrypto,
sendControlMessage func([]byte) error) (InterHostForwarder, error)
}
// When a consumer is called, the decoder will already have been used
// to decode the frame.
type InterHostConsumer func(src *Peer, dst *Peer, frame []byte,
dec *EthernetDecoder)
// Crypto settings for a forwarder.
type InterHostCrypto struct {
Dec Decryptor
Enc Encryptor
EncDF Encryptor
}
// All of the machinery to forward packets to a particular peer
type InterHostForwarder interface {
// Register a callback for forwarder state changes.
// side-effect, calling this confirms that the connection is
// really wanted, and so the provider should activate it.
// However, Forward might be called before this is called
// (e.g. on another thread).
SetListener(InterHostForwarderListener)
// Forward a packet across the connection. The caller must
// supply an EthernetDecoder specific to this thread, which
// has already been used to decode the frame.
Forward(src *Peer, dest *Peer, frame []byte, dec *EthernetDecoder,
broadcast bool)
Close()
// Handle a message from the peer
ControlMessage([]byte)
}
type InterHostForwarderListener interface {
Established()
Error(error)
}
type NullInterHost struct{}
func (NullInterHost) ConsumePackets(*Peer, *Peers, InterHostConsumer) error {
return nil
}
func (NullInterHost) MakeForwarder(*Peer, net.IP, *net.UDPAddr, uint64,
InterHostCrypto, func([]byte) error) (InterHostForwarder, error) {
return NullInterHost{}, nil
}
func (NullInterHost) SetListener(InterHostForwarderListener) {
}
func (NullInterHost) Forward(*Peer, *Peer, []byte, *EthernetDecoder,
bool) {
}
func (NullInterHost) Close() {
}
func (NullInterHost) ControlMessage([]byte) {
}