Check validity of interface definitions.
Thanks to Aleksey Berezin for the bugreport.
This commit is contained in:
parent
0c3d9dacaf
commit
d7c0628591
6 changed files with 44 additions and 19 deletions
|
@ -393,7 +393,7 @@ protocol rip {
|
|||
Set BIRD's router ID based on an IP address of an interface specified by
|
||||
an interface pattern. The option is applicable for IPv4 version only.
|
||||
See <ref id="dsc-iface" name="interface"> section for detailed
|
||||
description of interface patterns.
|
||||
description of interface patterns with extended clauses.
|
||||
|
||||
<tag>listen bgp [address <m/address/] [port <m/port/] [dual]</tag>
|
||||
This option allows to specify address and port where BGP protocol should
|
||||
|
@ -569,23 +569,26 @@ agreement").
|
|||
given interface-specific options. A set of interfaces specified by one
|
||||
interface option is described using an interface pattern. The interface
|
||||
pattern consists of a sequence of clauses (separated by commas), each
|
||||
clause may contain a mask, a prefix, or both of them. An interface
|
||||
matches the clause if its name matches the mask (if specified) and its
|
||||
address matches the prefix (if specified). Mask is specified as
|
||||
shell-like pattern. For IPv6, the prefix part of a clause is generally
|
||||
ignored and interfaces are matched just by their name.
|
||||
clause is a mask specified as a shell-like pattern. Interfaces are
|
||||
matched by their name.
|
||||
|
||||
An interface matches the pattern if it matches any of its clauses. If
|
||||
the clause begins with <cf/-/, matching interfaces are excluded. Patterns
|
||||
are parsed left-to-right, thus <cf/interface "eth0", -"eth*", "*";/
|
||||
are processed left-to-right, thus <cf/interface "eth0", -"eth*", "*";/
|
||||
means eth0 and all non-ethernets.
|
||||
|
||||
Some protocols (namely OSPFv2 and Direct) support extended clauses that
|
||||
may contain a mask, a prefix, or both of them. An interface matches such
|
||||
clause if its name matches the mask (if specified) and its address
|
||||
matches the prefix (if specified). Extended clauses are used when the
|
||||
protocol handles multiple addresses on an interface independently.
|
||||
|
||||
An interface option can be used more times with different interface-specific
|
||||
options, in that case for given interface the first matching interface
|
||||
option is used.
|
||||
|
||||
This option is allowed in Direct, OSPF, RIP and RAdv protocols, but in
|
||||
OSPF protocol it is used in <cf/area/ subsection.
|
||||
This option is allowed in BFD, Direct, OSPF, RAdv and RIP protocols, but
|
||||
in OSPF protocol it is used in the <cf/area/ subsection.
|
||||
|
||||
Default: none.
|
||||
|
||||
|
@ -2094,9 +2097,11 @@ on Linux systems BIRD cannot change non-BIRD route in the kernel routing table.
|
|||
<tag>interface <m/pattern [, ...]/</tag>
|
||||
By default, the Direct protocol will generate device routes for all the
|
||||
interfaces available. If you want to restrict it to some subset of
|
||||
interfaces (for example if you're using multiple routing tables for
|
||||
policy routing and some of the policy domains don't contain all
|
||||
interfaces), just use this clause.
|
||||
interfaces or addresses (e.g. if you're using multiple routing tables
|
||||
for policy routing and some of the policy domains don't contain all
|
||||
interfaces), just use this clause. See <ref id="dsc-iface" name="interface">
|
||||
common option for detailed description. The Direct protocol uses
|
||||
extended interface clauses.
|
||||
</descrip>
|
||||
|
||||
<p>Direct device routes don't contain any specific attributes.
|
||||
|
@ -2468,9 +2473,11 @@ protocol ospf <name> {
|
|||
<tag>interface <M>pattern</M> [instance <m/num/]</tag>
|
||||
Defines that the specified interfaces belong to the area being defined.
|
||||
See <ref id="dsc-iface" name="interface"> common option for detailed
|
||||
description. In OSPFv3, you can specify instance ID for that interface
|
||||
description, so it is possible to have several instances of that
|
||||
interface with different options or even in different areas.
|
||||
description. In OSPFv2, extended interface clauses are used, because
|
||||
OSPFv2 handles each network prefix as a separate virtual interface. In
|
||||
OSPFv3, you can specify instance ID for that interface description, so
|
||||
it is possible to have several instances of that interface with
|
||||
different options or even in different areas.
|
||||
|
||||
<tag>virtual link <M>id</M> [instance <m/num/]</tag>
|
||||
Virtual link to router with the router id. Virtual link acts as a
|
||||
|
|
|
@ -24,6 +24,17 @@ static list *this_p_list;
|
|||
static struct password_item *this_p_item;
|
||||
static int password_id;
|
||||
|
||||
static void
|
||||
iface_patt_check(void)
|
||||
{
|
||||
struct iface_patt_node *pn;
|
||||
|
||||
WALK_LIST(pn, this_ipatt->ipn_list)
|
||||
if (!pn->pattern || pn->pxlen)
|
||||
cf_error("Interface name/mask expected, not IP prefix");
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
reset_passwords(void)
|
||||
{
|
||||
|
@ -272,6 +283,9 @@ iface_patt_list:
|
|||
| iface_patt_list ',' iface_patt_node
|
||||
;
|
||||
|
||||
/* For name/mask-only iface patterns */
|
||||
iface_patt_list_nopx: iface_patt_list { iface_patt_check(); }
|
||||
|
||||
iface_patt_init: {
|
||||
/* Generic this_ipatt init */
|
||||
this_ipatt = cfg_allocz(sizeof(struct iface_patt));
|
||||
|
|
|
@ -89,7 +89,7 @@ bfd_iface_opt_list:
|
|||
| '{' bfd_iface_opts '}'
|
||||
;
|
||||
|
||||
bfd_iface: bfd_iface_start iface_patt_list bfd_iface_opt_list
|
||||
bfd_iface: bfd_iface_start iface_patt_list_nopx bfd_iface_opt_list
|
||||
{ add_tail(&BFD_CFG->patt_list, NODE this_ipatt); };
|
||||
|
||||
bfd_multihop: bfd_iface_start bfd_iface_opt_list
|
||||
|
|
|
@ -386,6 +386,10 @@ ospf_instance_id:
|
|||
| INSTANCE expr { set_instance_id($2); }
|
||||
;
|
||||
|
||||
ospf_iface_patt_list:
|
||||
iface_patt_list { if (OSPF_VERSION == 3) iface_patt_check(); } ospf_instance_id
|
||||
;
|
||||
|
||||
ospf_iface_opts:
|
||||
/* empty */
|
||||
| ospf_iface_opts ospf_iface_item ';'
|
||||
|
@ -397,7 +401,7 @@ ospf_iface_opt_list:
|
|||
;
|
||||
|
||||
ospf_iface:
|
||||
ospf_iface_start iface_patt_list ospf_instance_id ospf_iface_opt_list { ospf_iface_finish(); }
|
||||
ospf_iface_start ospf_iface_patt_list ospf_iface_opt_list { ospf_iface_finish(); }
|
||||
;
|
||||
|
||||
opttext:
|
||||
|
|
|
@ -138,7 +138,7 @@ radv_iface_opt_list:
|
|||
;
|
||||
|
||||
radv_iface:
|
||||
radv_iface_start iface_patt_list radv_iface_opt_list radv_iface_finish;
|
||||
radv_iface_start iface_patt_list_nopx radv_iface_opt_list radv_iface_finish;
|
||||
|
||||
|
||||
radv_prefix_start: prefix
|
||||
|
|
|
@ -110,7 +110,7 @@ rip_iface_init:
|
|||
}
|
||||
;
|
||||
|
||||
rip_iface:
|
||||
rip_iface: /* TODO: switch to iface_patt_list_nopx */
|
||||
rip_iface_init iface_patt_list rip_iface_opt_list
|
||||
;
|
||||
|
||||
|
|
Loading…
Reference in a new issue