1 /* Shared library add-on to iptables for the TTL target
2 * (C) 2000 by Harald Welte <laforge@gnumonks.org>
3 *
4 * This program is distributed under the terms of GNU GPL
5 */
6 #include <stdio.h>
7 #include <xtables.h>
8 #include <linux/netfilter_ipv4/ipt_TTL.h>
9
10 enum {
11 O_TTL_SET = 0,
12 O_TTL_INC,
13 O_TTL_DEC,
14 F_TTL_SET = 1 << O_TTL_SET,
15 F_TTL_INC = 1 << O_TTL_INC,
16 F_TTL_DEC = 1 << O_TTL_DEC,
17 F_ANY = F_TTL_SET | F_TTL_INC | F_TTL_DEC,
18 };
19
20 #define s struct ipt_TTL_info
21 static const struct xt_option_entry TTL_opts[] = {
22 {.name = "ttl-set", .type = XTTYPE_UINT8, .id = O_TTL_SET,
23 .excl = F_ANY, .flags = XTOPT_PUT, XTOPT_POINTER(s, ttl)},
24 {.name = "ttl-dec", .type = XTTYPE_UINT8, .id = O_TTL_DEC,
25 .excl = F_ANY, .flags = XTOPT_PUT, XTOPT_POINTER(s, ttl),
26 .min = 1},
27 {.name = "ttl-inc", .type = XTTYPE_UINT8, .id = O_TTL_INC,
28 .excl = F_ANY, .flags = XTOPT_PUT, XTOPT_POINTER(s, ttl),
29 .min = 1},
30 XTOPT_TABLEEND,
31 };
32 #undef s
33
TTL_help(void)34 static void TTL_help(void)
35 {
36 printf(
37 "TTL target options\n"
38 " --ttl-set value Set TTL to <value 0-255>\n"
39 " --ttl-dec value Decrement TTL by <value 1-255>\n"
40 " --ttl-inc value Increment TTL by <value 1-255>\n");
41 }
42
TTL_parse(struct xt_option_call * cb)43 static void TTL_parse(struct xt_option_call *cb)
44 {
45 struct ipt_TTL_info *info = cb->data;
46
47 xtables_option_parse(cb);
48 switch (cb->entry->id) {
49 case O_TTL_SET:
50 info->mode = IPT_TTL_SET;
51 break;
52 case O_TTL_DEC:
53 info->mode = IPT_TTL_DEC;
54 break;
55 case O_TTL_INC:
56 info->mode = IPT_TTL_INC;
57 break;
58 }
59 }
60
TTL_check(struct xt_fcheck_call * cb)61 static void TTL_check(struct xt_fcheck_call *cb)
62 {
63 if (!(cb->xflags & F_ANY))
64 xtables_error(PARAMETER_PROBLEM,
65 "TTL: You must specify an action");
66 }
67
TTL_save(const void * ip,const struct xt_entry_target * target)68 static void TTL_save(const void *ip, const struct xt_entry_target *target)
69 {
70 const struct ipt_TTL_info *info =
71 (struct ipt_TTL_info *) target->data;
72
73 switch (info->mode) {
74 case IPT_TTL_SET:
75 printf(" --ttl-set");
76 break;
77 case IPT_TTL_DEC:
78 printf(" --ttl-dec");
79 break;
80
81 case IPT_TTL_INC:
82 printf(" --ttl-inc");
83 break;
84 }
85 printf(" %u", info->ttl);
86 }
87
TTL_print(const void * ip,const struct xt_entry_target * target,int numeric)88 static void TTL_print(const void *ip, const struct xt_entry_target *target,
89 int numeric)
90 {
91 const struct ipt_TTL_info *info =
92 (struct ipt_TTL_info *) target->data;
93
94 printf(" TTL ");
95 switch (info->mode) {
96 case IPT_TTL_SET:
97 printf("set to");
98 break;
99 case IPT_TTL_DEC:
100 printf("decrement by");
101 break;
102 case IPT_TTL_INC:
103 printf("increment by");
104 break;
105 }
106 printf(" %u", info->ttl);
107 }
108
109 static struct xtables_target ttl_tg_reg = {
110 .name = "TTL",
111 .version = XTABLES_VERSION,
112 .family = NFPROTO_IPV4,
113 .size = XT_ALIGN(sizeof(struct ipt_TTL_info)),
114 .userspacesize = XT_ALIGN(sizeof(struct ipt_TTL_info)),
115 .help = TTL_help,
116 .print = TTL_print,
117 .save = TTL_save,
118 .x6_parse = TTL_parse,
119 .x6_fcheck = TTL_check,
120 .x6_options = TTL_opts,
121 };
122
_init(void)123 void _init(void)
124 {
125 xtables_register_target(&ttl_tg_reg);
126 }
127