1
2
3
4
5
6
7
8
9
10
11
12#ifndef _NF_CONNTRACK_L3PROTO_H
13#define _NF_CONNTRACK_L3PROTO_H
14#include <linux/netlink.h>
15#include <net/netlink.h>
16#include <linux/seq_file.h>
17#include <net/netfilter/nf_conntrack.h>
18
19struct nf_conntrack_l3proto {
20
21 u_int16_t l3proto;
22
23
24 const char *name;
25
26
27
28
29
30 bool (*pkt_to_tuple)(const struct sk_buff *skb, unsigned int nhoff,
31 struct nf_conntrack_tuple *tuple);
32
33
34
35
36
37 bool (*invert_tuple)(struct nf_conntrack_tuple *inverse,
38 const struct nf_conntrack_tuple *orig);
39
40
41 void (*print_tuple)(struct seq_file *s,
42 const struct nf_conntrack_tuple *);
43
44
45
46
47
48
49 int (*get_l4proto)(const struct sk_buff *skb, unsigned int nhoff,
50 unsigned int *dataoff, u_int8_t *protonum);
51
52 int (*tuple_to_nlattr)(struct sk_buff *skb,
53 const struct nf_conntrack_tuple *t);
54
55
56
57
58 int (*nlattr_tuple_size)(void);
59
60 int (*nlattr_to_tuple)(struct nlattr *tb[],
61 struct nf_conntrack_tuple *t);
62 const struct nla_policy *nla_policy;
63
64 size_t nla_size;
65
66#ifdef CONFIG_SYSCTL
67 const char *ctl_table_path;
68#endif
69
70
71 int (*init_net)(struct net *net);
72
73
74 struct module *me;
75};
76
77extern struct nf_conntrack_l3proto __rcu *nf_ct_l3protos[AF_MAX];
78
79
80int nf_ct_l3proto_pernet_register(struct net *net,
81 struct nf_conntrack_l3proto *proto);
82void nf_ct_l3proto_pernet_unregister(struct net *net,
83 struct nf_conntrack_l3proto *proto);
84
85
86int nf_ct_l3proto_register(struct nf_conntrack_l3proto *proto);
87void nf_ct_l3proto_unregister(struct nf_conntrack_l3proto *proto);
88
89struct nf_conntrack_l3proto *nf_ct_l3proto_find_get(u_int16_t l3proto);
90
91
92extern struct nf_conntrack_l3proto nf_conntrack_l3proto_generic;
93
94static inline struct nf_conntrack_l3proto *
95__nf_ct_l3proto_find(u_int16_t l3proto)
96{
97 if (unlikely(l3proto >= AF_MAX))
98 return &nf_conntrack_l3proto_generic;
99 return rcu_dereference(nf_ct_l3protos[l3proto]);
100}
101
102#endif
103