Commit 716b904f authored by Ondřej Zajíček's avatar Ondřej Zajíček

Filter: Make ifname attribute modifiable

Allow to change an interface associated with a route by setting
ifname attribute. It will also change the route to a direct one.
parent fff79b1c
Pipeline #41957 passed with stages
in 6 minutes and 52 seconds
......@@ -1405,7 +1405,8 @@ clist for most purposes.
<tag><label id="rta-ifname"><m/string/ ifname</tag>
Name of the outgoing interface. Sink routes (like blackhole, unreachable
or prohibit) and multipath routes have no interface associated with
them, so <cf/ifname/ returns an empty string for such routes. Read-only.
them, so <cf/ifname/ returns an empty string for such routes. Setting it
would also change route to a direct one (remove gateway).
<tag><label id="rta-ifindex"><m/int/ ifindex</tag>
Index of the outgoing interface. System wide index of the interface. May
......
......@@ -792,7 +792,7 @@ static_attr:
| SCOPE { $$ = f_new_static_attr(T_ENUM_SCOPE, SA_SCOPE, 1); }
| CAST { $$ = f_new_static_attr(T_ENUM_RTC, SA_CAST, 0); }
| DEST { $$ = f_new_static_attr(T_ENUM_RTD, SA_DEST, 1); }
| IFNAME { $$ = f_new_static_attr(T_STRING, SA_IFNAME, 0); }
| IFNAME { $$ = f_new_static_attr(T_STRING, SA_IFNAME, 1); }
| IFINDEX { $$ = f_new_static_attr(T_INT, SA_IFINDEX, 0); }
;
......
......@@ -1000,6 +1000,20 @@ interpret(struct f_inst *what)
rta->hostentry = NULL;
break;
case SA_IFNAME:
{
struct iface *ifa = if_find_by_name(v1.val.s);
if (!ifa)
runtime( "Invalid iface name" );
rta->dest = RTD_DEVICE;
rta->gw = IPA_NONE;
rta->iface = ifa;
rta->nexthops = NULL;
rta->hostentry = NULL;
}
break;
default:
bug("Invalid static attribute access (%x)", res.type);
}
......
......@@ -441,7 +441,7 @@ if_find_by_name(char *name)
struct iface *i;
WALK_LIST(i, iface_list)
if (!strcmp(i->name, name))
if (!strcmp(i->name, name) && !(i->flags & IF_SHUTDOWN))
return i;
return NULL;
}
......@@ -451,8 +451,9 @@ if_get_by_name(char *name)
{
struct iface *i;
if (i = if_find_by_name(name))
return i;
WALK_LIST(i, iface_list)
if (!strcmp(i->name, name))
return i;
/* No active iface, create a dummy */
i = mb_allocz(if_pool, sizeof(struct iface));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment