@@ -101,11 +101,13 @@ func (c *Controller) addRoute(r netlink.Route) error {
101101 // already managed - nothing to do
102102 return nil
103103 }
104- link , err := util .GetNetLinkOps ().LinkByIndex (r .LinkIndex )
105- if err != nil {
106- return fmt .Errorf ("failed to apply route (%s) because unable to get link: %v" , r .String (), err )
104+ if r .LinkIndex != 0 {
105+ _ , err := util .GetNetLinkOps ().LinkByIndex (r .LinkIndex )
106+ if err != nil {
107+ return fmt .Errorf ("failed to apply route (%s) because unable to get link: %v" , r .String (), err )
108+ }
107109 }
108- if err := c .applyRoute (link , r .Gw , r .Dst , r .MTU , r .Src , r .Table ); err != nil {
110+ if err := c .applyRoute (r . LinkIndex , r .Gw , r .Dst , r .MTU , r .Src , r .Table , r . Priority , r . Type , r . Scope ); err != nil {
109111 return fmt .Errorf ("failed to apply route (%s): %v" , r .String (), err )
110112 }
111113 klog .Infof ("Route Manager: completed adding route: %s" , r .String ())
@@ -118,15 +120,17 @@ func (c *Controller) delRoute(r netlink.Route) error {
118120 c .Lock ()
119121 defer c .Unlock ()
120122 klog .Infof ("Route Manager: attempting to delete route: %s" , r .String ())
121- link , err := util .GetNetLinkOps ().LinkByIndex (r .LinkIndex )
122- if err != nil {
123- if util .GetNetLinkOps ().IsLinkNotFoundError (err ) {
124- delete (c .store , r .LinkIndex )
125- return nil
123+ if r .LinkIndex != 0 {
124+ _ , err := util .GetNetLinkOps ().LinkByIndex (r .LinkIndex )
125+ if err != nil {
126+ if util .GetNetLinkOps ().IsLinkNotFoundError (err ) {
127+ delete (c .store , r .LinkIndex )
128+ return nil
129+ }
130+ return fmt .Errorf ("failed to delete route (%s) because unable to get link: %v" , r .String (), err )
126131 }
127- return fmt .Errorf ("failed to delete route (%s) because unable to get link: %v" , r .String (), err )
128132 }
129- if err := c .netlinkDelRoute (link , r .Dst , r .Table ); err != nil {
133+ if err := c .netlinkDelRoute (r . LinkIndex , r .Dst , r .Table ); err != nil {
130134 return fmt .Errorf ("failed to delete route (%s): %v" , r .String (), err )
131135 }
132136 managedRoutes , ok := c .store [r .LinkIndex ]
@@ -171,27 +175,31 @@ func (c *Controller) processNetlinkEvent(ru netlink.RouteUpdate) error {
171175 }
172176 for _ , managedRoute := range managedRoutes {
173177 if RoutePartiallyEqual (managedRoute , ru .Route ) {
174- link , err := util .GetNetLinkOps ().LinkByIndex (managedRoute .LinkIndex )
175- if err != nil {
176- klog .Errorf ("Route Manager: failed to restore route because unable to get link by index %d: %v" , managedRoute .LinkIndex , err )
177- continue
178+ if managedRoute .LinkIndex != 0 {
179+ _ , err := util .GetNetLinkOps ().LinkByIndex (managedRoute .LinkIndex )
180+ if err != nil {
181+ klog .Errorf ("Route Manager: failed to restore route because unable to get link by index %d: %v" , managedRoute .LinkIndex , err )
182+ continue
183+ }
178184 }
179- if err = c .applyRoute (link , managedRoute .Gw , managedRoute .Dst , managedRoute .MTU , managedRoute .Src , managedRoute .Table ); err != nil {
185+ if err := c .applyRoute (managedRoute .LinkIndex , managedRoute .Gw , managedRoute .Dst , managedRoute .MTU , managedRoute .Src , managedRoute .Table ,
186+ managedRoute .Priority , managedRoute .Type , managedRoute .Scope ); err != nil {
180187 klog .Errorf ("Route Manager: failed to apply route (%s): %v" , managedRoute .String (), err )
181188 }
182189 }
183190 }
184191 return nil
185192}
186193
187- func (c * Controller ) applyRoute (link netlink.Link , gwIP net.IP , subnet * net.IPNet , mtu int , src net.IP , table int ) error {
188- filterRoute , filterMask := filterRouteByDstAndTable (link .Attrs ().Index , subnet , table )
194+ func (c * Controller ) applyRoute (linkIndex int , gwIP net.IP , subnet * net.IPNet , mtu int , src net.IP ,
195+ table , priority , rtype int , scope netlink.Scope ) error {
196+ filterRoute , filterMask := filterRouteByDstAndTable (linkIndex , subnet , table )
189197 existingRoutes , err := util .GetNetLinkOps ().RouteListFiltered (getNetlinkIPFamily (subnet ), filterRoute , filterMask )
190198 if err != nil {
191199 return fmt .Errorf ("failed to list filtered routes: %v" , err )
192200 }
193201 if len (existingRoutes ) == 0 {
194- return c .netlinkAddRoute (link , gwIP , subnet , mtu , src , table )
202+ return c .netlinkAddRoute (linkIndex , gwIP , subnet , mtu , src , table , priority , rtype , scope )
195203 }
196204 netlinkRoute := & existingRoutes [0 ]
197205 if netlinkRoute .MTU != mtu || ! src .Equal (netlinkRoute .Src ) || ! gwIP .Equal (netlinkRoute .Gw ) {
@@ -207,10 +215,11 @@ func (c *Controller) applyRoute(link netlink.Link, gwIP net.IP, subnet *net.IPNe
207215 return nil
208216}
209217
210- func (c * Controller ) netlinkAddRoute (link netlink.Link , gwIP net.IP , subnet * net.IPNet , mtu int , srcIP net.IP , table int ) error {
218+ func (c * Controller ) netlinkAddRoute (linkIndex int , gwIP net.IP , subnet * net.IPNet ,
219+ mtu int , srcIP net.IP , table , priority , rtype int , scope netlink.Scope ) error {
211220 newNlRoute := & netlink.Route {
212221 Dst : subnet ,
213- LinkIndex : link . Attrs (). Index ,
222+ LinkIndex : linkIndex ,
214223 Scope : netlink .SCOPE_UNIVERSE ,
215224 Table : table ,
216225 }
@@ -223,21 +232,31 @@ func (c *Controller) netlinkAddRoute(link netlink.Link, gwIP net.IP, subnet *net
223232 if mtu != 0 {
224233 newNlRoute .MTU = mtu
225234 }
235+ if priority != 0 {
236+ newNlRoute .Priority = priority
237+ }
238+ if rtype != 0 {
239+ newNlRoute .Type = rtype
240+ }
241+ if scope != netlink .Scope (0 ) {
242+ newNlRoute .Scope = scope
243+ }
226244 err := util .GetNetLinkOps ().RouteAdd (newNlRoute )
227245 if err != nil {
228- return fmt .Errorf ("failed to add route (gw: %v, subnet %v, mtu %d, src IP %v): %v" , gwIP , subnet , mtu , srcIP , err )
246+ return fmt .Errorf ("failed to add route (linkIndex: %d gw: %v, subnet %v, mtu %d, src IP %v): %v" ,
247+ newNlRoute .LinkIndex , gwIP , subnet , mtu , srcIP , err )
229248 }
230249 return nil
231250}
232251
233- func (c * Controller ) netlinkDelRoute (link netlink. Link , subnet * net.IPNet , table int ) error {
252+ func (c * Controller ) netlinkDelRoute (linkIndex int , subnet * net.IPNet , table int ) error {
234253 if subnet == nil {
235254 return fmt .Errorf ("cannot delete route with no valid subnet" )
236255 }
237- filter , mask := filterRouteByDstAndTable (link . Attrs (). Index , subnet , table )
256+ filter , mask := filterRouteByDstAndTable (linkIndex , subnet , table )
238257 existingRoutes , err := util .GetNetLinkOps ().RouteListFiltered (netlink .FAMILY_ALL , filter , mask )
239258 if err != nil {
240- return fmt .Errorf ("failed to get routes for link %s : %v" , link . Attrs (). Name , err )
259+ return fmt .Errorf ("failed to get routes for link %d : %v" , linkIndex , err )
241260 }
242261 for _ , existingRoute := range existingRoutes {
243262 if err = util .GetNetLinkOps ().RouteDel (& existingRoute ); err != nil {
@@ -286,16 +305,19 @@ func (c *Controller) sync() {
286305 }
287306 }
288307 if ! found {
289- link , err := util .GetNetLinkOps ().LinkByIndex (managedRoute .LinkIndex )
290- if err != nil {
291- if util .GetNetLinkOps ().IsLinkNotFoundError (err ) {
292- deletedLinkIndexes = append (deletedLinkIndexes , linkIndex )
293- } else {
294- klog .Errorf ("Route Manager: failed to apply route (%s) because unable to retrieve associated link: %v" , managedRoute .String (), err )
308+ if managedRoute .LinkIndex != 0 {
309+ _ , err := util .GetNetLinkOps ().LinkByIndex (managedRoute .LinkIndex )
310+ if err != nil {
311+ if util .GetNetLinkOps ().IsLinkNotFoundError (err ) {
312+ deletedLinkIndexes = append (deletedLinkIndexes , linkIndex )
313+ } else {
314+ klog .Errorf ("Route Manager: failed to apply route (%s) because unable to retrieve associated link: %v" , managedRoute .String (), err )
315+ }
316+ continue
295317 }
296- continue
297318 }
298- if err := c .applyRoute (link , managedRoute .Gw , managedRoute .Dst , managedRoute .MTU , managedRoute .Src , managedRoute .Table ); err != nil {
319+ if err := c .applyRoute (managedRoute .LinkIndex , managedRoute .Gw , managedRoute .Dst , managedRoute .MTU , managedRoute .Src , managedRoute .Table ,
320+ managedRoute .Priority , managedRoute .Type , managedRoute .Scope ); err != nil {
299321 klog .Errorf ("Route Manager: failed to apply route (%s): %v" , managedRoute .String (), err )
300322 }
301323 }
@@ -353,5 +375,8 @@ func RoutePartiallyEqual(r, x netlink.Route) bool {
353375 r .Gw .Equal (x .Gw ) &&
354376 r .Table == x .Table &&
355377 r .Flags == x .Flags &&
356- r .MTU == x .MTU
378+ r .MTU == x .MTU &&
379+ r .Type == x .Type &&
380+ r .Priority == x .Priority &&
381+ r .Scope == x .Scope
357382}
0 commit comments