Skip to content

Commit

Permalink
server/server: Add field to WatchEventPeerState for PeerDownEvent
Browse files Browse the repository at this point in the history
To include the PeerDownReason and data in BMP messages,
this commit adds some field to WatchEventPeerState.

Signed-off-by: Satoshi Fujimoto <satoshi.fujimoto7@gmail.com>
  • Loading branch information
fujimoto-s authored and fujita committed May 24, 2018
1 parent 76ef116 commit a980a02
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 17 deletions.
21 changes: 8 additions & 13 deletions server/bmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,17 +205,12 @@ func (b *bmpClient) loop() {
}
}
case *WatchEventPeerState:
info := &table.PeerInfo{
Address: msg.PeerAddress,
AS: msg.PeerAS,
ID: msg.PeerID,
}
if msg.State == bgp.BGP_FSM_ESTABLISHED {
if err := write(bmpPeerUp(msg.LocalAddress.String(), msg.LocalPort, msg.PeerPort, msg.SentOpen, msg.RecvOpen, bmp.BMP_PEER_TYPE_GLOBAL, false, 0, info, msg.Timestamp.Unix())); err != nil {
if err := write(bmpPeerUp(msg, bmp.BMP_PEER_TYPE_GLOBAL, false, 0)); err != nil {
return false
}
} else {
if err := write(bmpPeerDown(bmp.BMP_PEER_DOWN_REASON_UNKNOWN, bmp.BMP_PEER_TYPE_GLOBAL, false, 0, info, msg.Timestamp.Unix())); err != nil {
if err := write(bmpPeerDown(msg, bmp.BMP_PEER_TYPE_GLOBAL, false, 0)); err != nil {
return false
}
}
Expand Down Expand Up @@ -264,22 +259,22 @@ type bmpClient struct {
ribout ribout
}

func bmpPeerUp(laddr string, lport, rport uint16, sent, recv *bgp.BGPMessage, t uint8, policy bool, pd uint64, peeri *table.PeerInfo, timestamp int64) *bmp.BMPMessage {
func bmpPeerUp(ev *WatchEventPeerState, t uint8, policy bool, pd uint64) *bmp.BMPMessage {
var flags uint8 = 0
if policy {
flags |= bmp.BMP_PEER_FLAG_POST_POLICY
}
ph := bmp.NewBMPPeerHeader(t, flags, pd, peeri.Address.String(), peeri.AS, peeri.ID.String(), float64(timestamp))
return bmp.NewBMPPeerUpNotification(*ph, laddr, lport, rport, sent, recv)
ph := bmp.NewBMPPeerHeader(t, flags, pd, ev.PeerAddress.String(), ev.PeerAS, ev.PeerID.String(), float64(ev.Timestamp.Unix()))
return bmp.NewBMPPeerUpNotification(*ph, ev.LocalAddress.String(), ev.LocalPort, ev.PeerPort, ev.SentOpen, ev.RecvOpen)
}

func bmpPeerDown(reason uint8, t uint8, policy bool, pd uint64, peeri *table.PeerInfo, timestamp int64) *bmp.BMPMessage {
func bmpPeerDown(ev *WatchEventPeerState, t uint8, policy bool, pd uint64) *bmp.BMPMessage {
var flags uint8 = 0
if policy {
flags |= bmp.BMP_PEER_FLAG_POST_POLICY
}
ph := bmp.NewBMPPeerHeader(t, flags, pd, peeri.Address.String(), peeri.AS, peeri.ID.String(), float64(timestamp))
return bmp.NewBMPPeerDownNotification(*ph, reason, nil, []byte{})
ph := bmp.NewBMPPeerHeader(t, flags, pd, ev.PeerAddress.String(), ev.PeerAS, ev.PeerID.String(), float64(ev.Timestamp.Unix()))
return bmp.NewBMPPeerDownNotification(*ph, uint8(ev.StateReason.PeerDownReason), ev.StateReason.BGPNotification, ev.StateReason.Data)
}

func bmpPeerRoute(t uint8, policy bool, pd uint64, fourBytesAs bool, peeri *table.PeerInfo, timestamp int64, payload []byte) *bmp.BMPMessage {
Expand Down
11 changes: 11 additions & 0 deletions server/fsm.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,17 @@ import (
"github.com/osrg/gobgp/table"
)

type PeerDownReason int

const (
PEER_DOWN_REASON_UNKNOWN PeerDownReason = iota
PEER_DOWN_BY_LOCAL
PEER_DOWN_BY_LOCAL_WITHOUT_NOTIFICATION
PEER_DOWN_BY_REMOTE
PEER_DOWN_BY_REMOTE_WITHOUT_NOTIFICATION
PEER_DOWN_BY_BMP_CONFIGURATION
)

type FsmStateReason string

const (
Expand Down
14 changes: 10 additions & 4 deletions server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -708,12 +708,12 @@ func (server *BgpServer) notifyPostPolicyUpdateWatcher(peer *Peer, pathList []*t
server.notifyWatcher(WATCH_EVENT_TYPE_POST_UPDATE, ev)
}

func createWatchEventPeerState(peer *Peer) *WatchEventPeerState {
func newWatchEventPeerState(peer *Peer, m *FsmMsg) *WatchEventPeerState {
_, rport := peer.fsm.RemoteHostPort()
laddr, lport := peer.fsm.LocalHostPort()
sentOpen := buildopen(peer.fsm.gConf, peer.fsm.pConf)
recvOpen := peer.fsm.recvOpen
return &WatchEventPeerState{
e := &WatchEventPeerState{
PeerAS: peer.fsm.peerInfo.AS,
LocalAS: peer.fsm.peerInfo.LocalAS,
PeerAddress: peer.fsm.peerInfo.Address,
Expand All @@ -728,12 +728,17 @@ func createWatchEventPeerState(peer *Peer) *WatchEventPeerState {
Timestamp: time.Now(),
PeerInterface: peer.fsm.pConf.Config.NeighborInterface,
}

if m != nil {
e.StateReason = m.StateReason
}
return e
}

func (server *BgpServer) broadcastPeerState(peer *Peer, oldState bgp.FSMState) {
newState := peer.fsm.state
if oldState == bgp.BGP_FSM_ESTABLISHED || newState == bgp.BGP_FSM_ESTABLISHED {
server.notifyWatcher(WATCH_EVENT_TYPE_PEER_STATE, createWatchEventPeerState(peer))
server.notifyWatcher(WATCH_EVENT_TYPE_PEER_STATE, newWatchEventPeerState(peer))
}
}

Expand Down Expand Up @@ -2651,6 +2656,7 @@ type WatchEventPeerState struct {
SentOpen *bgp.BGPMessage
RecvOpen *bgp.BGPMessage
State bgp.FSMState
StateReason *FsmStateReason
AdminState AdminState
Timestamp time.Time
PeerInterface string
Expand Down Expand Up @@ -2895,7 +2901,7 @@ func (s *BgpServer) Watch(opts ...WatchOption) (w *Watcher) {
if peer.fsm.state != bgp.BGP_FSM_ESTABLISHED {
continue
}
w.notify(createWatchEventPeerState(peer))
w.notify(newWatchEventPeerState(peer))
}
}
if w.opts.initBest && s.active() == nil {
Expand Down

0 comments on commit a980a02

Please sign in to comment.