summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorWataru Ishida <ishida.wataru@lab.ntt.co.jp>2017-08-07 08:18:14 -0400
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2017-08-07 22:31:26 +0900
commitfed596b613821b2fca0980614ff9e5bcd1598df2 (patch)
tree64a83eab69329438b76a947e96bf983dc8d7a155
parent539642d28791789bc52a4d23acc30fac35691fc4 (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.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)
+}