]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Enables multihop mode for IBGP by default.
authorOndrej Zajicek <santiago@crfreenet.org>
Sun, 24 Nov 2013 11:37:24 +0000 (12:37 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Sun, 24 Nov 2013 11:37:24 +0000 (12:37 +0100)
This is more consistent with common usage and also with the behavior of
other implementations (Cisco, Juniper).

Also changes the default for gw mode to be based solely on
direct/multihop.

doc/bird.sgml
proto/bgp/bgp.c
proto/bgp/config.Y

index 421be7130b744477efa4d3d859afd19c5498474b..52520a7e853b26a18ecd36c1395c74c713235f6d 100644 (file)
@@ -1536,33 +1536,37 @@ This allows to set routing policy and all the other parameters differently
 for each neighbor using the following configuration parameters:
 
 <descrip>
-       <tag>local [<m/ip/] as <m/number/</tag> Define which AS we
-       are part of. (Note that contrary to other IP routers, BIRD is
-       able to act as a router located in multiple AS'es
-       simultaneously, but in such cases you need to tweak the BGP
-       paths manually in the filters to get consistent behavior.)
-       Optional <cf/ip/ argument specifies a source address,
-       equivalent to the <cf/source address/ option (see below).
+       <tag>local [<m/ip/] as <m/number/</tag> Define which AS we are part
+       of. (Note that contrary to other IP routers, BIRD is able to act as a
+       router located in multiple AS'es simultaneously, but in such cases you
+       need to tweak the BGP paths manually in the filters to get consistent
+       behavior.) Optional <cf/ip/ argument specifies a source address,
+       equivalent to the <cf/source address/ option (see below).  This
+       parameter is mandatory.
+
+       <tag>neighbor <m/ip/ as <m/number/</tag> Define neighboring router this
+       instance will be talking to and what AS it's located in. In case the
+       neighbor is in the same AS as we are, we automatically switch to iBGP.
        This parameter is mandatory.
 
-       <tag>neighbor <m/ip/ as <m/number/</tag> Define neighboring router
-       this instance will be talking to and what AS it's located in. Unless
-       you use the <cf/multihop/ clause, it must be directly connected to one
-       of your router's interfaces. In case the neighbor is in the same AS
-       as we are, we automatically switch to iBGP. This parameter is mandatory.
-
-       <tag>multihop [<m/number/]</tag> Configure multihop BGP
-       session to a neighbor that isn't directly connected.
-       Accurately, this option should be used if the configured
-       neighbor IP address does not match with any local network
-       subnets. Such IP address have to be reachable through system
-       routing table. For multihop BGP it is recommended to
-       explicitly configure <cf/source address/ to have it
-       stable. Optional <cf/number/ argument can be used to specify
-       the number of hops (used for TTL). Note that the number of
-       networks (edges) in a path is counted, i.e. if two BGP
-       speakers are separated by one router, the number of hops is
-       2. Default: switched off.
+       <tag>direct</tag> Specify that the neighbor is directly connected. The
+       IP address of the neighbor must be from a directly reachable IP range
+       (i.e. associated with one of your router's interfaces), otherwise the
+       BGP session wouldn't start but it would wait for such interface to
+       appear. The alternative is the <cf/multihop/ option.  Default: enabled
+       for eBGP.
+
+       <tag>multihop [<m/number/]</tag> Configure multihop BGP session to a
+       neighbor that isn't directly connected.  Accurately, this option should
+       be used if the configured neighbor IP address does not match with any
+       local network subnets. Such IP address have to be reachable through
+       system routing table.  The alternative is the <cf/direct/ option. For
+       multihop BGP it is recommended to explicitly configure the source
+       address to have it stable. Optional <cf/number/ argument can be used to
+       specify the number of hops (used for TTL). Note that the number of
+       networks (edges) in a path is counted; i.e., if two BGP speakers are
+       separated by one router, the number of hops is 2. Default: enabled for
+       iBGP.
 
        <tag>source address <m/ip/</tag> Define local address we
        should use for next hop calculation and as a source address
@@ -1609,8 +1613,8 @@ for each neighbor using the following configuration parameters:
        table, and was used in older versions of BIRD, but does not
        handle well nontrivial iBGP setups and multihop.  Recursive
        mode is incompatible with <ref id="dsc-sorted" name="sorted
-       tables">. Default: <cf/direct/ for singlehop eBGP,
-       <cf/recursive/ otherwise.
+       tables">. Default: <cf/direct/ for direct sessions,
+       <cf/recursive/ for multihop sessions.
 
        <tag>igp table <m/name/</tag> Specifies a table that is used
        as an IGP routing table. Default: the same as the table BGP is
index cc5318e84bb38566f307dc4e4e8c698a7c7441c7..f5b6b8fcca99c8a9f6336eaba1dc88c2b51b276c 100644 (file)
@@ -1006,6 +1006,24 @@ bgp_check_config(struct bgp_config *c)
   if (c->c.class == SYM_TEMPLATE)
     return;
 
+
+  /* EBGP direct by default, IBGP multihop by default */
+  if (c->multihop < 0)
+    c->multihop = internal ? 64 : 0;
+
+  /* Different default for gw_mode */
+  if (!c->gw_mode)
+    c->gw_mode = c->multihop ? GW_RECURSIVE : GW_DIRECT;
+
+  /* Different default based on rs_client */
+  if (!c->missing_lladdr)
+    c->missing_lladdr = c->rs_client ? MLL_IGNORE : MLL_SELF;
+
+  /* Disable after error incompatible with restart limit action */
+  if (c->c.in_limit && (c->c.in_limit->action == PLA_RESTART) && c->disable_after_error)
+    c->c.in_limit->action = PLA_DISABLE;
+
+
   if (!c->local_as)
     cf_error("Local AS number must be set");
 
@@ -1021,7 +1039,6 @@ bgp_check_config(struct bgp_config *c)
   if (internal && c->rs_client)
     cf_error("Only external neighbor can be RS client");
 
-
   if (c->multihop && (c->gw_mode == GW_DIRECT))
     cf_error("Multihop BGP cannot use direct gateway mode");
 
@@ -1032,20 +1049,6 @@ bgp_check_config(struct bgp_config *c)
   if (c->multihop && c->bfd && ipa_zero(c->source_addr))
     cf_error("Multihop BGP with BFD requires specified source address");
 
-
-  /* Different default based on rs_client */
-  if (!c->missing_lladdr)
-    c->missing_lladdr = c->rs_client ? MLL_IGNORE : MLL_SELF;
-
-  /* Different default for gw_mode */
-  if (!c->gw_mode)
-    c->gw_mode = (c->multihop || internal) ? GW_RECURSIVE : GW_DIRECT;
-
-  /* Disable after error incompatible with restart limit action */
-  if (c->c.in_limit && (c->c.in_limit->action == PLA_RESTART) && c->disable_after_error)
-    c->c.in_limit->action = PLA_DISABLE;
-
-
   if ((c->gw_mode == GW_RECURSIVE) && c->c.table->sorted)
     cf_error("BGP in recursive mode prohibits sorted table");
 
index 185b1bda5189d3445f98c3f653c1ce3a70b43d9d..e93501d3a97ec29703512e04d1f0b39c6b1d4c76 100644 (file)
@@ -34,6 +34,7 @@ CF_ADDTO(proto, bgp_proto '}' { bgp_check_config(BGP_CFG); } )
 
 bgp_proto_start: proto_start BGP {
      this_proto = proto_config_new(&proto_bgp, sizeof(struct bgp_config), $1);
+     BGP_CFG->multihop = -1;   /* undefined */
      BGP_CFG->hold_time = 240;
      BGP_CFG->connect_retry_time = 120;
      BGP_CFG->initial_hold_time = 240;
@@ -74,6 +75,7 @@ bgp_proto:
  | bgp_proto STARTUP HOLD TIME expr ';' { BGP_CFG->initial_hold_time = $5; }
  | bgp_proto CONNECT RETRY TIME expr ';' { BGP_CFG->connect_retry_time = $5; }
  | bgp_proto KEEPALIVE TIME expr ';' { BGP_CFG->keepalive_time = $4; }
+ | bgp_proto DIRECT ';' { BGP_CFG->multihop = 0; }
  | bgp_proto MULTIHOP ';' { BGP_CFG->multihop = 64; }
  | bgp_proto MULTIHOP expr ';' { BGP_CFG->multihop = $3; if (($3<1) || ($3>255)) cf_error("Multihop must be in range 1-255"); }
  | bgp_proto NEXT HOP SELF ';' { BGP_CFG->next_hop_self = 1; BGP_CFG->next_hop_keep = 0; }