Florian/folks,
This is an improved version:
Essentially, if the lifetime of a prefix is not specified (i.e., the
admin relies on the default values), the Preferred Lifetime is set to
the Router Lifetime, and the Valid Lifetime is set to Router Lifetime *
48 (one day)
This improve the state of affairs for renumbering events on the router side.
---- cut here ----
diff --git frontend.c frontend.c
index c932c3dfca3..fd0f16779aa 100644
--- frontend.c
+++ frontend.c
@@ -128,7 +128,8 @@ struct ra_iface_conf *find_ra_iface_conf(struct
ra_iface_conf_head *,
struct ra_prefix_conf *find_ra_prefix_conf(struct ra_prefix_conf_head*,
struct in6_addr *, int);
void add_new_prefix_to_ra_iface(struct ra_iface *r,
- struct in6_addr *, int, struct ra_prefix_conf *);
+ struct in6_addr *, int, struct ra_prefix_conf *,
+ struct ra_iface_conf *);
void free_ra_iface(struct ra_iface *);
int in6_mask2prefixlen(struct in6_addr *);
void get_interface_prefixes(struct ra_iface *,
@@ -858,16 +859,16 @@ merge_ra_interfaces(void)
continue;
}
- ra_iface_conf = find_ra_iface_conf(
- &frontend_conf->ra_iface_list, ra_iface->conf_name);
+ ra_iface_conf =
find_ra_iface_conf(&frontend_conf->ra_iface_list,
+ ra_iface->name);
log_debug("add static prefixes for %s", ra_iface->name);
SIMPLEQ_FOREACH(ra_prefix_conf, &ra_iface_conf->ra_prefix_list,
entry) {
add_new_prefix_to_ra_iface(ra_iface,
- &ra_prefix_conf->prefix,
- ra_prefix_conf->prefixlen, ra_prefix_conf);
+ &ra_prefix_conf->prefix, ra_prefix_conf->prefixlen,
+ ra_prefix_conf, ra_iface_conf);
}
if (ra_iface_conf->autoprefix)
@@ -926,6 +927,7 @@ get_interface_prefixes(struct ra_iface *ra_iface,
struct ra_prefix_conf
struct ifaddrs *ifap, *ifa;
struct sockaddr_in6 *sin6;
int prefixlen;
+ struct ra_iface_conf *ra_iface_conf;
log_debug("%s: %s", __func__, ra_iface->name);
@@ -959,8 +961,11 @@ get_interface_prefixes(struct ra_iface *ra_iface,
struct ra_prefix_conf
mask_prefix(&sin6->sin6_addr, prefixlen);
+ ra_iface_conf =
find_ra_iface_conf(&frontend_conf->ra_iface_list,
+ ra_iface->name);
+
add_new_prefix_to_ra_iface(ra_iface, &sin6->sin6_addr,
- prefixlen, autoprefix);
+ prefixlen, autoprefix, ra_iface_conf);
}
freeifaddrs(ifap);
}
@@ -982,7 +987,8 @@ find_ra_prefix_conf(struct ra_prefix_conf_head*
head, struct in6_addr *prefix,
void
add_new_prefix_to_ra_iface(struct ra_iface *ra_iface, struct in6_addr
*addr,
- int prefixlen, struct ra_prefix_conf *ra_prefix_conf)
+ int prefixlen, struct ra_prefix_conf *ra_prefix_conf,
+ struct ra_iface_conf *ra_iface_conf)
{
struct ra_prefix_conf *new_ra_prefix_conf;
@@ -992,14 +998,28 @@ add_new_prefix_to_ra_iface(struct ra_iface
*ra_iface, struct in6_addr *addr,
return;
}
+ ra_iface_conf = find_ra_iface_conf(&frontend_conf->ra_iface_list,
+ ra_iface->name);
+
log_debug("adding %s/%d prefix", in6_to_str(addr), prefixlen);
if ((new_ra_prefix_conf = calloc(1, sizeof(*ra_prefix_conf))) == NULL)
fatal("%s", __func__);
new_ra_prefix_conf->prefix = *addr;
new_ra_prefix_conf->prefixlen = prefixlen;
- new_ra_prefix_conf->vltime = ra_prefix_conf->vltime;
- new_ra_prefix_conf->pltime = ra_prefix_conf->pltime;
+
+ if(ra_prefix_conf->pltime == DEFAULT_PIO_PLTIME &&
+ ra_iface_conf->ra_options.router_lifetime > DEFAULT_PIO_PLTIME) {
+ new_ra_prefix_conf->pltime =
+ ra_iface_conf->ra_options.router_lifetime;
+ new_ra_prefix_conf->vltime = new_ra_prefix_conf->pltime *
+ DFLT_VLTIME_MULT;
+ }
+ else{
+ new_ra_prefix_conf->pltime = ra_prefix_conf->pltime;
+ new_ra_prefix_conf->vltime = ra_prefix_conf->vltime;
+ }
+
new_ra_prefix_conf->aflag = ra_prefix_conf->aflag;
new_ra_prefix_conf->lflag = ra_prefix_conf->lflag;
SIMPLEQ_INSERT_TAIL(&ra_iface->prefixes, new_ra_prefix_conf, entry);
diff --git parse.y parse.y
index bb18c3d9c9c..5c45ced6147 100644
--- parse.y
+++ parse.y
@@ -964,8 +964,8 @@ conf_get_ra_prefix(struct in6_addr *addr, int prefixlen)
if (prefix == NULL)
errx(1, "%s: calloc", __func__);
prefix->prefixlen = prefixlen;
- prefix->vltime = 2592000; /* 30 days */
- prefix->pltime = 604800; /* 7 days */
+ prefix->vltime = DEFAULT_PIO_VLTIME;
+ prefix->pltime = DEFAULT_PIO_PLTIME;
prefix->lflag = 1;
prefix->aflag = 1;
diff --git rad.h rad.h
index 2bbf7c8ed5c..a94dd07bc36 100644
--- rad.h
+++ rad.h
@@ -31,7 +31,9 @@
#define MIN_RTR_ADV_INTERVAL 200
#define MAX_SEARCH 1025 /* same as MAXDNAME in arpa/nameser.h */
#define DEFAULT_RDNS_LIFETIME 600 * 1.5
-
+#define DFLT_VLTIME_MULT 48
+#define DEFAULT_PIO_PLTIME 1800
+#define DEFAULT_PIO_VLTIME 1800 * DFLT_VLTIME_MULT
#define IMSG_DATA_SIZE(imsg) ((imsg).hdr.len - IMSG_HEADER_SIZE)
enum {
---- cut here ----
Also at: https://www.gont.com.ar/code/fgont-patch-rad-pio-lifetimes.txt
On 14/3/20 12:54, Fernando Gont wrote:
Folks,
This improves IPv6 SLAAC handling of renumbering scenarios. At the time
of this writing, this doesn't follow the spec, but is the right thing.
Essentially, PIOs will employ these default values:
Preferred Lifetime = Router Lifetime (as sent by router, defaulting to
1800)
Valid Lifetime= 48 * Preferred Lifetime
(unless you manually set them to something else)
The problem statement for this is in this IETF I-D (v6ops wg item):
https://tools.ietf.org/html/draft-ietf-v6ops-slaac-renum
And the changes are described Section 4.1.1 of this (*individual* I-D):
https://tools.ietf.org/html/draft-gont-6man-slaac-renum-04
Note: More is needed... but this is at least something. If you like the
patch, I may implement the rest of the proposal.
Thoughts?
---- cut here ----
diff --git frontend.c frontend.c
index c932c3dfca3..80c16f953ea 100644
--- frontend.c
+++ frontend.c
@@ -128,7 +128,8 @@ struct ra_iface_conf *find_ra_iface_conf(struct
ra_iface_conf_head *,
struct ra_prefix_conf *find_ra_prefix_conf(struct
ra_prefix_conf_head*,
struct in6_addr *, int);
void add_new_prefix_to_ra_iface(struct ra_iface *r,
- struct in6_addr *, int, struct ra_prefix_conf *);
+ struct in6_addr *, int, struct ra_prefix_conf *,
+ struct ra_iface_conf *);
void free_ra_iface(struct ra_iface *);
int in6_mask2prefixlen(struct in6_addr *);
void get_interface_prefixes(struct ra_iface *,
@@ -858,16 +859,16 @@ merge_ra_interfaces(void)
continue;
}
- ra_iface_conf = find_ra_iface_conf(
- &frontend_conf->ra_iface_list, ra_iface->conf_name);
+ ra_iface_conf = find_ra_iface_conf(&frontend_conf->ra_iface_list,
+ ra_iface->name);
log_debug("add static prefixes for %s", ra_iface->name);
SIMPLEQ_FOREACH(ra_prefix_conf, &ra_iface_conf->ra_prefix_list,
entry) {
add_new_prefix_to_ra_iface(ra_iface,
- &ra_prefix_conf->prefix,
- ra_prefix_conf->prefixlen, ra_prefix_conf);
+ &ra_prefix_conf->prefix, ra_prefix_conf->prefixlen,
+ ra_prefix_conf, ra_iface_conf);
}
if (ra_iface_conf->autoprefix)
@@ -926,6 +927,7 @@ get_interface_prefixes(struct ra_iface *ra_iface,
struct ra_prefix_conf
struct ifaddrs *ifap, *ifa;
struct sockaddr_in6 *sin6;
int prefixlen;
+ struct ra_iface_conf *ra_iface_conf;
log_debug("%s: %s", __func__, ra_iface->name);
@@ -959,8 +961,11 @@ get_interface_prefixes(struct ra_iface *ra_iface,
struct ra_prefix_conf
mask_prefix(&sin6->sin6_addr, prefixlen);
+ ra_iface_conf = find_ra_iface_conf(&frontend_conf->ra_iface_list,
+ ra_iface->name);
+
add_new_prefix_to_ra_iface(ra_iface, &sin6->sin6_addr,
- prefixlen, autoprefix);
+ prefixlen, autoprefix, ra_iface_conf);
}
freeifaddrs(ifap);
}
@@ -982,7 +987,8 @@ find_ra_prefix_conf(struct ra_prefix_conf_head*
head, struct in6_addr *prefix,
void
add_new_prefix_to_ra_iface(struct ra_iface *ra_iface, struct in6_addr
*addr,
- int prefixlen, struct ra_prefix_conf *ra_prefix_conf)
+ int prefixlen, struct ra_prefix_conf *ra_prefix_conf,
+ struct ra_iface_conf *ra_iface_conf)
{
struct ra_prefix_conf *new_ra_prefix_conf;
@@ -992,6 +998,9 @@ add_new_prefix_to_ra_iface(struct ra_iface
*ra_iface, struct in6_addr *addr,
return;
}
+ ra_iface_conf = find_ra_iface_conf(&frontend_conf->ra_iface_list,
+ ra_iface->name);
+
log_debug("adding %s/%d prefix", in6_to_str(addr), prefixlen);
if ((new_ra_prefix_conf = calloc(1, sizeof(*ra_prefix_conf))) ==
NULL)
@@ -999,7 +1008,18 @@ add_new_prefix_to_ra_iface(struct ra_iface
*ra_iface, struct in6_addr *addr,
new_ra_prefix_conf->prefix = *addr;
new_ra_prefix_conf->prefixlen = prefixlen;
new_ra_prefix_conf->vltime = ra_prefix_conf->vltime;
- new_ra_prefix_conf->pltime = ra_prefix_conf->pltime;
+
+ if(ra_prefix_conf->pltime == DEFAULT_PIO_PLTIME &&
+ ra_iface_conf->ra_options.router_lifetime > DEFAULT_PIO_PLTIME) {
+ new_ra_prefix_conf->pltime =
+ ra_iface_conf->ra_options.router_lifetime;
+ new_ra_prefix_conf->vltime = new_ra_prefix_conf->pltime * 48;
+ }
+ else{
+ new_ra_prefix_conf->pltime = ra_prefix_conf->pltime;
+ new_ra_prefix_conf->vltime = ra_prefix_conf->vltime;
+ }
+
new_ra_prefix_conf->aflag = ra_prefix_conf->aflag;
new_ra_prefix_conf->lflag = ra_prefix_conf->lflag;
SIMPLEQ_INSERT_TAIL(&ra_iface->prefixes, new_ra_prefix_conf, entry);
diff --git parse.y parse.y
index bb18c3d9c9c..5c45ced6147 100644
--- parse.y
+++ parse.y
@@ -964,8 +964,8 @@ conf_get_ra_prefix(struct in6_addr *addr, int
prefixlen)
if (prefix == NULL)
errx(1, "%s: calloc", __func__);
prefix->prefixlen = prefixlen;
- prefix->vltime = 2592000; /* 30 days */
- prefix->pltime = 604800; /* 7 days */
+ prefix->vltime = DEFAULT_PIO_VLTIME;
+ prefix->pltime = DEFAULT_PIO_PLTIME;
prefix->lflag = 1;
prefix->aflag = 1;
diff --git rad.h rad.h
index 2bbf7c8ed5c..e77e8f38c4c 100644
--- rad.h
+++ rad.h
@@ -31,7 +31,8 @@
#define MIN_RTR_ADV_INTERVAL 200
#define MAX_SEARCH 1025 /* same as MAXDNAME in arpa/nameser.h */
#define DEFAULT_RDNS_LIFETIME 600 * 1.5
-
+#define DEFAULT_PIO_PLTIME 1800
+#define DEFAULT_PIO_VLTIME 1800 * 48
#define IMSG_DATA_SIZE(imsg) ((imsg).hdr.len - IMSG_HEADER_SIZE)
enum {
---- cut here ----
--
Fernando Gont
e-mail: [email protected] || [email protected]
PGP Fingerprint: 7809 84F5 322E 45C7 F1C9 3945 96EE A9EF D076 FFF1