1/* Header for use in defining a given protocol. */ 2#ifndef _NF_NAT_L4PROTO_H 3#define _NF_NAT_L4PROTO_H 4#include <net/netfilter/nf_nat.h> 5#include <linux/netfilter/nfnetlink_conntrack.h> 6 7struct nf_nat_range; 8struct nf_nat_l3proto; 9 10struct nf_nat_l4proto { 11 /* Protocol number. */ 12 u8 l4proto; 13 14 /* Translate a packet to the target according to manip type. 15 * Return true if succeeded. 16 */ 17 bool (*manip_pkt)(struct sk_buff *skb, 18 const struct nf_nat_l3proto *l3proto, 19 unsigned int iphdroff, unsigned int hdroff, 20 const struct nf_conntrack_tuple *tuple, 21 enum nf_nat_manip_type maniptype); 22 23 /* Is the manipable part of the tuple between min and max incl? */ 24 bool (*in_range)(const struct nf_conntrack_tuple *tuple, 25 enum nf_nat_manip_type maniptype, 26 const union nf_conntrack_man_proto *min, 27 const union nf_conntrack_man_proto *max); 28 29 /* Alter the per-proto part of the tuple (depending on 30 * maniptype), to give a unique tuple in the given range if 31 * possible. Per-protocol part of tuple is initialized to the 32 * incoming packet. 33 */ 34 void (*unique_tuple)(const struct nf_nat_l3proto *l3proto, 35 struct nf_conntrack_tuple *tuple, 36 const struct nf_nat_range *range, 37 enum nf_nat_manip_type maniptype, 38 const struct nf_conn *ct); 39 40 int (*nlattr_to_range)(struct nlattr *tb[], 41 struct nf_nat_range *range); 42}; 43 44/* Protocol registration. */ 45int nf_nat_l4proto_register(u8 l3proto, const struct nf_nat_l4proto *l4proto); 46void nf_nat_l4proto_unregister(u8 l3proto, 47 const struct nf_nat_l4proto *l4proto); 48 49const struct nf_nat_l4proto *__nf_nat_l4proto_find(u8 l3proto, u8 l4proto); 50 51/* Built-in protocols. */ 52extern const struct nf_nat_l4proto nf_nat_l4proto_tcp; 53extern const struct nf_nat_l4proto nf_nat_l4proto_udp; 54extern const struct nf_nat_l4proto nf_nat_l4proto_icmp; 55extern const struct nf_nat_l4proto nf_nat_l4proto_icmpv6; 56extern const struct nf_nat_l4proto nf_nat_l4proto_unknown; 57 58bool nf_nat_l4proto_in_range(const struct nf_conntrack_tuple *tuple, 59 enum nf_nat_manip_type maniptype, 60 const union nf_conntrack_man_proto *min, 61 const union nf_conntrack_man_proto *max); 62 63void nf_nat_l4proto_unique_tuple(const struct nf_nat_l3proto *l3proto, 64 struct nf_conntrack_tuple *tuple, 65 const struct nf_nat_range *range, 66 enum nf_nat_manip_type maniptype, 67 const struct nf_conn *ct, u16 *rover); 68 69int nf_nat_l4proto_nlattr_to_range(struct nlattr *tb[], 70 struct nf_nat_range *range); 71 72#endif /*_NF_NAT_L4PROTO_H*/ 73