blob: 79d8d16732b426d722f11ec2951ef03891159a63 [file] [log] [blame]
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -07001/*
2 * (C) 2008 Krzysztof Piotr Oledzki <ole@ans.pl>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#ifndef _NF_CONNTRACK_ACCT_H
10#define _NF_CONNTRACK_ACCT_H
Alexey Dobriyand716a4d2008-10-08 11:35:09 +020011#include <net/net_namespace.h>
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070012#include <linux/netfilter/nf_conntrack_common.h>
13#include <linux/netfilter/nf_conntrack_tuple_common.h>
14#include <net/netfilter/nf_conntrack.h>
15#include <net/netfilter/nf_conntrack_extend.h>
16
17struct nf_conn_counter {
Eric Dumazetb3e0bfa2011-12-14 14:45:20 +010018 atomic64_t packets;
19 atomic64_t bytes;
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070020};
21
Holger Eitzenbergerf7b13e42013-09-26 17:31:51 +020022struct nf_conn_acct {
23 struct nf_conn_counter counter[IP_CT_DIR_MAX];
24};
25
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070026static inline
Holger Eitzenbergerf7b13e42013-09-26 17:31:51 +020027struct nf_conn_acct *nf_conn_acct_find(const struct nf_conn *ct)
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070028{
29 return nf_ct_ext_find(ct, NF_CT_EXT_ACCT);
30}
31
32static inline
Holger Eitzenbergerf7b13e42013-09-26 17:31:51 +020033struct nf_conn_acct *nf_ct_acct_ext_add(struct nf_conn *ct, gfp_t gfp)
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070034{
Alexey Dobriyand716a4d2008-10-08 11:35:09 +020035 struct net *net = nf_ct_net(ct);
Holger Eitzenbergerf7b13e42013-09-26 17:31:51 +020036 struct nf_conn_acct *acct;
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070037
Alexey Dobriyand716a4d2008-10-08 11:35:09 +020038 if (!net->ct.sysctl_acct)
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070039 return NULL;
40
41 acct = nf_ct_ext_add(ct, NF_CT_EXT_ACCT, gfp);
42 if (!acct)
43 pr_debug("failed to add accounting extension area");
44
45
46 return acct;
47};
48
Joe Perches4e77be42013-09-23 11:37:48 -070049unsigned int seq_print_acct(struct seq_file *s, const struct nf_conn *ct,
50 int dir);
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070051
Tim Gardnera8756202010-06-25 14:44:07 +020052/* Check if connection tracking accounting is enabled */
53static inline bool nf_ct_acct_enabled(struct net *net)
54{
55 return net->ct.sysctl_acct != 0;
56}
57
58/* Enable/disable connection tracking accounting */
59static inline void nf_ct_set_acct(struct net *net, bool enable)
60{
61 net->ct.sysctl_acct = enable;
62}
63
Joe Perches4e77be42013-09-23 11:37:48 -070064int nf_conntrack_acct_pernet_init(struct net *net);
65void nf_conntrack_acct_pernet_fini(struct net *net);
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070066
Joe Perches4e77be42013-09-23 11:37:48 -070067int nf_conntrack_acct_init(void);
68void nf_conntrack_acct_fini(void);
Krzysztof Piotr Oledzki58401572008-07-21 10:01:34 -070069#endif /* _NF_CONNTRACK_ACCT_H */