Implements default router preference (RFC 4191) for RAdv.
Thanks to Baptiste Jonglez for the patch.
This commit is contained in:
parent
6285793f18
commit
751482899c
5 changed files with 30 additions and 6 deletions
|
@ -3013,6 +3013,10 @@ definitions, prefix definitions and DNS definitions:
|
||||||
as a default router. For <cf/sensitive/ option, see <ref id="dsc-trigger" name="trigger">.
|
as a default router. For <cf/sensitive/ option, see <ref id="dsc-trigger" name="trigger">.
|
||||||
Default: 3 * <cf/max ra interval/, <cf/sensitive/ yes.
|
Default: 3 * <cf/max ra interval/, <cf/sensitive/ yes.
|
||||||
|
|
||||||
|
<tag>default preference low|medium|high</tag>
|
||||||
|
This option specifies the Default Router Preference value to advertise
|
||||||
|
to hosts. Default: medium.
|
||||||
|
|
||||||
<tag>rdnss local <m/switch/</tag>
|
<tag>rdnss local <m/switch/</tag>
|
||||||
Use only local (interface-specific) RDNSS definitions for this
|
Use only local (interface-specific) RDNSS definitions for this
|
||||||
interface. Otherwise, both global and local definitions are used. Could
|
interface. Otherwise, both global and local definitions are used. Could
|
||||||
|
|
|
@ -30,9 +30,9 @@ CF_KEYWORDS(RADV, PREFIX, INTERFACE, MIN, MAX, RA, DELAY, INTERVAL,
|
||||||
MANAGED, OTHER, CONFIG, LINK, MTU, REACHABLE, TIME, RETRANS,
|
MANAGED, OTHER, CONFIG, LINK, MTU, REACHABLE, TIME, RETRANS,
|
||||||
TIMER, CURRENT, HOP, LIMIT, DEFAULT, VALID, PREFERRED, MULT,
|
TIMER, CURRENT, HOP, LIMIT, DEFAULT, VALID, PREFERRED, MULT,
|
||||||
LIFETIME, SKIP, ONLINK, AUTONOMOUS, RDNSS, DNSSL, NS, DOMAIN,
|
LIFETIME, SKIP, ONLINK, AUTONOMOUS, RDNSS, DNSSL, NS, DOMAIN,
|
||||||
LOCAL, TRIGGER, SENSITIVE)
|
LOCAL, TRIGGER, SENSITIVE, PREFERENCE, LOW, MEDIUM, HIGH)
|
||||||
|
|
||||||
%type<i> radv_mult radv_sensitive
|
%type<i> radv_mult radv_sensitive radv_preference
|
||||||
|
|
||||||
CF_GRAMMAR
|
CF_GRAMMAR
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ radv_iface_start:
|
||||||
RADV_IFACE->current_hop_limit = DEFAULT_CURRENT_HOP_LIMIT;
|
RADV_IFACE->current_hop_limit = DEFAULT_CURRENT_HOP_LIMIT;
|
||||||
RADV_IFACE->default_lifetime = -1;
|
RADV_IFACE->default_lifetime = -1;
|
||||||
RADV_IFACE->default_lifetime_sensitive = 1;
|
RADV_IFACE->default_lifetime_sensitive = 1;
|
||||||
|
RADV_IFACE->default_preference = RA_PREF_MEDIUM;
|
||||||
};
|
};
|
||||||
|
|
||||||
radv_iface_item:
|
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 (($3 < 0) || ($3 > 9000)) cf_error("Default lifetime must be in range 0-9000");
|
||||||
if ($4 != -1) RADV_IFACE->default_lifetime_sensitive = $4;
|
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); }
|
| 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); }
|
| 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); }
|
| 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; }
|
| 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:
|
radv_iface_finish:
|
||||||
{
|
{
|
||||||
struct radv_iface_config *ic = RADV_IFACE;
|
struct radv_iface_config *ic = RADV_IFACE;
|
||||||
|
|
|
@ -251,10 +251,11 @@ radv_prepare_ra(struct radv_iface *ifa)
|
||||||
pkt->code = 0;
|
pkt->code = 0;
|
||||||
pkt->checksum = 0;
|
pkt->checksum = 0;
|
||||||
pkt->current_hop_limit = ic->current_hop_limit;
|
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) ?
|
pkt->router_lifetime = (ra->active || !ic->default_lifetime_sensitive) ?
|
||||||
htons(ic->default_lifetime) : 0;
|
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->reachable_time = htonl(ic->reachable_time);
|
||||||
pkt->retrans_timer = htonl(ic->retrans_timer);
|
pkt->retrans_timer = htonl(ic->retrans_timer);
|
||||||
buf += sizeof(*pkt);
|
buf += sizeof(*pkt);
|
||||||
|
@ -330,10 +331,15 @@ radv_send_ra(struct radv_iface *ifa, int shutdown)
|
||||||
|
|
||||||
if (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;
|
struct radv_ra_packet *pkt = (void *) ifa->sk->tbuf;
|
||||||
pkt->router_lifetime = 0;
|
pkt->router_lifetime = 0;
|
||||||
|
pkt->flags &= ~RA_PREF_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
RADV_TRACE(D_PACKETS, "Sending RA via %s", ifa->iface->name);
|
RADV_TRACE(D_PACKETS, "Sending RA via %s", ifa->iface->name);
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
* Supported standards:
|
* Supported standards:
|
||||||
* - RFC 4861 - main RA standard
|
* - RFC 4861 - main RA standard
|
||||||
* - RFC 6106 - DNS extensions (RDDNS, DNSSL)
|
* - RFC 6106 - DNS extensions (RDDNS, DNSSL)
|
||||||
|
* - RFC 4191 (partial) - Default Router Preference
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -80,6 +80,7 @@ struct radv_iface_config
|
||||||
u32 current_hop_limit;
|
u32 current_hop_limit;
|
||||||
u32 default_lifetime;
|
u32 default_lifetime;
|
||||||
u8 default_lifetime_sensitive; /* Whether default_lifetime depends on trigger */
|
u8 default_lifetime_sensitive; /* Whether default_lifetime depends on trigger */
|
||||||
|
u8 default_preference; /* Default Router Preference (RFC 4191) */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct radv_prefix_config
|
struct radv_prefix_config
|
||||||
|
@ -144,6 +145,11 @@ struct radv_iface
|
||||||
#define RA_EV_CHANGE 2 /* Change of options or prefixes */
|
#define RA_EV_CHANGE 2 /* Change of options or prefixes */
|
||||||
#define RA_EV_RS 3 /* Received RS */
|
#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
|
#ifdef LOCAL_DEBUG
|
||||||
|
|
Loading…
Reference in a new issue