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