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