diff options
author | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2018-11-05 22:03:21 +0100 |
---|---|---|
committer | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2018-11-05 22:03:21 +0100 |
commit | f2d8e6801e88a84b1e57da72d078d7569598a5f5 (patch) | |
tree | abf191000fb802dedd87b8b78abcc2f12c45d8b8 | |
parent | 69b2f63d9a477ab5d083773e16ca15ed2e570144 (diff) |
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.
-rw-r--r-- | doc/bird.sgml | 3 | ||||
-rw-r--r-- | filter/config.Y | 2 | ||||
-rw-r--r-- | filter/filter.c | 14 | ||||
-rw-r--r-- | nest/iface.c | 7 |
4 files changed, 21 insertions, 5 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml index fdfae2a6..72c386f2 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1606,7 +1606,8 @@ regarded as empty bgppath/*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 diff --git a/filter/config.Y b/filter/config.Y index 93ad8d8b..d865d11f 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -852,7 +852,7 @@ static_attr: | SOURCE { $$ = f_new_static_attr(T_ENUM_RTS, SA_SOURCE, 0); } | SCOPE { $$ = f_new_static_attr(T_ENUM_SCOPE, SA_SCOPE, 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); } ; diff --git a/filter/filter.c b/filter/filter.c index edf54ec0..f308e7fd 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -1002,6 +1002,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_UNICAST; + rta->nh.gw = IPA_NONE; + rta->nh.iface = ifa; + rta->nh.next = NULL; + rta->hostentry = NULL; + } + break; + default: bug("Invalid static attribute access (%x)", res.type); } diff --git a/nest/iface.c b/nest/iface.c index 9462b634..23a82ac5 100644 --- a/nest/iface.c +++ b/nest/iface.c @@ -449,7 +449,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; } @@ -459,8 +459,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)); |