diff options
-rw-r--r-- | doc/bird.sgml | 34 | ||||
-rw-r--r-- | proto/bgp/attrs.c | 4 | ||||
-rw-r--r-- | proto/bgp/bgp.c | 12 | ||||
-rw-r--r-- | proto/bgp/bgp.h | 1 | ||||
-rw-r--r-- | proto/bgp/config.Y | 1 |
5 files changed, 32 insertions, 20 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml index 4bbcb871..01b59c6a 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -2047,8 +2047,9 @@ using the following configuration parameters: <tag><label id="bgp-iface">interface <m/string/</tag> Define interface we should use for link-local BGP IPv6 sessions. Interface can also be specified as a part of <cf/neighbor address/ - (e.g., <cf/neighbor fe80::1234%eth0 as 65000;/). It is an error to use - this parameter for non link-local sessions. + (e.g., <cf/neighbor fe80::1234%eth0 as 65000;/). The option may also be + used for non link-local sessions when it is necessary to explicitly + specify an interface, but only for direct (not multihop) sessions. <tag><label id="bgp-direct">direct</tag> Specify that the neighbor is directly connected. The IP address of the @@ -2232,6 +2233,14 @@ using the following configuration parameters: TX direction. When active, all available routes accepted by the export filter are advertised to the neighbor. Default: off. + <tag><label id="bgp-allow-local-pref">allow bgp_local_pref <m/switch/</tag> + A standard BGP implementation do not send the Local Preference attribute + to eBGP neighbors and ignore this attribute if received from eBGP + neighbors, as per <rfc id="4271">. When this option is enabled on an + eBGP session, this attribute will be sent to and accepted from the peer, + which is useful for example if you have a setup like in <rfc id="7938">. + The option does not affect iBGP sessions. Default: off. + <tag><label id="bgp-allow-local-as">allow local as [<m/number/]</tag> BGP prevents routing loops by rejecting received routes with the local AS number in the AS path. This option allows to loose or disable the @@ -3991,16 +4000,17 @@ protocol rip [ng] [<name>] { <p><code> protocol rip { - debug all; - port 1520; - period 12; - garbage time 60; - interface "eth0" { metric 3; mode multicast; }; - interface "eth*" { metric 2; mode broadcast; }; - authentication cryptographic; - password "secret-shared-key" { algorithm hmac sha256; }; - import filter { print "importing"; accept; }; - export filter { print "exporting"; accept; }; + import all; + export all; + interface "eth*" { + metric 2; + port 1520; + mode multicast; + update time 12; + timeout time 60; + authentication cryptographic; + password "secret" { algorithm hmac sha256; }; + }; } </code> diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c index cf9db1c8..882ba44e 100644 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@ -358,14 +358,14 @@ bgp_decode_med(struct bgp_parse_state *s, uint code UNUSED, uint flags, byte *da static void bgp_export_local_pref(struct bgp_export_state *s, eattr *a) { - if (!s->proto->is_interior) + if (!s->proto->is_interior && !s->proto->cf->allow_local_pref) UNSET(a); } static void bgp_decode_local_pref(struct bgp_parse_state *s, uint code UNUSED, uint flags, byte *data, uint len, ea_list **to) { - if (!s->proto->is_interior) + if (!s->proto->is_interior && !s->proto->cf->allow_local_pref) DISCARD(BAD_EBGP, "LOCAL_PREF"); if (len != 4) diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 86f7be1b..b9a1d157 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -979,7 +979,7 @@ bgp_find_proto(sock *sk) WALK_LIST(p, proto_list) if ((p->p.proto == &proto_bgp) && ipa_equal(p->cf->remote_ip, sk->daddr) && - (!ipa_is_link_local(sk->daddr) || (p->cf->iface == sk->iface)) && + (!p->cf->iface || (p->cf->iface == sk->iface)) && (ipa_zero(p->cf->local_ip) || ipa_equal(p->cf->local_ip, sk->saddr)) && (p->cf->local_port == sk->sport)) return p; @@ -1608,11 +1608,8 @@ bgp_postconfig(struct proto_config *CF) if (!cf->remote_as) cf_error("Remote AS number must be set"); - // if (ipa_is_link_local(c->remote_ip) && !c->iface) - // cf_error("Link-local neighbor address requires specified interface"); - - if (!ipa_is_link_local(cf->remote_ip) != !cf->iface) - cf_error("Link-local address and interface scope must be used together"); + if (ipa_is_link_local(cf->remote_ip) && !cf->iface) + cf_error("Link-local neighbor address requires specified interface"); if (!(cf->capabilities && cf->enable_as4) && (cf->remote_as > 0xFFFF)) cf_error("Neighbor AS number out of range (AS4 not available)"); @@ -1630,6 +1627,9 @@ bgp_postconfig(struct proto_config *CF) ipa_is_link_local(cf->remote_ip))) cf_error("Multihop BGP cannot be used with link-local addresses"); + if (cf->multihop && cf->iface) + cf_error("Multihop BGP cannot be bound to interface"); + if (cf->multihop && cf->check_link) cf_error("Multihop BGP cannot depend on link state"); diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index 61d3600d..7ffcb68a 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -105,6 +105,7 @@ struct bgp_config { int passive; /* Do not initiate outgoing connection */ int interpret_communities; /* Hardwired handling of well-known communities */ int allow_local_as; /* Allow that number of local ASNs in incoming AS_PATHs */ + int allow_local_pref; /* Allow LOCAL_PREF in EBGP sessions */ int gr_mode; /* Graceful restart mode (BGP_GR_*) */ int setkey; /* Set MD5 password to system SA/SP database */ unsigned gr_time; /* Graceful restart timeout */ diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y index 63e82285..941ae5b6 100644 --- a/proto/bgp/config.Y +++ b/proto/bgp/config.Y @@ -126,6 +126,7 @@ bgp_proto: | bgp_proto INTERPRET COMMUNITIES bool ';' { BGP_CFG->interpret_communities = $4; } | bgp_proto ALLOW LOCAL AS ';' { BGP_CFG->allow_local_as = -1; } | bgp_proto ALLOW LOCAL AS expr ';' { BGP_CFG->allow_local_as = $5; } + | bgp_proto ALLOW BGP_LOCAL_PREF bool ';' { BGP_CFG->allow_local_pref = $4; } | bgp_proto GRACEFUL RESTART bool ';' { BGP_CFG->gr_mode = $4; } | bgp_proto GRACEFUL RESTART AWARE ';' { BGP_CFG->gr_mode = BGP_GR_AWARE; } | bgp_proto GRACEFUL RESTART TIME expr ';' { BGP_CFG->gr_time = $5; } |