libxt_length.c revision c15f9e3f6d8552cddfc858b115d996c7cf5b47e9
1147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE#include <stdio.h>
236087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI#include <xtables.h>
336087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI#include <linux/netfilter/xt_length.h>
4147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
5c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardtenum {
6c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	O_LENGTH = 0,
7c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt};
8c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt
9181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void length_help(void)
10147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{
11147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE	printf(
128b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"length match options:\n"
13147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE"[!] --length length[:length]    Match packet length against value or range\n"
148b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"                                of values (inclusive)\n");
15147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE}
16147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
17c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardtstatic const struct xt_option_entry length_opts[] = {
18c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	{.name = "length", .id = O_LENGTH, .type = XTTYPE_UINT16RC,
19c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	 .flags = XTOPT_MAND | XTOPT_INVERT},
20c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	XTOPT_TABLEEND,
21147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE};
22147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
23c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardtstatic void length_parse(struct xt_option_call *cb)
24147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{
25c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	struct xt_length_info *info = cb->data;
26147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
27c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	xtables_option_parse(cb);
28c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	info->min = cb->val.u16_range[0];
29c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	info->max = (cb->nvals == 2) ? cb->val.u16_range[1] : UINT16_MAX;
30c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	if (cb->invert)
31c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt		info->invert = 1;
32147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE}
33147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
34147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIEstatic void
35cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardtlength_print(const void *ip, const struct xt_entry_match *match, int numeric)
36147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{
37cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt	const struct xt_length_info *info = (void *)match->data;
38cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt
3973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" length %s", info->invert ? "!" : "");
40cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt	if (info->min == info->max)
4173866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf("%u", info->min);
42147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE	else
4373866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf("%u:%u", info->min, info->max);
44147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE}
45147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
46181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void length_save(const void *ip, const struct xt_entry_match *match)
47147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{
48cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt	const struct xt_length_info *info = (void *)match->data;
49cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt
5073866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf("%s --length ", info->invert ? " !" : "");
51cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt	if (info->min == info->max)
5273866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf("%u", info->min);
53cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt	else
5473866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt		printf("%u:%u", info->min, info->max);
55147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE}
56147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
57181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic struct xtables_match length_match = {
5842979363f3958b4436c6d2503753c182c58e55eaJan Engelhardt	.family		= NFPROTO_UNSPEC,
5936087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI	.name		= "length",
608b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version	= XTABLES_VERSION,
6136087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof(struct xt_length_info)),
6236087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI	.userspacesize	= XT_ALIGN(sizeof(struct xt_length_info)),
63181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.help		= length_help,
64181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.print		= length_print,
65181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	.save		= length_save,
66c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	.x6_parse	= length_parse,
67c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt	.x6_options	= length_opts,
68147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE};
69147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE
70147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIEvoid _init(void)
71147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{
72181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt	xtables_register_match(&length_match);
73147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE}
74