libipt_ttl.c revision d09b6d591ca7d7d7575cb6aa20384c9830f777ab
1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* Shared library add-on to iptables to add TTL matching support
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * (C) 2000 by Harald Welte <laforge@gnumonks.org>
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4df143a5041f03a22808b59c76698770b74692815Selim Gurun * $Id$
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This program is released under the terms of GNU GPL */
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdbool.h>
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdio.h>
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h>
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <getopt.h>
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <xtables.h>
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <linux/netfilter_ipv4/ipt_ttl.h>
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void ttl_help(void)
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf(
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"ttl match options:\n"
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"  --ttl-eq value	Match time to live value\n"
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"  --ttl-lt value	Match TTL < value\n"
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project"  --ttl-gt value	Match TTL > value\n");
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int ttl_parse(int c, char **argv, int invert, unsigned int *flags,
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     const void *entry, struct xt_entry_match **match)
2794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun{
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	struct ipt_ttl_info *info = (struct ipt_ttl_info *) (*match)->data;
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	unsigned int value;
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xtables_check_inverse(optarg, &invert, &optind, 0, argv);
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (c) {
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case '2':
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (!xtables_strtoui(optarg, NULL, &value, 0, UINT8_MAX))
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xtables_error(PARAMETER_PROBLEM,
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				           "ttl: Expected value between 0 and 255");
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (invert)
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				info->mode = IPT_TTL_NE;
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				info->mode = IPT_TTL_EQ;
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			/* is 0 allowed? */
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			info->ttl = value;
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case '3':
4894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun			if (!xtables_strtoui(optarg, NULL, &value, 0, UINT8_MAX))
4994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun				xtables_error(PARAMETER_PROBLEM,
5094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun				           "ttl: Expected value between 0 and 255");
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (invert)
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xtables_error(PARAMETER_PROBLEM,
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						"ttl: unexpected `!'");
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			info->mode = IPT_TTL_LT;
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			info->ttl = value;
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case '4':
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (!xtables_strtoui(optarg, NULL, &value, 0, UINT8_MAX))
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				xtables_error(PARAMETER_PROBLEM,
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				           "ttl: Expected value between 0 and 255");
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if (invert)
65218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang				xtables_error(PARAMETER_PROBLEM,
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project						"ttl: unexpected `!'");
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			info->mode = IPT_TTL_GT;
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			info->ttl = value;
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (*flags)
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xtables_error(PARAMETER_PROBLEM,
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				"Can't specify TTL option twice");
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*flags = 1;
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return 1;
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void ttl_check(unsigned int flags)
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (!flags)
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xtables_error(PARAMETER_PROBLEM,
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"TTL match: You must specify one of "
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			"`--ttl-eq', `--ttl-lt', `--ttl-gt");
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void ttl_print(const void *ip, const struct xt_entry_match *match,
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      int numeric)
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	const struct ipt_ttl_info *info =
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(struct ipt_ttl_info *) match->data;
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	printf("TTL match ");
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	switch (info->mode) {
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case IPT_TTL_EQ:
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("TTL == ");
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case IPT_TTL_NE:
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			printf("TTL != ");
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			break;
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		case IPT_TTL_LT:
104218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			printf("TTL < ");
105df143a5041f03a22808b59c76698770b74692815Selim Gurun			break;
106218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang		case IPT_TTL_GT:
107218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			printf("TTL > ");
108218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			break;
109218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	}
110218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	printf("%u ", info->ttl);
111218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang}
112218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang
113218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wangstatic void ttl_save(const void *ip, const struct xt_entry_match *match)
114218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang{
115218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	const struct ipt_ttl_info *info =
116218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang		(struct ipt_ttl_info *) match->data;
117218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang
118218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	switch (info->mode) {
119df143a5041f03a22808b59c76698770b74692815Selim Gurun		case IPT_TTL_EQ:
120218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			printf("--ttl-eq ");
121218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			break;
122218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang		case IPT_TTL_NE:
123df143a5041f03a22808b59c76698770b74692815Selim Gurun			printf("! --ttl-eq ");
124218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			break;
125218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang		case IPT_TTL_LT:
126218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			printf("--ttl-lt ");
127218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			break;
128218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang		case IPT_TTL_GT:
129218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			printf("--ttl-gt ");
130218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			break;
131218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang		default:
132218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			/* error */
133218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang			break;
134218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	}
135df143a5041f03a22808b59c76698770b74692815Selim Gurun	printf("%u ", info->ttl);
136218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang}
137218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang
138218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wangstatic const struct option ttl_opts[] = {
139218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	{.name = "ttl",    .has_arg = true, .val = '2'},
140218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	{.name = "ttl-eq", .has_arg = true, .val = '2'},
141218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	{.name = "ttl-lt", .has_arg = true, .val = '3'},
142218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	{.name = "ttl-gt", .has_arg = true, .val = '4'},
143218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	XT_GETOPT_TABLEEND,
144218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang};
145218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang
146218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wangstatic struct xtables_match ttl_mt_reg = {
147218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	.name		= "ttl",
148218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	.version	= XTABLES_VERSION,
149218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	.family		= NFPROTO_IPV4,
150218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	.size		= XT_ALIGN(sizeof(struct ipt_ttl_info)),
151218647ebd721a259319b28f5719e89a4d0d1aaefShimeng (Simon) Wang	.userspacesize	= XT_ALIGN(sizeof(struct ipt_ttl_info)),
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	.help		= ttl_help,
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	.parse		= ttl_parse,
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	.final_check	= ttl_check,
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	.print		= ttl_print,
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	.save		= ttl_save,
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	.extra_opts	= ttl_opts,
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid _init(void)
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xtables_register_match(&ttl_mt_reg);
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project