diff options
Diffstat (limited to 'net/ipv4/icmp.c')
-rw-r--r-- | net/ipv4/icmp.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index e57f1673bf6b..37cdea0c26b4 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -275,18 +275,19 @@ static inline void icmp_xmit_unlock(void) | |||
275 | #define XRLIM_BURST_FACTOR 6 | 275 | #define XRLIM_BURST_FACTOR 6 |
276 | int xrlim_allow(struct dst_entry *dst, int timeout) | 276 | int xrlim_allow(struct dst_entry *dst, int timeout) |
277 | { | 277 | { |
278 | unsigned long now; | 278 | unsigned long now, token = dst->rate_tokens; |
279 | int rc = 0; | 279 | int rc = 0; |
280 | 280 | ||
281 | now = jiffies; | 281 | now = jiffies; |
282 | dst->rate_tokens += now - dst->rate_last; | 282 | token += now - dst->rate_last; |
283 | dst->rate_last = now; | 283 | dst->rate_last = now; |
284 | if (dst->rate_tokens > XRLIM_BURST_FACTOR * timeout) | 284 | if (token > XRLIM_BURST_FACTOR * timeout) |
285 | dst->rate_tokens = XRLIM_BURST_FACTOR * timeout; | 285 | token = XRLIM_BURST_FACTOR * timeout; |
286 | if (dst->rate_tokens >= timeout) { | 286 | if (token >= timeout) { |
287 | dst->rate_tokens -= timeout; | 287 | token -= timeout; |
288 | rc = 1; | 288 | rc = 1; |
289 | } | 289 | } |
290 | dst->rate_tokens = token; | ||
290 | return rc; | 291 | return rc; |
291 | } | 292 | } |
292 | 293 | ||