68 lines
1.1 KiB
Go
68 lines
1.1 KiB
Go
package peer
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net"
|
|
)
|
|
|
|
type Peer struct {
|
|
// Immutable data.
|
|
ip byte // Last byte of IPv4 address.
|
|
hubAddr string
|
|
apiKey string
|
|
|
|
encPubKey []byte
|
|
encPrivKey []byte
|
|
signPubKey []byte
|
|
signPrivKey []byte
|
|
conn *net.UDPConn
|
|
iface io.ReadWriteCloser
|
|
|
|
router *Router
|
|
}
|
|
|
|
func NewPeer(netName, listenIP string, port uint16) (*Peer, error) {
|
|
conf, err := loadPeerConfig(netName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
peer := &Peer{
|
|
ip: conf.PeerIP,
|
|
hubAddr: conf.HubAddress,
|
|
apiKey: conf.APIKey,
|
|
encPubKey: conf.EncPubKey,
|
|
encPrivKey: conf.EncPrivKey,
|
|
signPubKey: conf.SignPubKey,
|
|
signPrivKey: conf.SignPrivKey,
|
|
}
|
|
|
|
peer.router = NewRouter(conf)
|
|
|
|
port = determinePort(conf.Port, port)
|
|
|
|
conn, err := openUDPConn(listenIP, port)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
peer.conn = conn
|
|
|
|
peer.iface, err = openInterface(conf.Network, conf.PeerIP, netName)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return peer, nil
|
|
}
|
|
|
|
func (p *Peer) Run() {
|
|
go p.netReader()
|
|
p.ifReader()
|
|
}
|