diff options
-rw-r--r-- | packet/bmp.go | 6 | ||||
-rw-r--r-- | server/bmp.go | 7 | ||||
-rw-r--r-- | server/server.go | 5 |
3 files changed, 13 insertions, 5 deletions
diff --git a/packet/bmp.go b/packet/bmp.go index 587a9fd7..eceb1272 100644 --- a/packet/bmp.go +++ b/packet/bmp.go @@ -136,7 +136,8 @@ func (h *BMPPeerHeader) Serialize() ([]byte, error) { } type BMPRouteMonitoring struct { - BGPUpdate *BGPMessage + BGPUpdate *BGPMessage + BGPUpdatePayload []byte } func NewBMPRouteMonitoring(p BMPPeerHeader, update *BGPMessage) *BMPMessage { @@ -162,6 +163,9 @@ func (body *BMPRouteMonitoring) ParseBody(msg *BMPMessage, data []byte) error { } func (body *BMPRouteMonitoring) Serialize() ([]byte, error) { + if body.BGPUpdatePayload != nil { + return body.BGPUpdatePayload, nil + } return body.BGPUpdate.Serialize() } diff --git a/server/bmp.go b/server/bmp.go index 2a00b73d..5384c3f6 100644 --- a/server/bmp.go +++ b/server/bmp.go @@ -126,7 +126,10 @@ func bmpPeerDown(reason uint8, t int, policy bool, pd uint64, peeri *table.PeerI return bgp.NewBMPPeerDownNotification(*ph, reason, nil, []byte{}) } -func bmpPeerRoute(t int, policy bool, pd uint64, peeri *table.PeerInfo, timestamp int64, u *bgp.BGPMessage) *bgp.BMPMessage { +func bmpPeerRoute(t int, policy bool, pd uint64, peeri *table.PeerInfo, timestamp int64, payload []byte) *bgp.BMPMessage { ph := bgp.NewBMPPeerHeader(uint8(t), policy, pd, peeri.Address.String(), peeri.AS, peeri.LocalID.String(), float64(timestamp)) - return bgp.NewBMPRouteMonitoring(*ph, u) + m := bgp.NewBMPRouteMonitoring(*ph, nil) + body := m.Body.(*bgp.BMPRouteMonitoring) + body.BGPUpdatePayload = payload + return m } diff --git a/server/server.go b/server/server.go index ecdbc8c2..3e7d4072 100644 --- a/server/server.go +++ b/server/server.go @@ -333,7 +333,8 @@ func (server *BgpServer) Serve() { for _, p := range targetPeer.adjRib.GetInPathList(targetPeer.configuredRFlist()) { // avoid to merge for timestamp u := table.CreateUpdateMsgFromPaths([]*table.Path{p}) - bmpMsgList = append(bmpMsgList, bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, targetPeer.fsm.peerInfo, p.GetTimestamp().Unix(), u[0])) + buf, _ := u[0].Serialize() + bmpMsgList = append(bmpMsgList, bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, targetPeer.fsm.peerInfo, p.GetTimestamp().Unix(), buf)) } } @@ -815,7 +816,7 @@ func (server *BgpServer) handleFSMMessage(peer *Peer, e *FsmMsg, incoming chan * if ch := server.bmpClient.send(); ch != nil { bm := &broadcastBMPMsg{ ch: ch, - msgList: []*bgp.BMPMessage{bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.fsm.peerInfo, e.timestamp.Unix(), m)}, + msgList: []*bgp.BMPMessage{bmpPeerRoute(bgp.BMP_PEER_TYPE_GLOBAL, false, 0, peer.fsm.peerInfo, e.timestamp.Unix(), e.payload)}, } server.broadcastMsgs = append(server.broadcastMsgs, bm) } |