diff options
| author | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2008-05-27 04:37:49 -0400 |
|---|---|---|
| committer | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2008-06-04 15:02:34 -0400 |
| commit | 4bed72e4f5502ea3322f0a00794815fa58951abe (patch) | |
| tree | fd652d01822746a84d5812bbe2ee0661fbd3b86f /include | |
| parent | baa2bfb8aef24bb7fe1875b256918724b3884662 (diff) | |
[IPV6] ADDRCONF: Allow longer lifetime on 64bit archs.
- Allow longer lifetimes (>= 0x7fffffff/HZ) on 64bit archs
by using unsigned long.
- Shadow this arithmetic overflow workaround by introducing
helper functions: addrconf_timeout_fixup() and
addrconf_finite_timeout().
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/net/addrconf.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 0a2f0372df31..bbd3d583c6e6 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
| @@ -94,6 +94,28 @@ extern void addrconf_join_solict(struct net_device *dev, | |||
| 94 | extern void addrconf_leave_solict(struct inet6_dev *idev, | 94 | extern void addrconf_leave_solict(struct inet6_dev *idev, |
| 95 | struct in6_addr *addr); | 95 | struct in6_addr *addr); |
| 96 | 96 | ||
| 97 | static inline unsigned long addrconf_timeout_fixup(u32 timeout, | ||
| 98 | unsigned unit) | ||
| 99 | { | ||
| 100 | if (timeout == 0xffffffff) | ||
| 101 | return ~0UL; | ||
| 102 | |||
| 103 | /* | ||
| 104 | * Avoid arithmetic overflow. | ||
| 105 | * Assuming unit is constant and non-zero, this "if" statement | ||
| 106 | * will go away on 64bit archs. | ||
| 107 | */ | ||
| 108 | if (0xfffffffe > LONG_MAX / unit && timeout > LONG_MAX / unit) | ||
| 109 | return LONG_MAX / unit; | ||
| 110 | |||
| 111 | return timeout; | ||
| 112 | } | ||
| 113 | |||
| 114 | static inline int addrconf_finite_timeout(unsigned long timeout) | ||
| 115 | { | ||
| 116 | return ~timeout; | ||
| 117 | } | ||
| 118 | |||
| 97 | /* | 119 | /* |
| 98 | * IPv6 Address Label subsystem (addrlabel.c) | 120 | * IPv6 Address Label subsystem (addrlabel.c) |
| 99 | */ | 121 | */ |
