* connbytes & 64bit counters @ 2006-10-24 22:53 Krzysztof Oledzki 2006-10-25 22:20 ` Patrick McHardy 0 siblings, 1 reply; 21+ messages in thread From: Krzysztof Oledzki @ 2006-10-24 22:53 UTC (permalink / raw) To: netfilter-devel [-- Attachment #1: Type: TEXT/PLAIN, Size: 738 bytes --] Hello, It seems there is something wrong with connbytes and 64bit conters. The "iptables" manual mention that counters are 64bit, so there should be no problem with overflows, but it seems it might not be true. My firewall puts long living ftp & http connections to a different TC class when they reach 256MB, but aftear they reach 4GB (probably) they go back to the default class, with no speed limit. After some researches I found that ip_conntrack_counter structure defined in nf_conntrack_common.h uses u_int32_t. I always thought that netfilter has 64bit counters, hasn't it? And I'm quite sure it used to work when I set up my firewall, about 1 year ago. Stange... Best regards, Krzysztof Olędzki ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-10-24 22:53 connbytes & 64bit counters Krzysztof Oledzki @ 2006-10-25 22:20 ` Patrick McHardy 2006-10-28 16:48 ` Krzysztof Oledzki 0 siblings, 1 reply; 21+ messages in thread From: Patrick McHardy @ 2006-10-25 22:20 UTC (permalink / raw) To: Krzysztof Oledzki; +Cc: netfilter-devel, Pablo Neira Ayuso Krzysztof Oledzki wrote: > Hello, > > It seems there is something wrong with connbytes and 64bit conters. > > The "iptables" manual mention that counters are 64bit, so there should > be no problem with overflows, but it seems it might not be true. My > firewall puts long living ftp & http connections to a different TC class > when they reach 256MB, but aftear they reach 4GB (probably) they go back > to the default class, with no speed limit. > > After some researches I found that ip_conntrack_counter structure > defined in nf_conntrack_common.h uses u_int32_t. I always thought that > netfilter has 64bit counters, hasn't it? And I'm quite sure it used to > work when I set up my firewall, about 1 year ago. Stange... It was changed to save some memory in struct ip_conntrack. The idea was mainly that its only used for ctnetlink and it is possible to send events before overflow. Obviously, this wasn't true (besides the fact that events are unreliable). Not sure what we should do about it .. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-10-25 22:20 ` Patrick McHardy @ 2006-10-28 16:48 ` Krzysztof Oledzki 2006-10-30 12:01 ` Amin Azez 2006-10-30 15:54 ` Patrick McHardy 0 siblings, 2 replies; 21+ messages in thread From: Krzysztof Oledzki @ 2006-10-28 16:48 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel, Pablo Neira Ayuso [-- Attachment #1: Type: TEXT/PLAIN, Size: 8887 bytes --] On Thu, 26 Oct 2006, Patrick McHardy wrote: > Krzysztof Oledzki wrote: >> Hello, >> >> It seems there is something wrong with connbytes and 64bit conters. >> >> The "iptables" manual mention that counters are 64bit, so there should >> be no problem with overflows, but it seems it might not be true. My >> firewall puts long living ftp & http connections to a different TC class >> when they reach 256MB, but aftear they reach 4GB (probably) they go back >> to the default class, with no speed limit. >> >> After some researches I found that ip_conntrack_counter structure >> defined in nf_conntrack_common.h uses u_int32_t. I always thought that >> netfilter has 64bit counters, hasn't it? And I'm quite sure it used to >> work when I set up my firewall, about 1 year ago. Stange... > > > It was changed to save some memory in struct ip_conntrack. > The idea was mainly that its only used for ctnetlink and > it is possible to send events before overflow. Obviously, > this wasn't true (besides the fact that events are unreliable). > Not sure what we should do about it .. How about attached (and inlined for easy review) patch? [NETFILTER] Reimplementation of 64bit counters for bytes/packets accounting Initially netfilter has had 64bit counters for conntrack-based accounting, but it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit counters are still required, for example for "connbytes" extension. Add possibility to choose between 32 and 64bits but keep default 32bit counters. Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> diff -Nur linux-2.6.19-rc3-orig/include/linux/netfilter/nf_conntrack_common.h linux-2.6.19-rc3/include/linux/netfilter/nf_conntrack_common.h --- linux-2.6.19-rc3-orig/include/linux/netfilter/nf_conntrack_common.h 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/include/linux/netfilter/nf_conntrack_common.h 2006-10-28 17:42:48.000000000 +0200 @@ -139,8 +139,13 @@ #ifdef __KERNEL__ struct ip_conntrack_counter { +#if defined(CONFIG_IP_NF_CT_ACCT_64BIT_COUNTERS) || defined(CONFIG_NF_CT_ACCT_64BIT_COUNTERS) + u_int64_t packets; + u_int64_t bytes; +#else u_int32_t packets; u_int32_t bytes; +#endif }; struct ip_conntrack_stat diff -Nur linux-2.6.19-rc3-orig/include/linux/netfilter/nfnetlink_conntrack.h linux-2.6.19-rc3/include/linux/netfilter/nfnetlink_conntrack.h --- linux-2.6.19-rc3-orig/include/linux/netfilter/nfnetlink_conntrack.h 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/include/linux/netfilter/nfnetlink_conntrack.h 2006-10-25 14:55:19.000000000 +0200 @@ -89,8 +89,8 @@ enum ctattr_counters { CTA_COUNTERS_UNSPEC, - CTA_COUNTERS_PACKETS, /* old 64bit counters */ - CTA_COUNTERS_BYTES, /* old 64bit counters */ + CTA_COUNTERS_PACKETS, /* optional 64bit counters */ + CTA_COUNTERS_BYTES, /* optional 64bit counters */ CTA_COUNTERS32_PACKETS, CTA_COUNTERS32_BYTES, __CTA_COUNTERS_MAX diff -Nur linux-2.6.19-rc3-orig/net/ipv4/netfilter/Kconfig linux-2.6.19-rc3/net/ipv4/netfilter/Kconfig --- linux-2.6.19-rc3-orig/net/ipv4/netfilter/Kconfig 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/net/ipv4/netfilter/Kconfig 2006-10-28 18:44:16.000000000 +0200 @@ -46,6 +46,21 @@ If unsure, say `N'. +config IP_NF_CT_ACCT_64BIT_COUNTERS + bool 'Enable 64bit counters for conntrack-based accounting' + depends on IP_NF_CT_ACCT + default n + help + Use 64 bit counters for bytes/packets accounting instead of default 32. + + This will make every connection entry larger by 16 bytes, enlarging + it by about 5%. + + Say Y if you have plenty of RAM and want to be able to detect + long-lived connections, using for example "connbytes" extension. + + If unsure, say N. + config IP_NF_CONNTRACK_MARK bool 'Connection mark tracking support' depends on IP_NF_CONNTRACK diff -Nur linux-2.6.19-rc3-orig/net/ipv4/netfilter/ip_conntrack_core.c linux-2.6.19-rc3/net/ipv4/netfilter/ip_conntrack_core.c --- linux-2.6.19-rc3-orig/net/ipv4/netfilter/ip_conntrack_core.c 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/net/ipv4/netfilter/ip_conntrack_core.c 2006-10-28 17:44:28.000000000 +0200 @@ -1148,9 +1148,15 @@ ct->counters[CTINFO2DIR(ctinfo)].packets++; ct->counters[CTINFO2DIR(ctinfo)].bytes += ntohs(skb->nh.iph->tot_len); +#ifdef CONFIG_IP_NF_CT_ACCT_64BIT_COUNTERS + if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x8000000000000000LL) + || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x8000000000000000LL)) + event |= IPCT_COUNTER_FILLING; +#else if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) event |= IPCT_COUNTER_FILLING; +#endif } #endif diff -Nur linux-2.6.19-rc3-orig/net/ipv4/netfilter/ip_conntrack_netlink.c linux-2.6.19-rc3/net/ipv4/netfilter/ip_conntrack_netlink.c --- linux-2.6.19-rc3-orig/net/ipv4/netfilter/ip_conntrack_netlink.c 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/net/ipv4/netfilter/ip_conntrack_netlink.c 2006-10-28 18:23:06.000000000 +0200 @@ -185,6 +185,15 @@ { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); +#ifdef CONFIG_IP_NF_CT_ACCT_64BIT_COUNTERS + __be64 tmp; + + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); + + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); +#else __be32 tmp; tmp = htonl(ct->counters[dir].packets); @@ -192,6 +201,7 @@ tmp = htonl(ct->counters[dir].bytes); NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(__be32), &tmp); +#endif NFA_NEST_END(skb, nest_count); diff -Nur linux-2.6.19-rc3-orig/net/netfilter/Kconfig linux-2.6.19-rc3/net/netfilter/Kconfig --- linux-2.6.19-rc3-orig/net/netfilter/Kconfig 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/net/netfilter/Kconfig 2006-10-28 18:43:54.000000000 +0200 @@ -51,6 +51,21 @@ If unsure, say `N'. +config NF_CT_ACCT_64BIT_COUNTERS + bool 'Enable 64bit counters for conntrack-based accounting' + depends on NF_CT_ACCT + default n + help + Use 64 bit counters for bytes/packets accounting instead of default 32. + + This will make every connection entry larger by 16 bytes, enlarging + it by about 5%. + + Say Y if you have plenty of RAM and want to be able to detect + long-lived connections, using for example "connbytes" extension. + + If unsure, say N. + config NF_CONNTRACK_MARK bool 'Connection mark tracking support' depends on NF_CONNTRACK diff -Nur linux-2.6.19-rc3-orig/net/netfilter/nf_conntrack_core.c linux-2.6.19-rc3/net/netfilter/nf_conntrack_core.c --- linux-2.6.19-rc3-orig/net/netfilter/nf_conntrack_core.c 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/net/netfilter/nf_conntrack_core.c 2006-10-28 17:44:11.000000000 +0200 @@ -1412,9 +1412,15 @@ ct->counters[CTINFO2DIR(ctinfo)].packets++; ct->counters[CTINFO2DIR(ctinfo)].bytes += skb->len - (unsigned int)(skb->nh.raw - skb->data); +#ifdef CONFIG_NF_CT_ACCT_64BIT_COUNTERS + if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x8000000000000000LL) + || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x8000000000000000LL)) + event |= IPCT_COUNTER_FILLING; +#else if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) event |= IPCT_COUNTER_FILLING; +#endif } #endif diff -Nur linux-2.6.19-rc3-orig/net/netfilter/nf_conntrack_netlink.c linux-2.6.19-rc3/net/netfilter/nf_conntrack_netlink.c --- linux-2.6.19-rc3-orig/net/netfilter/nf_conntrack_netlink.c 2006-10-24 01:02:02.000000000 +0200 +++ linux-2.6.19-rc3/net/netfilter/nf_conntrack_netlink.c 2006-10-28 18:24:12.000000000 +0200 @@ -194,13 +194,23 @@ { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); - u_int32_t tmp; +#ifdef CONFIG_NF_CT_ACCT_64BIT_COUNTERS + __be64 tmp; + + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); + + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); +#else + __be32 tmp; tmp = htonl(ct->counters[dir].packets); - NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(u_int32_t), &tmp); + NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(__be32), &tmp); tmp = htonl(ct->counters[dir].bytes); - NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(u_int32_t), &tmp); + NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(__be32), &tmp); +#endif NFA_NEST_END(skb, nest_count); Best regards, Krzysztof Olędzki [-- Attachment #2: Type: APPLICATION/octet-stream, Size: 1652 bytes --] ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-10-28 16:48 ` Krzysztof Oledzki @ 2006-10-30 12:01 ` Amin Azez 2006-10-30 15:54 ` Patrick McHardy 1 sibling, 0 replies; 21+ messages in thread From: Amin Azez @ 2006-10-30 12:01 UTC (permalink / raw) To: Krzysztof Oledzki; +Cc: netfilter-devel, Pablo Neira Ayuso * Krzysztof Oledzki wrote, On 28/10/06 17:48: > On Thu, 26 Oct 2006, Patrick McHardy wrote: >> It was changed to save some memory in struct ip_conntrack. >> The idea was mainly that its only used for ctnetlink and >> it is possible to send events before overflow. Obviously, >> this wasn't true (besides the fact that events are unreliable). >> Not sure what we should do about it .. > > How about attached (and inlined for easy review) patch? I prefer 64 bit counters and am going to have to put them back; so thanks for this. Sam ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-10-28 16:48 ` Krzysztof Oledzki 2006-10-30 12:01 ` Amin Azez @ 2006-10-30 15:54 ` Patrick McHardy 2006-10-30 20:01 ` Krzysztof Oledzki 2006-11-01 15:08 ` Amin Azez 1 sibling, 2 replies; 21+ messages in thread From: Patrick McHardy @ 2006-10-30 15:54 UTC (permalink / raw) To: Krzysztof Oledzki; +Cc: netfilter-devel, Pablo Neira Ayuso Krzysztof Oledzki wrote: > [NETFILTER] Reimplementation of 64bit counters for bytes/packets accounting > > Initially netfilter has had 64bit counters for conntrack-based > accounting, but > it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit > counters are > still required, for example for "connbytes" extension. Add possibility > to choose > between 32 and 64bits but keep default 32bit counters. > > Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> > > +++ linux-2.6.19-rc3/net/netfilter/nf_conntrack_netlink.c 2006-10-28 > 18:24:12.000000000 +0200 > @@ -194,13 +194,23 @@ > { > enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; > struct nfattr *nest_count = NFA_NEST(skb, type); > - u_int32_t tmp; > +#ifdef CONFIG_NF_CT_ACCT_64BIT_COUNTERS > + __be64 tmp; > + > + tmp = cpu_to_be64(ct->counters[dir].packets); > + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); > + > + tmp = cpu_to_be64(ct->counters[dir].bytes); > + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); > +#else We can't make the API depend on config options (and I don't like all those ifdefs). For now I would suggest to keep the ctnetlink interface as it is and use 64 bit counters either unconditionally or only when the connbytes match is enabled. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-10-30 15:54 ` Patrick McHardy @ 2006-10-30 20:01 ` Krzysztof Oledzki 2006-11-23 14:05 ` Patrick McHardy 2006-11-01 15:08 ` Amin Azez 1 sibling, 1 reply; 21+ messages in thread From: Krzysztof Oledzki @ 2006-10-30 20:01 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso [-- Attachment #1: Type: TEXT/PLAIN, Size: 2779 bytes --] On Mon, 30 Oct 2006, Patrick McHardy wrote: > Krzysztof Oledzki wrote: >> [NETFILTER] Reimplementation of 64bit counters for bytes/packets accounting >> >> Initially netfilter has had 64bit counters for conntrack-based >> accounting, but >> it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit >> counters are >> still required, for example for "connbytes" extension. Add possibility >> to choose >> between 32 and 64bits but keep default 32bit counters. >> >> Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> >> >> +++ linux-2.6.19-rc3/net/netfilter/nf_conntrack_netlink.c 2006-10-28 >> 18:24:12.000000000 +0200 >> @@ -194,13 +194,23 @@ >> { >> enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; >> struct nfattr *nest_count = NFA_NEST(skb, type); >> - u_int32_t tmp; >> +#ifdef CONFIG_NF_CT_ACCT_64BIT_COUNTERS >> + __be64 tmp; >> + >> + tmp = cpu_to_be64(ct->counters[dir].packets); >> + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); >> + >> + tmp = cpu_to_be64(ct->counters[dir].bytes); >> + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); >> +#else > > > We can't make the API depend on config options But this does not change the API imho, and this situation is perfectly handled by libnetfilter_conntrack: static void nfct_parse_counters(struct nfattr *attr, struct nfct_conntrack *ct, enum ctattr_type parent) { (...) if (tb[CTA_COUNTERS_PACKETS-1]) ct->counters[dir].packets = __be64_to_cpu(*(u_int64_t *) NFA_DATA(tb[CTA_COUNTERS_PACKETS-1])); if (tb[CTA_COUNTERS_BYTES-1]) ct->counters[dir].bytes = __be64_to_cpu(*(u_int64_t *) NFA_DATA(tb[CTA_COUNTERS_BYTES-1])); if (tb[CTA_COUNTERS32_PACKETS-1]) ct->counters[dir].packets = htonl(*(u_int32_t *) NFA_DATA(tb[CTA_COUNTERS32_PACKETS-1])); if (tb[CTA_COUNTERS32_BYTES-1]) ct->counters[dir].bytes = htonl(*(u_int32_t *) NFA_DATA(tb[CTA_COUNTERS32_BYTES-1])); (...) > (and I don't like all those ifdefs). Why? > For now I would suggest to keep the ctnetlink interface as it is and use > 64 bit counters either unconditionally or only when the connbytes match > is enabled. What is wrong in sending 64 bit counters to userspace if we already have 64 bit counters in kernel? Best regards, Krzysztof Olędzki ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-10-30 20:01 ` Krzysztof Oledzki @ 2006-11-23 14:05 ` Patrick McHardy 2006-11-23 21:04 ` Pablo Neira Ayuso 0 siblings, 1 reply; 21+ messages in thread From: Patrick McHardy @ 2006-11-23 14:05 UTC (permalink / raw) To: Krzysztof Oledzki; +Cc: netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso Krzysztof Oledzki wrote: > > > On Mon, 30 Oct 2006, Patrick McHardy wrote: > >> Krzysztof Oledzki wrote: >> >>> [NETFILTER] Reimplementation of 64bit counters for bytes/packets >>> accounting >>> >>> Initially netfilter has had 64bit counters for conntrack-based >>> accounting, but >>> it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit >>> counters are >>> still required, for example for "connbytes" extension. Add possibility >>> to choose >>> between 32 and 64bits but keep default 32bit counters. >>> >>> Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> >>> >>> +++ linux-2.6.19-rc3/net/netfilter/nf_conntrack_netlink.c 2006-10-28 >>> 18:24:12.000000000 +0200 >>> @@ -194,13 +194,23 @@ >>> { >>> enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: >>> CTA_COUNTERS_ORIG; >>> struct nfattr *nest_count = NFA_NEST(skb, type); >>> - u_int32_t tmp; >>> +#ifdef CONFIG_NF_CT_ACCT_64BIT_COUNTERS >>> + __be64 tmp; >>> + >>> + tmp = cpu_to_be64(ct->counters[dir].packets); >>> + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); >>> + >>> + tmp = cpu_to_be64(ct->counters[dir].bytes); >>> + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); >>> +#else >> >> >> We can't make the API depend on config options > > But this does not change the API imho, and this situation is perfectly > handled by libnetfilter_conntrack: It does change the API since we currently use u32. But you're right that it shouldn't break anything (even if something besides libnetfilter_conntrack uses the raw attributes) since we use big endian. >> (and I don't like all those ifdefs). > > Why? Because they make the code ugly and unreadable. >> For now I would suggest to keep the ctnetlink interface as it is and >> use 64 bit counters either unconditionally or only when the connbytes >> match is enabled. > > > What is wrong in sending 64 bit counters to userspace if we already have > 64 bit counters in kernel? Nothing - but changing the API based on config options is bad design. I am fine with sending 64 bit unconditionally. But you need to make sure you don't send (32 bit) overflow events to userspace anymore. Mhh .. this hole thing is a mess: enum ctattr_counters { CTA_COUNTERS_UNSPEC, CTA_COUNTERS_PACKETS, /* old 64bit counters */ CTA_COUNTERS_BYTES, /* old 64bit counters */ CTA_COUNTERS32_PACKETS, CTA_COUNTERS32_BYTES, __CTA_COUNTERS_MAX }; So apparently we already broke compatibility. My prefered solution would be to get rid of this mess and return to 64 bit counters unconditionally and everywhere. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-11-23 14:05 ` Patrick McHardy @ 2006-11-23 21:04 ` Pablo Neira Ayuso 2006-11-24 9:09 ` Patrick McHardy 0 siblings, 1 reply; 21+ messages in thread From: Pablo Neira Ayuso @ 2006-11-23 21:04 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel, Krzysztof Oledzki Patrick McHardy wrote: >>What is wrong in sending 64 bit counters to userspace if we already have >>64 bit counters in kernel? > > Nothing - but changing the API based on config options is bad design. > I am fine with sending 64 bit unconditionally. But you need to make > sure you don't send (32 bit) overflow events to userspace anymore. They could be used to notify 64 bits overflow events. Userspace can differenciate if the kernel is using 32 or 64 bits and interpret the overflow event appropiately. > Mhh .. this hole thing is a mess: > > enum ctattr_counters { > CTA_COUNTERS_UNSPEC, > CTA_COUNTERS_PACKETS, /* old 64bit counters */ > CTA_COUNTERS_BYTES, /* old 64bit counters */ > CTA_COUNTERS32_PACKETS, > CTA_COUNTERS32_BYTES, > > __CTA_COUNTERS_MAX > }; > > So apparently we already broke compatibility. My prefered solution would > be to get rid of this mess and return to 64 bit counters unconditionally > and everywhere. Hm, why not default on 64 bits counters but still give the choice to select 32 bits at compilation time? Some advanced users could still want to compile 32 bits to save some memory (perhaps embedded stuff guys), so I have the impression that this issue will be revisited sooner or later. I can give a hand to Krzysztof and improve the patch to make it look cleaner, although we will still need some ifdef's. Still not convinced? -- The dawn of the fourth age of Linux firewalling is coming; a time of great struggle and heroic deeds -- J.Kadlecsik got inspired by J.Morris ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-11-23 21:04 ` Pablo Neira Ayuso @ 2006-11-24 9:09 ` Patrick McHardy 2006-12-25 1:59 ` Krzysztof Oledzki 0 siblings, 1 reply; 21+ messages in thread From: Patrick McHardy @ 2006-11-24 9:09 UTC (permalink / raw) To: Pablo Neira Ayuso; +Cc: netfilter-devel, Krzysztof Oledzki Pablo Neira Ayuso wrote: > Patrick McHardy wrote: > >>> What is wrong in sending 64 bit counters to userspace if we already have >>> 64 bit counters in kernel? >> >> >> Nothing - but changing the API based on config options is bad design. >> I am fine with sending 64 bit unconditionally. But you need to make >> sure you don't send (32 bit) overflow events to userspace anymore. > > > They could be used to notify 64 bits overflow events. Userspace can > differenciate if the kernel is using 32 or 64 bits and interpret the > overflow event appropiately. Mhh .. even with 100gbit it will take about 50 years to overflow. I don't think we really need this. > Hm, why not default on 64 bits counters but still give the choice to > select 32 bits at compilation time? Some advanced users could still want > to compile 32 bits to save some memory (perhaps embedded stuff guys), so > I have the impression that this issue will be revisited sooner or later. > I can give a hand to Krzysztof and improve the patch to make it look > cleaner, although we will still need some ifdef's. Still not convinced? Config options for things like this are silly in my opinion, if we really want to save memory these counters should be selectable at runtime, most people don't need them, but distributions will probably enable them anyway (if not already then once programs using them appear). And people using them don't save anything, they have to keep copies in userspace to handle overflows, which needs even more memory. Given that their use of the 32 bit counters in libnetfilter_conntrack is broken anyway (incorrect byte order conversion) I think we should just get rid of them. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-11-24 9:09 ` Patrick McHardy @ 2006-12-25 1:59 ` Krzysztof Oledzki 2007-01-10 13:36 ` Patrick McHardy 0 siblings, 1 reply; 21+ messages in thread From: Krzysztof Oledzki @ 2006-12-25 1:59 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso [-- Attachment #1: Type: TEXT/PLAIN, Size: 7548 bytes --] On Fri, 24 Nov 2006, Patrick McHardy wrote: > Pablo Neira Ayuso wrote: >> Patrick McHardy wrote: >> >>>> What is wrong in sending 64 bit counters to userspace if we already have >>>> 64 bit counters in kernel? >>> >>> >>> Nothing - but changing the API based on config options is bad design. >>> I am fine with sending 64 bit unconditionally. But you need to make >>> sure you don't send (32 bit) overflow events to userspace anymore. >> >> >> They could be used to notify 64 bits overflow events. Userspace can >> differenciate if the kernel is using 32 or 64 bits and interpret the >> overflow event appropiately. > > > Mhh .. even with 100gbit it will take about 50 years to overflow. > I don't think we really need this. > >> Hm, why not default on 64 bits counters but still give the choice to >> select 32 bits at compilation time? Some advanced users could still want >> to compile 32 bits to save some memory (perhaps embedded stuff guys), so >> I have the impression that this issue will be revisited sooner or later. >> I can give a hand to Krzysztof and improve the patch to make it look >> cleaner, although we will still need some ifdef's. Still not convinced? > > > Config options for things like this are silly in my opinion, if we > really want to save memory these counters should be selectable at > runtime, most people don't need them, but distributions will probably > enable them anyway (if not already then once programs using them > appear). And people using them don't save anything, they have to > keep copies in userspace to handle overflows, which needs even more > memory. > > Given that their use of the 32 bit counters in libnetfilter_conntrack > is broken anyway (incorrect byte order conversion) I think we should > just get rid of them. OK, maybe something like this can be accepted - no ifdefs, 64 bit counters unconditionally for both ip_conntrack/nf_conntrack. If someone needs to save memory it is IMHO better to simply disable accounting at all. [NETFILTER] Reimplementation of 64bit counters for bytes/packets accounting Initially netfilter has had 64bit counters for conntrack-based accounting, but it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit counters are still required, for example with "connbytes" extension. Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> diff -Nur linux-2.6.19.1-orig/include/linux/netfilter/nf_conntrack_common.h linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nf_conntrack_common.h --- linux-2.6.19.1-orig/include/linux/netfilter/nf_conntrack_common.h 2006-12-11 20:32:53.000000000 +0100 +++ linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nf_conntrack_common.h 2006-12-22 21:15:10.000000000 +0100 @@ -122,7 +122,7 @@ IPCT_NATINFO_BIT = 10, IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), - /* Counter highest bit has been set */ + /* Counter highest bit has been set - UNUSED */ IPCT_COUNTER_FILLING_BIT = 11, IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT), @@ -139,8 +139,8 @@ #ifdef __KERNEL__ struct ip_conntrack_counter { - u_int32_t packets; - u_int32_t bytes; + u_int64_t packets; + u_int64_t bytes; }; struct ip_conntrack_stat diff -Nur linux-2.6.19.1-orig/include/linux/netfilter/nfnetlink_conntrack.h linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nfnetlink_conntrack.h --- linux-2.6.19.1-orig/include/linux/netfilter/nfnetlink_conntrack.h 2006-12-11 20:32:53.000000000 +0100 +++ linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nfnetlink_conntrack.h 2006-12-22 21:15:26.000000000 +0100 @@ -89,10 +89,10 @@ enum ctattr_counters { CTA_COUNTERS_UNSPEC, - CTA_COUNTERS_PACKETS, /* old 64bit counters */ - CTA_COUNTERS_BYTES, /* old 64bit counters */ - CTA_COUNTERS32_PACKETS, - CTA_COUNTERS32_BYTES, + CTA_COUNTERS_PACKETS, /* 64bit counters */ + CTA_COUNTERS_BYTES, /* 64bit counters */ + CTA_COUNTERS32_PACKETS, /* unused */ + CTA_COUNTERS32_BYTES, /* unused */ __CTA_COUNTERS_MAX }; #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) diff -Nur linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_core.c linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c --- linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_core.c 2006-12-11 20:32:53.000000000 +0100 +++ linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c 2006-12-22 21:13:35.000000000 +0100 @@ -1148,9 +1148,6 @@ ct->counters[CTINFO2DIR(ctinfo)].packets++; ct->counters[CTINFO2DIR(ctinfo)].bytes += ntohs(skb->nh.iph->tot_len); - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) - event |= IPCT_COUNTER_FILLING; } #endif diff -Nur linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_netlink.c linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_netlink.c --- linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_netlink.c 2006-12-11 20:32:53.000000000 +0100 +++ linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_netlink.c 2006-12-22 21:12:15.000000000 +0100 @@ -186,13 +186,13 @@ { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); - __be32 tmp; + __be64 tmp; - tmp = htonl(ct->counters[dir].packets); - NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(__be32), &tmp); + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); - tmp = htonl(ct->counters[dir].bytes); - NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(__be32), &tmp); + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); NFA_NEST_END(skb, nest_count); diff -Nur linux-2.6.19.1-orig/net/netfilter/nf_conntrack_core.c linux-2.6.19.1-64bitconntrack/net/netfilter/nf_conntrack_core.c --- linux-2.6.19.1-orig/net/netfilter/nf_conntrack_core.c 2006-12-11 20:32:53.000000000 +0100 +++ linux-2.6.19.1-64bitconntrack/net/netfilter/nf_conntrack_core.c 2006-12-22 21:13:55.000000000 +0100 @@ -1411,9 +1411,6 @@ ct->counters[CTINFO2DIR(ctinfo)].packets++; ct->counters[CTINFO2DIR(ctinfo)].bytes += skb->len - (unsigned int)(skb->nh.raw - skb->data); - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) - event |= IPCT_COUNTER_FILLING; } #endif diff -Nur linux-2.6.19.1-orig/net/netfilter/nf_conntrack_netlink.c linux-2.6.19.1-64bitconntrack/net/netfilter/nf_conntrack_netlink.c --- linux-2.6.19.1-orig/net/netfilter/nf_conntrack_netlink.c 2006-12-11 20:32:53.000000000 +0100 +++ linux-2.6.19.1-64bitconntrack/net/netfilter/nf_conntrack_netlink.c 2006-12-22 21:13:11.000000000 +0100 @@ -195,13 +195,13 @@ { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); - u_int32_t tmp; + __be64 tmp; - tmp = htonl(ct->counters[dir].packets); - NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); - tmp = htonl(ct->counters[dir].bytes); - NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); NFA_NEST_END(skb, nest_count); Best regards, Krzysztof Olędzki [-- Attachment #2: Type: APPLICATION/octet-stream, Size: 1230 bytes --] ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-12-25 1:59 ` Krzysztof Oledzki @ 2007-01-10 13:36 ` Patrick McHardy 2007-01-15 10:45 ` Krzysztof Oledzki 0 siblings, 1 reply; 21+ messages in thread From: Patrick McHardy @ 2007-01-10 13:36 UTC (permalink / raw) To: Krzysztof Oledzki Cc: Harald Welte, netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso Krzysztof Oledzki wrote: > OK, maybe something like this can be accepted - no ifdefs, 64 bit > counters unconditionally for both ip_conntrack/nf_conntrack. If someone > needs to save memory it is IMHO better to simply disable accounting at all. Or ideally have a runtime option. Something to keep in mind when redesigning the nf_conntrack allocation scheme. > [NETFILTER] Reimplementation of 64bit counters for bytes/packets accounting > > Initially netfilter has had 64bit counters for conntrack-based > accounting, but > it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit > counters are > still required, for example with "connbytes" extension. > > Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> > > diff -Nur > linux-2.6.19.1-orig/include/linux/netfilter/nf_conntrack_common.h > linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nf_conntrack_common.h > --- linux-2.6.19.1-orig/include/linux/netfilter/nf_conntrack_common.h > 2006-12-11 20:32:53.000000000 +0100 > +++ > linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nf_conntrack_common.h > 2006-12-22 21:15:10.000000000 +0100 > @@ -122,7 +122,7 @@ > IPCT_NATINFO_BIT = 10, > IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), > > - /* Counter highest bit has been set */ > + /* Counter highest bit has been set - UNUSED */ > IPCT_COUNTER_FILLING_BIT = 11, > IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT), No need to keep this. > @@ -139,8 +139,8 @@ > #ifdef __KERNEL__ > struct ip_conntrack_counter > { > - u_int32_t packets; > - u_int32_t bytes; > + u_int64_t packets; > + u_int64_t bytes; > }; > > struct ip_conntrack_stat > diff -Nur > linux-2.6.19.1-orig/include/linux/netfilter/nfnetlink_conntrack.h > linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nfnetlink_conntrack.h > --- linux-2.6.19.1-orig/include/linux/netfilter/nfnetlink_conntrack.h > 2006-12-11 20:32:53.000000000 +0100 > +++ > linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nfnetlink_conntrack.h > 2006-12-22 21:15:26.000000000 +0100 > @@ -89,10 +89,10 @@ > > enum ctattr_counters { > CTA_COUNTERS_UNSPEC, > - CTA_COUNTERS_PACKETS, /* old 64bit counters */ > - CTA_COUNTERS_BYTES, /* old 64bit counters */ > - CTA_COUNTERS32_PACKETS, > - CTA_COUNTERS32_BYTES, > + CTA_COUNTERS_PACKETS, /* 64bit counters */ > + CTA_COUNTERS_BYTES, /* 64bit counters */ > + CTA_COUNTERS32_PACKETS, /* unused */ > + CTA_COUNTERS32_BYTES, /* unused */ > __CTA_COUNTERS_MAX > }; > #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) > diff -Nur linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_core.c > linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c > --- linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_core.c > 2006-12-11 20:32:53.000000000 +0100 > +++ > linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c > 2006-12-22 21:13:35.000000000 +0100 > @@ -1148,9 +1148,6 @@ > ct->counters[CTINFO2DIR(ctinfo)].packets++; > ct->counters[CTINFO2DIR(ctinfo)].bytes += > ntohs(skb->nh.iph->tot_len); > - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) > - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) > - event |= IPCT_COUNTER_FILLING; This was actually broken before, since the counters are not reset (they just overflow) an event was generated for every packet until the overflow once they reached 2^31. Anyway, I'm not sure how ulogd2 uses these counters, Harald, is it necessary to receive period updates? ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-01-10 13:36 ` Patrick McHardy @ 2007-01-15 10:45 ` Krzysztof Oledzki 2007-01-15 14:37 ` Patrick McHardy 0 siblings, 1 reply; 21+ messages in thread From: Krzysztof Oledzki @ 2007-01-15 10:45 UTC (permalink / raw) To: Patrick McHardy Cc: Harald Welte, netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso [-- Attachment #1: Type: TEXT/PLAIN, Size: 4164 bytes --] On Wed, 10 Jan 2007, Patrick McHardy wrote: > Krzysztof Oledzki wrote: >> OK, maybe something like this can be accepted - no ifdefs, 64 bit >> counters unconditionally for both ip_conntrack/nf_conntrack. If someone >> needs to save memory it is IMHO better to simply disable accounting at all. > > Or ideally have a runtime option. Something to keep in mind when > redesigning the nf_conntrack allocation scheme. Indeed. >> [NETFILTER] Reimplementation of 64bit counters for bytes/packets accounting >> >> Initially netfilter has had 64bit counters for conntrack-based >> accounting, but >> it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit >> counters are >> still required, for example with "connbytes" extension. >> >> Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> >> >> diff -Nur >> linux-2.6.19.1-orig/include/linux/netfilter/nf_conntrack_common.h >> linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nf_conntrack_common.h >> --- linux-2.6.19.1-orig/include/linux/netfilter/nf_conntrack_common.h >> 2006-12-11 20:32:53.000000000 +0100 >> +++ >> linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nf_conntrack_common.h >> 2006-12-22 21:15:10.000000000 +0100 >> @@ -122,7 +122,7 @@ >> IPCT_NATINFO_BIT = 10, >> IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), >> >> - /* Counter highest bit has been set */ >> + /* Counter highest bit has been set - UNUSED */ >> IPCT_COUNTER_FILLING_BIT = 11, >> IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT), > > > No need to keep this. OK, I'll remove both IPCT_COUNTER_FILLING_BIT & IPCT_COUNTER_FILLING. >> @@ -139,8 +139,8 @@ >> #ifdef __KERNEL__ >> struct ip_conntrack_counter >> { >> - u_int32_t packets; >> - u_int32_t bytes; >> + u_int64_t packets; >> + u_int64_t bytes; >> }; >> >> struct ip_conntrack_stat >> diff -Nur >> linux-2.6.19.1-orig/include/linux/netfilter/nfnetlink_conntrack.h >> linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nfnetlink_conntrack.h >> --- linux-2.6.19.1-orig/include/linux/netfilter/nfnetlink_conntrack.h >> 2006-12-11 20:32:53.000000000 +0100 >> +++ >> linux-2.6.19.1-64bitconntrack/include/linux/netfilter/nfnetlink_conntrack.h >> 2006-12-22 21:15:26.000000000 +0100 >> @@ -89,10 +89,10 @@ >> >> enum ctattr_counters { >> CTA_COUNTERS_UNSPEC, >> - CTA_COUNTERS_PACKETS, /* old 64bit counters */ >> - CTA_COUNTERS_BYTES, /* old 64bit counters */ >> - CTA_COUNTERS32_PACKETS, >> - CTA_COUNTERS32_BYTES, >> + CTA_COUNTERS_PACKETS, /* 64bit counters */ >> + CTA_COUNTERS_BYTES, /* 64bit counters */ >> + CTA_COUNTERS32_PACKETS, /* unused */ >> + CTA_COUNTERS32_BYTES, /* unused */ >> __CTA_COUNTERS_MAX >> }; >> #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) >> diff -Nur linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_core.c >> linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c >> --- linux-2.6.19.1-orig/net/ipv4/netfilter/ip_conntrack_core.c >> 2006-12-11 20:32:53.000000000 +0100 >> +++ >> linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c >> 2006-12-22 21:13:35.000000000 +0100 >> @@ -1148,9 +1148,6 @@ >> ct->counters[CTINFO2DIR(ctinfo)].packets++; >> ct->counters[CTINFO2DIR(ctinfo)].bytes += >> ntohs(skb->nh.iph->tot_len); >> - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) >> - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) >> - event |= IPCT_COUNTER_FILLING; > > > This was actually broken before, since the counters are not > reset (they just overflow) an event was generated for every > packet until the overflow once they reached 2^31. Anyway, > I'm not sure how ulogd2 uses these counters, Harald, is it > necessary to receive period updates? If we remove IPCT_COUNTER_FILLING there is no other solution than also drop this part of the code. BTW: what about CTA_COUNTERS32_*? Should we also drop that attributes? Best regards, Krzysztof Olędzki ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-01-15 10:45 ` Krzysztof Oledzki @ 2007-01-15 14:37 ` Patrick McHardy 2007-07-20 22:13 ` Krzysztof Oledzki 0 siblings, 1 reply; 21+ messages in thread From: Patrick McHardy @ 2007-01-15 14:37 UTC (permalink / raw) To: Krzysztof Oledzki Cc: Harald Welte, netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso Krzysztof Oledzki wrote: > On Wed, 10 Jan 2007, Patrick McHardy wrote: > >>> linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c >>> 2006-12-22 21:13:35.000000000 +0100 >>> @@ -1148,9 +1148,6 @@ >>> ct->counters[CTINFO2DIR(ctinfo)].packets++; >>> ct->counters[CTINFO2DIR(ctinfo)].bytes += >>> ntohs(skb->nh.iph->tot_len); >>> - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) >>> - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) >>> - event |= IPCT_COUNTER_FILLING; >> >> >> >> This was actually broken before, since the counters are not >> reset (they just overflow) an event was generated for every >> packet until the overflow once they reached 2^31. Anyway, >> I'm not sure how ulogd2 uses these counters, Harald, is it >> necessary to receive period updates? > > > If we remove IPCT_COUNTER_FILLING there is no other solution than also > drop this part of the code. Let's wait what Harald says about ulogd2, I'm not sure whether we need to keep this. > BTW: what about CTA_COUNTERS32_*? Should we also drop that attributes? They should be kept to make sure the value are not reused. Please just add a comment stating that they are not used anymore. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-01-15 14:37 ` Patrick McHardy @ 2007-07-20 22:13 ` Krzysztof Oledzki 2007-07-20 22:42 ` Krzysztof Oledzki 0 siblings, 1 reply; 21+ messages in thread From: Krzysztof Oledzki @ 2007-07-20 22:13 UTC (permalink / raw) To: Patrick McHardy Cc: Harald Welte, netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso [-- Attachment #1: Type: TEXT/PLAIN, Size: 5102 bytes --] On Mon, 15 Jan 2007, Patrick McHardy wrote: > Krzysztof Oledzki wrote: >> On Wed, 10 Jan 2007, Patrick McHardy wrote: >> >>>> linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c >>>> 2006-12-22 21:13:35.000000000 +0100 >>>> @@ -1148,9 +1148,6 @@ >>>> ct->counters[CTINFO2DIR(ctinfo)].packets++; >>>> ct->counters[CTINFO2DIR(ctinfo)].bytes += >>>> ntohs(skb->nh.iph->tot_len); >>>> - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) >>>> - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) >>>> - event |= IPCT_COUNTER_FILLING; >>> >>> >>> >>> This was actually broken before, since the counters are not >>> reset (they just overflow) an event was generated for every >>> packet until the overflow once they reached 2^31. Anyway, >>> I'm not sure how ulogd2 uses these counters, Harald, is it >>> necessary to receive period updates? >> >> >> If we remove IPCT_COUNTER_FILLING there is no other solution than also >> drop this part of the code. > > Let's wait what Harald says about ulogd2, I'm not sure whether we need > to keep this. > >> BTW: what about CTA_COUNTERS32_*? Should we also drop that attributes? > > They should be kept to make sure the value are not reused. Please just > add a comment stating that they are not used anymore. > Getting back to this old thread... How about attached (and inlined) patch? - for 2.6.22 and current linux-2.6.git kernels with ip_conntrack removed - removes IPCT_COUNTER_FILLING - comments CTA_COUNTERS32_* [NETFILTER]: Reimplementation of 64bit counters for bytes/packets accounting Initially netfilter has had 64bit counters for conntrack-based accounting, but it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit counters are still required, for example for the "connbytes" extension. Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 9e0dae0..7a29936 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h @@ -122,10 +122,6 @@ enum ip_conntrack_events IPCT_NATINFO_BIT = 10, IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), - /* Counter highest bit has been set */ - IPCT_COUNTER_FILLING_BIT = 11, - IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT), - /* Mark is set */ IPCT_MARK_BIT = 12, IPCT_MARK = (1 << IPCT_MARK_BIT), @@ -139,8 +135,8 @@ enum ip_conntrack_expect_events { #ifdef __KERNEL__ struct ip_conntrack_counter { - u_int32_t packets; - u_int32_t bytes; + u_int64_t packets; + u_int64_t bytes; }; struct ip_conntrack_stat diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index d7c3503..75f3df8 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h @@ -93,10 +93,10 @@ enum ctattr_protoinfo_tcp { enum ctattr_counters { CTA_COUNTERS_UNSPEC, - CTA_COUNTERS_PACKETS, /* old 64bit counters */ - CTA_COUNTERS_BYTES, /* old 64bit counters */ - CTA_COUNTERS32_PACKETS, - CTA_COUNTERS32_BYTES, + CTA_COUNTERS_PACKETS, /* 64bit counters */ + CTA_COUNTERS_BYTES, /* 64bit counters */ + CTA_COUNTERS32_PACKETS, /* 32bit counters, unused */ + CTA_COUNTERS32_BYTES, /* 32bit counters, unused */ __CTA_COUNTERS_MAX }; #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 3d14110..7fd9f54 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -773,9 +773,6 @@ void __nf_ct_refresh_acct(struct nf_conn *ct, ct->counters[CTINFO2DIR(ctinfo)].bytes += skb->len - skb_network_offset(skb); - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) - event |= IPCT_COUNTER_FILLING; } #endif diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 6f89b10..1967fed 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -204,13 +204,13 @@ ctnetlink_dump_counters(struct sk_buff *skb, const struct nf_conn *ct, { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); - __be32 tmp; + __be64 tmp; - tmp = htonl(ct->counters[dir].packets); - NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); - tmp = htonl(ct->counters[dir].bytes); - NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); NFA_NEST_END(skb, nest_count); Best regards, Krzysztof Olędzki [-- Attachment #2: Type: TEXT/PLAIN, Size: 3436 bytes --] [NETFILTER]: Reimplementation of 64bit counters for bytes/packets accounting Initially netfilter has had 64bit counters for conntrack-based accounting, but it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit counters are still required, for example for the "connbytes" extension. Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 9e0dae0..7a29936 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h @@ -122,10 +122,6 @@ enum ip_conntrack_events IPCT_NATINFO_BIT = 10, IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), - /* Counter highest bit has been set */ - IPCT_COUNTER_FILLING_BIT = 11, - IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT), - /* Mark is set */ IPCT_MARK_BIT = 12, IPCT_MARK = (1 << IPCT_MARK_BIT), @@ -139,8 +135,8 @@ enum ip_conntrack_expect_events { #ifdef __KERNEL__ struct ip_conntrack_counter { - u_int32_t packets; - u_int32_t bytes; + u_int64_t packets; + u_int64_t bytes; }; struct ip_conntrack_stat diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index d7c3503..75f3df8 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h @@ -93,10 +93,10 @@ enum ctattr_protoinfo_tcp { enum ctattr_counters { CTA_COUNTERS_UNSPEC, - CTA_COUNTERS_PACKETS, /* old 64bit counters */ - CTA_COUNTERS_BYTES, /* old 64bit counters */ - CTA_COUNTERS32_PACKETS, - CTA_COUNTERS32_BYTES, + CTA_COUNTERS_PACKETS, /* 64bit counters */ + CTA_COUNTERS_BYTES, /* 64bit counters */ + CTA_COUNTERS32_PACKETS, /* 32bit counters, unused */ + CTA_COUNTERS32_BYTES, /* 32bit counters, unused */ __CTA_COUNTERS_MAX }; #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 3d14110..7fd9f54 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -773,9 +773,6 @@ void __nf_ct_refresh_acct(struct nf_conn *ct, ct->counters[CTINFO2DIR(ctinfo)].bytes += skb->len - skb_network_offset(skb); - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) - event |= IPCT_COUNTER_FILLING; } #endif diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 6f89b10..1967fed 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -204,13 +204,13 @@ ctnetlink_dump_counters(struct sk_buff *skb, const struct nf_conn *ct, { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); - __be32 tmp; + __be64 tmp; - tmp = htonl(ct->counters[dir].packets); - NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); - tmp = htonl(ct->counters[dir].bytes); - NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); NFA_NEST_END(skb, nest_count); ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-07-20 22:13 ` Krzysztof Oledzki @ 2007-07-20 22:42 ` Krzysztof Oledzki 2007-07-21 4:18 ` Patrick McHardy 0 siblings, 1 reply; 21+ messages in thread From: Krzysztof Oledzki @ 2007-07-20 22:42 UTC (permalink / raw) To: Patrick McHardy Cc: Harald Welte, netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso [-- Attachment #1: Type: TEXT/PLAIN, Size: 5635 bytes --] On Sat, 21 Jul 2007, Krzysztof Oledzki wrote: > > > On Mon, 15 Jan 2007, Patrick McHardy wrote: > >> Krzysztof Oledzki wrote: >>> On Wed, 10 Jan 2007, Patrick McHardy wrote: >>> >>>>> linux-2.6.19.1-64bitconntrack/net/ipv4/netfilter/ip_conntrack_core.c >>>>> 2006-12-22 21:13:35.000000000 +0100 >>>>> @@ -1148,9 +1148,6 @@ >>>>> ct->counters[CTINFO2DIR(ctinfo)].packets++; >>>>> ct->counters[CTINFO2DIR(ctinfo)].bytes += >>>>> ntohs(skb->nh.iph->tot_len); >>>>> - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) >>>>> - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) >>>>> - event |= IPCT_COUNTER_FILLING; >>>> >>>> >>>> >>>> This was actually broken before, since the counters are not >>>> reset (they just overflow) an event was generated for every >>>> packet until the overflow once they reached 2^31. Anyway, >>>> I'm not sure how ulogd2 uses these counters, Harald, is it >>>> necessary to receive period updates? >>> >>> >>> If we remove IPCT_COUNTER_FILLING there is no other solution than also >>> drop this part of the code. >> >> Let's wait what Harald says about ulogd2, I'm not sure whether we need >> to keep this. >> >>> BTW: what about CTA_COUNTERS32_*? Should we also drop that attributes? >> >> They should be kept to make sure the value are not reused. Please just >> add a comment stating that they are not used anymore. >> > > Getting back to this old thread... How about attached (and inlined) patch? > > - for 2.6.22 and current linux-2.6.git kernels with ip_conntrack removed > - removes IPCT_COUNTER_FILLING > - comments CTA_COUNTERS32_* Errr, incomplete patch, sorry... This one should work. [NETFILTER]: Reimplementation of 64bit counters for bytes/packets accounting Initially netfilter has had 64bit counters for conntrack-based accounting, but it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit counters are still required, for example for the "connbytes" extension. Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 9e0dae0..7a29936 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h @@ -122,10 +122,6 @@ enum ip_conntrack_events IPCT_NATINFO_BIT = 10, IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), - /* Counter highest bit has been set */ - IPCT_COUNTER_FILLING_BIT = 11, - IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT), - /* Mark is set */ IPCT_MARK_BIT = 12, IPCT_MARK = (1 << IPCT_MARK_BIT), @@ -139,8 +135,8 @@ enum ip_conntrack_expect_events { #ifdef __KERNEL__ struct ip_conntrack_counter { - u_int32_t packets; - u_int32_t bytes; + u_int64_t packets; + u_int64_t bytes; }; struct ip_conntrack_stat diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index d7c3503..75f3df8 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h @@ -93,10 +93,10 @@ enum ctattr_protoinfo_tcp { enum ctattr_counters { CTA_COUNTERS_UNSPEC, - CTA_COUNTERS_PACKETS, /* old 64bit counters */ - CTA_COUNTERS_BYTES, /* old 64bit counters */ - CTA_COUNTERS32_PACKETS, - CTA_COUNTERS32_BYTES, + CTA_COUNTERS_PACKETS, /* 64bit counters */ + CTA_COUNTERS_BYTES, /* 64bit counters */ + CTA_COUNTERS32_PACKETS, /* 32bit counters, unused */ + CTA_COUNTERS32_BYTES, /* 32bit counters, unused */ __CTA_COUNTERS_MAX }; #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index aa086c8..25e027f 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -806,9 +806,6 @@ void __nf_ct_refresh_acct(struct nf_conn *ct, ct->counters[CTINFO2DIR(ctinfo)].bytes += skb->len - skb_network_offset(skb); - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) - event |= IPCT_COUNTER_FILLING; } #endif diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 6f89b10..b53284f 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -204,13 +204,13 @@ ctnetlink_dump_counters(struct sk_buff *skb, const struct nf_conn *ct, { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); - __be32 tmp; + __be64 tmp; - tmp = htonl(ct->counters[dir].packets); - NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); - tmp = htonl(ct->counters[dir].bytes); - NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); NFA_NEST_END(skb, nest_count); @@ -397,10 +397,6 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, goto nfattr_failure; #endif - if (events & IPCT_COUNTER_FILLING && - (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 || - ctnetlink_dump_counters(skb, ct, IP_CT_DIR_REPLY) < 0)) - goto nfattr_failure; } nlh->nlmsg_len = skb->tail - b; Best regards, Krzysztof Olędzki [-- Attachment #2: Type: TEXT/PLAIN, Size: 3798 bytes --] [NETFILTER]: Reimplementation of 64bit counters for bytes/packets accounting Initially netfilter has had 64bit counters for conntrack-based accounting, but it was changed in 2.6.14 to save memory. Unfortunately in-kernel 64bit counters are still required, for example for the "connbytes" extension. Signed-off-by: Krzysztof Piotr Oledzki <ole@ans.pl> diff --git a/include/linux/netfilter/nf_conntrack_common.h b/include/linux/netfilter/nf_conntrack_common.h index 9e0dae0..7a29936 100644 --- a/include/linux/netfilter/nf_conntrack_common.h +++ b/include/linux/netfilter/nf_conntrack_common.h @@ -122,10 +122,6 @@ enum ip_conntrack_events IPCT_NATINFO_BIT = 10, IPCT_NATINFO = (1 << IPCT_NATINFO_BIT), - /* Counter highest bit has been set */ - IPCT_COUNTER_FILLING_BIT = 11, - IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT), - /* Mark is set */ IPCT_MARK_BIT = 12, IPCT_MARK = (1 << IPCT_MARK_BIT), @@ -139,8 +135,8 @@ enum ip_conntrack_expect_events { #ifdef __KERNEL__ struct ip_conntrack_counter { - u_int32_t packets; - u_int32_t bytes; + u_int64_t packets; + u_int64_t bytes; }; struct ip_conntrack_stat diff --git a/include/linux/netfilter/nfnetlink_conntrack.h b/include/linux/netfilter/nfnetlink_conntrack.h index d7c3503..75f3df8 100644 --- a/include/linux/netfilter/nfnetlink_conntrack.h +++ b/include/linux/netfilter/nfnetlink_conntrack.h @@ -93,10 +93,10 @@ enum ctattr_protoinfo_tcp { enum ctattr_counters { CTA_COUNTERS_UNSPEC, - CTA_COUNTERS_PACKETS, /* old 64bit counters */ - CTA_COUNTERS_BYTES, /* old 64bit counters */ - CTA_COUNTERS32_PACKETS, - CTA_COUNTERS32_BYTES, + CTA_COUNTERS_PACKETS, /* 64bit counters */ + CTA_COUNTERS_BYTES, /* 64bit counters */ + CTA_COUNTERS32_PACKETS, /* 32bit counters, unused */ + CTA_COUNTERS32_BYTES, /* 32bit counters, unused */ __CTA_COUNTERS_MAX }; #define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1) diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index aa086c8..25e027f 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -806,9 +806,6 @@ void __nf_ct_refresh_acct(struct nf_conn *ct, ct->counters[CTINFO2DIR(ctinfo)].bytes += skb->len - skb_network_offset(skb); - if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000) - || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000)) - event |= IPCT_COUNTER_FILLING; } #endif diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 6f89b10..b53284f 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -204,13 +204,13 @@ ctnetlink_dump_counters(struct sk_buff *skb, const struct nf_conn *ct, { enum ctattr_type type = dir ? CTA_COUNTERS_REPLY: CTA_COUNTERS_ORIG; struct nfattr *nest_count = NFA_NEST(skb, type); - __be32 tmp; + __be64 tmp; - tmp = htonl(ct->counters[dir].packets); - NFA_PUT(skb, CTA_COUNTERS32_PACKETS, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].packets); + NFA_PUT(skb, CTA_COUNTERS_PACKETS, sizeof(__be64), &tmp); - tmp = htonl(ct->counters[dir].bytes); - NFA_PUT(skb, CTA_COUNTERS32_BYTES, sizeof(u_int32_t), &tmp); + tmp = cpu_to_be64(ct->counters[dir].bytes); + NFA_PUT(skb, CTA_COUNTERS_BYTES, sizeof(__be64), &tmp); NFA_NEST_END(skb, nest_count); @@ -397,10 +397,6 @@ static int ctnetlink_conntrack_event(struct notifier_block *this, goto nfattr_failure; #endif - if (events & IPCT_COUNTER_FILLING && - (ctnetlink_dump_counters(skb, ct, IP_CT_DIR_ORIGINAL) < 0 || - ctnetlink_dump_counters(skb, ct, IP_CT_DIR_REPLY) < 0)) - goto nfattr_failure; } nlh->nlmsg_len = skb->tail - b; ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-07-20 22:42 ` Krzysztof Oledzki @ 2007-07-21 4:18 ` Patrick McHardy 2007-07-21 16:38 ` Jan Engelhardt ` (2 more replies) 0 siblings, 3 replies; 21+ messages in thread From: Patrick McHardy @ 2007-07-21 4:18 UTC (permalink / raw) To: Krzysztof Oledzki Cc: Harald Welte, netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso Krzysztof Oledzki wrote: > Errr, incomplete patch, sorry... This one should work. > > [NETFILTER]: Reimplementation of 64bit counters for bytes/packets > accounting I thought about this today, but came to no conclusion. We have ct_extend now, allowing to allocate the counters dynamically for new conntracks, and the only reasonable thing IMO (considering distributors that waste 16 bytes per conntrack for a feature pratically *nobody* uses, with your patch that actually fixes a regression 32 byte) would be to make accounting optional and triggered by a target in the raw table. Its so far used by default and the counters are visible through /proc and ctnetlink though. So this would break compatibility. OTOH I think its totally ridiculous to waste this much memory for something pratically nobody uses. So my current opinion is between just breaking compatibility (with some grace period perhaps) and trying to behave half-way compatible when ctnetlink is loaded. I don't think the second option will work though. And frankly, the current code it totally broken, it will send a COUNTER_OVERFLOW event *for each packet* when the counters exceed 2^31. So its really questionable if anyone actually uses this, without further patches. Opinions are welcome. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-07-21 4:18 ` Patrick McHardy @ 2007-07-21 16:38 ` Jan Engelhardt 2007-07-23 2:27 ` Yasuyuki KOZAKAI [not found] ` <200707230227.l6N2R1hs010163@toshiba.co.jp> 2 siblings, 0 replies; 21+ messages in thread From: Jan Engelhardt @ 2007-07-21 16:38 UTC (permalink / raw) To: Patrick McHardy Cc: Harald Welte, netfilter-devel, Krzysztof Oledzki, Pablo Neira Ayuso On Jul 21 2007 06:18, Patrick McHardy wrote: > >(considering distributors that waste 16 bytes per conntrack for a feature >pratically *nobody* uses, > >Opinions are welcome. Break compatibility -- if there are any users (you assume there are none), they will surely turn up. Jan -- ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-07-21 4:18 ` Patrick McHardy 2007-07-21 16:38 ` Jan Engelhardt @ 2007-07-23 2:27 ` Yasuyuki KOZAKAI [not found] ` <200707230227.l6N2R1hs010163@toshiba.co.jp> 2 siblings, 0 replies; 21+ messages in thread From: Yasuyuki KOZAKAI @ 2007-07-23 2:27 UTC (permalink / raw) To: kaber; +Cc: laforge, netfilter-devel, olenf, pablo From: Patrick McHardy <kaber@trash.net> Date: Sat, 21 Jul 2007 06:18:46 +0200 > Krzysztof Oledzki wrote: > > Errr, incomplete patch, sorry... This one should work. > > > > [NETFILTER]: Reimplementation of 64bit counters for bytes/packets > > accounting > > > I thought about this today, but came to no conclusion. We have ct_extend > now, allowing to allocate the counters dynamically for new conntracks, > and the only reasonable thing IMO (considering distributors that waste > 16 bytes per conntrack for a feature pratically *nobody* uses, with your > patch that actually fixes a regression 32 byte) would be to make > accounting optional and triggered by a target in the raw table. Its so > far used by default and the counters are visible through /proc and > ctnetlink though. So this would break compatibility. OTOH I think its > totally ridiculous to waste this much memory for something pratically > nobody uses. So my current opinion is between just breaking > compatibility (with some grace period perhaps) and trying to behave > half-way compatible when ctnetlink is loaded. I don't think the second > option will work though. And frankly, the current code it totally > broken, it will send a COUNTER_OVERFLOW event *for each packet* when > the counters exceed 2^31. So its really questionable if anyone actually > uses this, without further patches. > > Opinions are welcome. Well, we cannot add ct_extend area to confirmed conntrack. Then connbytes match would not be able to get counters of such conntracks if connbytes is loaded after loading nf_conntrack. I begin to feel that the lock issue of ct_extend limits us more strictly than I thought. -- Yasuyuki Kozakai ^ permalink raw reply [flat|nested] 21+ messages in thread
[parent not found: <200707230227.l6N2R1hs010163@toshiba.co.jp>]
* Re: connbytes & 64bit counters [not found] ` <200707230227.l6N2R1hs010163@toshiba.co.jp> @ 2007-08-06 11:30 ` Krzysztof Oledzki 2007-08-29 11:31 ` Krzysztof Oledzki 0 siblings, 1 reply; 21+ messages in thread From: Krzysztof Oledzki @ 2007-08-06 11:30 UTC (permalink / raw) To: Yasuyuki KOZAKAI; +Cc: laforge, netfilter-devel, olenf, kaber, pablo [-- Attachment #1: Type: TEXT/PLAIN, Size: 2012 bytes --] On Mon, 23 Jul 2007, Yasuyuki KOZAKAI wrote: > From: Patrick McHardy <kaber@trash.net> > Date: Sat, 21 Jul 2007 06:18:46 +0200 > >> Krzysztof Oledzki wrote: >>> Errr, incomplete patch, sorry... This one should work. >>> >>> [NETFILTER]: Reimplementation of 64bit counters for bytes/packets >>> accounting >> >> >> I thought about this today, but came to no conclusion. We have ct_extend >> now, allowing to allocate the counters dynamically for new conntracks, >> and the only reasonable thing IMO (considering distributors that waste >> 16 bytes per conntrack for a feature pratically *nobody* uses, with your >> patch that actually fixes a regression 32 byte) would be to make >> accounting optional and triggered by a target in the raw table. Its so >> far used by default and the counters are visible through /proc and >> ctnetlink though. So this would break compatibility. OTOH I think its >> totally ridiculous to waste this much memory for something pratically >> nobody uses. So my current opinion is between just breaking >> compatibility (with some grace period perhaps) and trying to behave >> half-way compatible when ctnetlink is loaded. I don't think the second >> option will work though. And frankly, the current code it totally >> broken, it will send a COUNTER_OVERFLOW event *for each packet* when >> the counters exceed 2^31. So its really questionable if anyone actually >> uses this, without further patches. >> >> Opinions are welcome. > > Well, we cannot add ct_extend area to confirmed conntrack. Then connbytes > match would not be able to get counters of such conntracks if connbytes is > loaded after loading nf_conntrack. > > I begin to feel that the lock issue of ct_extend limits us more strictly > than I thought. So maybe we can add a sysctl option to enable/disable counters for new connection? Then distributors may setup a kernel with counters compiled in, but disabled a sysctl.conf? Best regards, Krzysztof Olędzki ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2007-08-06 11:30 ` Krzysztof Oledzki @ 2007-08-29 11:31 ` Krzysztof Oledzki 0 siblings, 0 replies; 21+ messages in thread From: Krzysztof Oledzki @ 2007-08-29 11:31 UTC (permalink / raw) To: kaber; +Cc: laforge, netfilter-devel, olenf, Yasuyuki KOZAKAI, pablo [-- Attachment #1: Type: TEXT/PLAIN, Size: 2202 bytes --] On Mon, 6 Aug 2007, Krzysztof Oledzki wrote: > > > On Mon, 23 Jul 2007, Yasuyuki KOZAKAI wrote: > >> From: Patrick McHardy <kaber@trash.net> >> Date: Sat, 21 Jul 2007 06:18:46 +0200 >> >>> Krzysztof Oledzki wrote: >>>> Errr, incomplete patch, sorry... This one should work. >>>> >>>> [NETFILTER]: Reimplementation of 64bit counters for bytes/packets >>>> accounting >>> >>> >>> I thought about this today, but came to no conclusion. We have ct_extend >>> now, allowing to allocate the counters dynamically for new conntracks, >>> and the only reasonable thing IMO (considering distributors that waste >>> 16 bytes per conntrack for a feature pratically *nobody* uses, with your >>> patch that actually fixes a regression 32 byte) would be to make >>> accounting optional and triggered by a target in the raw table. Its so >>> far used by default and the counters are visible through /proc and >>> ctnetlink though. So this would break compatibility. OTOH I think its >>> totally ridiculous to waste this much memory for something pratically >>> nobody uses. So my current opinion is between just breaking >>> compatibility (with some grace period perhaps) and trying to behave >>> half-way compatible when ctnetlink is loaded. I don't think the second >>> option will work though. And frankly, the current code it totally >>> broken, it will send a COUNTER_OVERFLOW event *for each packet* when >>> the counters exceed 2^31. So its really questionable if anyone actually >>> uses this, without further patches. >>> >>> Opinions are welcome. >> >> Well, we cannot add ct_extend area to confirmed conntrack. Then connbytes >> match would not be able to get counters of such conntracks if connbytes is >> loaded after loading nf_conntrack. >> >> I begin to feel that the lock issue of ct_extend limits us more strictly >> than I thought. > > So maybe we can add a sysctl option to enable/disable counters for new > connection? Then distributors may setup a kernel with counters compiled in, > but disabled a sysctl.conf? Patric, Do you find this idea acceptable or do you want a different solution? Best regards, Krzysztof Olędzki ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: connbytes & 64bit counters 2006-10-30 15:54 ` Patrick McHardy 2006-10-30 20:01 ` Krzysztof Oledzki @ 2006-11-01 15:08 ` Amin Azez 1 sibling, 0 replies; 21+ messages in thread From: Amin Azez @ 2006-11-01 15:08 UTC (permalink / raw) To: Patrick McHardy; +Cc: netfilter-devel, Pablo Neira Ayuso * Patrick McHardy wrote, On 30/10/06 15:54: > We can't make the API depend on config options (and I don't > like all those ifdefs). For now I would suggest to keep the > ctnetlink interface as it is and use 64 bit counters either > unconditionally or only when the connbytes match is enabled. I like: unconditionally. In my experience we can save more kernel space by reducing the default conntrack timeout than by reducing counter size. Sam (who remembered to remove the gmane newsgroup to avoid posting twice) ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2007-08-29 11:31 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-24 22:53 connbytes & 64bit counters Krzysztof Oledzki
2006-10-25 22:20 ` Patrick McHardy
2006-10-28 16:48 ` Krzysztof Oledzki
2006-10-30 12:01 ` Amin Azez
2006-10-30 15:54 ` Patrick McHardy
2006-10-30 20:01 ` Krzysztof Oledzki
2006-11-23 14:05 ` Patrick McHardy
2006-11-23 21:04 ` Pablo Neira Ayuso
2006-11-24 9:09 ` Patrick McHardy
2006-12-25 1:59 ` Krzysztof Oledzki
2007-01-10 13:36 ` Patrick McHardy
2007-01-15 10:45 ` Krzysztof Oledzki
2007-01-15 14:37 ` Patrick McHardy
2007-07-20 22:13 ` Krzysztof Oledzki
2007-07-20 22:42 ` Krzysztof Oledzki
2007-07-21 4:18 ` Patrick McHardy
2007-07-21 16:38 ` Jan Engelhardt
2007-07-23 2:27 ` Yasuyuki KOZAKAI
[not found] ` <200707230227.l6N2R1hs010163@toshiba.co.jp>
2007-08-06 11:30 ` Krzysztof Oledzki
2007-08-29 11:31 ` Krzysztof Oledzki
2006-11-01 15:08 ` Amin Azez
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.