From 9d5960cfa5b4c15ddd48dbab599f864a6aa1e025 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Tue, 10 Jun 2014 12:16:01 +0200 Subject: Fixes max include depth in documentation. Thanks to Artyom Gavrichenkov for the patch. --- doc/bird.sgml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc/bird.sgml') diff --git a/doc/bird.sgml b/doc/bird.sgml index fa4c777f..beacd4be 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -318,7 +318,7 @@ protocol rip {

include " This statement causes inclusion of a new file. + This option specifies the Default Router Preference value to advertise + to hosts. Default: medium. + rdnss local Use only local (interface-specific) RDNSS definitions for this interface. Otherwise, both global and local definitions are used. Could diff --git a/proto/radv/config.Y b/proto/radv/config.Y index 88a9e298..a26ea88e 100644 --- a/proto/radv/config.Y +++ b/proto/radv/config.Y @@ -30,9 +30,9 @@ CF_KEYWORDS(RADV, PREFIX, INTERFACE, MIN, MAX, RA, DELAY, INTERVAL, MANAGED, OTHER, CONFIG, LINK, MTU, REACHABLE, TIME, RETRANS, TIMER, CURRENT, HOP, LIMIT, DEFAULT, VALID, PREFERRED, MULT, LIFETIME, SKIP, ONLINK, AUTONOMOUS, RDNSS, DNSSL, NS, DOMAIN, - LOCAL, TRIGGER, SENSITIVE) + LOCAL, TRIGGER, SENSITIVE, PREFERENCE, LOW, MEDIUM, HIGH) -%type radv_mult radv_sensitive +%type radv_mult radv_sensitive radv_preference CF_GRAMMAR @@ -84,6 +84,7 @@ radv_iface_start: RADV_IFACE->current_hop_limit = DEFAULT_CURRENT_HOP_LIMIT; RADV_IFACE->default_lifetime = -1; RADV_IFACE->default_lifetime_sensitive = 1; + RADV_IFACE->default_preference = RA_PREF_MEDIUM; }; radv_iface_item: @@ -101,6 +102,7 @@ radv_iface_item: if (($3 < 0) || ($3 > 9000)) cf_error("Default lifetime must be in range 0-9000"); if ($4 != -1) RADV_IFACE->default_lifetime_sensitive = $4; } + | DEFAULT PREFERENCE radv_preference { RADV_IFACE->default_preference = $3; } | PREFIX radv_prefix { add_tail(&RADV_IFACE->pref_list, NODE this_radv_prefix); } | RDNSS { init_list(&radv_dns_list); } radv_rdnss { add_tail_list(&RADV_IFACE->rdnss_list, &radv_dns_list); } | DNSSL { init_list(&radv_dns_list); } radv_dnssl { add_tail_list(&RADV_IFACE->dnssl_list, &radv_dns_list); } @@ -108,6 +110,11 @@ radv_iface_item: | DNSSL LOCAL bool { RADV_IFACE->dnssl_local = $3; } ; +radv_preference: + LOW { $$ = RA_PREF_LOW; } + | MEDIUM { $$ = RA_PREF_MEDIUM; } + | HIGH { $$ = RA_PREF_HIGH; } + radv_iface_finish: { struct radv_iface_config *ic = RADV_IFACE; diff --git a/proto/radv/packets.c b/proto/radv/packets.c index 1d7e04f4..ef869722 100644 --- a/proto/radv/packets.c +++ b/proto/radv/packets.c @@ -251,10 +251,11 @@ radv_prepare_ra(struct radv_iface *ifa) pkt->code = 0; pkt->checksum = 0; pkt->current_hop_limit = ic->current_hop_limit; - pkt->flags = (ic->managed ? OPT_RA_MANAGED : 0) | - (ic->other_config ? OPT_RA_OTHER_CFG : 0); pkt->router_lifetime = (ra->active || !ic->default_lifetime_sensitive) ? htons(ic->default_lifetime) : 0; + pkt->flags = (ic->managed ? OPT_RA_MANAGED : 0) | + (ic->other_config ? OPT_RA_OTHER_CFG : 0) | + (pkt->router_lifetime ? ic->default_preference : 0); pkt->reachable_time = htonl(ic->reachable_time); pkt->retrans_timer = htonl(ic->retrans_timer); buf += sizeof(*pkt); @@ -330,10 +331,15 @@ radv_send_ra(struct radv_iface *ifa, int shutdown) if (shutdown) { - /* Modify router lifetime to 0, it is not restored because - we suppose that the iface will be removed */ + /* + * Modify router lifetime to 0, it is not restored because we suppose that + * the iface will be removed. The preference value also has to be zeroed. + * (RFC 4191 2.2: If router lifetime is 0, the preference value must be 0.) + */ + struct radv_ra_packet *pkt = (void *) ifa->sk->tbuf; pkt->router_lifetime = 0; + pkt->flags &= ~RA_PREF_MASK; } RADV_TRACE(D_PACKETS, "Sending RA via %s", ifa->iface->name); diff --git a/proto/radv/radv.c b/proto/radv/radv.c index 90408536..6be7cd84 100644 --- a/proto/radv/radv.c +++ b/proto/radv/radv.c @@ -40,6 +40,7 @@ * Supported standards: * - RFC 4861 - main RA standard * - RFC 6106 - DNS extensions (RDDNS, DNSSL) + * - RFC 4191 (partial) - Default Router Preference */ static void diff --git a/proto/radv/radv.h b/proto/radv/radv.h index f80e4530..bb80d65f 100644 --- a/proto/radv/radv.h +++ b/proto/radv/radv.h @@ -80,6 +80,7 @@ struct radv_iface_config u32 current_hop_limit; u32 default_lifetime; u8 default_lifetime_sensitive; /* Whether default_lifetime depends on trigger */ + u8 default_preference; /* Default Router Preference (RFC 4191) */ }; struct radv_prefix_config @@ -144,6 +145,11 @@ struct radv_iface #define RA_EV_CHANGE 2 /* Change of options or prefixes */ #define RA_EV_RS 3 /* Received RS */ +/* Default Router Preferences (RFC 4191) */ +#define RA_PREF_LOW 0x18 +#define RA_PREF_MEDIUM 0x00 +#define RA_PREF_HIGH 0x08 +#define RA_PREF_MASK 0x18 #ifdef LOCAL_DEBUG -- cgit v1.2.3 From dcde7ae597ccb7d81648b9ecab7c0f61c88e60f2 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Thu, 2 Oct 2014 11:33:55 +0200 Subject: Allows to configure different remote port for BGP sessions. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to João Taveira Araújo for the original patch. --- conf/confbase.Y | 12 ++++++++++-- doc/bird.sgml | 5 ++--- proto/bgp/bgp.c | 4 ++-- proto/bgp/bgp.h | 1 + proto/bgp/config.Y | 5 +++-- 5 files changed, 18 insertions(+), 9 deletions(-) (limited to 'doc/bird.sgml') diff --git a/conf/confbase.Y b/conf/confbase.Y index cba6fc56..49831b1a 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -72,7 +72,7 @@ CF_DECLS %token TEXT %type ipa_scope -%type expr bool pxlen +%type expr bool pxlen ipa_port %type expr_us %type

] [protocol

] [stats|count]]], [[Show routing table]]) +CF_CLI(SHOW ROUTE, r_args, [[[|for |for ] [table ] [filter |where ] [all] [primary] [filtered] [(export|preexport|noexport)

] [protocol

] [stats|count]]], [[Show routing table]]) { rt_show($3); } ; r_args: @@ -492,7 +492,7 @@ r_args: $$ = $1; $$->filtered = 1; } - | r_args export_or_preexport SYM { + | r_args export_mode SYM { struct proto_config *c = (struct proto_config *) $3->def; $$ = $1; if ($$->export_mode) cf_error("Protocol specified twice"); @@ -519,9 +519,10 @@ r_args: } ; -export_or_preexport: - PREEXPORT { $$ = 1; } - | EXPORT { $$ = 2; } +export_mode: + PREEXPORT { $$ = RSEM_PREEXPORT; } + | EXPORT { $$ = RSEM_EXPORT; } + | NOEXPORT { $$ = RSEM_NOEXPORT; } ; diff --git a/nest/route.h b/nest/route.h index 82d9e202..5ee04a30 100644 --- a/nest/route.h +++ b/nest/route.h @@ -301,6 +301,12 @@ struct rt_show_data { }; void rt_show(struct rt_show_data *); +/* Value of export_mode in struct rt_show_data */ +#define RSEM_NONE 0 /* Export mode not used */ +#define RSEM_PREEXPORT 1 /* Routes ready for export, before filtering */ +#define RSEM_EXPORT 2 /* Routes accepted by export filter */ +#define RSEM_NOEXPORT 3 /* Routes rejected by export filter */ + /* * Route Attributes * diff --git a/nest/rt-table.c b/nest/rt-table.c index 37dbb33d..59fd0711 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -2255,6 +2255,9 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d) if (d->export_mode) { + if (! d->export_protocol->rt_notify) + return; + a = proto_find_announce_hook(d->export_protocol, d->table); if (!a) return; @@ -2287,18 +2290,20 @@ rt_show_net(struct cli *c, net *n, struct rt_show_data *d) if (ic < 0) goto skip; - if (d->export_mode > 1) + if (d->export_mode > RSEM_PREEXPORT) { /* * FIXME - This shows what should be exported according to current * filters, but not what was really exported. 'configure soft' * command may change the export filter and do not update routes. */ + int do_export = (ic > 0) || + (f_run(a->out_filter, &e, &tmpa, rte_update_pool, FF_FORCE_TMPATTR) <= F_ACCEPT); - if (!ic && (f_run(a->out_filter, &e, &tmpa, rte_update_pool, FF_FORCE_TMPATTR) > F_ACCEPT)) + if (do_export != (d->export_mode == RSEM_EXPORT)) goto skip; - if (ep->accept_ra_types == RA_ACCEPTED) + if ((d->export_mode == RSEM_EXPORT) && (ep->accept_ra_types == RA_ACCEPTED)) pass = 1; } } -- cgit v1.2.3