From a4fab9829b7dd63ef628fdc632ca98b5ce3d9f39 Mon Sep 17 00:00:00 2001
From: cedi <cedi@users.noreply.github.com>
Date: Tue, 13 Nov 2018 00:35:47 +0100
Subject: [PATCH] Write multiple next hops to netlink in case there are
 multiple ones

---
 protocols/netlink/netlink_writer.go | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/protocols/netlink/netlink_writer.go b/protocols/netlink/netlink_writer.go
index a66b0509..f0fb324b 100644
--- a/protocols/netlink/netlink_writer.go
+++ b/protocols/netlink/netlink_writer.go
@@ -131,14 +131,17 @@ func (nw *NetlinkWriter) RemovePath(pfx bnet.Prefix, path *route.Path) bool {
 
 // Add pfx/path to kernel
 func (nw *NetlinkWriter) addKernel(pfx bnet.Prefix) error {
-	route := nw.createRoute(pfx, nw.pathTable[pfx])
+	route, err := nw.createRoute(pfx, nw.pathTable[pfx])
+	if err != nil {
+		return fmt.Errorf("Could not create Route: %v", err.Error())
+	}
 
 	log.WithFields(log.Fields{
 		"Prefix": pfx.String(),
 		"Table":  route.Table,
 	}).Debug("AddPath to netlink")
 
-	err := netlink.RouteAdd(route)
+	err = netlink.RouteAdd(route)
 	if err != nil {
 		log.Errorf("Error while adding route: %v", err)
 		return fmt.Errorf("Error while adding route: %v", err)
@@ -149,13 +152,16 @@ func (nw *NetlinkWriter) addKernel(pfx bnet.Prefix) error {
 
 // remove pfx/path from kernel
 func (nw *NetlinkWriter) removeKernel(pfx bnet.Prefix, paths []*route.Path) error {
-	route := nw.createRoute(pfx, nw.pathTable[pfx])
+	route, err := nw.createRoute(pfx, nw.pathTable[pfx])
+	if err != nil {
+		return fmt.Errorf("Could not create Route: %v", err.Error())
+	}
 
 	log.WithFields(log.Fields{
 		"Prefix": pfx.String(),
 	}).Debug("Remove from netlink")
 
-	err := netlink.RouteDel(route)
+	err = netlink.RouteDel(route)
 	if err != nil {
 		return fmt.Errorf("Error while removing route: %v", err)
 	}
@@ -164,7 +170,7 @@ func (nw *NetlinkWriter) removeKernel(pfx bnet.Prefix, paths []*route.Path) erro
 }
 
 // create a route from a prefix and a path
-func (nw *NetlinkWriter) createRoute(pfx bnet.Prefix, paths []*route.Path) *netlink.Route {
+func (nw *NetlinkWriter) createRoute(pfx bnet.Prefix, paths []*route.Path) (*netlink.Route, error) {
 	route := &netlink.Route{
 		Dst:      pfx.GetIPNet(),
 		Table:    int(nw.options.RoutingTable), // config dependent
@@ -180,7 +186,13 @@ func (nw *NetlinkWriter) createRoute(pfx bnet.Prefix, paths []*route.Path) *netl
 		multiPath = append(multiPath, nextHop)
 	}
 
-	route.MultiPath = multiPath
+	if len(multiPath) == 1 {
+		route.Gw = multiPath[0].Gw
+	} else if len(multiPath) > 1 {
+		route.MultiPath = multiPath
+	} else {
+		return nil, fmt.Errorf("No destination address specified. At least one NextHop has to be specified in path")
+	}
 
-	return route
+	return route, nil
 }
-- 
GitLab