diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2017-08-08 13:39:38 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-08-08 13:39:38 -0400 | 
| commit | 76a86854181c27819e5cf71b12ae1fa5ccd9e02a (patch) | |
| tree | 691b03e51b9c99874d4ef26f9ca9b29cbee1b199 | |
| parent | f66e92bc4856352dc4c1c81fa35b1dd570cd83e5 (diff) | |
| parent | 06e0a0cb3c630c2b221fecd2f081348b36943a6e (diff) | |
Merge pull request #920 from opensourcerouting/static-routes-ifindex-update-3.0reindent-3.0-before
[3.0] fixup static routes' ifindexes when interfaces (dis)appear
| -rw-r--r-- | zebra/interface.c | 14 | ||||
| -rw-r--r-- | zebra/zebra_static.c | 118 | ||||
| -rw-r--r-- | zebra/zebra_static.h | 15 | ||||
| -rw-r--r-- | zebra/zebra_vrf.c | 44 | ||||
| -rw-r--r-- | zebra/zebra_vrf.h | 1 | ||||
| -rw-r--r-- | zebra/zebra_vty.c | 64 | 
6 files changed, 128 insertions, 128 deletions
diff --git a/zebra/interface.c b/zebra/interface.c index 317cc722b4..c629dfb3f3 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -48,6 +48,7 @@  #include "zebra/zebra_ptm.h"  #include "zebra/rt_netlink.h"  #include "zebra/interface.h" +#include "zebra/zebra_static.h"  #define ZEBRA_PTM_SUPPORT @@ -118,8 +119,6 @@ if_zebra_new_hook (struct interface *ifp)    zebra_if->ipv4_subnets = route_table_init_with_delegate (&zebra_if_table_delegate);    ifp->info = zebra_if; - -  zebra_vrf_static_route_interface_fixup (ifp);    return 0;  } @@ -520,6 +519,7 @@ if_add_update (struct interface *ifp)        if (IS_ZEBRA_DEBUG_KERNEL)  	zlog_debug ("interface %s vrf %u index %d becomes active.",  		    ifp->name, ifp->vrf_id, ifp->ifindex); +      static_ifindex_update(ifp, true);      }    else      { @@ -695,6 +695,8 @@ if_delete_update (struct interface *ifp)      zlog_debug ("interface %s vrf %u index %d is now inactive.",                  ifp->name, ifp->vrf_id, ifp->ifindex); +  static_ifindex_update(ifp, false); +    /* Delete connected routes from the kernel. */    if_delete_connected (ifp); @@ -723,6 +725,8 @@ if_handle_vrf_change (struct interface *ifp, vrf_id_t vrf_id)    old_vrf_id = ifp->vrf_id; +  static_ifindex_update(ifp, false); +    /* Uninstall connected routes. */    if_uninstall_connected (ifp); @@ -746,6 +750,8 @@ if_handle_vrf_change (struct interface *ifp, vrf_id_t vrf_id)    /* Install connected routes (in new VRF). */    if_install_connected (ifp); +  static_ifindex_update(ifp, true); +    /* Due to connected route change, schedule RIB processing for both old     * and new VRF.     */ @@ -754,8 +760,6 @@ if_handle_vrf_change (struct interface *ifp, vrf_id_t vrf_id)                  ifp->vrf_id, ifp->name);    rib_update (old_vrf_id, RIB_UPDATE_IF_CHANGE);    rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE); - -  zebra_vrf_static_route_interface_fixup (ifp);  }  static void @@ -862,8 +866,6 @@ if_up (struct interface *ifp)      zlog_debug ("%u: IF %s up, scheduling RIB processing",                  ifp->vrf_id, ifp->name);    rib_update (ifp->vrf_id, RIB_UPDATE_IF_CHANGE); - -  zebra_vrf_static_route_interface_fixup (ifp);  }  /* Interface goes down.  We have to manage different behavior of based diff --git a/zebra/zebra_static.c b/zebra/zebra_static.c index 4628d11091..169f1827e0 100644 --- a/zebra/zebra_static.c +++ b/zebra/zebra_static.c @@ -25,6 +25,7 @@  #include <lib/nexthop.h>  #include <lib/memory.h>  #include <lib/srcdest_table.h> +#include <lib/if.h>  #include "vty.h"  #include "zebra/debug.h" @@ -83,7 +84,7 @@ static_install_route (afi_t afi, safi_t safi, struct prefix *p,  	  nh_p.u.prefix4 = si->addr.ipv4;  	  zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);  	  break; -	case STATIC_IFINDEX: +	case STATIC_IFNAME:  	  nexthop = rib_nexthop_ifindex_add (rib, si->ifindex);  	  break;  	case STATIC_BLACKHOLE: @@ -96,7 +97,7 @@ static_install_route (afi_t afi, safi_t safi, struct prefix *p,  	  nh_p.u.prefix6 = si->addr.ipv6;  	  zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);  	  break; -	case STATIC_IPV6_GATEWAY_IFINDEX: +	case STATIC_IPV6_GATEWAY_IFNAME:  	  nexthop = rib_nexthop_ipv6_ifindex_add (rib, &si->addr.ipv6,  						  si->ifindex);  	  break; @@ -147,7 +148,7 @@ static_install_route (afi_t afi, safi_t safi, struct prefix *p,  	  nh_p.u.prefix4 = si->addr.ipv4;  	  zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);  	  break; -	case STATIC_IFINDEX: +	case STATIC_IFNAME:  	  nexthop = rib_nexthop_ifindex_add (rib, si->ifindex);  	  break;  	case STATIC_BLACKHOLE: @@ -160,7 +161,7 @@ static_install_route (afi_t afi, safi_t safi, struct prefix *p,  	  nh_p.u.prefix6 = si->addr.ipv6;  	  zebra_register_rnh_static_nh(si->vrf_id, &nh_p, rn);  	  break; -	case STATIC_IPV6_GATEWAY_IFINDEX: +	case STATIC_IPV6_GATEWAY_IFNAME:  	  nexthop = rib_nexthop_ipv6_ifindex_add (rib, &si->addr.ipv6,  						  si->ifindex);  	  break; @@ -197,6 +198,9 @@ static_install_route (afi_t afi, safi_t safi, struct prefix *p,      }  } +/* this works correctly with IFNAME<>IFINDEX because a static route on a + * non-active interface will have IFINDEX_INTERNAL and thus compare false + */  static int  static_nexthop_same (struct nexthop *nexthop, struct static_route *si)  { @@ -209,7 +213,7 @@ static_nexthop_same (struct nexthop *nexthop, struct static_route *si)        && IPV4_ADDR_SAME (&nexthop->gate.ipv4, &si->addr.ipv4))      return 1;    else if (nexthop->type == NEXTHOP_TYPE_IFINDEX -      && si->type == STATIC_IFINDEX +      && si->type == STATIC_IFNAME        && nexthop->ifindex == si->ifindex)      return 1;    else if (nexthop->type == NEXTHOP_TYPE_IPV6 @@ -217,7 +221,7 @@ static_nexthop_same (struct nexthop *nexthop, struct static_route *si)        && IPV6_ADDR_SAME (&nexthop->gate.ipv6, &si->addr.ipv6))      return 1;    else if (nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX -      && si->type == STATIC_IPV6_GATEWAY_IFINDEX +      && si->type == STATIC_IPV6_GATEWAY_IFNAME        && IPV6_ADDR_SAME (&nexthop->gate.ipv6, &si->addr.ipv6)        && nexthop->ifindex == si->ifindex)      return 1; @@ -340,8 +344,7 @@ static_uninstall_route (afi_t afi, safi_t safi, struct prefix *p,  int  static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p, -		  struct prefix_ipv6 *src_p, -		  union g_addr *gate, ifindex_t ifindex, +		  struct prefix_ipv6 *src_p, union g_addr *gate,  		  const char *ifname, u_char flags, route_tag_t tag,  		  u_char distance, struct zebra_vrf *zvrf,  		  struct static_nh_label *snh_label) @@ -359,12 +362,12 @@ static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,    if (!gate &&        (type == STATIC_IPV4_GATEWAY ||         type == STATIC_IPV6_GATEWAY || -       type == STATIC_IPV6_GATEWAY_IFINDEX)) +       type == STATIC_IPV6_GATEWAY_IFNAME))      return -1; -  if (!ifindex && -      (type == STATIC_IFINDEX || -       type == STATIC_IPV6_GATEWAY_IFINDEX)) +  if (!ifname && +      (type == STATIC_IFNAME || +       type == STATIC_IPV6_GATEWAY_IFNAME))      return -1;    /* Lookup static route prefix. */ @@ -377,7 +380,7 @@ static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,  	  && (! gate ||  	      ((afi == AFI_IP && IPV4_ADDR_SAME (gate, &si->addr.ipv4)) ||  	       (afi == AFI_IP6 && IPV6_ADDR_SAME (gate, &si->addr.ipv6)))) -	  && (! ifindex || ifindex == si->ifindex)) +	  && (!strcmp (ifname ? ifname : "", si->ifname)))  	{  	  if ((distance == si->distance) && (tag == si->tag) &&  	      !memcmp (&si->snh_label, snh_label, sizeof (struct static_nh_label)) && @@ -393,7 +396,7 @@ static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,    /* Distance or tag or label changed, delete existing first. */    if (update) -    static_delete_route (afi, safi, type, p, src_p, gate, ifindex, update->tag, +    static_delete_route (afi, safi, type, p, src_p, gate, ifname, update->tag,  			 update->distance, zvrf, &update->snh_label);    /* Make new static route structure. */ @@ -404,9 +407,9 @@ static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,    si->flags = flags;    si->tag = tag;    si->vrf_id = zvrf_id (zvrf); -  si->ifindex = ifindex; -  if (si->ifindex) -    strcpy(si->ifname, ifname); +  if (ifname) +    strlcpy(si->ifname, ifname, sizeof(si->ifname)); +  si->ifindex = IFINDEX_INTERNAL;    switch (type)      { @@ -416,10 +419,10 @@ static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,      case STATIC_IPV6_GATEWAY:        si->addr.ipv6 = gate->ipv6;        break; -    case STATIC_IPV6_GATEWAY_IFINDEX: +    case STATIC_IPV6_GATEWAY_IFNAME:        si->addr.ipv6 = gate->ipv6;        break; -    case STATIC_IFINDEX: +    case STATIC_IFNAME:        break;      } @@ -453,8 +456,20 @@ static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,    si->prev = pp;    si->next = cp; -  /* Install into rib. */ -  static_install_route (afi, safi, p, src_p, si); +  /* check whether interface exists in system & install if it does */ +  if (!ifname) +    static_install_route(afi, safi, p, src_p, si); +  else +    { +      struct interface *ifp; + +      ifp = if_lookup_by_name(ifname, zvrf_id(zvrf)); +      if (ifp && ifp->ifindex != IFINDEX_INTERNAL) +        { +          si->ifindex = ifp->ifindex; +          static_install_route (afi, safi, p, src_p, si); +        } +    }    return 1;  } @@ -462,7 +477,7 @@ static_add_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,  int  static_delete_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,  		     struct prefix_ipv6 *src_p, -		     union g_addr *gate, ifindex_t ifindex, +		     union g_addr *gate, const char *ifname,  		     route_tag_t tag, u_char distance, struct zebra_vrf *zvrf,  		     struct static_nh_label *snh_label)  { @@ -486,7 +501,7 @@ static_delete_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,  	&& (! gate || (  		       (afi == AFI_IP && IPV4_ADDR_SAME (gate, &si->addr.ipv4)) ||  		       (afi == AFI_IP6 && IPV6_ADDR_SAME (gate, &si->addr.ipv6)))) -	&& (! ifindex || ifindex == si->ifindex) +	&& (!strcmp(ifname ? ifname : "", si->ifname))  	&& (! tag || (tag == si->tag))  	&& (! snh_label->num_labels ||  	    !memcmp (&si->snh_label, snh_label, sizeof (struct static_nh_label)))) @@ -499,8 +514,9 @@ static_delete_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,        return 0;      } -  /* Install into rib. */ -  static_uninstall_route (afi, safi, p, src_p, si); +  /* Uninstall from rib. */ +  if (!si->ifname[0] || si->ifindex != IFINDEX_INTERNAL) +    static_uninstall_route (afi, safi, p, src_p, si);    /* Unlink static route from linked list. */    if (si->prev) @@ -518,3 +534,55 @@ static_delete_route (afi_t afi, safi_t safi, u_char type, struct prefix *p,    return 1;  } + +static void +static_ifindex_update_af(struct interface *ifp, bool up, +                         afi_t afi, safi_t safi) +{ +  struct route_table *stable; +  struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(ifp->vrf_id); +  struct route_node *rn; +  struct static_route *si; +  struct prefix *p, *src_pp; +  struct prefix_ipv6 *src_p; + +  stable = zebra_vrf_static_table(afi, safi, zvrf); +  if (!stable) +    return; + +  for (rn = route_top(stable); rn; rn = srcdest_route_next(rn)) +    { +      srcdest_rnode_prefixes(rn, &p, &src_pp); +      src_p = (struct prefix_ipv6 *)src_pp; + +      for (si = rn->info; si; si = si->next) +        { +          if (!si->ifname[0]) +            continue; +          if (up) +            { +              if (strcmp(si->ifname, ifp->name)) +                continue; +              si->ifindex = ifp->ifindex; +              static_install_route(afi, safi, p, src_p, si); +            } +          else +            { +              if (si->ifindex != ifp->ifindex) +                continue; +              static_uninstall_route(afi, safi, p, src_p, si); +              si->ifindex = IFINDEX_INTERNAL; +          } +        } +    } +} + +/* called from if_{add,delete}_update, i.e. when ifindex becomes [in]valid */ +void +static_ifindex_update(struct interface *ifp, bool up) +{ +  static_ifindex_update_af(ifp, up, AFI_IP, SAFI_UNICAST); +  static_ifindex_update_af(ifp, up, AFI_IP, SAFI_MULTICAST); +  static_ifindex_update_af(ifp, up, AFI_IP6, SAFI_UNICAST); +  static_ifindex_update_af(ifp, up, AFI_IP6, SAFI_MULTICAST); +} diff --git a/zebra/zebra_static.h b/zebra/zebra_static.h index adc2efff58..6d3bafa325 100644 --- a/zebra/zebra_static.h +++ b/zebra/zebra_static.h @@ -32,11 +32,11 @@ struct static_nh_label  };  typedef enum { -  STATIC_IFINDEX, +  STATIC_IFNAME,    STATIC_IPV4_GATEWAY,    STATIC_BLACKHOLE,    STATIC_IPV6_GATEWAY, -  STATIC_IPV6_GATEWAY_IFINDEX, +  STATIC_IPV6_GATEWAY_IFNAME,  } zebra_static_types;  /* Static route information. */ @@ -64,7 +64,7 @@ struct static_route     * Under IPv4 addr and ifindex are     * used independentyly.     * STATIC_IPV4_GATEWAY uses addr -   * STATIC_IFINDEX uses ifindex +   * STATIC_IFNAME uses ifindex     */    union g_addr addr;    ifindex_t ifindex; @@ -91,16 +91,15 @@ static_uninstall_route (afi_t afi, safi_t safi, struct prefix *p,  extern int  static_add_route (afi_t, safi_t safi, u_char type, struct prefix *p, -		  struct prefix_ipv6 *src_p, -		  union g_addr *gate, ifindex_t ifindex, +		  struct prefix_ipv6 *src_p, union g_addr *gate,  		  const char *ifname, u_char flags, route_tag_t tag,  		  u_char distance, struct zebra_vrf *zvrf,  		  struct static_nh_label *snh_label);  extern int  static_delete_route (afi_t, safi_t safi, u_char type, struct prefix *p, -		     struct prefix_ipv6 *src_p, -		     union g_addr *gate, ifindex_t ifindex, route_tag_t tag, +		     struct prefix_ipv6 *src_p, union g_addr *gate, +		     const char *ifname, route_tag_t tag,  		     u_char distance, struct zebra_vrf *zvrf,  		     struct static_nh_label *snh_label); @@ -119,4 +118,6 @@ static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,                    const char *distance_str, const char *vrf_id_str,  		  const char *label_str); +extern void static_ifindex_update(struct interface *ifp, bool up); +  #endif diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c index 1797ef080c..06d87a468e 100644 --- a/zebra/zebra_vrf.c +++ b/zebra/zebra_vrf.c @@ -98,50 +98,6 @@ zebra_vrf_new (struct vrf *vrf)    return 0;  } -/* - * Moving an interface amongst different vrf's - * causes the interface to get a new ifindex - * so we need to find static routes with - * the old ifindex and replace with new - * ifindex to insert back into the table - */ -void -zebra_vrf_static_route_interface_fixup (struct interface *ifp) -{ -  afi_t afi; -  safi_t safi; -  struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id (ifp->vrf_id); -  struct route_table *stable = NULL; -  struct route_node *rn = NULL; -  struct static_route *si = NULL; - -  if (!zvrf) -    return; - -  for (afi = AFI_IP; afi < AFI_MAX; afi++) -    { -      for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++) -        { -          stable = zvrf->stable[afi][safi]; -          if (stable) -	    for (rn = route_top (stable); rn; rn = route_next (rn)) -	      { -		if (rn->info) -		  { -		    si = rn->info; -		    if ((strcmp (si->ifname, ifp->name) == 0) && -			(si->ifindex != ifp->ifindex)) -		      { -			si->ifindex = ifp->ifindex; -			static_install_route (afi, safi, &rn->p, NULL, si); -		      }	   -		  } -	      } -	} -    } -   -} -  /* Callback upon enabling a VRF. */  static int  zebra_vrf_enable (struct vrf *vrf) diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h index 56c98931f2..cfe7cde75c 100644 --- a/zebra/zebra_vrf.h +++ b/zebra/zebra_vrf.h @@ -105,7 +105,6 @@ struct route_table *  zebra_vrf_table_with_table_id (afi_t afi, safi_t safi,                                 vrf_id_t vrf_id, u_int32_t table_id); -extern void zebra_vrf_static_route_interface_fixup (struct interface *ifp);  extern void zebra_vrf_update_all (struct zserv *client);  extern struct zebra_vrf *zebra_vrf_lookup_by_id (vrf_id_t vrf_id);  extern struct zebra_vrf *zebra_vrf_lookup_by_name (const char *); diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 180ecd64a5..aeb01be070 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -69,7 +69,6 @@ zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,    u_char flag = 0;    route_tag_t tag = 0;    struct zebra_vrf *zvrf = NULL; -  unsigned int ifindex = 0;    const char *ifname = NULL;    u_char type = STATIC_BLACKHOLE;    struct static_nh_label snh_label; @@ -142,10 +141,10 @@ zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,            return CMD_WARNING;          }        if (add_cmd) -        static_add_route (AFI_IP, safi, type, &p, NULL, NULL, ifindex, ifname, +        static_add_route (AFI_IP, safi, type, &p, NULL, NULL, ifname,  			  ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf, &snh_label);        else -        static_delete_route (AFI_IP, safi, type, &p, NULL, NULL, ifindex, tag, +        static_delete_route (AFI_IP, safi, type, &p, NULL, NULL, ifname, tag,  			     distance, zvrf, &snh_label);        return CMD_SUCCESS;      } @@ -170,11 +169,11 @@ zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,    if (gate_str == NULL)    {      if (add_cmd) -      static_add_route (AFI_IP, safi, type, &p, NULL, NULL, ifindex, ifname, flag, +      static_add_route (AFI_IP, safi, type, &p, NULL, NULL, ifname, flag,  			tag, distance, zvrf, &snh_label);      else -      static_delete_route (AFI_IP, safi, type, &p, NULL, NULL, ifindex, tag, distance, -			   zvrf, &snh_label); +      static_delete_route (AFI_IP, safi, type, &p, NULL, NULL, ifname, tag, +			   distance, zvrf, &snh_label);      return CMD_SUCCESS;    } @@ -184,27 +183,19 @@ zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,    ret = inet_aton (gate_str, &gate);    if (!ret)      { -      struct interface *ifp = if_lookup_by_name (gate_str, zvrf_id (zvrf)); -      if (!ifp) -        { -	  vty_out (vty, "%% Unknown interface: %s%s", gate_str, VTY_NEWLINE); -          ifindex = IFINDEX_DELETED; -        } -      else -        ifindex = ifp->ifindex;        ifname = gate_str; -      type = STATIC_IFINDEX; +      type = STATIC_IFNAME;      }    else      type = STATIC_IPV4_GATEWAY;    if (add_cmd)      static_add_route (AFI_IP, safi, type, &p, NULL, -		      ifindex ? NULL : (union g_addr *)&gate, ifindex, ifname, +		      ret ? (union g_addr *)&gate : NULL, ifname,  		      flag, tag, distance, zvrf, &snh_label);    else      static_delete_route (AFI_IP, safi, type, &p, NULL, -			 ifindex ? NULL : (union g_addr *)&gate, ifindex, tag, +			 ret ? (union g_addr *)&gate : NULL, ifname, tag,  			 distance, zvrf, &snh_label);    return CMD_SUCCESS; @@ -2287,7 +2278,7 @@ static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)                case STATIC_IPV4_GATEWAY:                  vty_out (vty, " %s", inet_ntoa (si->addr.ipv4));                  break; -              case STATIC_IFINDEX: +              case STATIC_IFNAME:                  vty_out (vty, " %s", si->ifname);                  break;                case STATIC_BLACKHOLE: @@ -2296,7 +2287,7 @@ static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)  	      case STATIC_IPV6_GATEWAY:  		vty_out (vty, " %s", inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ));  		break; -	      case STATIC_IPV6_GATEWAY_IFINDEX: +	      case STATIC_IPV6_GATEWAY_IFNAME:  		vty_out (vty, " %s %s",  			 inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ),  			 ifindex2ifname (si->ifindex, si->vrf_id)); @@ -2354,8 +2345,6 @@ static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,    u_char type = STATIC_BLACKHOLE;    u_char flag = 0;    route_tag_t tag = 0; -  unsigned int ifindex = 0; -  struct interface *ifp = NULL;    struct zebra_vrf *zvrf;    struct static_nh_label snh_label; @@ -2430,11 +2419,11 @@ static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,            return CMD_WARNING;          }        if (add_cmd) -        static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, NULL, ifindex, ifname, +        static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, NULL, ifname,                            ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf, &snh_label);        else -        static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, NULL, ifindex, tag, -                             distance, zvrf, &snh_label); +        static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, NULL, +                             ifname, tag, distance, zvrf, &snh_label);        return CMD_SUCCESS;      } @@ -2464,15 +2453,8 @@ static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,            vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);            return CMD_WARNING;          } -      type = STATIC_IPV6_GATEWAY_IFINDEX; +      type = STATIC_IPV6_GATEWAY_IFNAME;        gate = &gate_addr; -      ifp = if_lookup_by_name (ifname, zvrf_id (zvrf)); -      if (!ifp) -        { -          vty_out (vty, "%% Malformed Interface name %s%s", ifname, VTY_NEWLINE); -          return CMD_WARNING; -        } -      ifindex = ifp->ifindex;      }    else      { @@ -2483,25 +2465,17 @@ static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,          }        else          { -          type = STATIC_IFINDEX; -          ifp = if_lookup_by_name (gate_str, zvrf_id (zvrf)); -          if (!ifp) -            { -              vty_out (vty, "%% Malformed Interface name %s%s", gate_str, VTY_NEWLINE); -              ifindex = IFINDEX_DELETED; -            } -          else -            ifindex = ifp->ifindex; +          type = STATIC_IFNAME;            ifname = gate_str;          }      }    if (add_cmd)      static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, (union g_addr *)gate, -                      ifindex, ifname, flag, tag, distance, zvrf, &snh_label); +                      ifname, flag, tag, distance, zvrf, &snh_label);    else      static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, src_p, (union g_addr *)gate, -                         ifindex, tag, distance, zvrf, &snh_label); +                         ifname, tag, distance, zvrf, &snh_label);    return CMD_SUCCESS;  } @@ -3780,13 +3754,13 @@ static_config_ipv6 (struct vty *vty)  	      case STATIC_IPV6_GATEWAY:  		vty_out (vty, " %s", inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ));  		break; -	      case STATIC_IFINDEX: +	      case STATIC_IFNAME:  		vty_out (vty, " %s", si->ifname);  		break;  	      case STATIC_BLACKHOLE:  		vty_out (vty, " Null0" );  		break; -	      case STATIC_IPV6_GATEWAY_IFINDEX: +	      case STATIC_IPV6_GATEWAY_IFNAME:  		vty_out (vty, " %s %s",  			 inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ),  			 ifindex2ifname (si->ifindex, si->vrf_id));  | 
