Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
Yasuyuki KOZAKAI | 36087d9 | 2007-07-24 07:15:03 +0000 | [diff] [blame] | 2 | #include <xtables.h> |
| 3 | #include <linux/netfilter/xt_length.h> |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 4 | |
Jan Engelhardt | c15f9e3 | 2011-03-06 17:00:49 +0100 | [diff] [blame] | 5 | enum { |
| 6 | O_LENGTH = 0, |
| 7 | }; |
| 8 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 9 | static void length_help(void) |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 10 | { |
| 11 | printf( |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 12 | "length match options:\n" |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 13 | "[!] --length length[:length] Match packet length against value or range\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 14 | " of values (inclusive)\n"); |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 15 | } |
| 16 | |
Jan Engelhardt | c15f9e3 | 2011-03-06 17:00:49 +0100 | [diff] [blame] | 17 | static const struct xt_option_entry length_opts[] = { |
| 18 | {.name = "length", .id = O_LENGTH, .type = XTTYPE_UINT16RC, |
| 19 | .flags = XTOPT_MAND | XTOPT_INVERT}, |
| 20 | XTOPT_TABLEEND, |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 21 | }; |
| 22 | |
Jan Engelhardt | c15f9e3 | 2011-03-06 17:00:49 +0100 | [diff] [blame] | 23 | static void length_parse(struct xt_option_call *cb) |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 24 | { |
Jan Engelhardt | c15f9e3 | 2011-03-06 17:00:49 +0100 | [diff] [blame] | 25 | struct xt_length_info *info = cb->data; |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 26 | |
Jan Engelhardt | c15f9e3 | 2011-03-06 17:00:49 +0100 | [diff] [blame] | 27 | xtables_option_parse(cb); |
| 28 | info->min = cb->val.u16_range[0]; |
| 29 | info->max = (cb->nvals == 2) ? cb->val.u16_range[1] : UINT16_MAX; |
| 30 | if (cb->invert) |
| 31 | info->invert = 1; |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 32 | } |
| 33 | |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 34 | static void |
Jan Engelhardt | cea9f71 | 2008-12-09 15:06:20 +0100 | [diff] [blame] | 35 | length_print(const void *ip, const struct xt_entry_match *match, int numeric) |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 36 | { |
Jan Engelhardt | cea9f71 | 2008-12-09 15:06:20 +0100 | [diff] [blame] | 37 | const struct xt_length_info *info = (void *)match->data; |
| 38 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 39 | printf(" length %s", info->invert ? "!" : ""); |
Jan Engelhardt | cea9f71 | 2008-12-09 15:06:20 +0100 | [diff] [blame] | 40 | if (info->min == info->max) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 41 | printf("%u", info->min); |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 42 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 43 | printf("%u:%u", info->min, info->max); |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 44 | } |
| 45 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 46 | static void length_save(const void *ip, const struct xt_entry_match *match) |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 47 | { |
Jan Engelhardt | cea9f71 | 2008-12-09 15:06:20 +0100 | [diff] [blame] | 48 | const struct xt_length_info *info = (void *)match->data; |
| 49 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 50 | printf("%s --length ", info->invert ? " !" : ""); |
Jan Engelhardt | cea9f71 | 2008-12-09 15:06:20 +0100 | [diff] [blame] | 51 | if (info->min == info->max) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 52 | printf("%u", info->min); |
Jan Engelhardt | cea9f71 | 2008-12-09 15:06:20 +0100 | [diff] [blame] | 53 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 54 | printf("%u:%u", info->min, info->max); |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 55 | } |
| 56 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 57 | static struct xtables_match length_match = { |
Jan Engelhardt | 4297936 | 2009-06-01 11:56:23 +0200 | [diff] [blame] | 58 | .family = NFPROTO_UNSPEC, |
Yasuyuki KOZAKAI | 36087d9 | 2007-07-24 07:15:03 +0000 | [diff] [blame] | 59 | .name = "length", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 60 | .version = XTABLES_VERSION, |
Yasuyuki KOZAKAI | 36087d9 | 2007-07-24 07:15:03 +0000 | [diff] [blame] | 61 | .size = XT_ALIGN(sizeof(struct xt_length_info)), |
| 62 | .userspacesize = XT_ALIGN(sizeof(struct xt_length_info)), |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 63 | .help = length_help, |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 64 | .print = length_print, |
| 65 | .save = length_save, |
Jan Engelhardt | c15f9e3 | 2011-03-06 17:00:49 +0100 | [diff] [blame] | 66 | .x6_parse = length_parse, |
| 67 | .x6_options = length_opts, |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 68 | }; |
| 69 | |
| 70 | void _init(void) |
| 71 | { |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 72 | xtables_register_match(&length_match); |
Fabrice MARIE | 147a2be | 2001-05-02 15:45:57 +0000 | [diff] [blame] | 73 | } |