Works fine here, OK florian

On Wed, Mar 03, 2021 at 08:50:59PM -0300, Fernando Gont wrote:
> This revised patch adresses a minor issue pointed out by Florian (avoid
> floating-point math). At this point this is unnecessary, since the
> IPv6 temporary address lifetimes are not configurable.
> 
> P.S.: Patch also available at:
> https://www.gont.com.ar/files/fgont-patch-rfc8981-v0.3.diff
> 
> Thanks,
> Fernando
> 
> 
> 
> 
> diff --git engine.c engine.c
> index 4160d798261..3ddf0303dd9 100644
> --- engine.c
> +++ engine.c
> @@ -88,11 +88,15 @@
>  #define      RTR_SOLICITATION_INTERVAL       4
>  #define      MAX_RTR_SOLICITATIONS           3
>  
> -/* constants for RFC 4941 autoconf privacy extension */
> -#define PRIV_MAX_DESYNC_FACTOR       600     /* 10 minutes */
> +/*
> + * Constants for RFC 8981 autoconf privacy extensions
> + *
> + * PRIV_PREFERRED_LIFETIME > (PRIV_MAX_DESYNC_FACTOR + PRIV_REGEN_ADVANCE)
> + */
>  #define PRIV_VALID_LIFETIME  172800  /* 2 days */
>  #define PRIV_PREFERRED_LIFETIME      86400   /* 1 day */
> -#define      PRIV_REGEN_ADVANCE      5       /* 5 seconds */
> +#define PRIV_MAX_DESYNC_FACTOR       34560   /* PRIV_PREFERRED_LIFETIME * 
> 0.4 */
> +#define PRIV_REGEN_ADVANCE   5       /* 5 seconds */
>  
>  enum if_state {
>       IF_DOWN,
> @@ -198,6 +202,7 @@ struct address_proposal {
>       uint8_t                          prefix_len;
>       uint32_t                         vltime;
>       uint32_t                         pltime;
> +     uint32_t                         desync_factor;
>       uint8_t                          soiikey[SLAACD_SOIIKEY_LEN];
>       uint32_t                         mtu;
>  };
> @@ -327,8 +332,6 @@ static struct imsgev      *iev_frontend;
>  static struct imsgev *iev_main;
>  int64_t                       proposal_id;
>  
> -uint32_t              desync_factor;
> -
>  void
>  engine_sig_handler(int sig, short event, void *arg)
>  {
> @@ -399,8 +402,6 @@ engine(int debug, int verbose)
>  
>       LIST_INIT(&slaacd_interfaces);
>  
> -     desync_factor = arc4random_uniform(PRIV_MAX_DESYNC_FACTOR);
> -
>       event_dispatch();
>  
>       engine_shutdown();
> @@ -1858,14 +1859,18 @@ update_iface_ra_prefix(struct slaacd_iface *iface, 
> struct radv *ra,
>  
>               if (addr_proposal->privacy) {
>                       struct timespec now;
> -                     int64_t         ltime;
> +                     int64_t         ltime, mtime;
>  
>                       if (clock_gettime(CLOCK_MONOTONIC, &now))
>                               fatal("clock_gettime");
>  
> -                     ltime = MINIMUM(addr_proposal->created.tv_sec +
> -                         PRIV_PREFERRED_LIFETIME - desync_factor,
> -                         now.tv_sec + prefix->pltime) - now.tv_sec;
> +                     mtime = addr_proposal->created.tv_sec +
> +                         PRIV_PREFERRED_LIFETIME -
> +                         addr_proposal->desync_factor;
> +
> +                     ltime = MINIMUM(mtime, now.tv_sec + prefix->pltime) -
> +                         now.tv_sec;
> +
>                       pltime = ltime > 0 ? ltime : 0;
>  
>                       ltime = MINIMUM(addr_proposal->created.tv_sec +
> @@ -1873,7 +1878,7 @@ update_iface_ra_prefix(struct slaacd_iface *iface, 
> struct radv *ra,
>                           now.tv_sec;
>                       vltime = ltime > 0 ? ltime : 0;
>  
> -                     if (pltime > PRIV_REGEN_ADVANCE)
> +                     if ((mtime - now.tv_sec) > PRIV_REGEN_ADVANCE)
>                               found_privacy = 1;
>               } else {
>                       pltime = prefix->pltime;
> @@ -1919,11 +1924,11 @@ update_iface_ra_prefix(struct slaacd_iface *iface, 
> struct radv *ra,
>  
>       /* privacy addresses do not depend on eui64 */
>       if (!found_privacy && iface->autoconfprivacy) {
> -             if (prefix->pltime < desync_factor) {
> +             if (prefix->pltime < PRIV_REGEN_ADVANCE) {
>                       log_warnx("%s: pltime from %s is too small: %d < %d; "
>                           "not generating privacy address", __func__,
>                           sin6_to_str(&ra->from), prefix->pltime,
> -                         desync_factor);
> +                         PRIV_REGEN_ADVANCE);
>               } else
>                       /* new privacy proposal */
>                       gen_address_proposal(iface, ra, prefix, 1);
> @@ -2055,8 +2060,11 @@ gen_address_proposal(struct slaacd_iface *iface, 
> struct radv *ra, struct
>       if (privacy) {
>               addr_proposal->vltime = MINIMUM(prefix->vltime,
>                   PRIV_VALID_LIFETIME);
> +             addr_proposal->desync_factor =
> +                 arc4random_uniform(PRIV_MAX_DESYNC_FACTOR);
> +
>               addr_proposal->pltime = MINIMUM(prefix->pltime,
> -                 PRIV_PREFERRED_LIFETIME - desync_factor);
> +                 PRIV_PREFERRED_LIFETIME - addr_proposal->desync_factor);
>       } else {
>               addr_proposal->vltime = prefix->vltime;
>               addr_proposal->pltime = prefix->pltime;
> diff --git slaacd.8 slaacd.8
> index fb9bb3d0c60..44057ea4785 100644
> --- slaacd.8
> +++ slaacd.8
> @@ -110,15 +110,6 @@ socket used for communication with
>  .Re
>  .Pp
>  .Rs
> -.%A T. Narten
> -.%A R. Draves
> -.%A S. Krishnan
> -.%D September 2007
> -.%R RFC 4941
> -.%T Privacy Extensions for Stateless Address Autoconfiguration in IPv6
> -.Re
> -.Pp
> -.Rs
>  .%A F. Gont
>  .%D April 2014
>  .%R RFC 7217
> @@ -152,6 +143,16 @@ socket used for communication with
>  .%R RFC 8106
>  .%T IPv6 Router Advertisement Options for DNS Configuration
>  .Re
> +.Pp
> +.Rs
> +.%A F. Gont
> +.%A S. Krishnan
> +.%A T. Narten
> +.%A R. Draves
> +.%D February 2021
> +.%R RFC 8981
> +.%T Temporary Address Extensions for Stateless Address Autoconfiguration in 
> IPv6
> +.Re
>  .Sh HISTORY
>  The
>  .Nm
> 


-- 
I'm not entirely sure you are real.

Reply via email to