diff options
-rw-r--r-- | doc/bird.sgml | 21 | ||||
-rw-r--r-- | proto/ospf/config.Y | 25 |
2 files changed, 33 insertions, 13 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml index 3edd6e0e..820ebaa2 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1811,7 +1811,7 @@ protocol ospf <name> { summary <switch>; cost <num>; } - interface <interface pattern> { + interface <interface pattern> [instance <num>] { cost <num>; stub <switch>; hello <num>; @@ -1841,7 +1841,7 @@ protocol ospf <name> { <ip> eligible; }; }; - virtual link <id> { + virtual link <id> [instance <num>] { hello <num>; retransmit <num>; wait <num>; @@ -1961,14 +1961,19 @@ protocol ospf <name> { subnetworks of given stub network are suppressed. This might be used, for example, to aggregate generated stub networks. - <tag>interface <M>pattern</M></tag> + <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. - - <tag>virtual link <M>id</M></tag> - Virtual link to router with the router id. Virtual link acts as a - point-to-point interface belonging to backbone. The actual area is - used as transport area. This item cannot be in the backbone. + 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 point-to-point interface belonging to backbone. The + actual area is used as transport area. This item cannot be in + the backbone. In OSPFv3, you could also use several virtual + links to one destination with different instance IDs. <tag>cost <M>num</M></tag> Specifies output cost (metric) of an interface. Default value is 10. diff --git a/proto/ospf/config.Y b/proto/ospf/config.Y index 38e59886..0c36b7f8 100644 --- a/proto/ospf/config.Y +++ b/proto/ospf/config.Y @@ -107,7 +107,17 @@ static inline void check_defcost(int cost) { if ((cost <= 0) || (cost >= LSINFINITY)) - cf_error("Default cost must be in range 1-%d", LSINFINITY); + cf_error("Default cost must be in range 1-%d", LSINFINITY-1); +} + +static inline void +set_instance_id(unsigned id) +{ +#ifdef OSPFv3 + OSPF_PATT->instance_id = id; +#else + cf_error("Instance ID requires OSPFv3"); +#endif } CF_DECLS @@ -120,7 +130,7 @@ CF_KEYWORDS(NONE, SIMPLE, AUTHENTICATION, STRICT, CRYPTOGRAPHIC) CF_KEYWORDS(ELIGIBLE, POLL, NETWORKS, HIDDEN, VIRTUAL, CHECK, LINK) CF_KEYWORDS(RX, BUFFER, LARGE, NORMAL, STUBNET, HIDDEN, SUMMARY, TAG, EXTERNAL) CF_KEYWORDS(WAIT, DELAY, LSADB, ECMP, LIMIT, WEIGHT, NSSA, TRANSLATOR, STABILITY) -CF_KEYWORDS(GLOBAL, LSID, ROUTER, SELF) +CF_KEYWORDS(GLOBAL, LSID, ROUTER, SELF, INSTANCE) %type <t> opttext %type <ld> lsadb_args @@ -218,8 +228,8 @@ ospf_stubnet_item: ; ospf_vlink: - ospf_vlink_start '{' ospf_vlink_opts '}' { ospf_iface_finish(); } - | ospf_vlink_start { ospf_iface_finish(); } + ospf_vlink_start ospf_instance_id '{' ospf_vlink_opts '}' { ospf_iface_finish(); } + | ospf_vlink_start ospf_instance_id { ospf_iface_finish(); } ; ospf_vlink_opts: @@ -364,6 +374,11 @@ ospf_iface_start: } ; +ospf_instance_id: + /* empty */ + | INSTANCE expr { set_instance_id($2); } + ; + ospf_iface_opts: /* empty */ | ospf_iface_opts ospf_iface_item ';' @@ -375,7 +390,7 @@ ospf_iface_opt_list: ; ospf_iface: - ospf_iface_start iface_patt_list ospf_iface_opt_list { ospf_iface_finish(); } + ospf_iface_start iface_patt_list ospf_instance_id ospf_iface_opt_list { ospf_iface_finish(); } ; opttext: |