|
@@ -1112,45 +1112,46 @@ void ip_conntrack_helper_unregister(struct ip_conntrack_helper *me)
|
|
|
synchronize_net();
|
|
|
}
|
|
|
|
|
|
-static inline void ct_add_counters(struct ip_conntrack *ct,
|
|
|
- enum ip_conntrack_info ctinfo,
|
|
|
- const struct sk_buff *skb)
|
|
|
-{
|
|
|
-#ifdef CONFIG_IP_NF_CT_ACCT
|
|
|
- if (skb) {
|
|
|
- ct->counters[CTINFO2DIR(ctinfo)].packets++;
|
|
|
- ct->counters[CTINFO2DIR(ctinfo)].bytes +=
|
|
|
- ntohs(skb->nh.iph->tot_len);
|
|
|
- }
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
-/* Refresh conntrack for this many jiffies and do accounting (if skb != NULL) */
|
|
|
-void ip_ct_refresh_acct(struct ip_conntrack *ct,
|
|
|
+/* Refresh conntrack for this many jiffies and do accounting if do_acct is 1 */
|
|
|
+void __ip_ct_refresh_acct(struct ip_conntrack *ct,
|
|
|
enum ip_conntrack_info ctinfo,
|
|
|
const struct sk_buff *skb,
|
|
|
- unsigned long extra_jiffies)
|
|
|
+ unsigned long extra_jiffies,
|
|
|
+ int do_acct)
|
|
|
{
|
|
|
+ int do_event = 0;
|
|
|
+
|
|
|
IP_NF_ASSERT(ct->timeout.data == (unsigned long)ct);
|
|
|
+ IP_NF_ASSERT(skb);
|
|
|
+
|
|
|
+ write_lock_bh(&ip_conntrack_lock);
|
|
|
|
|
|
/* If not in hash table, timer will not be active yet */
|
|
|
if (!is_confirmed(ct)) {
|
|
|
ct->timeout.expires = extra_jiffies;
|
|
|
- ct_add_counters(ct, ctinfo, skb);
|
|
|
+ do_event = 1;
|
|
|
} else {
|
|
|
- write_lock_bh(&ip_conntrack_lock);
|
|
|
/* Need del_timer for race avoidance (may already be dying). */
|
|
|
if (del_timer(&ct->timeout)) {
|
|
|
ct->timeout.expires = jiffies + extra_jiffies;
|
|
|
add_timer(&ct->timeout);
|
|
|
- /* FIXME: We loose some REFRESH events if this function
|
|
|
- * is called without an skb. I'll fix this later -HW */
|
|
|
- if (skb)
|
|
|
- ip_conntrack_event_cache(IPCT_REFRESH, skb);
|
|
|
+ do_event = 1;
|
|
|
}
|
|
|
- ct_add_counters(ct, ctinfo, skb);
|
|
|
- write_unlock_bh(&ip_conntrack_lock);
|
|
|
}
|
|
|
+
|
|
|
+#ifdef CONFIG_IP_NF_CT_ACCT
|
|
|
+ if (do_acct) {
|
|
|
+ ct->counters[CTINFO2DIR(ctinfo)].packets++;
|
|
|
+ ct->counters[CTINFO2DIR(ctinfo)].bytes +=
|
|
|
+ ntohs(skb->nh.iph->tot_len);
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ write_unlock_bh(&ip_conntrack_lock);
|
|
|
+
|
|
|
+ /* must be unlocked when calling event cache */
|
|
|
+ if (do_event)
|
|
|
+ ip_conntrack_event_cache(IPCT_REFRESH, skb);
|
|
|
}
|
|
|
|
|
|
#if defined(CONFIG_IP_NF_CONNTRACK_NETLINK) || \
|