Check validity of interface definitions.

Thanks to Aleksey Berezin for the bugreport.
This commit is contained in:
Ondrej Zajicek 2014-03-31 00:56:44 +02:00
parent 0c3d9dacaf
commit d7c0628591
6 changed files with 44 additions and 19 deletions

View file

@ -393,7 +393,7 @@ protocol rip {
Set BIRD's router ID based on an IP address of an interface specified by 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. an interface pattern. The option is applicable for IPv4 version only.
See <ref id="dsc-iface" name="interface"> section for detailed 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> <tag>listen bgp [address <m/address/] [port <m/port/] [dual]</tag>
This option allows to specify address and port where BGP protocol should 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 given interface-specific options. A set of interfaces specified by one
interface option is described using an interface pattern. The interface interface option is described using an interface pattern. The interface
pattern consists of a sequence of clauses (separated by commas), each pattern consists of a sequence of clauses (separated by commas), each
clause may contain a mask, a prefix, or both of them. An interface clause is a mask specified as a shell-like pattern. Interfaces are
matches the clause if its name matches the mask (if specified) and its matched by their name.
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.
An interface matches the pattern if it matches any of its clauses. If An interface matches the pattern if it matches any of its clauses. If
the clause begins with <cf/-/, matching interfaces are excluded. Patterns 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. 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 An interface option can be used more times with different interface-specific
options, in that case for given interface the first matching interface options, in that case for given interface the first matching interface
option is used. option is used.
This option is allowed in Direct, OSPF, RIP and RAdv protocols, but in This option is allowed in BFD, Direct, OSPF, RAdv and RIP protocols, but
OSPF protocol it is used in <cf/area/ subsection. in OSPF protocol it is used in the <cf/area/ subsection.
Default: none. 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> <tag>interface <m/pattern [, ...]/</tag>
By default, the Direct protocol will generate device routes for all the 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 available. If you want to restrict it to some subset of
interfaces (for example if you're using multiple routing tables for interfaces or addresses (e.g. if you're using multiple routing tables
policy routing and some of the policy domains don't contain all for policy routing and some of the policy domains don't contain all
interfaces), just use this clause. 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> </descrip>
<p>Direct device routes don't contain any specific attributes. <p>Direct device routes don't contain any specific attributes.
@ -2468,9 +2473,11 @@ protocol ospf &lt;name&gt; {
<tag>interface <M>pattern</M> [instance <m/num/]</tag> <tag>interface <M>pattern</M> [instance <m/num/]</tag>
Defines that the specified interfaces belong to the area being defined. Defines that the specified interfaces belong to the area being defined.
See <ref id="dsc-iface" name="interface"> common option for detailed See <ref id="dsc-iface" name="interface"> common option for detailed
description. In OSPFv3, you can specify instance ID for that interface description. In OSPFv2, extended interface clauses are used, because
description, so it is possible to have several instances of that OSPFv2 handles each network prefix as a separate virtual interface. In
interface with different options or even in different areas. 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> <tag>virtual link <M>id</M> [instance <m/num/]</tag>
Virtual link to router with the router id. Virtual link acts as a Virtual link to router with the router id. Virtual link acts as a

View file

@ -24,6 +24,17 @@ static list *this_p_list;
static struct password_item *this_p_item; static struct password_item *this_p_item;
static int password_id; 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 static inline void
reset_passwords(void) reset_passwords(void)
{ {
@ -272,6 +283,9 @@ iface_patt_list:
| iface_patt_list ',' iface_patt_node | 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: { iface_patt_init: {
/* Generic this_ipatt init */ /* Generic this_ipatt init */
this_ipatt = cfg_allocz(sizeof(struct iface_patt)); this_ipatt = cfg_allocz(sizeof(struct iface_patt));

View file

@ -89,7 +89,7 @@ bfd_iface_opt_list:
| '{' bfd_iface_opts '}' | '{' 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); }; { add_tail(&BFD_CFG->patt_list, NODE this_ipatt); };
bfd_multihop: bfd_iface_start bfd_iface_opt_list bfd_multihop: bfd_iface_start bfd_iface_opt_list

View file

@ -386,6 +386,10 @@ ospf_instance_id:
| INSTANCE expr { set_instance_id($2); } | 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: ospf_iface_opts:
/* empty */ /* empty */
| ospf_iface_opts ospf_iface_item ';' | ospf_iface_opts ospf_iface_item ';'
@ -397,7 +401,7 @@ ospf_iface_opt_list:
; ;
ospf_iface: 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: opttext:

View file

@ -138,7 +138,7 @@ radv_iface_opt_list:
; ;
radv_iface: 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 radv_prefix_start: prefix

View file

@ -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 rip_iface_init iface_patt_list rip_iface_opt_list
; ;