1 /* Header for use in defining a given protocol. */
2 #ifndef _IP_NAT_PROTOCOL_H
3 #define _IP_NAT_PROTOCOL_H
4 #include <linux/init.h>
5 #include <linux/list.h>
6 
7 struct iphdr;
8 struct ip_nat_range;
9 
10 struct ip_nat_protocol
11 {
12 	struct list_head list;
13 
14 	/* Protocol name */
15 	const char *name;
16 
17 	/* Protocol number. */
18 	unsigned int protonum;
19 
20 	/* Do a packet translation according to the ip_nat_proto_manip
21 	 * and manip type. */
22 	void (*manip_pkt)(struct iphdr *iph, size_t len,
23 			  const struct ip_conntrack_manip *manip,
24 			  enum ip_nat_manip_type maniptype);
25 
26 	/* Is the manipable part of the tuple between min and max incl? */
27 	int (*in_range)(const struct ip_conntrack_tuple *tuple,
28 			enum ip_nat_manip_type maniptype,
29 			const union ip_conntrack_manip_proto *min,
30 			const union ip_conntrack_manip_proto *max);
31 
32 	/* Alter the per-proto part of the tuple (depending on
33 	   maniptype), to give a unique tuple in the given range if
34 	   possible; return false if not.  Per-protocol part of tuple
35 	   is initialized to the incoming packet. */
36 	int (*unique_tuple)(struct ip_conntrack_tuple *tuple,
37 			    const struct ip_nat_range *range,
38 			    enum ip_nat_manip_type maniptype,
39 			    const struct ip_conntrack *conntrack);
40 
41 	unsigned int (*print)(char *buffer,
42 			      const struct ip_conntrack_tuple *match,
43 			      const struct ip_conntrack_tuple *mask);
44 
45 	unsigned int (*print_range)(char *buffer,
46 				    const struct ip_nat_range *range);
47 };
48 
49 /* Protocol registration. */
50 extern int ip_nat_protocol_register(struct ip_nat_protocol *proto);
51 extern void ip_nat_protocol_unregister(struct ip_nat_protocol *proto);
52 
53 extern int init_protocols(void) __init;
54 extern void cleanup_protocols(void);
55 extern struct ip_nat_protocol *find_nat_proto(u_int16_t protonum);
56 
57 #endif /*_IP_NAT_PROTO_H*/
58