summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packet/bmp/bmp.go2
-rw-r--r--server/bmp.go15
2 files changed, 15 insertions, 2 deletions
diff --git a/packet/bmp/bmp.go b/packet/bmp/bmp.go
index 7cf4f5e6..d931643c 100644
--- a/packet/bmp/bmp.go
+++ b/packet/bmp/bmp.go
@@ -43,12 +43,14 @@ const (
BMP_PEER_TYPE_GLOBAL uint8 = iota
BMP_PEER_TYPE_L3VPN
BMP_PEER_TYPE_LOCAL
+ BMP_PEER_TYPE_LOCAL_RIB
)
const (
BMP_PEER_FLAG_IPV6 = 1 << 7
BMP_PEER_FLAG_POST_POLICY = 1 << 6
BMP_PEER_FLAG_TWO_AS = 1 << 5
+ BMP_PEER_FLAG_FILTERED = 1 << 6
)
func (h *BMPHeader) DecodeFromBytes(data []byte) error {
diff --git a/server/bmp.go b/server/bmp.go
index 6f1a16ee..85016f47 100644
--- a/server/bmp.go
+++ b/server/bmp.go
@@ -113,10 +113,12 @@ func (b *bmpClient) loop() {
if func() bool {
ops := []WatchOption{WatchPeerState(true)}
- if b.typ != config.BMP_ROUTE_MONITORING_POLICY_TYPE_POST_POLICY {
+ if b.typ == config.BMP_ROUTE_MONITORING_POLICY_TYPE_PRE_POLICY || b.typ == config.BMP_ROUTE_MONITORING_POLICY_TYPE_BOTH {
ops = append(ops, WatchUpdate(true))
- } else if b.typ != config.BMP_ROUTE_MONITORING_POLICY_TYPE_PRE_POLICY {
+ } else if b.typ == config.BMP_ROUTE_MONITORING_POLICY_TYPE_POST_POLICY || b.typ == config.BMP_ROUTE_MONITORING_POLICY_TYPE_BOTH {
ops = append(ops, WatchPostUpdate(true))
+ } else if b.typ == config.BMP_ROUTE_MONITORING_POLICY_TYPE_LOCAL_RIB {
+ ops = append(ops, WatchBestPath(true))
}
w := b.s.Watch(ops...)
defer w.Stop()
@@ -162,6 +164,15 @@ func (b *bmpClient) loop() {
return false
}
}
+ case *WatchEventBestPath:
+ for _, p := range msg.PathList {
+ u := table.CreateUpdateMsgFromPaths([]*table.Path{p})[0]
+ if payload, err := u.Serialize(); err != nil {
+ return false
+ } else if err = write(bmpPeerRoute(bmp.BMP_PEER_TYPE_LOCAL_RIB, false, 0, p.GetSource(), p.GetTimestamp().Unix(), payload)); err != nil {
+ return false
+ }
+ }
case *WatchEventPeerState:
info := &table.PeerInfo{
Address: msg.PeerAddress,