|
@@ -18,6 +18,7 @@
|
|
|
#include <linux/netfilter/xt_limit.h>
|
|
|
|
|
|
struct xt_limit_priv {
|
|
|
+ spinlock_t lock;
|
|
|
unsigned long prev;
|
|
|
uint32_t credit;
|
|
|
};
|
|
@@ -32,8 +33,6 @@ MODULE_ALIAS("ip6t_limit");
|
|
|
* see net/sched/sch_tbf.c in the linux source tree
|
|
|
*/
|
|
|
|
|
|
-static DEFINE_SPINLOCK(limit_lock);
|
|
|
-
|
|
|
/* Rusty: This is my (non-mathematically-inclined) understanding of
|
|
|
this algorithm. The `average rate' in jiffies becomes your initial
|
|
|
amount of credit `credit' and the most credit you can ever have
|
|
@@ -72,7 +71,7 @@ limit_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
|
|
struct xt_limit_priv *priv = r->master;
|
|
|
unsigned long now = jiffies;
|
|
|
|
|
|
- spin_lock_bh(&limit_lock);
|
|
|
+ spin_lock_bh(&priv->lock);
|
|
|
priv->credit += (now - xchg(&priv->prev, now)) * CREDITS_PER_JIFFY;
|
|
|
if (priv->credit > r->credit_cap)
|
|
|
priv->credit = r->credit_cap;
|
|
@@ -80,11 +79,11 @@ limit_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
|
|
if (priv->credit >= r->cost) {
|
|
|
/* We're not limited. */
|
|
|
priv->credit -= r->cost;
|
|
|
- spin_unlock_bh(&limit_lock);
|
|
|
+ spin_unlock_bh(&priv->lock);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- spin_unlock_bh(&limit_lock);
|
|
|
+ spin_unlock_bh(&priv->lock);
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -126,6 +125,8 @@ static int limit_mt_check(const struct xt_mtchk_param *par)
|
|
|
r->credit_cap = priv->credit; /* Credits full. */
|
|
|
r->cost = user2credits(r->avg);
|
|
|
}
|
|
|
+ spin_lock_init(&priv->lock);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|