From f3e59178506dab9d54cf19ec701f8d9a7fe283f9 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Sun, 24 Nov 2013 12:37:24 +0100 Subject: [PATCH] Enables multihop mode for IBGP by default. 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 | 56 +++++++++++++++++++++++++--------------------- proto/bgp/bgp.c | 33 ++++++++++++++------------- proto/bgp/config.Y | 2 ++ 3 files changed, 50 insertions(+), 41 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: - local [ 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 local [ 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 neighbor 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. - neighbor Define neighboring router - this instance will be talking to and what AS it's located in. Unless - you use the direct 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 multihop [ 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 multihop [ 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 source address 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 . Default: . Default: igp table 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; }