blob: 254b19140bdbafec446cc4a0d3f9350e807987db [file] [log] [blame]
Maciej Soltysiak60358d72003-01-08 09:14:20 +00001/*
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
6 */
Maciej Soltysiak60358d72003-01-08 09:14:20 +00007#include <stdio.h>
Jan Engelhardt5d9678a2008-11-20 10:15:35 +01008#include <xtables.h>
Maciej Soltysiak60358d72003-01-08 09:14:20 +00009#include <linux/netfilter_ipv6/ip6t_HL.h>
10
Jan Engelhardtfa728c82011-02-13 03:31:54 +010011enum {
12 O_HL_SET = 0,
13 O_HL_INC,
14 O_HL_DEC,
15 F_HL_SET = 1 << O_HL_SET,
16 F_HL_INC = 1 << O_HL_INC,
17 F_HL_DEC = 1 << O_HL_DEC,
18 F_ANY = F_HL_SET | F_HL_INC | F_HL_DEC,
19};
20
21#define s struct ip6t_HL_info
22static const struct xt_option_entry HL_opts[] = {
23 {.name = "ttl-set", .type = XTTYPE_UINT8, .id = O_HL_SET,
24 .excl = F_ANY, .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
25 {.name = "ttl-dec", .type = XTTYPE_UINT8, .id = O_HL_DEC,
26 .excl = F_ANY, .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit),
27 .min = 1},
28 {.name = "ttl-inc", .type = XTTYPE_UINT8, .id = O_HL_INC,
29 .excl = F_ANY, .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit),
30 .min = 1},
31 XTOPT_TABLEEND,
32};
33#undef s
Maciej Soltysiak60358d72003-01-08 09:14:20 +000034
Jan Engelhardt4d150eb2007-10-04 16:29:39 +000035static void HL_help(void)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000036{
37 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020038"HL target options\n"
Maciej Soltysiak46e85382004-07-28 14:08:22 +000039" --hl-set value Set HL to <value 0-255>\n"
40" --hl-dec value Decrement HL by <value 1-255>\n"
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020041" --hl-inc value Increment HL by <value 1-255>\n");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000042}
43
Jan Engelhardtfa728c82011-02-13 03:31:54 +010044static void HL_parse(struct xt_option_call *cb)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000045{
Jan Engelhardtfa728c82011-02-13 03:31:54 +010046 struct ip6t_HL_info *info = cb->data;
Maciej Soltysiak60358d72003-01-08 09:14:20 +000047
Jan Engelhardtfa728c82011-02-13 03:31:54 +010048 xtables_option_parse(cb);
49 switch (cb->entry->id) {
50 case O_HL_SET:
51 info->mode = IP6T_HL_SET;
52 break;
53 case O_HL_INC:
54 info->mode = IP6T_HL_INC;
55 break;
56 case O_HL_DEC:
57 info->mode = IP6T_HL_DEC;
58 break;
Maciej Soltysiak60358d72003-01-08 09:14:20 +000059 }
Maciej Soltysiak60358d72003-01-08 09:14:20 +000060}
61
Jan Engelhardtfa728c82011-02-13 03:31:54 +010062static void HL_check(struct xt_fcheck_call *cb)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000063{
Jan Engelhardtfa728c82011-02-13 03:31:54 +010064 if (!(cb->xflags & F_ANY))
Jan Engelhardt1829ed42009-02-21 03:29:44 +010065 xtables_error(PARAMETER_PROBLEM,
Maciej Soltysiak60358d72003-01-08 09:14:20 +000066 "HL: You must specify an action");
67}
68
Jan Engelhardt4d150eb2007-10-04 16:29:39 +000069static void HL_save(const void *ip, const struct xt_entry_target *target)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000070{
71 const struct ip6t_HL_info *info =
72 (struct ip6t_HL_info *) target->data;
73
74 switch (info->mode) {
75 case IP6T_HL_SET:
Jan Engelhardt73866352010-12-18 02:04:59 +010076 printf(" --hl-set");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000077 break;
78 case IP6T_HL_DEC:
Jan Engelhardt73866352010-12-18 02:04:59 +010079 printf(" --hl-dec");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000080 break;
81
82 case IP6T_HL_INC:
Jan Engelhardt73866352010-12-18 02:04:59 +010083 printf(" --hl-inc");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000084 break;
85 }
Jan Engelhardt73866352010-12-18 02:04:59 +010086 printf(" %u", info->hop_limit);
Maciej Soltysiak60358d72003-01-08 09:14:20 +000087}
88
Jan Engelhardt4d150eb2007-10-04 16:29:39 +000089static void HL_print(const void *ip, const struct xt_entry_target *target,
90 int numeric)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000091{
92 const struct ip6t_HL_info *info =
93 (struct ip6t_HL_info *) target->data;
94
Jan Engelhardt73866352010-12-18 02:04:59 +010095 printf(" HL ");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000096 switch (info->mode) {
97 case IP6T_HL_SET:
Jan Engelhardt73866352010-12-18 02:04:59 +010098 printf("set to");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000099 break;
100 case IP6T_HL_DEC:
Jan Engelhardt73866352010-12-18 02:04:59 +0100101 printf("decrement by");
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000102 break;
103 case IP6T_HL_INC:
Jan Engelhardt73866352010-12-18 02:04:59 +0100104 printf("increment by");
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000105 break;
106 }
Jan Engelhardt73866352010-12-18 02:04:59 +0100107 printf(" %u", info->hop_limit);
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000108}
109
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200110static struct xtables_target hl_tg6_reg = {
Harald Weltefcbab562005-02-01 13:36:46 +0000111 .name = "HL",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200112 .version = XTABLES_VERSION,
Jan Engelhardt03d99482008-11-18 12:27:54 +0100113 .family = NFPROTO_IPV6,
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200114 .size = XT_ALIGN(sizeof(struct ip6t_HL_info)),
115 .userspacesize = XT_ALIGN(sizeof(struct ip6t_HL_info)),
Jan Engelhardt4d150eb2007-10-04 16:29:39 +0000116 .help = HL_help,
Jan Engelhardt4d150eb2007-10-04 16:29:39 +0000117 .print = HL_print,
118 .save = HL_save,
Jan Engelhardtfa728c82011-02-13 03:31:54 +0100119 .x6_parse = HL_parse,
120 .x6_fcheck = HL_check,
121 .x6_options = HL_opts,
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000122};
123
124void _init(void)
125{
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200126 xtables_register_target(&hl_tg6_reg);
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000127}