blob: 875c6d41eaab0854d02bf625b460ce2d7defbad4 [file] [log] [blame]
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -08001/*
2 * Copyright (C)2003,2004 USAGI/WIDE Project
3 *
4 * Header for use in defining a given L3 protocol for connection tracking.
5 *
6 * Author:
7 * Yasuyuki Kozakai @USAGI <yasuyuki.kozakai@toshiba.co.jp>
8 *
9 * Derived from include/netfilter_ipv4/ip_conntrack_protocol.h
10 */
11
12#ifndef _NF_CONNTRACK_L3PROTO_H
13#define _NF_CONNTRACK_L3PROTO_H
Patrick McHardydf6fb862007-09-28 14:37:03 -070014#include <linux/netlink.h>
Patrick McHardyf73e9242007-09-28 14:39:55 -070015#include <net/netlink.h>
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080016#include <linux/seq_file.h>
17#include <net/netfilter/nf_conntrack.h>
18
19struct nf_conntrack_l3proto
20{
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080021 /* L3 Protocol Family number. ex) PF_INET */
22 u_int16_t l3proto;
23
24 /* Protocol name */
25 const char *name;
26
27 /*
28 * Try to fill in the third arg: nhoff is offset of l3 proto
29 * hdr. Return true if possible.
30 */
31 int (*pkt_to_tuple)(const struct sk_buff *skb, unsigned int nhoff,
32 struct nf_conntrack_tuple *tuple);
33
34 /*
35 * Invert the per-proto part of the tuple: ie. turn xmit into reply.
36 * Some packets can't be inverted: return 0 in that case.
37 */
38 int (*invert_tuple)(struct nf_conntrack_tuple *inverse,
39 const struct nf_conntrack_tuple *orig);
40
41 /* Print out the per-protocol part of the tuple. */
42 int (*print_tuple)(struct seq_file *s,
43 const struct nf_conntrack_tuple *);
44
45 /* Print out the private part of the conntrack. */
46 int (*print_conntrack)(struct seq_file *s, const struct nf_conn *);
47
48 /* Returns verdict for packet, or -1 for invalid. */
49 int (*packet)(struct nf_conn *conntrack,
50 const struct sk_buff *skb,
51 enum ip_conntrack_info ctinfo);
52
53 /*
54 * Called when a new connection for this protocol found;
55 * returns TRUE if it's OK. If so, packet() called next.
56 */
57 int (*new)(struct nf_conn *conntrack, const struct sk_buff *skb);
58
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080059 /*
60 * Called before tracking.
Yasuyuki Kozakaiffc30692007-07-14 20:44:50 -070061 * *dataoff: offset of protocol header (TCP, UDP,...) in skb
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080062 * *protonum: protocol number
63 */
Yasuyuki Kozakaiffc30692007-07-14 20:44:50 -070064 int (*get_l4proto)(const struct sk_buff *skb, unsigned int nhoff,
65 unsigned int *dataoff, u_int8_t *protonum);
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080066
Patrick McHardyfdf70832007-09-28 14:37:41 -070067 int (*tuple_to_nlattr)(struct sk_buff *skb,
Pablo Neira Ayusoc1d10ad2006-01-05 12:19:05 -080068 const struct nf_conntrack_tuple *t);
69
Patrick McHardyfdf70832007-09-28 14:37:41 -070070 int (*nlattr_to_tuple)(struct nlattr *tb[],
Pablo Neira Ayusoc1d10ad2006-01-05 12:19:05 -080071 struct nf_conntrack_tuple *t);
Patrick McHardyf73e9242007-09-28 14:39:55 -070072 const struct nla_policy *nla_policy;
Pablo Neira Ayusoc1d10ad2006-01-05 12:19:05 -080073
Patrick McHardyd62f9ed2006-11-29 02:35:17 +010074#ifdef CONFIG_SYSCTL
75 struct ctl_table_header *ctl_table_header;
Pavel Emelyanovb3fd3ff2008-01-09 00:34:02 -080076 struct ctl_path *ctl_table_path;
Patrick McHardyd62f9ed2006-11-29 02:35:17 +010077 struct ctl_table *ctl_table;
78#endif /* CONFIG_SYSCTL */
79
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080080 /* Module (if any) which this is connected to. */
81 struct module *me;
82};
83
84extern struct nf_conntrack_l3proto *nf_ct_l3protos[AF_MAX];
85
86/* Protocol registration. */
87extern int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto);
Patrick McHardyfe3eb202007-02-12 11:14:28 -080088extern void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto);
Patrick McHardya3c50292007-03-14 16:39:25 -070089extern struct nf_conntrack_l3proto *nf_ct_l3proto_find_get(u_int16_t l3proto);
Pablo Neira Ayusoc1d10ad2006-01-05 12:19:05 -080090extern void nf_ct_l3proto_put(struct nf_conntrack_l3proto *p);
91
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -080092/* Existing built-in protocols */
Martin Josefsson605dcad2006-11-29 02:35:06 +010093extern struct nf_conntrack_l3proto nf_conntrack_l3proto_generic;
Yasuyuki Kozakaiddc8d022006-02-04 02:12:14 -080094
95static inline struct nf_conntrack_l3proto *
96__nf_ct_l3proto_find(u_int16_t l3proto)
97{
98 if (unlikely(l3proto >= AF_MAX))
Martin Josefsson605dcad2006-11-29 02:35:06 +010099 return &nf_conntrack_l3proto_generic;
Patrick McHardy923f4902007-02-12 11:12:57 -0800100 return rcu_dereference(nf_ct_l3protos[l3proto]);
Yasuyuki Kozakaiddc8d022006-02-04 02:12:14 -0800101}
102
Yasuyuki Kozakai9fb9cbb2005-11-09 16:38:16 -0800103#endif /*_NF_CONNTRACK_L3PROTO_H*/