Skip to content
Snippets Groups Projects
Unverified Commit bc3f1809 authored by Daniel Czerwonk's avatar Daniel Czerwonk Committed by GitHub
Browse files

Merge pull request #36 from hikhvar/feature/sleep-between-reconnects

Feature: Only activate the fsm at configurable reconnectInterval
parents 6978b867 c9f5158a
No related branches found
No related tags found
No related merge requests found
......@@ -3,19 +3,22 @@ package config
import (
"net"
"time"
"github.com/bio-routing/bio-rd/routingtable"
)
type Peer struct {
AdminEnabled bool
KeepAlive uint16
HoldTimer uint16
LocalAddress net.IP
PeerAddress net.IP
LocalAS uint32
PeerAS uint32
Passive bool
RouterID uint32
AddPathSend routingtable.ClientOptions
AddPathRecv bool
AdminEnabled bool
KeepAlive uint16
HoldTimer uint16
LocalAddress net.IP
PeerAddress net.IP
LocalAS uint32
PeerAS uint32
Passive bool
RouterID uint32
AddPathSend routingtable.ClientOptions
AddPathRecv bool
ReconnectInterval time.Duration
}
......@@ -6,27 +6,33 @@ import (
"github.com/bio-routing/bio-rd/config"
"github.com/bio-routing/bio-rd/protocols/bgp/packet"
"github.com/bio-routing/bio-rd/routingtable"
"time"
)
type Peer struct {
addr net.IP
asn uint32
fsm *FSM
rib routingtable.RouteTableClient
routerID uint32
addPathSend routingtable.ClientOptions
addPathRecv bool
optOpenParams []packet.OptParam
addr net.IP
asn uint32
fsm *FSM
rib routingtable.RouteTableClient
routerID uint32
addPathSend routingtable.ClientOptions
addPathRecv bool
optOpenParams []packet.OptParam
reconnectInterval time.Duration
}
// NewPeer creates a new peer with the given config. If an connection is established, the adjRIBIN of the peer is connected
// to the given rib. To actually connect the peer, call Start() on the returned peer.
func NewPeer(c config.Peer, rib routingtable.RouteTableClient) (*Peer, error) {
p := &Peer{
addr: c.PeerAddress,
asn: c.PeerAS,
rib: rib,
addPathSend: c.AddPathSend,
addPathRecv: c.AddPathRecv,
optOpenParams: make([]packet.OptParam, 0),
addr: c.PeerAddress,
asn: c.PeerAS,
rib: rib,
addPathSend: c.AddPathSend,
addPathRecv: c.AddPathRecv,
optOpenParams: make([]packet.OptParam, 0),
reconnectInterval: c.ReconnectInterval,
}
p.fsm = NewFSM(p, c, rib)
......@@ -61,19 +67,29 @@ func NewPeer(c config.Peer, rib routingtable.RouteTableClient) (*Peer, error) {
return p, nil
}
// GetAddr returns the IP address of the peer
func (p *Peer) GetAddr() net.IP {
return p.addr
}
// GetASN returns the configured AS number of the peer
func (p *Peer) GetASN() uint32 {
return p.asn
}
// Start the peers fsm. It starts from the Idle state and will get an ManualStart event. To trigger
// reconnects if the fsm falls back into the Idle state, every reconnectInterval a ManualStart event is send.
// The default value for reconnectInterval is 30 seconds.
func (p *Peer) Start() {
p.fsm.start()
if p.reconnectInterval == 0 {
p.reconnectInterval = 30 * time.Second
}
t := time.Tick(p.reconnectInterval)
go func() {
for {
<-t
p.fsm.activate()
}
}()
}()
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment