summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--table/message.go12
-rw-r--r--table/message_test.go27
2 files changed, 37 insertions, 2 deletions
diff --git a/table/message.go b/table/message.go
index a2b7f926..cb77013b 100644
--- a/table/message.go
+++ b/table/message.go
@@ -278,8 +278,16 @@ func createUpdateMsgFromPath(path *Path, msg *bgp.BGPMessage) *bgp.BGPMessage {
u := msg.Body.(*bgp.BGPUpdate)
u.NLRI = append(u.NLRI, nlri)
} else {
- pathAttrs := path.GetPathAttrs()
- return bgp.NewBGPUpdateMessage(nil, pathAttrs, []*bgp.IPAddrPrefix{nlri})
+ attrs := make([]bgp.PathAttributeInterface, 0, 8)
+ for _, p := range path.GetPathAttrs() {
+ switch p.GetType() {
+ case bgp.BGP_ATTR_TYPE_MP_REACH_NLRI:
+ case bgp.BGP_ATTR_TYPE_MP_UNREACH_NLRI:
+ default:
+ attrs = append(attrs, p)
+ }
+ }
+ return bgp.NewBGPUpdateMessage(nil, attrs, []*bgp.IPAddrPrefix{nlri})
}
}
} else {
diff --git a/table/message_test.go b/table/message_test.go
index 229ff5de..739abadd 100644
--- a/table/message_test.go
+++ b/table/message_test.go
@@ -458,3 +458,30 @@ func TestMixedMPReachMPUnreach(t *testing.T) {
attrs = msgs[1].Body.(*bgp.BGPUpdate).PathAttributes
assert.Equal(t, len(attrs), 1)
}
+
+func TestMixedNLRIAndMPUnreach(t *testing.T) {
+ aspath1 := []bgp.AsPathParamInterface{
+ bgp.NewAs4PathParam(2, []uint32{100}),
+ }
+ nlri1 := []*bgp.IPAddrPrefix{bgp.NewIPAddrPrefix(24, "10.0.0.0")}
+ nlri2 := []bgp.AddrPrefixInterface{bgp.NewIPv6AddrPrefix(32, "1111::")}
+
+ p := []bgp.PathAttributeInterface{
+ bgp.NewPathAttributeOrigin(0),
+ bgp.NewPathAttributeAsPath(aspath1),
+ bgp.NewPathAttributeNextHop("1.1.1.1"),
+ bgp.NewPathAttributeMpUnreachNLRI(nlri2),
+ }
+ msg := bgp.NewBGPUpdateMessage(nil, p, nlri1)
+ pList := ProcessMessage(msg, peerR1(), time.Now())
+
+ assert.Equal(t, len(pList), 2)
+ assert.Equal(t, pList[0].IsWithdraw, false)
+ assert.Equal(t, pList[1].IsWithdraw, true)
+ msgs := CreateUpdateMsgFromPaths(pList)
+ assert.Equal(t, len(msgs), 2)
+ attrs := msgs[0].Body.(*bgp.BGPUpdate).PathAttributes
+ assert.Equal(t, len(attrs), 1)
+ attrs = msgs[1].Body.(*bgp.BGPUpdate).PathAttributes
+ assert.Equal(t, len(attrs), 3)
+}