2
* IPv6 Hop Limit Target module
3
* Maciej Soltysiak <solt@dns.toxicfilms.tv>
4
* Based on HW's ttl target
5
* This program is distributed under the terms of GNU GPL
12
#include <ip6tables.h>
14
#include <linux/netfilter_ipv6/ip6_tables.h>
15
#include <linux/netfilter_ipv6/ip6t_HL.h>
17
#define IP6T_HL_USED 1
19
static void init(struct ip6t_entry_target *t, unsigned int *nfcache)
23
static void help(void)
26
"HL target v%s options\n"
27
" --hl-set value Set HL to <value 0-255>\n"
28
" --hl-dec value Decrement HL by <value 1-255>\n"
29
" --hl-inc value Increment HL by <value 1-255>\n"
33
static int parse(int c, char **argv, int invert, unsigned int *flags,
34
const struct ip6t_entry *entry,
35
struct ip6t_entry_target **target)
37
struct ip6t_HL_info *info = (struct ip6t_HL_info *) (*target)->data;
40
if (*flags & IP6T_HL_USED) {
41
exit_error(PARAMETER_PROBLEM,
42
"Can't specify HL option twice");
46
exit_error(PARAMETER_PROBLEM,
47
"HL: You must specify a value");
49
if (check_inverse(optarg, &invert, NULL, 0))
50
exit_error(PARAMETER_PROBLEM,
51
"HL: unexpected `!'");
53
if (string_to_number(optarg, 0, 255, &value) == -1)
54
exit_error(PARAMETER_PROBLEM,
55
"HL: Expected value between 0 and 255");
60
info->mode = IP6T_HL_SET;
65
exit_error(PARAMETER_PROBLEM,
66
"HL: decreasing by 0?");
69
info->mode = IP6T_HL_DEC;
74
exit_error(PARAMETER_PROBLEM,
75
"HL: increasing by 0?");
78
info->mode = IP6T_HL_INC;
86
info->hop_limit = value;
87
*flags |= IP6T_HL_USED;
92
static void final_check(unsigned int flags)
94
if (!(flags & IP6T_HL_USED))
95
exit_error(PARAMETER_PROBLEM,
96
"HL: You must specify an action");
99
static void save(const struct ip6t_ip6 *ip,
100
const struct ip6t_entry_target *target)
102
const struct ip6t_HL_info *info =
103
(struct ip6t_HL_info *) target->data;
105
switch (info->mode) {
117
printf("%u ", info->hop_limit);
120
static void print(const struct ip6t_ip6 *ip,
121
const struct ip6t_entry_target *target, int numeric)
123
const struct ip6t_HL_info *info =
124
(struct ip6t_HL_info *) target->data;
127
switch (info->mode) {
132
printf("decrement by ");
135
printf("increment by ");
138
printf("%u ", info->hop_limit);
141
static struct option opts[] = {
142
{ "hl-set", 1, 0, '1' },
143
{ "hl-dec", 1, 0, '2' },
144
{ "hl-inc", 1, 0, '3' },
149
struct ip6tables_target HL = { NULL,
151
.version = IPTABLES_VERSION,
152
.size = IP6T_ALIGN(sizeof(struct ip6t_HL_info)),
153
.userspacesize = IP6T_ALIGN(sizeof(struct ip6t_HL_info)),
157
.final_check = &final_check,
165
register_target6(&HL);