From 1f3d43687ecdd14b73b0a14e32af95f0d099b88c Mon Sep 17 00:00:00 2001
From: Daniel Czerwonk <czerwonk@users.noreply.github.com>
Date: Thu, 14 Feb 2019 17:44:57 +0100
Subject: [PATCH] sane default for ClientOptions (#195)

* sane default for ClientOptions, otherwise max paths for non add path is 0

* applied new default to BMP test

* added regression test
---
 protocols/bgp/server/bmp_router_test.go    |  2 +
 protocols/bgp/server/fsm_address_family.go |  3 +
 protocols/bgp/server/fsm_open_sent_test.go | 80 ++++++++++++++++++++++
 3 files changed, 85 insertions(+)

diff --git a/protocols/bgp/server/bmp_router_test.go b/protocols/bgp/server/bmp_router_test.go
index aa17d74e..3ced25bf 100644
--- a/protocols/bgp/server/bmp_router_test.go
+++ b/protocols/bgp/server/bmp_router_test.go
@@ -330,12 +330,14 @@ func TestProcessPeerUpNotification(t *testing.T) {
 								safi:         1,
 								adjRIBIn:     adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false),
 								importFilter: filter.NewAcceptAllFilter(),
+								addPathTX:    routingtable.ClientOptions{BestOnly: true},
 							},
 							ipv6Unicast: &fsmAddressFamily{
 								afi:          2,
 								safi:         1,
 								adjRIBIn:     adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false),
 								importFilter: filter.NewAcceptAllFilter(),
+								addPathTX:    routingtable.ClientOptions{BestOnly: true},
 							},
 						},
 					},
diff --git a/protocols/bgp/server/fsm_address_family.go b/protocols/bgp/server/fsm_address_family.go
index 04234c3d..f59d4103 100644
--- a/protocols/bgp/server/fsm_address_family.go
+++ b/protocols/bgp/server/fsm_address_family.go
@@ -45,6 +45,9 @@ func newFSMAddressFamily(afi uint16, safi uint8, family *peerAddressFamily, fsm
 		rib:          family.rib,
 		importFilter: family.importFilter,
 		exportFilter: family.exportFilter,
+		addPathTX: routingtable.ClientOptions{
+			BestOnly: true,
+		},
 	}
 }
 
diff --git a/protocols/bgp/server/fsm_open_sent_test.go b/protocols/bgp/server/fsm_open_sent_test.go
index 5b699bb1..31b33dc7 100644
--- a/protocols/bgp/server/fsm_open_sent_test.go
+++ b/protocols/bgp/server/fsm_open_sent_test.go
@@ -1,6 +1,7 @@
 package server
 
 import (
+	"github.com/bio-routing/bio-rd/routingtable"
 	"net"
 	"testing"
 
@@ -211,3 +212,82 @@ func TestProcessMultiProtocolCapability(t *testing.T) {
 		})
 	}
 }
+
+func TestProcessAddPathCapabilityTX(t *testing.T) {
+	tests := []struct {
+		name     string
+		peer     *peer
+		caps     []packet.AddPathCapability
+		expected routingtable.ClientOptions
+	}{
+		{
+			name: "Add-Path enabled and cap received",
+			peer: &peer{
+				ipv4: &peerAddressFamily{
+					addPathSend: routingtable.ClientOptions{MaxPaths: 3},
+				},
+			},
+			caps: []packet.AddPathCapability{
+				{
+					AFI:         packet.IPv4AFI,
+					SAFI:        packet.UnicastSAFI,
+					SendReceive: packet.AddPathReceive,
+				},
+			},
+			expected: routingtable.ClientOptions{MaxPaths: 3},
+		},
+		{
+			name: "Add-Path enabled and cap not received",
+			peer: &peer{
+				ipv4: &peerAddressFamily{
+					addPathSend: routingtable.ClientOptions{MaxPaths: 3},
+				},
+			},
+			caps:     []packet.AddPathCapability{},
+			expected: routingtable.ClientOptions{BestOnly: true},
+		},
+		{
+			name: "Add-Path disabled and cap received",
+			peer: &peer{
+				ipv4: &peerAddressFamily{
+					addPathSend: routingtable.ClientOptions{BestOnly: true},
+				},
+			},
+			caps: []packet.AddPathCapability{
+				{
+					AFI:         packet.IPv4AFI,
+					SAFI:        packet.UnicastSAFI,
+					SendReceive: packet.AddPathReceive,
+				},
+			},
+			expected: routingtable.ClientOptions{BestOnly: true},
+		},
+		{
+			name: "Add-Path disabled and cap not received",
+			peer: &peer{
+				ipv4: &peerAddressFamily{
+					addPathSend: routingtable.ClientOptions{BestOnly: true},
+				},
+			},
+			caps:     []packet.AddPathCapability{},
+			expected: routingtable.ClientOptions{BestOnly: true},
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			fsm := newFSM(test.peer)
+			fsm.con = &btesting.MockConn{}
+
+			s := &openSentState{
+				fsm: fsm,
+			}
+
+			for _, cap := range test.caps {
+				s.processAddPathCapability(cap)
+			}
+
+			assert.Equal(t, test.expected, fsm.ipv4Unicast.addPathTX)
+		})
+	}
+}
-- 
GitLab