/* Flag for this static route's type. */
u_char type;
-#define STATIC_IPV4_GATEWAY 1
-#define STATIC_IPV4_IFNAME 2
+#define STATIC_IFINDEX 1
+#define STATIC_IPV4_GATEWAY 2
#define STATIC_IPV4_BLACKHOLE 3
#define STATIC_IPV6_GATEWAY 4
-#define STATIC_IPV6_GATEWAY_IFNAME 5
-#define STATIC_IPV6_IFNAME 6
+#define STATIC_IPV6_GATEWAY_IFINDEX 5
/*
* Nexthop value.
*
- * Under IPv4 addr and ifname are
+ * Under IPv4 addr and ifindex are
* used independentyly.
* STATIC_IPV4_GATEWAY uses addr
- * STATIC_IPV4_IFNAME uses ifname
+ * STATIC_IFINDEX uses ifindex
*/
union g_addr addr;
- char *ifname;
+ unsigned int ifindex;
/* bit flags */
u_char flags;
extern int
-static_add_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
+static_add_ipv4 (struct prefix *p, struct in_addr *gate, unsigned int ifindex,
u_char flags, u_short tag, u_char distance, vrf_id_t vrf_id);
extern int
-static_delete_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
+static_delete_ipv4 (struct prefix *p, struct in_addr *gate, unsigned int ifindex,
u_short tag, u_char distance, vrf_id_t vrf_id);
extern int
extern int
static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
- const char *ifname, u_char flags, u_short tag,
+ unsigned int ifindex, u_char flags, u_short tag,
u_char distance, vrf_id_t vrf_id);
extern int
extern int
static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
- const char *ifname, u_short tag, u_char distance,
+ unsigned int ifindex, u_short tag, u_char distance,
vrf_id_t vrf_id);
extern int rib_gc_dest (struct route_node *rn);
return nexthop;
}
-struct nexthop *
-rib_nexthop_ipv6_ifname_add (struct rib *rib, struct in6_addr *ipv6,
- char *ifname)
-{
- struct nexthop *nexthop;
-
- nexthop = nexthop_new();
- nexthop->type = NEXTHOP_TYPE_IPV6_IFNAME;
- nexthop->gate.ipv6 = *ipv6;
- nexthop->ifname = XSTRDUP (0, ifname);
-
- rib_nexthop_add (rib, nexthop);
-
- return nexthop;
-}
-
struct nexthop *
rib_nexthop_ipv6_ifindex_add (struct rib *rib, struct in6_addr *ipv6,
unsigned int ifindex)
nh_p.u.prefix4 = si->addr.ipv4;
zebra_register_rnh_static_nh(&nh_p, rn);
break;
- case STATIC_IPV4_IFNAME:
- rib_nexthop_ifname_add (rib, si->ifname);
+ case STATIC_IFINDEX:
+ rib_nexthop_ifindex_add (rib, si->ifindex);
break;
case STATIC_IPV4_BLACKHOLE:
rib_nexthop_blackhole_add (rib);
nh_p.u.prefix6 = si->addr.ipv6;
zebra_register_rnh_static_nh(&nh_p, rn);
break;
- case STATIC_IPV6_IFNAME:
- rib_nexthop_ifname_add (rib, si->ifname);
- break;
- case STATIC_IPV6_GATEWAY_IFNAME:
- rib_nexthop_ipv6_ifname_add (rib, &si->addr.ipv6, si->ifname);
+ case STATIC_IPV6_GATEWAY_IFINDEX:
+ rib_nexthop_ipv6_ifindex_add (rib, &si->addr.ipv6, si->ifindex);
break;
}
nh_p.u.prefix4 = si->addr.ipv4;
zebra_register_rnh_static_nh(&nh_p, rn);
break;
- case STATIC_IPV4_IFNAME:
- rib_nexthop_ifname_add (rib, si->ifname);
+ case STATIC_IFINDEX:
+ rib_nexthop_ifindex_add (rib, si->ifindex);
break;
case STATIC_IPV4_BLACKHOLE:
rib_nexthop_blackhole_add (rib);
nh_p.u.prefix6 = si->addr.ipv6;
zebra_register_rnh_static_nh(&nh_p, rn);
break;
- case STATIC_IPV6_IFNAME:
- rib_nexthop_ifname_add (rib, si->ifname);
- break;
- case STATIC_IPV6_GATEWAY_IFNAME:
- rib_nexthop_ipv6_ifname_add (rib, &si->addr.ipv6, si->ifname);
+ case STATIC_IPV6_GATEWAY_IFINDEX:
+ rib_nexthop_ipv6_ifindex_add (rib, &si->addr.ipv6, si->ifindex);
break;
}
&& si->type == STATIC_IPV4_GATEWAY
&& IPV4_ADDR_SAME (&nexthop->gate.ipv4, &si->addr.ipv4))
return 1;
- if (nexthop->type == NEXTHOP_TYPE_IFNAME
- && si->type == STATIC_IPV4_IFNAME
- && strcmp (nexthop->ifname, si->ifname) == 0)
+ if (nexthop->type == NEXTHOP_TYPE_IFINDEX
+ && si->type == STATIC_IFINDEX
+ && nexthop->ifindex == si->ifindex)
return 1;
if (nexthop->type == NEXTHOP_TYPE_BLACKHOLE
&& si->type == STATIC_IPV4_BLACKHOLE)
&& si->type == STATIC_IPV6_GATEWAY
&& IPV6_ADDR_SAME (&nexthop->gate.ipv6, &si->addr.ipv6))
return 1;
- if (nexthop->type == NEXTHOP_TYPE_IFNAME
- && si->type == STATIC_IPV6_IFNAME
- && strcmp (nexthop->ifname, si->ifname) == 0)
- return 1;
- if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
- && si->type == STATIC_IPV6_GATEWAY_IFNAME
+ if (nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX
+ && si->type == STATIC_IPV6_GATEWAY_IFINDEX
&& IPV6_ADDR_SAME (&nexthop->gate.ipv6, &si->addr.ipv6)
- && strcmp (nexthop->ifname, si->ifname) == 0)
+ && nexthop->ifindex == si->ifindex)
return 1;
return 0;
}
/* Add static route into static route configuration. */
int
-static_add_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
+static_add_ipv4 (struct prefix *p, struct in_addr *gate, unsigned int ifindex,
u_char flags, u_short tag, u_char distance, vrf_id_t vrf_id)
{
u_char type = 0;
/* Make flags. */
if (gate)
type = STATIC_IPV4_GATEWAY;
- else if (ifname)
- type = STATIC_IPV4_IFNAME;
+ else if (ifindex)
+ type = STATIC_IFINDEX;
else
type = STATIC_IPV4_BLACKHOLE;
{
if (type == si->type
&& (! gate || IPV4_ADDR_SAME (gate, &si->addr.ipv4))
- && (! ifname || strcmp (ifname, si->ifname) == 0))
+ && (! ifindex || ifindex == si->ifindex))
{
if ((distance == si->distance) && (tag == si->tag))
{
/* Distance or tag changed. */
if (update)
- static_delete_ipv4 (p, gate, ifname, update->tag, update->distance, vrf_id);
+ static_delete_ipv4 (p, gate, ifindex, update->tag, update->distance, vrf_id);
/* Make new static route structure. */
si = XCALLOC (MTYPE_STATIC_ROUTE, sizeof (struct static_route));
si->flags = flags;
si->tag = tag;
si->vrf_id = vrf_id;
+ si->ifindex = ifindex;
if (gate)
si->addr.ipv4 = *gate;
- if (ifname)
- si->ifname = XSTRDUP (0, ifname);
/* Add new static route information to the tree with sort by
distance value and gateway address. */
/* Delete static route from static route configuration. */
int
-static_delete_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname,
+static_delete_ipv4 (struct prefix *p, struct in_addr *gate, unsigned int ifindex,
u_short tag, u_char distance, vrf_id_t vrf_id)
{
u_char type = 0;
/* Make flags. */
if (gate)
type = STATIC_IPV4_GATEWAY;
- else if (ifname)
- type = STATIC_IPV4_IFNAME;
+ else if (ifindex)
+ type = STATIC_IFINDEX;
else
type = STATIC_IPV4_BLACKHOLE;
for (si = rn->info; si; si = si->next)
if (type == si->type
&& (! gate || IPV4_ADDR_SAME (gate, &si->addr.ipv4))
- && (! ifname || strcmp (ifname, si->ifname) == 0)
+ && (! ifindex || ifindex == si->ifindex)
&& (! tag || (tag == si->tag)))
break;
route_unlock_node (rn);
/* Free static route configuration. */
- if (ifname)
- XFREE (0, si->ifname);
XFREE (MTYPE_STATIC_ROUTE, si);
route_unlock_node (rn);
/* Add static route into static route configuration. */
int
static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
- const char *ifname, u_char flags, u_short tag,
+ unsigned int ifindex, u_char flags, u_short tag,
u_char distance, vrf_id_t vrf_id)
{
struct route_node *rn;
return -1;
if (!gate &&
- (type == STATIC_IPV6_GATEWAY || type == STATIC_IPV6_GATEWAY_IFNAME))
+ (type == STATIC_IPV6_GATEWAY || type == STATIC_IPV6_GATEWAY_IFINDEX))
return -1;
- if (!ifname &&
- (type == STATIC_IPV6_GATEWAY_IFNAME || type == STATIC_IPV6_IFNAME))
+ if (!ifindex &&
+ (type == STATIC_IPV6_GATEWAY_IFINDEX || type == STATIC_IFINDEX))
return -1;
/* Lookup static route prefix. */
{
if (type == si->type
&& (! gate || IPV6_ADDR_SAME (gate, &si->addr.ipv6))
- && (! ifname || strcmp (ifname, si->ifname) == 0))
+ && (! ifindex || ifindex == si->ifindex))
{
if ((distance == si->distance) && (tag == si->tag))
{
/* Distance or tag changed. */
if (update)
- static_delete_ipv6 (p, type, gate, ifname, update->tag, update->distance, vrf_id);
+ static_delete_ipv6 (p, type, gate, ifindex, update->tag, update->distance, vrf_id);
/* Make new static route structure. */
si = XCALLOC (MTYPE_STATIC_ROUTE, sizeof (struct static_route));
si->flags = flags;
si->tag = tag;
si->vrf_id = vrf_id;
+ si->ifindex = ifindex;
switch (type)
{
case STATIC_IPV6_GATEWAY:
si->addr.ipv6 = *gate;
break;
- case STATIC_IPV6_IFNAME:
- si->ifname = XSTRDUP (0, ifname);
- break;
- case STATIC_IPV6_GATEWAY_IFNAME:
+ case STATIC_IPV6_GATEWAY_IFINDEX:
si->addr.ipv6 = *gate;
- si->ifname = XSTRDUP (0, ifname);
break;
}
/* Delete static route from static route configuration. */
int
static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
- const char *ifname, u_short tag, u_char distance,
+ unsigned int ifindex, u_short tag, u_char distance,
vrf_id_t vrf_id)
{
struct route_node *rn;
if (distance == si->distance
&& type == si->type
&& (! gate || IPV6_ADDR_SAME (gate, &si->addr.ipv6))
- && (! ifname || strcmp (ifname, si->ifname) == 0)
+ && (! ifindex || ifindex == si->ifindex)
&& (! tag || (tag == si->tag)))
break;
si->next->prev = si->prev;
/* Free static route configuration. */
- if (ifname)
- XFREE (0, si->ifname);
XFREE (MTYPE_STATIC_ROUTE, si);
return 1;
struct prefix p;
struct in_addr gate;
struct in_addr mask;
- const char *ifname;
u_char flag = 0;
u_short tag = 0;
vrf_id_t vrf_id = VRF_DEFAULT;
-
+ unsigned int ifindex = 0;
+
ret = str2prefix (dest_str, &p);
if (ret <= 0)
{
return CMD_WARNING;
}
if (add_cmd)
- static_add_ipv4 (&p, NULL, NULL, ZEBRA_FLAG_BLACKHOLE, tag, distance, vrf_id);
+ static_add_ipv4 (&p, NULL, ifindex, ZEBRA_FLAG_BLACKHOLE, tag, distance, vrf_id);
else
- static_delete_ipv4 (&p, NULL, NULL, tag, distance, vrf_id);
+ static_delete_ipv4 (&p, NULL, ifindex, tag, distance, vrf_id);
return CMD_SUCCESS;
}
if (gate_str == NULL)
{
if (add_cmd)
- static_add_ipv4 (&p, NULL, NULL, flag, tag, distance, vrf_id);
+ static_add_ipv4 (&p, NULL, ifindex, flag, tag, distance, vrf_id);
else
- static_delete_ipv4 (&p, NULL, NULL, tag, distance, vrf_id);
+ static_delete_ipv4 (&p, NULL, ifindex, tag, distance, vrf_id);
return CMD_SUCCESS;
}
/* When gateway is A.B.C.D format, gate is treated as nexthop
address other case gate is treated as interface name. */
ret = inet_aton (gate_str, &gate);
- if (ret)
- ifname = NULL;
- else
- ifname = gate_str;
+ if (!ret)
+ {
+ struct interface *ifp = if_lookup_by_name_vrf (gate_str, vrf_id);
+ if (!ifp)
+ {
+ vty_out (vty, "%% Unknown interface: %s%s", gate_str, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ ifindex = ifp->ifindex;
+ }
if (add_cmd)
- static_add_ipv4 (&p, ifname ? NULL : &gate, ifname, flag, tag, distance, vrf_id);
+ static_add_ipv4 (&p, ifindex ? NULL : &gate, ifindex, flag, tag, distance, vrf_id);
else
- static_delete_ipv4 (&p, ifname ? NULL : &gate, ifname, tag, distance, vrf_id);
+ static_delete_ipv4 (&p, ifindex ? NULL : &gate, ifindex, tag, distance, vrf_id);
return CMD_SUCCESS;
}
case STATIC_IPV4_GATEWAY:
vty_out (vty, " %s", inet_ntoa (si->addr.ipv4));
break;
- case STATIC_IPV4_IFNAME:
- vty_out (vty, " %s", si->ifname);
+ case STATIC_IFINDEX:
+ vty_out (vty, " %s", ifindex2ifname_vrf(si->ifindex, si->vrf_id));
break;
case STATIC_IPV4_BLACKHOLE:
vty_out (vty, " Null0");
vrf_id_t vrf_id = VRF_DEFAULT;
u_char flag = 0;
u_short tag = 0;
+ unsigned int ifindex = 0;
+ struct interface *ifp = NULL;
ret = str2prefix (dest_str, &p);
if (ret <= 0)
vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
return CMD_WARNING;
}
- type = STATIC_IPV6_GATEWAY_IFNAME;
+ type = STATIC_IPV6_GATEWAY_IFINDEX;
gate = &gate_addr;
+ ifp = if_lookup_by_name_vrf (ifname, vrf_id);
+ if (!ifp)
+ {
+ vty_out (vty, "%% Malformed Interface name %s%s", ifname, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ ifindex = ifp->ifindex;
}
else
{
}
else
{
- type = STATIC_IPV6_IFNAME;
- ifname = gate_str;
+ type = STATIC_IFINDEX;
+ ifp = if_lookup_by_name_vrf (gate_str, vrf_id);
+ if (!ifp)
+ {
+ vty_out (vty, "%% Malformed Interface name %s%s", gate_str, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ ifindex = ifp->ifindex;
}
}
VTY_GET_INTEGER ("VRF ID", vrf_id, vrf_id_str);
if (add_cmd)
- static_add_ipv6 (&p, type, gate, ifname, flag, tag, distance, vrf_id);
+ static_add_ipv6 (&p, type, gate, ifindex, flag, tag, distance, vrf_id);
else
- static_delete_ipv6 (&p, type, gate, ifname, tag, distance, vrf_id);
+ static_delete_ipv6 (&p, type, gate, ifindex, tag, distance, vrf_id);
return CMD_SUCCESS;
}
case STATIC_IPV6_GATEWAY:
vty_out (vty, " %s", inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ));
break;
- case STATIC_IPV6_IFNAME:
- vty_out (vty, " %s", si->ifname);
+ case STATIC_IFINDEX:
+ vty_out (vty, " %s", ifindex2ifname_vrf (si->ifindex, si->vrf_id));
break;
- case STATIC_IPV6_GATEWAY_IFNAME:
+ case STATIC_IPV6_GATEWAY_IFINDEX:
vty_out (vty, " %s %s",
- inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ), si->ifname);
+ inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ),
+ ifindex2ifname_vrf (si->ifindex, si->vrf_id));
break;
}