diff options
author | Wataru Ishida <ishida.wataru@lab.ntt.co.jp> | 2017-08-07 08:18:14 -0400 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2017-08-07 22:31:26 +0900 |
commit | fed596b613821b2fca0980614ff9e5bcd1598df2 (patch) | |
tree | 64a83eab69329438b76a947e96bf983dc8d7a155 | |
parent | 539642d28791789bc52a4d23acc30fac35691fc4 (diff) |
table: exclude mpreach and mpunreach attribute for normal v4 updates
It is possible that gobgp's v4 path structure contains mpreach or
mpunreach attribute. (we store entire path attributes in path structure as
they are received)
Since we use a NLRI field of BGP update message for v4 updates and don't
aggregate update/withdrawal messages for other address families, we need
to exclude these attribute before sending out v4 updates.
Signed-off-by: Wataru Ishida <ishida.wataru@lab.ntt.co.jp>
-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) +} |