Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 1 | /* Shared library add-on to iptables for the TTL target |
| 2 | * (C) 2000 by Harald Welte <laforge@gnumonks.org> |
| 3 | * |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 4 | * This program is distributed under the terms of GNU GPL |
| 5 | */ |
| 6 | #include <stdio.h> |
Jan Engelhardt | 5d9678a | 2008-11-20 10:15:35 +0100 | [diff] [blame] | 7 | #include <xtables.h> |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 8 | #include <linux/netfilter_ipv4/ipt_TTL.h> |
| 9 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 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 |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 33 | |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 34 | static void TTL_help(void) |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 35 | { |
| 36 | printf( |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 37 | "TTL target options\n" |
Nicolas Bouliane | 37fd00d | 2004-07-27 21:46:21 +0000 | [diff] [blame] | 38 | " --ttl-set value Set TTL to <value 0-255>\n" |
| 39 | " --ttl-dec value Decrement TTL by <value 1-255>\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 40 | " --ttl-inc value Increment TTL by <value 1-255>\n"); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 41 | } |
| 42 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 43 | static void TTL_parse(struct xt_option_call *cb) |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 44 | { |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 45 | struct ipt_TTL_info *info = cb->data; |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 46 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 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; |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 58 | } |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 59 | } |
| 60 | |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 61 | static void TTL_check(struct xt_fcheck_call *cb) |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 62 | { |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 63 | if (!(cb->xflags & F_ANY)) |
Jan Engelhardt | 1829ed4 | 2009-02-21 03:29:44 +0100 | [diff] [blame] | 64 | xtables_error(PARAMETER_PROBLEM, |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 65 | "TTL: You must specify an action"); |
| 66 | } |
| 67 | |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 68 | static void TTL_save(const void *ip, const struct xt_entry_target *target) |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 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: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 75 | printf(" --ttl-set"); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 76 | break; |
| 77 | case IPT_TTL_DEC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 78 | printf(" --ttl-dec"); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 79 | break; |
| 80 | |
| 81 | case IPT_TTL_INC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 82 | printf(" --ttl-inc"); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 83 | break; |
| 84 | } |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 85 | printf(" %u", info->ttl); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 86 | } |
| 87 | |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 88 | static void TTL_print(const void *ip, const struct xt_entry_target *target, |
| 89 | int numeric) |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 90 | { |
| 91 | const struct ipt_TTL_info *info = |
| 92 | (struct ipt_TTL_info *) target->data; |
| 93 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 94 | printf(" TTL "); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 95 | switch (info->mode) { |
| 96 | case IPT_TTL_SET: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 97 | printf("set to"); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 98 | break; |
| 99 | case IPT_TTL_DEC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 100 | printf("decrement by"); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 101 | break; |
| 102 | case IPT_TTL_INC: |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 103 | printf("increment by"); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 104 | break; |
| 105 | } |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 106 | printf(" %u", info->ttl); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 107 | } |
| 108 | |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 109 | static struct xtables_target ttl_tg_reg = { |
Pablo Neira | 8caee8b | 2004-12-28 13:11:59 +0000 | [diff] [blame] | 110 | .name = "TTL", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 111 | .version = XTABLES_VERSION, |
Jan Engelhardt | 03d9948 | 2008-11-18 12:27:54 +0100 | [diff] [blame] | 112 | .family = NFPROTO_IPV4, |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 113 | .size = XT_ALIGN(sizeof(struct ipt_TTL_info)), |
| 114 | .userspacesize = XT_ALIGN(sizeof(struct ipt_TTL_info)), |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 115 | .help = TTL_help, |
Jan Engelhardt | 1d5b63d | 2007-10-04 16:29:00 +0000 | [diff] [blame] | 116 | .print = TTL_print, |
| 117 | .save = TTL_save, |
Jan Engelhardt | fa728c8 | 2011-02-13 03:31:54 +0100 | [diff] [blame] | 118 | .x6_parse = TTL_parse, |
| 119 | .x6_fcheck = TTL_check, |
| 120 | .x6_options = TTL_opts, |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 121 | }; |
| 122 | |
| 123 | void _init(void) |
| 124 | { |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 125 | xtables_register_target(&ttl_tg_reg); |
Harald Welte | 703828f | 2000-10-04 15:27:07 +0000 | [diff] [blame] | 126 | } |