]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Check validity of interface definitions.
authorOndrej Zajicek <santiago@crfreenet.org>
Sun, 30 Mar 2014 22:56:44 +0000 (00:56 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Sun, 30 Mar 2014 23:52:28 +0000 (01:52 +0200)
Thanks to Aleksey Berezin for the bugreport.

doc/bird.sgml
nest/config.Y
proto/bfd/config.Y
proto/ospf/config.Y
proto/radv/config.Y
proto/rip/config.Y

index 02773dd4ec5bd3dc3915f933b109121014d812ed..f991bad0147c02ff243f32f32b0092772bdc0c12 100644 (file)
@@ -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 &lt;name&gt; {
        <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
index 59d354b821aa55542e648eba444df26139a18fbc..5b544e5991c9e3ead0615d60cc6dcca1f9533e46 100644 (file)
@@ -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));
index 1bf8764f9135171520bb5384539299ada6e46684..67a4983b110014f3eff44a39f18db803714f9b9c 100644 (file)
@@ -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
index f894f134fa5cccfc640b2001ab9e4f948d72b990..90f289d083c6b04fdea6e3bf0f04ea143aa4e54c 100644 (file)
@@ -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:
index ff70a2f7ffc3272c76376aa080e032fb9fc6a971..88a9e298eb9249b5819909d4d70bfe4a3d8e2b15 100644 (file)
@@ -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
index 791c43a2cdbdb2942eff622feb49bb7514114867..7639752043f6ad6ba76016af97e4c8588b7198b0 100644 (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
  ;