From d6015a645ff2efd1062a7a9fec82bfcc9b773839 Mon Sep 17 00:00:00 2001
From: Daniel Czerwonk <daniel@dan-nrw.de>
Date: Tue, 17 Jul 2018 08:32:42 +0200
Subject: [PATCH] caps from family config

---
 protocols/bgp/server/peer.go | 43 ++++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 19 deletions(-)

diff --git a/protocols/bgp/server/peer.go b/protocols/bgp/server/peer.go
index 1a965b31..de8d3d65 100644
--- a/protocols/bgp/server/peer.go
+++ b/protocols/bgp/server/peer.go
@@ -195,39 +195,44 @@ func multiProtocolCapability(afi uint16) packet.Capability {
 func addPathCapabilities(c config.Peer) []packet.Capability {
 	caps := make([]packet.Capability, 0)
 
+	enabled, cap := addPathCapabilityForFamily(c.IPv4, packet.IPv4AFI, packet.UnicastSAFI)
+	if enabled {
+		caps = append(caps, cap)
+	}
+
+	enabled, cap = addPathCapabilityForFamily(c.IPv6, packet.IPv6AFI, packet.UnicastSAFI)
+	if enabled {
+		caps = append(caps, cap)
+	}
+
+	return caps
+}
+
+func addPathCapabilityForFamily(f *config.AddressFamilyConfig, afi uint16, safi uint8) (enabled bool, cap packet.Capability) {
+	if f == nil {
+		return false, packet.Capability{}
+	}
+
 	addPath := uint8(0)
-	if c.AddPathRecv {
+	if f.AddPathRecv {
 		addPath += packet.AddPathReceive
 	}
-	if !c.AddPathSend.BestOnly {
+	if !f.AddPathSend.BestOnly {
 		addPath += packet.AddPathSend
 	}
 
 	if addPath == 0 {
-		return caps
+		return false, packet.Capability{}
 	}
 
-	caps = append(caps, packet.Capability{
+	return true, packet.Capability{
 		Code: packet.AddPathCapabilityCode,
 		Value: packet.AddPathCapability{
-			AFI:         packet.IPv4AFI,
-			SAFI:        packet.UnicastSAFI,
+			AFI:         afi,
+			SAFI:        safi,
 			SendReceive: addPath,
 		},
-	})
-
-	if c.IPv6 != nil {
-		caps = append(caps, packet.Capability{
-			Code: packet.AddPathCapabilityCode,
-			Value: packet.AddPathCapability{
-				AFI:         packet.IPv6AFI,
-				SAFI:        packet.UnicastSAFI,
-				SendReceive: addPath,
-			},
-		})
 	}
-
-	return caps
 }
 
 func filterOrDefault(f *filter.Filter) *filter.Filter {
-- 
GitLab