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
Branches
Tags
No related merge requests found
......@@ -3,6 +3,8 @@ package config
import (
"net"
"time"
"github.com/bio-routing/bio-rd/routingtable"
)
......@@ -18,4 +20,5 @@ type Peer struct {
RouterID uint32
AddPathSend routingtable.ClientOptions
AddPathRecv bool
ReconnectInterval time.Duration
}
......@@ -6,6 +6,8 @@ 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 {
......@@ -17,8 +19,11 @@ type Peer struct {
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,
......@@ -27,6 +32,7 @@ func NewPeer(c config.Peer, rib routingtable.RouteTableClient) (*Peer, error) {
addPathSend: c.AddPathSend,
addPathRecv: c.AddPathRecv,
optOpenParams: make([]packet.OptParam, 0),
reconnectInterval: c.ReconnectInterval,
}
p.fsm = NewFSM(p, c, rib)
......@@ -61,18 +67,28 @@ 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 to comment