mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 17:51:53 +00:00
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:
parent
fff79b1c1e
commit
716b904f4e
@ -1405,7 +1405,8 @@ 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
|
||||||
|
@ -792,7 +792,7 @@ static_attr:
|
|||||||
| SCOPE { $$ = f_new_static_attr(T_ENUM_SCOPE, SA_SCOPE, 1); }
|
| SCOPE { $$ = f_new_static_attr(T_ENUM_SCOPE, SA_SCOPE, 1); }
|
||||||
| CAST { $$ = f_new_static_attr(T_ENUM_RTC, SA_CAST, 0); }
|
| CAST { $$ = f_new_static_attr(T_ENUM_RTC, SA_CAST, 0); }
|
||||||
| 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); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -1000,6 +1000,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_DEVICE;
|
||||||
|
rta->gw = IPA_NONE;
|
||||||
|
rta->iface = ifa;
|
||||||
|
rta->nexthops = NULL;
|
||||||
|
rta->hostentry = NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
bug("Invalid static attribute access (%x)", res.type);
|
bug("Invalid static attribute access (%x)", res.type);
|
||||||
}
|
}
|
||||||
|
@ -441,7 +441,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;
|
||||||
}
|
}
|
||||||
@ -451,8 +451,9 @@ if_get_by_name(char *name)
|
|||||||
{
|
{
|
||||||
struct iface *i;
|
struct iface *i;
|
||||||
|
|
||||||
if (i = if_find_by_name(name))
|
WALK_LIST(i, iface_list)
|
||||||
return i;
|
if (!strcmp(i->name, name))
|
||||||
|
return i;
|
||||||
|
|
||||||
/* No active iface, create a dummy */
|
/* No active iface, create a dummy */
|
||||||
i = mb_allocz(if_pool, sizeof(struct iface));
|
i = mb_allocz(if_pool, sizeof(struct iface));
|
||||||
|
Loading…
Reference in New Issue
Block a user