summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/bird.sgml58
-rw-r--r--proto/bgp/bgp.c33
-rw-r--r--proto/bgp/config.Y2
3 files changed, 51 insertions, 42 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml
index 421be713..52520a7e 100644
--- a/doc/bird.sgml
+++ b/doc/bird.sgml
@@ -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
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c
index cc5318e8..f5b6b8fc 100644
--- a/proto/bgp/bgp.c
+++ b/proto/bgp/bgp.c
@@ -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");
diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y
index 185b1bda..e93501d3 100644
--- a/proto/bgp/config.Y
+++ b/proto/bgp/config.Y
@@ -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; }