|
@@ -52,6 +52,8 @@ match(const struct sk_buff *skb,
|
|
|
{
|
|
|
const struct xt_connbytes_info *sinfo = matchinfo;
|
|
|
u_int64_t what = 0; /* initialize to make gcc happy */
|
|
|
+ u_int64_t bytes = 0;
|
|
|
+ u_int64_t pkts = 0;
|
|
|
const struct ip_conntrack_counter *counters;
|
|
|
|
|
|
if (!(counters = nf_ct_get_counters(skb)))
|
|
@@ -89,29 +91,22 @@ match(const struct sk_buff *skb,
|
|
|
case XT_CONNBYTES_AVGPKT:
|
|
|
switch (sinfo->direction) {
|
|
|
case XT_CONNBYTES_DIR_ORIGINAL:
|
|
|
- what = div64_64(counters[IP_CT_DIR_ORIGINAL].bytes,
|
|
|
- counters[IP_CT_DIR_ORIGINAL].packets);
|
|
|
+ bytes = counters[IP_CT_DIR_ORIGINAL].bytes;
|
|
|
+ pkts = counters[IP_CT_DIR_ORIGINAL].packets;
|
|
|
break;
|
|
|
case XT_CONNBYTES_DIR_REPLY:
|
|
|
- what = div64_64(counters[IP_CT_DIR_REPLY].bytes,
|
|
|
- counters[IP_CT_DIR_REPLY].packets);
|
|
|
+ bytes = counters[IP_CT_DIR_REPLY].bytes;
|
|
|
+ pkts = counters[IP_CT_DIR_REPLY].packets;
|
|
|
break;
|
|
|
case XT_CONNBYTES_DIR_BOTH:
|
|
|
- {
|
|
|
- u_int64_t bytes;
|
|
|
- u_int64_t pkts;
|
|
|
- bytes = counters[IP_CT_DIR_ORIGINAL].bytes +
|
|
|
- counters[IP_CT_DIR_REPLY].bytes;
|
|
|
- pkts = counters[IP_CT_DIR_ORIGINAL].packets+
|
|
|
- counters[IP_CT_DIR_REPLY].packets;
|
|
|
-
|
|
|
- /* FIXME_THEORETICAL: what to do if sum
|
|
|
- * overflows ? */
|
|
|
-
|
|
|
- what = div64_64(bytes, pkts);
|
|
|
- }
|
|
|
+ bytes = counters[IP_CT_DIR_ORIGINAL].bytes +
|
|
|
+ counters[IP_CT_DIR_REPLY].bytes;
|
|
|
+ pkts = counters[IP_CT_DIR_ORIGINAL].packets +
|
|
|
+ counters[IP_CT_DIR_REPLY].packets;
|
|
|
break;
|
|
|
}
|
|
|
+ if (pkts != 0)
|
|
|
+ what = div64_64(bytes, pkts);
|
|
|
break;
|
|
|
}
|
|
|
|