libxt_length.c revision c15f9e3f6d8552cddfc858b115d996c7cf5b47e9
1147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE#include <stdio.h> 236087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI#include <xtables.h> 336087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI#include <linux/netfilter/xt_length.h> 4147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 5c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardtenum { 6c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt O_LENGTH = 0, 7c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt}; 8c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt 9181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void length_help(void) 10147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{ 11147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE printf( 128b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt"length match options:\n" 13147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE"[!] --length length[:length] Match packet length against value or range\n" 148b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt" of values (inclusive)\n"); 15147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE} 16147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 17c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardtstatic const struct xt_option_entry length_opts[] = { 18c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt {.name = "length", .id = O_LENGTH, .type = XTTYPE_UINT16RC, 19c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt .flags = XTOPT_MAND | XTOPT_INVERT}, 20c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt XTOPT_TABLEEND, 21147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE}; 22147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 23c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardtstatic void length_parse(struct xt_option_call *cb) 24147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{ 25c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt struct xt_length_info *info = cb->data; 26147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 27c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt xtables_option_parse(cb); 28c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt info->min = cb->val.u16_range[0]; 29c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt info->max = (cb->nvals == 2) ? cb->val.u16_range[1] : UINT16_MAX; 30c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt if (cb->invert) 31c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt info->invert = 1; 32147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE} 33147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 34147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIEstatic void 35cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardtlength_print(const void *ip, const struct xt_entry_match *match, int numeric) 36147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{ 37cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt const struct xt_length_info *info = (void *)match->data; 38cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt 3973866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf(" length %s", info->invert ? "!" : ""); 40cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt if (info->min == info->max) 4173866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf("%u", info->min); 42147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE else 4373866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf("%u:%u", info->min, info->max); 44147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE} 45147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 46181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic void length_save(const void *ip, const struct xt_entry_match *match) 47147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{ 48cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt const struct xt_length_info *info = (void *)match->data; 49cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt 5073866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf("%s --length ", info->invert ? " !" : ""); 51cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt if (info->min == info->max) 5273866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf("%u", info->min); 53cea9f71f5618250a38acb21c31fbbf93a752f7d4Jan Engelhardt else 5473866357e4a7a0fdc1b293bf8863fee2bd56da9eJan Engelhardt printf("%u:%u", info->min, info->max); 55147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE} 56147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 57181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardtstatic struct xtables_match length_match = { 5842979363f3958b4436c6d2503753c182c58e55eaJan Engelhardt .family = NFPROTO_UNSPEC, 5936087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI .name = "length", 608b7c64d6ba156a99008fcd810cba874c73294333Jan Engelhardt .version = XTABLES_VERSION, 6136087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI .size = XT_ALIGN(sizeof(struct xt_length_info)), 6236087d952be182a6163fc508c2168b9c3b9209c2Yasuyuki KOZAKAI .userspacesize = XT_ALIGN(sizeof(struct xt_length_info)), 63181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .help = length_help, 64181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .print = length_print, 65181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt .save = length_save, 66c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt .x6_parse = length_parse, 67c15f9e3f6d8552cddfc858b115d996c7cf5b47e9Jan Engelhardt .x6_options = length_opts, 68147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE}; 69147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE 70147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIEvoid _init(void) 71147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE{ 72181dead3f13befe02769ef479bcbb51801b7fc4eJan Engelhardt xtables_register_match(&length_match); 73147a2be5ef19af6ef3842f496d1de2ae3e679eccFabrice MARIE} 74