blob: 37922f6fe0b02f7913d2cc2880153619b122f5cc [file] [log] [blame]
Maciej Soltysiak60358d72003-01-08 09:14:20 +00001/*
2 * IPv6 Hop Limit matching module
3 * Maciej Soltysiak <solt@dns.toxicfilms.tv>
4 * Based on HW's ttl match
5 * This program is released under the terms of GNU GPL
Stephane Ouellette46525cd2003-05-07 20:08:36 +00006 * Cleanups by Stephane Ouellette <ouellettes@videotron.ca>
Maciej Soltysiak60358d72003-01-08 09:14:20 +00007 */
Maciej Soltysiak60358d72003-01-08 09:14:20 +00008#include <stdio.h>
Jan Engelhardt5d9678a2008-11-20 10:15:35 +01009#include <xtables.h>
Maciej Soltysiak60358d72003-01-08 09:14:20 +000010#include <linux/netfilter_ipv6/ip6t_hl.h>
11
Jan Engelhardtdba08392011-02-18 03:20:56 +010012enum {
13 O_HL_EQ = 0,
14 O_HL_LT,
15 O_HL_GT,
16 F_HL_EQ = 1 << O_HL_EQ,
17 F_HL_LT = 1 << O_HL_LT,
18 F_HL_GT = 1 << O_HL_GT,
19 F_ANY = F_HL_EQ | F_HL_LT | F_HL_GT,
20};
21
Jan Engelhardt997045f2007-10-04 16:29:21 +000022static void hl_help(void)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000023{
24 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020025"hl match options:\n"
Jan Engelhardt96727922008-08-13 14:42:41 +020026"[!] --hl-eq value Match hop limit value\n"
Maciej Soltysiak60358d72003-01-08 09:14:20 +000027" --hl-lt value Match HL < value\n"
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020028" --hl-gt value Match HL > value\n");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000029}
30
Jan Engelhardtdba08392011-02-18 03:20:56 +010031static void hl_parse(struct xt_option_call *cb)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000032{
Jan Engelhardtdba08392011-02-18 03:20:56 +010033 struct ip6t_hl_info *info = cb->data;
Maciej Soltysiak60358d72003-01-08 09:14:20 +000034
Jan Engelhardtdba08392011-02-18 03:20:56 +010035 xtables_option_parse(cb);
36 switch (cb->entry->id) {
37 case O_HL_EQ:
38 info->mode = cb->invert ? IP6T_HL_NE : IP6T_HL_EQ;
39 break;
40 case O_HL_LT:
41 info->mode = IP6T_HL_LT;
42 break;
43 case O_HL_GT:
44 info->mode = IP6T_HL_GT;
45 break;
Maciej Soltysiak60358d72003-01-08 09:14:20 +000046 }
Maciej Soltysiak60358d72003-01-08 09:14:20 +000047}
48
Jan Engelhardtdba08392011-02-18 03:20:56 +010049static void hl_check(struct xt_fcheck_call *cb)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000050{
Jan Engelhardtdba08392011-02-18 03:20:56 +010051 if (!(cb->xflags & F_ANY))
Jan Engelhardt1829ed42009-02-21 03:29:44 +010052 xtables_error(PARAMETER_PROBLEM,
Maciej Soltysiak60358d72003-01-08 09:14:20 +000053 "HL match: You must specify one of "
Stephane Ouellette46525cd2003-05-07 20:08:36 +000054 "`--hl-eq', `--hl-lt', `--hl-gt'");
Maciej Soltysiak60358d72003-01-08 09:14:20 +000055}
56
Jan Engelhardt997045f2007-10-04 16:29:21 +000057static void hl_print(const void *ip, const struct xt_entry_match *match,
58 int numeric)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000059{
Jan Engelhardt69f564e2009-05-26 13:14:06 +020060 static const char *const op[] = {
Stephane Ouellette46525cd2003-05-07 20:08:36 +000061 [IP6T_HL_EQ] = "==",
62 [IP6T_HL_NE] = "!=",
63 [IP6T_HL_LT] = "<",
64 [IP6T_HL_GT] = ">" };
65
Maciej Soltysiak60358d72003-01-08 09:14:20 +000066 const struct ip6t_hl_info *info =
67 (struct ip6t_hl_info *) match->data;
68
Jan Engelhardt73866352010-12-18 02:04:59 +010069 printf(" HL match HL %s %u", op[info->mode], info->hop_limit);
Maciej Soltysiak60358d72003-01-08 09:14:20 +000070}
71
Jan Engelhardt997045f2007-10-04 16:29:21 +000072static void hl_save(const void *ip, const struct xt_entry_match *match)
Maciej Soltysiak60358d72003-01-08 09:14:20 +000073{
Jan Engelhardtcea9f712008-12-09 15:06:20 +010074 static const char *const op[] = {
75 [IP6T_HL_EQ] = "--hl-eq",
76 [IP6T_HL_NE] = "! --hl-eq",
77 [IP6T_HL_LT] = "--hl-lt",
78 [IP6T_HL_GT] = "--hl-gt" };
Stephane Ouellette46525cd2003-05-07 20:08:36 +000079
Maciej Soltysiak60358d72003-01-08 09:14:20 +000080 const struct ip6t_hl_info *info =
81 (struct ip6t_hl_info *) match->data;
82
Jan Engelhardt73866352010-12-18 02:04:59 +010083 printf(" %s %u", op[info->mode], info->hop_limit);
Maciej Soltysiak60358d72003-01-08 09:14:20 +000084}
85
Pablo Neira Ayuso7a0992d2016-07-24 12:45:53 +020086static const char *const op[] = {
87 [IP6T_HL_EQ] = "",
88 [IP6T_HL_NE] = "!= ",
89 [IP6T_HL_LT] = "lt ",
90 [IP6T_HL_GT] = "gt "
91};
Shivani Bhardwaj01980082016-01-12 19:58:29 +053092
Pablo Neira Ayuso7a0992d2016-07-24 12:45:53 +020093static int hl_xlate(struct xt_xlate *xl,
94 const struct xt_xlate_mt_params *params)
95{
Shivani Bhardwaj01980082016-01-12 19:58:29 +053096 const struct ip6t_hl_info *info =
Pablo Neira Ayuso7a0992d2016-07-24 12:45:53 +020097 (struct ip6t_hl_info *) params->match->data;
Shivani Bhardwaj01980082016-01-12 19:58:29 +053098
Pablo M. Bermudo Garayf035be32016-07-09 12:27:51 +020099 xt_xlate_add(xl, "ip6 hoplimit %s%u", op[info->mode], info->hop_limit);
Shivani Bhardwaj01980082016-01-12 19:58:29 +0530100
101 return 1;
102}
103
Jan Engelhardtdba08392011-02-18 03:20:56 +0100104#define s struct ip6t_hl_info
105static const struct xt_option_entry hl_opts[] = {
106 {.name = "hl-lt", .id = O_HL_LT, .excl = F_ANY, .type = XTTYPE_UINT8,
107 .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
108 {.name = "hl-gt", .id = O_HL_GT, .excl = F_ANY, .type = XTTYPE_UINT8,
109 .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
110 {.name = "hl-eq", .id = O_HL_EQ, .excl = F_ANY, .type = XTTYPE_UINT8,
111 .flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
112 {.name = "hl", .id = O_HL_EQ, .excl = F_ANY, .type = XTTYPE_UINT8,
113 .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
114 XTOPT_TABLEEND,
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000115};
Jan Engelhardtdba08392011-02-18 03:20:56 +0100116#undef s
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000117
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200118static struct xtables_match hl_mt6_reg = {
Stephane Ouellette46525cd2003-05-07 20:08:36 +0000119 .name = "hl",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200120 .version = XTABLES_VERSION,
Jan Engelhardt03d99482008-11-18 12:27:54 +0100121 .family = NFPROTO_IPV6,
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200122 .size = XT_ALIGN(sizeof(struct ip6t_hl_info)),
123 .userspacesize = XT_ALIGN(sizeof(struct ip6t_hl_info)),
Jan Engelhardt997045f2007-10-04 16:29:21 +0000124 .help = hl_help,
Jan Engelhardt997045f2007-10-04 16:29:21 +0000125 .print = hl_print,
126 .save = hl_save,
Jan Engelhardtdba08392011-02-18 03:20:56 +0100127 .x6_parse = hl_parse,
128 .x6_fcheck = hl_check,
129 .x6_options = hl_opts,
Shivani Bhardwaj01980082016-01-12 19:58:29 +0530130 .xlate = hl_xlate,
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000131};
132
133
134void _init(void)
135{
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200136 xtables_register_match(&hl_mt6_reg);
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000137}