diff options
-rw-r--r-- | table/message.go | 12 | ||||
-rw-r--r-- | table/message_test.go | 27 |
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) +} |