summaryrefslogtreecommitdiffhomepage
path: root/server/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/server.go')
-rw-r--r--server/server.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/server/server.go b/server/server.go
index 2cb0d29e..c1ba5206 100644
--- a/server/server.go
+++ b/server/server.go
@@ -69,6 +69,20 @@ func (m *broadcastGrpcMsg) send() {
}
}
+type broadcastBGPMsg struct {
+ message *bgp.BGPMessage
+ peerAS uint32
+ localAS uint32
+ peerAddress net.IP
+ localAddress net.IP
+ fourBytesAs bool
+ ch chan *broadcastBGPMsg
+}
+
+func (m *broadcastBGPMsg) send() {
+ m.ch <- m
+}
+
type BgpServer struct {
bgpConfig config.Bgp
globalTypeCh chan config.Global
@@ -76,6 +90,7 @@ type BgpServer struct {
deletedPeerCh chan config.Neighbor
updatedPeerCh chan config.Neighbor
rpkiConfigCh chan config.RpkiServers
+ dumper *dumper
GrpcReqCh chan *GrpcRequest
listenPort int
@@ -138,6 +153,15 @@ func (server *BgpServer) Serve() {
g := <-server.globalTypeCh
server.bgpConfig.Global = g
+ if g.Mrt.FileName != "" {
+ d, err := newDumper(g.Mrt.FileName)
+ if err != nil {
+ log.Warn(err)
+ } else {
+ server.dumper = d
+ }
+ }
+
senderCh := make(chan *SenderMsg, 1<<16)
go func(ch chan *SenderMsg) {
for {
@@ -772,6 +796,19 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *fsmMsg, incoming chan *
server.roaClient.validate(pathList)
}
}
+ if m.Header.Type == bgp.BGP_MSG_UPDATE && server.dumper != nil {
+ _, y := peer.capMap[bgp.BGP_CAP_FOUR_OCTET_AS_NUMBER]
+ bm := &broadcastBGPMsg{
+ message: m,
+ peerAS: peer.peerInfo.AS,
+ localAS: peer.peerInfo.LocalAS,
+ peerAddress: peer.peerInfo.Address,
+ localAddress: peer.fsm.LocalAddr(),
+ fourBytesAs: y,
+ ch: server.dumper.sendCh(),
+ }
+ server.broadcastMsgs = append(server.broadcastMsgs, bm)
+ }
msgs = append(msgs, server.propagateUpdate(peer, pathList)...)
default:
log.WithFields(log.Fields{