Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
Jan Engelhardt | 5d9678a | 2008-11-20 10:15:35 +0100 | [diff] [blame] | 2 | #include <xtables.h> |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 3 | #include <linux/netfilter_ipv4/ipt_ah.h> |
Jan Engelhardt | ddac6c5 | 2008-09-01 14:22:19 +0200 | [diff] [blame] | 4 | |
Jan Engelhardt | 4d6ede0 | 2011-02-16 01:59:18 +0100 | [diff] [blame] | 5 | enum { |
| 6 | O_AHSPI = 0, |
| 7 | }; |
| 8 | |
Jan Engelhardt | 59d1640 | 2007-10-04 16:28:39 +0000 | [diff] [blame] | 9 | static void ah_help(void) |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 10 | { |
| 11 | printf( |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 12 | "ah match options:\n" |
Jan Engelhardt | 9672792 | 2008-08-13 14:42:41 +0200 | [diff] [blame] | 13 | "[!] --ahspi spi[:spi]\n" |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 14 | " match spi (range)\n"); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 15 | } |
| 16 | |
Jan Engelhardt | 4d6ede0 | 2011-02-16 01:59:18 +0100 | [diff] [blame] | 17 | static const struct xt_option_entry ah_opts[] = { |
| 18 | {.name = "ahspi", .id = O_AHSPI, .type = XTTYPE_UINT32RC, |
| 19 | .flags = XTOPT_INVERT | XTOPT_PUT, |
| 20 | XTOPT_POINTER(struct ipt_ah, spis)}, |
| 21 | XTOPT_TABLEEND, |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 22 | }; |
| 23 | |
Jan Engelhardt | 4d6ede0 | 2011-02-16 01:59:18 +0100 | [diff] [blame] | 24 | static void ah_parse(struct xt_option_call *cb) |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 25 | { |
Jan Engelhardt | 4d6ede0 | 2011-02-16 01:59:18 +0100 | [diff] [blame] | 26 | struct ipt_ah *ahinfo = cb->data; |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 27 | |
Jan Engelhardt | 4d6ede0 | 2011-02-16 01:59:18 +0100 | [diff] [blame] | 28 | xtables_option_parse(cb); |
Jan Engelhardt | 6944f2c | 2011-05-24 23:50:29 +0200 | [diff] [blame] | 29 | if (cb->nvals == 1) |
| 30 | ahinfo->spis[1] = ahinfo->spis[0]; |
Jan Engelhardt | 4d6ede0 | 2011-02-16 01:59:18 +0100 | [diff] [blame] | 31 | if (cb->invert) |
| 32 | ahinfo->invflags |= IPT_AH_INV_SPI; |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 33 | } |
| 34 | |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 35 | static void |
Jan Engelhardt | 7ac4052 | 2011-01-07 12:34:04 +0100 | [diff] [blame] | 36 | print_spis(const char *name, uint32_t min, uint32_t max, |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 37 | int invert) |
| 38 | { |
| 39 | const char *inv = invert ? "!" : ""; |
| 40 | |
| 41 | if (min != 0 || max != 0xFFFFFFFF || invert) { |
| 42 | printf("%s", name); |
| 43 | if (min == max) { |
| 44 | printf(":%s", inv); |
| 45 | printf("%u", min); |
| 46 | } else { |
| 47 | printf("s:%s", inv); |
| 48 | printf("%u",min); |
| 49 | printf(":"); |
| 50 | printf("%u",max); |
| 51 | } |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 52 | } |
| 53 | } |
| 54 | |
Jan Engelhardt | 59d1640 | 2007-10-04 16:28:39 +0000 | [diff] [blame] | 55 | static void ah_print(const void *ip, const struct xt_entry_match *match, |
| 56 | int numeric) |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 57 | { |
| 58 | const struct ipt_ah *ah = (struct ipt_ah *)match->data; |
| 59 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 60 | printf(" ah "); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 61 | print_spis("spi", ah->spis[0], ah->spis[1], |
| 62 | ah->invflags & IPT_AH_INV_SPI); |
| 63 | if (ah->invflags & ~IPT_AH_INV_MASK) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 64 | printf(" Unknown invflags: 0x%X", |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 65 | ah->invflags & ~IPT_AH_INV_MASK); |
| 66 | } |
| 67 | |
Jan Engelhardt | 59d1640 | 2007-10-04 16:28:39 +0000 | [diff] [blame] | 68 | static void ah_save(const void *ip, const struct xt_entry_match *match) |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 69 | { |
| 70 | const struct ipt_ah *ahinfo = (struct ipt_ah *)match->data; |
| 71 | |
Harald Welte | f0ac814 | 2002-03-26 12:50:28 +0000 | [diff] [blame] | 72 | if (!(ahinfo->spis[0] == 0 |
| 73 | && ahinfo->spis[1] == 0xFFFFFFFF)) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 74 | printf("%s --ahspi ", |
| 75 | (ahinfo->invflags & IPT_AH_INV_SPI) ? " !" : ""); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 76 | if (ahinfo->spis[0] |
| 77 | != ahinfo->spis[1]) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 78 | printf("%u:%u", |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 79 | ahinfo->spis[0], |
| 80 | ahinfo->spis[1]); |
| 81 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 82 | printf("%u", |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 83 | ahinfo->spis[0]); |
| 84 | } |
| 85 | |
| 86 | } |
| 87 | |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 88 | static struct xtables_match ah_mt_reg = { |
Pablo Neira | 8caee8b | 2004-12-28 13:11:59 +0000 | [diff] [blame] | 89 | .name = "ah", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 90 | .version = XTABLES_VERSION, |
Jan Engelhardt | 03d9948 | 2008-11-18 12:27:54 +0100 | [diff] [blame] | 91 | .family = NFPROTO_IPV4, |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 92 | .size = XT_ALIGN(sizeof(struct ipt_ah)), |
| 93 | .userspacesize = XT_ALIGN(sizeof(struct ipt_ah)), |
Jan Engelhardt | 59d1640 | 2007-10-04 16:28:39 +0000 | [diff] [blame] | 94 | .help = ah_help, |
Jan Engelhardt | 59d1640 | 2007-10-04 16:28:39 +0000 | [diff] [blame] | 95 | .print = ah_print, |
| 96 | .save = ah_save, |
Jan Engelhardt | 4d6ede0 | 2011-02-16 01:59:18 +0100 | [diff] [blame] | 97 | .x6_parse = ah_parse, |
| 98 | .x6_options = ah_opts, |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 99 | }; |
| 100 | |
| 101 | void |
| 102 | _init(void) |
| 103 | { |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 104 | xtables_register_match(&ah_mt_reg); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 105 | } |