blob: 226b69c379cc70c77afacc098963ed66011df400 [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
Shivani Bhardwaj01980082016-01-12 19:58:29 +053086static int hl_xlate(const struct xt_entry_match *match,
87 struct xt_buf *buf, int numeric)
88{
89 static const char *const op[] = {
90 [IP6T_HL_EQ] = "",
91 [IP6T_HL_NE] = "!= ",
92 [IP6T_HL_LT] = "lt ",
93 [IP6T_HL_GT] = "gt " };
94
95 const struct ip6t_hl_info *info =
96 (struct ip6t_hl_info *) match->data;
97
98 xt_buf_add(buf, "ip6 hoplimit %s%u ", op[info->mode], info->hop_limit);
99
100 return 1;
101}
102
Jan Engelhardtdba08392011-02-18 03:20:56 +0100103#define s struct ip6t_hl_info
104static const struct xt_option_entry hl_opts[] = {
105 {.name = "hl-lt", .id = O_HL_LT, .excl = F_ANY, .type = XTTYPE_UINT8,
106 .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
107 {.name = "hl-gt", .id = O_HL_GT, .excl = F_ANY, .type = XTTYPE_UINT8,
108 .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
109 {.name = "hl-eq", .id = O_HL_EQ, .excl = F_ANY, .type = XTTYPE_UINT8,
110 .flags = XTOPT_INVERT | XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
111 {.name = "hl", .id = O_HL_EQ, .excl = F_ANY, .type = XTTYPE_UINT8,
112 .flags = XTOPT_PUT, XTOPT_POINTER(s, hop_limit)},
113 XTOPT_TABLEEND,
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000114};
Jan Engelhardtdba08392011-02-18 03:20:56 +0100115#undef s
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000116
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200117static struct xtables_match hl_mt6_reg = {
Stephane Ouellette46525cd2003-05-07 20:08:36 +0000118 .name = "hl",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200119 .version = XTABLES_VERSION,
Jan Engelhardt03d99482008-11-18 12:27:54 +0100120 .family = NFPROTO_IPV6,
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200121 .size = XT_ALIGN(sizeof(struct ip6t_hl_info)),
122 .userspacesize = XT_ALIGN(sizeof(struct ip6t_hl_info)),
Jan Engelhardt997045f2007-10-04 16:29:21 +0000123 .help = hl_help,
Jan Engelhardt997045f2007-10-04 16:29:21 +0000124 .print = hl_print,
125 .save = hl_save,
Jan Engelhardtdba08392011-02-18 03:20:56 +0100126 .x6_parse = hl_parse,
127 .x6_fcheck = hl_check,
128 .x6_options = hl_opts,
Shivani Bhardwaj01980082016-01-12 19:58:29 +0530129 .xlate = hl_xlate,
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000130};
131
132
133void _init(void)
134{
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200135 xtables_register_match(&hl_mt6_reg);
Maciej Soltysiak60358d72003-01-08 09:14:20 +0000136}