8
#include <limits.h> /* INT_MAX in ip_tables.h */
8
9
#include <linux/netfilter_ipv4/ip_tables.h>
9
#include <linux/netfilter/nf_nat.h>
10
#include <net/netfilter/nf_nat.h>
11
/* Function which prints out usage message. */
12
12
static void MASQUERADE_help(void)
28
/* Initialize the target. */
29
28
static void MASQUERADE_init(struct xt_entry_target *t)
31
struct ip_nat_multi_range *mr = (struct ip_nat_multi_range *)t->data;
30
struct nf_nat_multi_range *mr = (struct nf_nat_multi_range *)t->data;
33
32
/* Actually, it's 0, but it's ignored at the moment. */
48
47
if (port <= 0 || port > 65535)
49
exit_error(PARAMETER_PROBLEM, "Port `%s' not valid\n", arg);
48
xtables_error(PARAMETER_PROBLEM, "Port \"%s\" not valid\n", arg);
51
50
dash = strchr(arg, '-');
59
58
maxport = atoi(dash + 1);
60
59
if (maxport == 0 || maxport > 65535)
61
exit_error(PARAMETER_PROBLEM,
60
xtables_error(PARAMETER_PROBLEM,
62
61
"Port `%s' not valid\n", dash+1);
63
62
if (maxport < port)
64
63
/* People are stupid. Present reader excepted. */
65
exit_error(PARAMETER_PROBLEM,
64
xtables_error(PARAMETER_PROBLEM,
66
65
"Port range `%s' funky\n", arg);
67
66
mr->range[0].min.tcp.port = htons(port);
68
67
mr->range[0].max.tcp.port = htons(maxport);
72
/* Function which parses command options; returns true if it
74
71
static int MASQUERADE_parse(int c, char **argv, int invert, unsigned int *flags,
75
72
const void *e, struct xt_entry_target **target)
77
74
const struct ipt_entry *entry = e;
79
struct ip_nat_multi_range *mr
80
= (struct ip_nat_multi_range *)(*target)->data;
76
struct nf_nat_multi_range *mr
77
= (struct nf_nat_multi_range *)(*target)->data;
82
79
if (entry->ip.proto == IPPROTO_TCP
83
80
|| entry->ip.proto == IPPROTO_UDP
81
|| entry->ip.proto == IPPROTO_SCTP
82
|| entry->ip.proto == IPPROTO_DCCP
84
83
|| entry->ip.proto == IPPROTO_ICMP)
92
exit_error(PARAMETER_PROBLEM,
93
"Need TCP or UDP with port specification");
91
xtables_error(PARAMETER_PROBLEM,
92
"Need TCP, UDP, SCTP or DCCP with port specification");
95
if (check_inverse(optarg, &invert, NULL, 0))
96
exit_error(PARAMETER_PROBLEM,
94
if (xtables_check_inverse(optarg, &invert, NULL, 0))
95
xtables_error(PARAMETER_PROBLEM,
97
96
"Unexpected `!' after --to-ports");
99
98
parse_ports(optarg, mr);
111
/* Prints out the targinfo. */
113
111
MASQUERADE_print(const void *ip, const struct xt_entry_target *target,
116
struct ip_nat_multi_range *mr
117
= (struct ip_nat_multi_range *)target->data;
118
struct ip_nat_range *r = &mr->range[0];
114
struct nf_nat_multi_range *mr
115
= (struct nf_nat_multi_range *)target->data;
116
struct nf_nat_range *r = &mr->range[0];
120
118
if (r->flags & IP_NAT_RANGE_PROTO_SPECIFIED) {
121
119
printf("masq ports: ");
129
127
printf("random ");
132
/* Saves the union ipt_targinfo in parsable form to stdout. */
134
131
MASQUERADE_save(const void *ip, const struct xt_entry_target *target)
136
struct ip_nat_multi_range *mr
137
= (struct ip_nat_multi_range *)target->data;
138
struct ip_nat_range *r = &mr->range[0];
133
struct nf_nat_multi_range *mr
134
= (struct nf_nat_multi_range *)target->data;
135
struct nf_nat_range *r = &mr->range[0];
140
137
if (r->flags & IP_NAT_RANGE_PROTO_SPECIFIED) {
141
138
printf("--to-ports %hu", ntohs(r->min.tcp.port));
151
148
static struct xtables_target masquerade_tg_reg = {
152
149
.name = "MASQUERADE",
153
150
.version = XTABLES_VERSION,
155
.size = XT_ALIGN(sizeof(struct ip_nat_multi_range)),
156
.userspacesize = XT_ALIGN(sizeof(struct ip_nat_multi_range)),
151
.family = NFPROTO_IPV4,
152
.size = XT_ALIGN(sizeof(struct nf_nat_multi_range)),
153
.userspacesize = XT_ALIGN(sizeof(struct nf_nat_multi_range)),
157
154
.help = MASQUERADE_help,
158
155
.init = MASQUERADE_init,
159
156
.parse = MASQUERADE_parse,