70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package peer
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"net/netip"
|
|
)
|
|
|
|
type Peer struct {
|
|
ip byte // Last byte of IPv4 address.
|
|
hubAddr string
|
|
apiKey string
|
|
isServer bool
|
|
isMediator bool
|
|
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,
|
|
isMediator: conf.Mediator,
|
|
apiKey: conf.APIKey,
|
|
encPubKey: conf.EncPubKey,
|
|
encPrivKey: conf.EncPrivKey,
|
|
signPubKey: conf.SignPubKey,
|
|
signPrivKey: conf.SignPrivKey,
|
|
}
|
|
|
|
_, peer.isServer = netip.AddrFromSlice(conf.PublicIP)
|
|
|
|
port = determinePort(conf.Port, port)
|
|
|
|
peer.conn, err = openUDPConn(listenIP, port)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
peer.router = NewRouter(conf, peer.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()
|
|
}
|