1 /* Shared library add-on to iptables for the TTL target 2 * (C) 2000 by Harald Welte <laforge (at) 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 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 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 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 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 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 123 void _init(void) 124 { 125 xtables_register_target(&ttl_tg_reg); 126 } 127