blob: 1eaac1f4cd6aef2b12cfe51621a5ce6da5c4ba13 [file] [log] [blame]
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -08001/*
2 * connection tracking helpers.
3 *
4 * 16 Dec 2003: Yasuyuki Kozakai @USAGI <yasuyuki.kozakai@toshiba.co.jp>
5 * - generalize L3 protocol dependent part.
6 *
7 * Derived from include/linux/netfiter_ipv4/ip_conntrack_helper.h
8 */
9
10#ifndef _NF_CONNTRACK_HELPER_H
11#define _NF_CONNTRACK_HELPER_H
12#include <net/netfilter/nf_conntrack.h>
Yasuyuki Kozakaiceceae12007-07-07 22:23:42 -070013#include <net/netfilter/nf_conntrack_extend.h>
Pablo Neira Ayuso1afc5672012-06-07 12:11:50 +020014#include <net/netfilter/nf_conntrack_expect.h>
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080015
16struct module;
17
Pablo Neira Ayuso12f7a502012-05-13 21:44:54 +020018enum nf_ct_helper_flags {
19 NF_CT_HELPER_F_USERSPACE = (1 << 0),
20 NF_CT_HELPER_F_CONFIGURED = (1 << 1),
21};
22
Holger Eitzenbergeraf9d32a2009-03-25 18:44:01 +010023#define NF_CT_HELPER_NAME_LEN 16
24
Eric Dumazetfd2c3ef2009-11-03 03:26:03 +000025struct nf_conntrack_helper {
Patrick McHardyb8a7fe62007-07-07 22:36:46 -070026 struct hlist_node hnode; /* Internal use. */
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080027
Pablo Neira Ayuso3a8fc532012-01-15 16:34:08 +010028 char name[NF_CT_HELPER_NAME_LEN]; /* name of the module */
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080029 struct module *me; /* pointer to self */
Patrick McHardy6002f2662008-03-25 20:09:15 -070030 const struct nf_conntrack_expect_policy *expect_policy;
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080031
Pablo Neira Ayuso1afc5672012-06-07 12:11:50 +020032 /* length of internal data, ie. sizeof(struct nf_ct_*_master) */
33 size_t data_len;
34
Patrick McHardyd4156e82007-07-07 22:31:32 -070035 /* Tuple of things we will help (compared against server response) */
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080036 struct nf_conntrack_tuple tuple;
Patrick McHardyd4156e82007-07-07 22:31:32 -070037
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080038 /* Function to call when data passes; return verdict, or -1 to
39 invalidate. */
Herbert Xu3db05fe2007-10-15 00:53:15 -070040 int (*help)(struct sk_buff *skb,
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080041 unsigned int protoff,
42 struct nf_conn *ct,
43 enum ip_conntrack_info conntrackinfo);
Pablo Neira Ayusoc1d10ad2006-01-05 12:19:05 -080044
Patrick McHardyf09943f2006-12-02 22:09:41 -080045 void (*destroy)(struct nf_conn *ct);
46
Pablo Neira Ayusoae243be2012-06-07 14:19:42 +020047 int (*from_nlattr)(struct nlattr *attr, struct nf_conn *ct);
Patrick McHardyfdf70832007-09-28 14:37:41 -070048 int (*to_nlattr)(struct sk_buff *skb, const struct nf_conn *ct);
Patrick McHardy6002f2662008-03-25 20:09:15 -070049 unsigned int expect_class_max;
Pablo Neira Ayuso12f7a502012-05-13 21:44:54 +020050
51 unsigned int flags;
52 unsigned int queue_num; /* For user-space helpers. */
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080053};
54
Joe Perches4e77be42013-09-23 11:37:48 -070055struct nf_conntrack_helper *__nf_conntrack_helper_find(const char *name,
56 u16 l3num, u8 protonum);
Martin Josefsson7e5d03b2006-11-29 02:34:59 +010057
Joe Perches4e77be42013-09-23 11:37:48 -070058struct nf_conntrack_helper *nf_conntrack_helper_try_module_get(const char *name,
59 u16 l3num,
60 u8 protonum);
Gao Feng82de0be2016-07-18 11:39:23 +080061void nf_ct_helper_init(struct nf_conntrack_helper *helper,
62 u16 l3num, u16 protonum, const char *name,
63 u16 default_port, u16 spec_port, u32 id,
64 const struct nf_conntrack_expect_policy *exp_pol,
65 u32 expect_class_max, u32 data_len,
66 int (*help)(struct sk_buff *skb, unsigned int protoff,
67 struct nf_conn *ct,
68 enum ip_conntrack_info ctinfo),
69 int (*from_nlattr)(struct nlattr *attr,
70 struct nf_conn *ct),
71 struct module *module);
Patrick McHardy84f3bb92010-02-03 17:17:06 +010072
Joe Perches4e77be42013-09-23 11:37:48 -070073int nf_conntrack_helper_register(struct nf_conntrack_helper *);
74void nf_conntrack_helper_unregister(struct nf_conntrack_helper *);
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080075
Gao Feng82de0be2016-07-18 11:39:23 +080076int nf_conntrack_helpers_register(struct nf_conntrack_helper *, unsigned int);
77void nf_conntrack_helpers_unregister(struct nf_conntrack_helper *,
78 unsigned int);
79
Joe Perches4e77be42013-09-23 11:37:48 -070080struct nf_conn_help *nf_ct_helper_ext_add(struct nf_conn *ct,
81 struct nf_conntrack_helper *helper,
82 gfp_t gfp);
Patrick McHardyb5605802007-07-07 22:35:56 -070083
Joe Perches4e77be42013-09-23 11:37:48 -070084int __nf_ct_try_assign_helper(struct nf_conn *ct, struct nf_conn *tmpl,
85 gfp_t flags);
Pablo Neira Ayuso226c0c02008-11-18 11:54:05 +010086
Joe Perches4e77be42013-09-23 11:37:48 -070087void nf_ct_helper_destroy(struct nf_conn *ct);
Pablo Neira Ayuso9858a3a2009-06-13 12:28:22 +020088
Yasuyuki Kozakaiceceae12007-07-07 22:23:42 -070089static inline struct nf_conn_help *nfct_help(const struct nf_conn *ct)
90{
91 return nf_ct_ext_find(ct, NF_CT_EXT_HELPER);
92}
Patrick McHardyb334aad2008-01-14 23:48:57 -080093
Pablo Neira Ayuso1afc5672012-06-07 12:11:50 +020094static inline void *nfct_help_data(const struct nf_conn *ct)
95{
96 struct nf_conn_help *help;
97
98 help = nf_ct_ext_find(ct, NF_CT_EXT_HELPER);
99
100 return (void *)help->data;
101}
102
Joe Perches4e77be42013-09-23 11:37:48 -0700103int nf_conntrack_helper_pernet_init(struct net *net);
104void nf_conntrack_helper_pernet_fini(struct net *net);
Gao feng5e615b22013-01-21 22:10:30 +0000105
Joe Perches4e77be42013-09-23 11:37:48 -0700106int nf_conntrack_helper_init(void);
107void nf_conntrack_helper_fini(void);
Patrick McHardyb334aad2008-01-14 23:48:57 -0800108
Joe Perches4e77be42013-09-23 11:37:48 -0700109int nf_conntrack_broadcast_help(struct sk_buff *skb, unsigned int protoff,
110 struct nf_conn *ct,
111 enum ip_conntrack_info ctinfo,
112 unsigned int timeout);
Jiri Olsa93557f52011-01-18 18:12:24 +0100113
Pablo Neira Ayuso544d5c72012-02-05 03:44:51 +0100114struct nf_ct_helper_expectfn {
115 struct list_head head;
116 const char *name;
117 void (*expectfn)(struct nf_conn *ct, struct nf_conntrack_expect *exp);
118};
119
Pablo Neira Ayusob20ab9cc2013-02-10 18:56:56 +0100120__printf(3,4)
121void nf_ct_helper_log(struct sk_buff *skb, const struct nf_conn *ct,
122 const char *fmt, ...);
123
Pablo Neira Ayuso544d5c72012-02-05 03:44:51 +0100124void nf_ct_helper_expectfn_register(struct nf_ct_helper_expectfn *n);
125void nf_ct_helper_expectfn_unregister(struct nf_ct_helper_expectfn *n);
126struct nf_ct_helper_expectfn *
127nf_ct_helper_expectfn_find_by_name(const char *name);
128struct nf_ct_helper_expectfn *
129nf_ct_helper_expectfn_find_by_symbol(const void *symbol);
130
Pablo Neira Ayuso12f7a502012-05-13 21:44:54 +0200131extern struct hlist_head *nf_ct_helper_hash;
132extern unsigned int nf_ct_helper_hsize;
133
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -0800134#endif /*_NF_CONNTRACK_HELPER_H*/