libxt_length.c revision c15f9e3f6d8552cddfc858b115d996c7cf5b47e9
11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <stdio.h> 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <xtables.h> 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <linux/netfilter/xt_length.h> 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum { 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci O_LENGTH = 0, 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void length_help(void) 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci printf( 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci"length match options:\n" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci"[!] --length length[:length] Match packet length against value or range\n" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci" of values (inclusive)\n"); 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const struct xt_option_entry length_opts[] = { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci {.name = "length", .id = O_LENGTH, .type = XTTYPE_UINT16RC, 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .flags = XTOPT_MAND | XTOPT_INVERT}, 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XTOPT_TABLEEND, 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void length_parse(struct xt_option_call *cb) 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci struct xt_length_info *info = cb->data; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xtables_option_parse(cb); 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info->min = cb->val.u16_range[0]; 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info->max = (cb->nvals == 2) ? cb->val.u16_range[1] : UINT16_MAX; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (cb->invert) 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci info->invert = 1; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 35length_print(const void *ip, const struct xt_entry_match *match, int numeric) 36{ 37 const struct xt_length_info *info = (void *)match->data; 38 39 printf(" length %s", info->invert ? "!" : ""); 40 if (info->min == info->max) 41 printf("%u", info->min); 42 else 43 printf("%u:%u", info->min, info->max); 44} 45 46static void length_save(const void *ip, const struct xt_entry_match *match) 47{ 48 const struct xt_length_info *info = (void *)match->data; 49 50 printf("%s --length ", info->invert ? " !" : ""); 51 if (info->min == info->max) 52 printf("%u", info->min); 53 else 54 printf("%u:%u", info->min, info->max); 55} 56 57static struct xtables_match length_match = { 58 .family = NFPROTO_UNSPEC, 59 .name = "length", 60 .version = XTABLES_VERSION, 61 .size = XT_ALIGN(sizeof(struct xt_length_info)), 62 .userspacesize = XT_ALIGN(sizeof(struct xt_length_info)), 63 .help = length_help, 64 .print = length_print, 65 .save = length_save, 66 .x6_parse = length_parse, 67 .x6_options = length_opts, 68}; 69 70void _init(void) 71{ 72 xtables_register_match(&length_match); 73} 74