10c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy/*
20c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy * Copyright (c) 2003-2013 Patrick McHardy <kaber@trash.net>
30c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy */
40c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy
56ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik#include <stdio.h>
6e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI#include <xtables.h>
7e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI#include <linux/netfilter/xt_CLASSIFY.h>
86ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik#include <linux/pkt_sched.h>
96ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
1035459f05f5addd1b92c32a241863995aa619495bJan Engelhardtenum {
1135459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	O_SET_CLASS = 0,
1235459f05f5addd1b92c32a241863995aa619495bJan Engelhardt};
1335459f05f5addd1b92c32a241863995aa619495bJan Engelhardt
146ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsikstatic void
1572118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila TóthCLASSIFY_help(void)
166ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik{
176ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik	printf(
188b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"CLASSIFY target options:\n"
19c9ccba543b52cb443f110670420967ac6a41c302Jan Engelhardt"--set-class MAJOR:MINOR    Set skb->priority value (always hexadecimal!)\n");
206ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik}
216ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
2235459f05f5addd1b92c32a241863995aa619495bJan Engelhardtstatic const struct xt_option_entry CLASSIFY_opts[] = {
2335459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	{.name = "set-class", .id = O_SET_CLASS, .type = XTTYPE_STRING,
2435459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	 .flags = XTOPT_MAND},
2535459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	XTOPT_TABLEEND,
266ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik};
276ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
2872118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila Tóthstatic int CLASSIFY_string_to_priority(const char *s, unsigned int *p)
296ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik{
306ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik	unsigned int i, j;
316ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
326ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik	if (sscanf(s, "%x:%x", &i, &j) != 2)
336ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik		return 1;
346ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
356ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik	*p = TC_H_MAKE(i<<16, j);
366ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik	return 0;
376ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik}
386ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
3935459f05f5addd1b92c32a241863995aa619495bJan Engelhardtstatic void CLASSIFY_parse(struct xt_option_call *cb)
406ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik{
4135459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	struct xt_classify_target_info *clinfo = cb->data;
426ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
4335459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	xtables_option_parse(cb);
4435459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	if (CLASSIFY_string_to_priority(cb->arg, &clinfo->priority))
451829ed482efbc8b390cc760d012b3a4450494e1aJan Engelhardt		xtables_error(PARAMETER_PROBLEM,
4635459f05f5addd1b92c32a241863995aa619495bJan Engelhardt			   "Bad class value \"%s\"", cb->arg);
476ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik}
486ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
496ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsikstatic void
5072118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila TóthCLASSIFY_print_class(unsigned int priority, int numeric)
516ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik{
5273866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" %x:%x", TC_H_MAJ(priority)>>16, TC_H_MIN(priority));
536ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik}
546ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
556ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsikstatic void
5672118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila TóthCLASSIFY_print(const void *ip,
57193df8ee3507f0c02762c88a16916c4ea950bd99Yasuyuki KOZAKAI      const struct xt_entry_target *target,
586ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik      int numeric)
596ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik{
60e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI	const struct xt_classify_target_info *clinfo =
61e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI		(const struct xt_classify_target_info *)target->data;
6273866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" CLASSIFY set");
6372118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila Tóth	CLASSIFY_print_class(clinfo->priority, numeric);
646ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik}
656ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
666ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsikstatic void
6772118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila TóthCLASSIFY_save(const void *ip, const struct xt_entry_target *target)
686ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik{
69e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI	const struct xt_classify_target_info *clinfo =
70e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI		(const struct xt_classify_target_info *)target->data;
716ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
7273866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt	printf(" --set-class %.4x:%.4x",
736ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik	       TC_H_MAJ(clinfo->priority)>>16, TC_H_MIN(clinfo->priority));
746ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik}
756ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
7672118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila Tóthstatic struct xtables_target classify_target = {
7742979363f3958b4436c6d2503753c182c58e55eaJan Engelhardt	.family		= NFPROTO_UNSPEC,
78e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI	.name		= "CLASSIFY",
798b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt	.version	= XTABLES_VERSION,
80e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI	.size		= XT_ALIGN(sizeof(struct xt_classify_target_info)),
81e4cc20b2367362c2f9c84c0daaccd985e3236118Yasuyuki KOZAKAI	.userspacesize	= XT_ALIGN(sizeof(struct xt_classify_target_info)),
8272118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila Tóth	.help		= CLASSIFY_help,
8372118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila Tóth	.print		= CLASSIFY_print,
8472118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila Tóth	.save		= CLASSIFY_save,
8535459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	.x6_parse	= CLASSIFY_parse,
8635459f05f5addd1b92c32a241863995aa619495bJan Engelhardt	.x6_options	= CLASSIFY_opts,
876ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik};
886ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik
896ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsikvoid _init(void)
906ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik{
9172118884b63f36ec0f42ce5a7e5e9569033291abLászló Attila Tóth	xtables_register_target(&classify_target);
926ab626bb74153c180f98e8ba6c8bff88d2d45ebcJoszef Kadlecsik}
93