diff --git a/doc/bird.sgml b/doc/bird.sgml index 02773dd4..f991bad0 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -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 section for detailed - description of interface patterns. + description of interface patterns with extended clauses. listen bgp [address 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 interface 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 + common option for detailed description. The Direct protocol uses + extended interface clauses.

Direct device routes don't contain any specific attributes. @@ -2468,9 +2473,11 @@ protocol ospf <name> { interface pattern [instance Defines that the specified interfaces belong to the area being defined. See 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. virtual link id [instance Virtual link to router with the router id. Virtual link acts as a diff --git a/nest/config.Y b/nest/config.Y index 59d354b8..5b544e59 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -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)); diff --git a/proto/bfd/config.Y b/proto/bfd/config.Y index 1bf8764f..67a4983b 100644 --- a/proto/bfd/config.Y +++ b/proto/bfd/config.Y @@ -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 diff --git a/proto/ospf/config.Y b/proto/ospf/config.Y index f894f134..90f289d0 100644 --- a/proto/ospf/config.Y +++ b/proto/ospf/config.Y @@ -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: diff --git a/proto/radv/config.Y b/proto/radv/config.Y index ff70a2f7..88a9e298 100644 --- a/proto/radv/config.Y +++ b/proto/radv/config.Y @@ -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 diff --git a/proto/rip/config.Y b/proto/rip/config.Y index 791c43a2..76397520 100644 --- a/proto/rip/config.Y +++ b/proto/rip/config.Y @@ -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 ;