Linus Lüssing
2017-Nov-25 07:44 UTC
[Bridge] [PATCH net-next] bridge: ebtables: Avoid resetting limit rule state
So far any changes with ebtables will reset the state of limit rules, leading to spikes in traffic. This is especially noticeable if changes are done frequently, for instance via a daemon. This patch fixes this by bailing out from (re)setting if the limit rule was initialized before. When sending packets every 250ms for 600s, with a "--limit 1/sec --limit-burst 50" rule and a command like this in the background: $ ebtables -N VOIDCHAIN $ while true; do ebtables -F VOIDCHAIN; sleep 30; done The results are: Before: ~1600 packets After: 650 packets Signed-off-by: Linus L?ssing <linus.luessing at c0d3.blue> --- net/bridge/netfilter/ebt_limit.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/bridge/netfilter/ebt_limit.c b/net/bridge/netfilter/ebt_limit.c index 61a9f1be1263..f74b48633feb 100644 --- a/net/bridge/netfilter/ebt_limit.c +++ b/net/bridge/netfilter/ebt_limit.c @@ -69,6 +69,10 @@ static int ebt_limit_mt_check(const struct xt_mtchk_param *par) { struct ebt_limit_info *info = par->matchinfo; + /* Do not reset state on unrelated table changes */ + if (info->prev) + return 0; + /* Check for overflow. */ if (info->burst == 0 || user2credits(info->avg * info->burst) < user2credits(info->avg)) { -- 2.11.0
Pablo Neira Ayuso
2017-Nov-27 23:30 UTC
[Bridge] [PATCH net-next] bridge: ebtables: Avoid resetting limit rule state
Hi Linus, On Sat, Nov 25, 2017 at 08:44:18AM +0100, Linus L?ssing wrote:> So far any changes with ebtables will reset the state of limit rules, > leading to spikes in traffic. This is especially noticeable if changes > are done frequently, for instance via a daemon. > > This patch fixes this by bailing out from (re)setting if the limit > rule was initialized before. > > When sending packets every 250ms for 600s, with a > "--limit 1/sec --limit-burst 50" rule and a command like this > in the background: > > $ ebtables -N VOIDCHAIN > $ while true; do ebtables -F VOIDCHAIN; sleep 30; done > > The results are: > > Before: ~1600 packets > After: 650 packets > > Signed-off-by: Linus L?ssing <linus.luessing at c0d3.blue> > --- > net/bridge/netfilter/ebt_limit.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/net/bridge/netfilter/ebt_limit.c b/net/bridge/netfilter/ebt_limit.c > index 61a9f1be1263..f74b48633feb 100644 > --- a/net/bridge/netfilter/ebt_limit.c > +++ b/net/bridge/netfilter/ebt_limit.c > @@ -69,6 +69,10 @@ static int ebt_limit_mt_check(const struct xt_mtchk_param *par) > { > struct ebt_limit_info *info = par->matchinfo; > > + /* Do not reset state on unrelated table changes */ > + if (info->prev) > + return 0;What kernel version are you using? I suspect you don't have this applied? commit ec23189049651b16dc2ffab35a4371dc1f491aca Author: Willem de Bruijn <willemb at google.com> Date: Mon Jan 2 17:19:46 2017 -0500 xtables: extend matches and targets with .usersize
Linus Lüssing
2017-Dec-04 04:53 UTC
[Bridge] [PATCH net-next] bridge: ebtables: Avoid resetting limit rule state
Hi Pablo, Thanks for your reply! On Tue, Nov 28, 2017 at 12:30:08AM +0100, Pablo Neira Ayuso wrote:> [...] > > diff --git a/net/bridge/netfilter/ebt_limit.c b/net/bridge/netfilter/ebt_limit.c > > index 61a9f1be1263..f74b48633feb 100644 > > --- a/net/bridge/netfilter/ebt_limit.c > > +++ b/net/bridge/netfilter/ebt_limit.c > > @@ -69,6 +69,10 @@ static int ebt_limit_mt_check(const struct xt_mtchk_param *par) > > { > > struct ebt_limit_info *info = par->matchinfo; > > > > + /* Do not reset state on unrelated table changes */ > > + if (info->prev) > > + return 0; > > What kernel version are you using? I suspect you don't have this > applied?I'm indeed using a 4.4.102 kernel, as LEDE is still in the process of updating to 4.14. So 4.4 with LEDE is where I got the measurement results from.> > commit ec23189049651b16dc2ffab35a4371dc1f491aca > Author: Willem de Bruijn <willemb at google.com> > Date: Mon Jan 2 17:19:46 2017 -0500 > > xtables: extend matches and targets with .usersizeAnd so, no I do not have this patch. I looked at it now, but it does not seem to have any relation with .matchinfo, does it? I also had a quick look at a 4.15-rc1 kernel in a VM now. I still end up in ebt_limit_mt_check() with the variables being reset when editing the table somewhere. Regards, Linus