Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 1 | /* |
| 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 Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 7 | #include <stdio.h> |
Jan Engelhardt | 5d9678a | 2008-11-20 10:15:35 +0100 | [diff] [blame] | 8 | #include <xtables.h> |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 9 | #include <linux/netfilter_ipv6/ip6t_HL.h> |
| 10 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 11 | enum { |
| 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 |
| 22 | static 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 Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 34 | |
Jan Engelhardt | 4d150eb | 2007-10-04 16:29:39 +0000 | [diff] [blame] | 35 | static void HL_help(void) |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 36 | { |
| 37 | printf( |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 38 | "HL target options\n" |
Maciej Soltysiak | 46e8538 | 2004-07-28 14:08:22 +0000 | [diff] [blame] | 39 | " --hl-set value Set HL to <value 0-255>\n" |
| 40 | " --hl-dec value Decrement HL by <value 1-255>\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 41 | " --hl-inc value Increment HL by <value 1-255>\n"); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 42 | } |
| 43 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 44 | static void HL_parse(struct xt_option_call *cb) |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 45 | { |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 46 | struct ip6t_HL_info *info = cb->data; |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 47 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 48 | 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 Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 59 | } |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 60 | } |
| 61 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 62 | static void HL_check(struct xt_fcheck_call *cb) |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 63 | { |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 64 | if (!(cb->xflags & F_ANY)) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 65 | xtables_error(PARAMETER_PROBLEM, |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 66 | "HL: You must specify an action"); |
| 67 | } |
| 68 | |
Jan Engelhardt | 4d150eb | 2007-10-04 16:29:39 +0000 | [diff] [blame] | 69 | static void HL_save(const void *ip, const struct xt_entry_target *target) |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 70 | { |
| 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 Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 76 | printf(" --hl-set"); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 77 | break; |
| 78 | case IP6T_HL_DEC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 79 | printf(" --hl-dec"); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 80 | break; |
| 81 | |
| 82 | case IP6T_HL_INC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 83 | printf(" --hl-inc"); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 84 | break; |
| 85 | } |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 86 | printf(" %u", info->hop_limit); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 87 | } |
| 88 | |
Jan Engelhardt | 4d150eb | 2007-10-04 16:29:39 +0000 | [diff] [blame] | 89 | static void HL_print(const void *ip, const struct xt_entry_target *target, |
| 90 | int numeric) |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 91 | { |
| 92 | const struct ip6t_HL_info *info = |
| 93 | (struct ip6t_HL_info *) target->data; |
| 94 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 95 | printf(" HL "); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 96 | switch (info->mode) { |
| 97 | case IP6T_HL_SET: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 98 | printf("set to"); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 99 | break; |
| 100 | case IP6T_HL_DEC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 101 | printf("decrement by"); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 102 | break; |
| 103 | case IP6T_HL_INC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 104 | printf("increment by"); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 105 | break; |
| 106 | } |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 107 | printf(" %u", info->hop_limit); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 108 | } |
| 109 | |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 110 | static struct xtables_target hl_tg6_reg = { |
Harald Welte | fcbab56 | 2005-02-01 13:36:46 +0000 | [diff] [blame] | 111 | .name = "HL", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 112 | .version = XTABLES_VERSION, |
Jan Engelhardt | 03d9948 | 2008-11-18 12:27:54 +0100 | [diff] [blame] | 113 | .family = NFPROTO_IPV6, |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 114 | .size = XT_ALIGN(sizeof(struct ip6t_HL_info)), |
| 115 | .userspacesize = XT_ALIGN(sizeof(struct ip6t_HL_info)), |
Jan Engelhardt | 4d150eb | 2007-10-04 16:29:39 +0000 | [diff] [blame] | 116 | .help = HL_help, |
Jan Engelhardt | 4d150eb | 2007-10-04 16:29:39 +0000 | [diff] [blame] | 117 | .print = HL_print, |
| 118 | .save = HL_save, |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 119 | .x6_parse = HL_parse, |
| 120 | .x6_fcheck = HL_check, |
| 121 | .x6_options = HL_opts, |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 122 | }; |
| 123 | |
| 124 | void _init(void) |
| 125 | { |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 126 | xtables_register_target(&hl_tg6_reg); |
Maciej Soltysiak | 60358d7 | 2003-01-08 09:14:20 +0000 | [diff] [blame] | 127 | } |