libxt_CLASSIFY.c revision 35459f05f5addd1b92c32a241863995aa619495b
1#include <stdio.h>
2#include <xtables.h>
3#include <linux/netfilter/xt_CLASSIFY.h>
4#include <linux/pkt_sched.h>
5
6enum {
7	O_SET_CLASS = 0,
8};
9
10static void
11CLASSIFY_help(void)
12{
13	printf(
14"CLASSIFY target options:\n"
15"--set-class MAJOR:MINOR    Set skb->priority value (always hexadecimal!)\n");
16}
17
18static const struct xt_option_entry CLASSIFY_opts[] = {
19	{.name = "set-class", .id = O_SET_CLASS, .type = XTTYPE_STRING,
20	 .flags = XTOPT_MAND},
21	XTOPT_TABLEEND,
22};
23
24static int CLASSIFY_string_to_priority(const char *s, unsigned int *p)
25{
26	unsigned int i, j;
27
28	if (sscanf(s, "%x:%x", &i, &j) != 2)
29		return 1;
30
31	*p = TC_H_MAKE(i<<16, j);
32	return 0;
33}
34
35static void CLASSIFY_parse(struct xt_option_call *cb)
36{
37	struct xt_classify_target_info *clinfo = cb->data;
38
39	xtables_option_parse(cb);
40	if (CLASSIFY_string_to_priority(cb->arg, &clinfo->priority))
41		xtables_error(PARAMETER_PROBLEM,
42			   "Bad class value \"%s\"", cb->arg);
43}
44
45static void
46CLASSIFY_print_class(unsigned int priority, int numeric)
47{
48	printf(" %x:%x", TC_H_MAJ(priority)>>16, TC_H_MIN(priority));
49}
50
51static void
52CLASSIFY_print(const void *ip,
53      const struct xt_entry_target *target,
54      int numeric)
55{
56	const struct xt_classify_target_info *clinfo =
57		(const struct xt_classify_target_info *)target->data;
58	printf(" CLASSIFY set");
59	CLASSIFY_print_class(clinfo->priority, numeric);
60}
61
62static void
63CLASSIFY_save(const void *ip, const struct xt_entry_target *target)
64{
65	const struct xt_classify_target_info *clinfo =
66		(const struct xt_classify_target_info *)target->data;
67
68	printf(" --set-class %.4x:%.4x",
69	       TC_H_MAJ(clinfo->priority)>>16, TC_H_MIN(clinfo->priority));
70}
71
72static struct xtables_target classify_target = {
73	.family		= NFPROTO_UNSPEC,
74	.name		= "CLASSIFY",
75	.version	= XTABLES_VERSION,
76	.size		= XT_ALIGN(sizeof(struct xt_classify_target_info)),
77	.userspacesize	= XT_ALIGN(sizeof(struct xt_classify_target_info)),
78	.help		= CLASSIFY_help,
79	.print		= CLASSIFY_print,
80	.save		= CLASSIFY_save,
81	.x6_parse	= CLASSIFY_parse,
82	.x6_options	= CLASSIFY_opts,
83};
84
85void _init(void)
86{
87	xtables_register_target(&classify_target);
88}
89