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.
This commit is contained in:
Ondrej Zajicek (work) 2018-11-05 22:03:21 +01:00
parent 69b2f63d9a
commit f2d8e6801e
4 changed files with 21 additions and 5 deletions

View file

@ -1606,7 +1606,8 @@ regarded as empty bgppath/*clist for most purposes.
<tag><label id="rta-ifname"><m/string/ ifname</tag> <tag><label id="rta-ifname"><m/string/ ifname</tag>
Name of the outgoing interface. Sink routes (like blackhole, unreachable Name of the outgoing interface. Sink routes (like blackhole, unreachable
or prohibit) and multipath routes have no interface associated with 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> <tag><label id="rta-ifindex"><m/int/ ifindex</tag>
Index of the outgoing interface. System wide index of the interface. May Index of the outgoing interface. System wide index of the interface. May

View file

@ -852,7 +852,7 @@ static_attr:
| SOURCE { $$ = f_new_static_attr(T_ENUM_RTS, SA_SOURCE, 0); } | SOURCE { $$ = f_new_static_attr(T_ENUM_RTS, SA_SOURCE, 0); }
| SCOPE { $$ = f_new_static_attr(T_ENUM_SCOPE, SA_SCOPE, 1); } | SCOPE { $$ = f_new_static_attr(T_ENUM_SCOPE, SA_SCOPE, 1); }
| DEST { $$ = f_new_static_attr(T_ENUM_RTD, SA_DEST, 1); } | 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); } | IFINDEX { $$ = f_new_static_attr(T_INT, SA_IFINDEX, 0); }
; ;

View file

@ -1002,6 +1002,20 @@ interpret(struct f_inst *what)
rta->hostentry = NULL; rta->hostentry = NULL;
break; break;
case SA_IFNAME:
{
struct iface *ifa = if_find_by_name(v1.val.s);
if (!ifa)
runtime( "Invalid iface name" );
rta->dest = RTD_UNICAST;
rta->nh.gw = IPA_NONE;
rta->nh.iface = ifa;
rta->nh.next = NULL;
rta->hostentry = NULL;
}
break;
default: default:
bug("Invalid static attribute access (%x)", res.type); bug("Invalid static attribute access (%x)", res.type);
} }

View file

@ -449,7 +449,7 @@ if_find_by_name(char *name)
struct iface *i; struct iface *i;
WALK_LIST(i, iface_list) WALK_LIST(i, iface_list)
if (!strcmp(i->name, name)) if (!strcmp(i->name, name) && !(i->flags & IF_SHUTDOWN))
return i; return i;
return NULL; return NULL;
} }
@ -459,7 +459,8 @@ if_get_by_name(char *name)
{ {
struct iface *i; struct iface *i;
if (i = if_find_by_name(name)) WALK_LIST(i, iface_list)
if (!strcmp(i->name, name))
return i; return i;
/* No active iface, create a dummy */ /* No active iface, create a dummy */