blob: ee0f9e1c4a509a10693fc35d2e5fee2af0329923 [file] [log] [blame]
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +00001#include <stdio.h>
Yasuyuki KOZAKAIe4cc20b2007-08-04 08:23:13 +00002#include <xtables.h>
Yasuyuki KOZAKAIe4cc20b2007-08-04 08:23:13 +00003#include <linux/netfilter/xt_CLASSIFY.h>
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +00004#include <linux/pkt_sched.h>
5
Jan Engelhardt35459f02011-03-01 20:14:16 +01006enum {
7 O_SET_CLASS = 0,
8};
9
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000010static void
László Attila Tóth72118882007-10-08 05:12:42 +000011CLASSIFY_help(void)
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000012{
13 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020014"CLASSIFY target options:\n"
Jan Engelhardtc9ccba52009-04-04 18:43:15 +020015"--set-class MAJOR:MINOR Set skb->priority value (always hexadecimal!)\n");
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000016}
17
Jan Engelhardt35459f02011-03-01 20:14:16 +010018static 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,
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000022};
23
László Attila Tóth72118882007-10-08 05:12:42 +000024static int CLASSIFY_string_to_priority(const char *s, unsigned int *p)
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000025{
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
Jan Engelhardt35459f02011-03-01 20:14:16 +010035static void CLASSIFY_parse(struct xt_option_call *cb)
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000036{
Jan Engelhardt35459f02011-03-01 20:14:16 +010037 struct xt_classify_target_info *clinfo = cb->data;
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000038
Jan Engelhardt35459f02011-03-01 20:14:16 +010039 xtables_option_parse(cb);
40 if (CLASSIFY_string_to_priority(cb->arg, &clinfo->priority))
Jan Engelhardt1829ed42009-02-21 03:29:44 +010041 xtables_error(PARAMETER_PROBLEM,
Jan Engelhardt35459f02011-03-01 20:14:16 +010042 "Bad class value \"%s\"", cb->arg);
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000043}
44
45static void
László Attila Tóth72118882007-10-08 05:12:42 +000046CLASSIFY_print_class(unsigned int priority, int numeric)
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000047{
Jan Engelhardt73866352010-12-18 02:04:59 +010048 printf(" %x:%x", TC_H_MAJ(priority)>>16, TC_H_MIN(priority));
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000049}
50
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000051static void
László Attila Tóth72118882007-10-08 05:12:42 +000052CLASSIFY_print(const void *ip,
Yasuyuki KOZAKAI193df8e2007-07-24 05:57:28 +000053 const struct xt_entry_target *target,
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000054 int numeric)
55{
Yasuyuki KOZAKAIe4cc20b2007-08-04 08:23:13 +000056 const struct xt_classify_target_info *clinfo =
57 (const struct xt_classify_target_info *)target->data;
Jan Engelhardt73866352010-12-18 02:04:59 +010058 printf(" CLASSIFY set");
László Attila Tóth72118882007-10-08 05:12:42 +000059 CLASSIFY_print_class(clinfo->priority, numeric);
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000060}
61
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000062static void
László Attila Tóth72118882007-10-08 05:12:42 +000063CLASSIFY_save(const void *ip, const struct xt_entry_target *target)
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000064{
Yasuyuki KOZAKAIe4cc20b2007-08-04 08:23:13 +000065 const struct xt_classify_target_info *clinfo =
66 (const struct xt_classify_target_info *)target->data;
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000067
Jan Engelhardt73866352010-12-18 02:04:59 +010068 printf(" --set-class %.4x:%.4x",
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000069 TC_H_MAJ(clinfo->priority)>>16, TC_H_MIN(clinfo->priority));
70}
71
László Attila Tóth72118882007-10-08 05:12:42 +000072static struct xtables_target classify_target = {
Jan Engelhardt42979362009-06-01 11:56:23 +020073 .family = NFPROTO_UNSPEC,
Yasuyuki KOZAKAIe4cc20b2007-08-04 08:23:13 +000074 .name = "CLASSIFY",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020075 .version = XTABLES_VERSION,
Yasuyuki KOZAKAIe4cc20b2007-08-04 08:23:13 +000076 .size = XT_ALIGN(sizeof(struct xt_classify_target_info)),
77 .userspacesize = XT_ALIGN(sizeof(struct xt_classify_target_info)),
László Attila Tóth72118882007-10-08 05:12:42 +000078 .help = CLASSIFY_help,
László Attila Tóth72118882007-10-08 05:12:42 +000079 .print = CLASSIFY_print,
80 .save = CLASSIFY_save,
Jan Engelhardt35459f02011-03-01 20:14:16 +010081 .x6_parse = CLASSIFY_parse,
82 .x6_options = CLASSIFY_opts,
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000083};
84
85void _init(void)
86{
László Attila Tóth72118882007-10-08 05:12:42 +000087 xtables_register_target(&classify_target);
Joszef Kadlecsik6ab626b2003-04-11 10:14:10 +000088}