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