Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 2 | #include <xtables.h> |
| 3 | #include <linux/netfilter/xt_esp.h> |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 4 | |
Jan Engelhardt | a3876fa | 2011-02-27 23:56:28 +0100 | [diff] [blame] | 5 | enum { |
| 6 | O_ESPSPI = 0, |
| 7 | }; |
| 8 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 9 | static void esp_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 | "esp match options:\n" |
Jan Engelhardt | 9672792 | 2008-08-13 14:42:41 +0200 | [diff] [blame] | 13 | "[!] --espspi 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 | a3876fa | 2011-02-27 23:56:28 +0100 | [diff] [blame] | 17 | static const struct xt_option_entry esp_opts[] = { |
| 18 | {.name = "espspi", .id = O_ESPSPI, .type = XTTYPE_UINT32RC, |
| 19 | .flags = XTOPT_INVERT | XTOPT_PUT, |
| 20 | XTOPT_POINTER(struct xt_esp, spis)}, |
| 21 | XTOPT_TABLEEND, |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 22 | }; |
| 23 | |
Jan Engelhardt | a3876fa | 2011-02-27 23:56:28 +0100 | [diff] [blame] | 24 | static void esp_parse(struct xt_option_call *cb) |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 25 | { |
Jan Engelhardt | a3876fa | 2011-02-27 23:56:28 +0100 | [diff] [blame] | 26 | struct xt_esp *espinfo = cb->data; |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 27 | |
Jan Engelhardt | a3876fa | 2011-02-27 23:56:28 +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 | espinfo->spis[1] = espinfo->spis[0]; |
Jan Engelhardt | a3876fa | 2011-02-27 23:56:28 +0100 | [diff] [blame] | 31 | if (cb->invert) |
| 32 | espinfo->invflags |= XT_ESP_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) { |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 42 | if (min == max) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 43 | printf(" %s:%s%u", name, inv, min); |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 44 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 45 | printf(" %ss:%s%u:%u", name, inv, min, max); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 46 | } |
| 47 | } |
| 48 | |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 49 | static void |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 50 | esp_print(const void *ip, const struct xt_entry_match *match, int numeric) |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 51 | { |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 52 | const struct xt_esp *esp = (struct xt_esp *)match->data; |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 53 | |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 54 | printf(" esp"); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 55 | print_spis("spi", esp->spis[0], esp->spis[1], |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 56 | esp->invflags & XT_ESP_INV_SPI); |
| 57 | if (esp->invflags & ~XT_ESP_INV_MASK) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 58 | printf(" Unknown invflags: 0x%X", |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 59 | esp->invflags & ~XT_ESP_INV_MASK); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 60 | } |
| 61 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 62 | static void esp_save(const void *ip, const struct xt_entry_match *match) |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 63 | { |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 64 | const struct xt_esp *espinfo = (struct xt_esp *)match->data; |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 65 | |
Harald Welte | f0ac814 | 2002-03-26 12:50:28 +0000 | [diff] [blame] | 66 | if (!(espinfo->spis[0] == 0 |
| 67 | && espinfo->spis[1] == 0xFFFFFFFF)) { |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 68 | printf("%s --espspi ", |
| 69 | (espinfo->invflags & XT_ESP_INV_SPI) ? " !" : ""); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 70 | if (espinfo->spis[0] |
| 71 | != espinfo->spis[1]) |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 72 | printf("%u:%u", |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 73 | espinfo->spis[0], |
| 74 | espinfo->spis[1]); |
| 75 | else |
Jan Engelhardt | 7386635 | 2010-12-18 02:04:59 +0100 | [diff] [blame] | 76 | printf("%u", |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 77 | espinfo->spis[0]); |
| 78 | } |
| 79 | |
| 80 | } |
| 81 | |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 82 | static struct xtables_match esp_match = { |
Jan Engelhardt | c5e8573 | 2009-06-12 20:55:44 +0200 | [diff] [blame] | 83 | .family = NFPROTO_UNSPEC, |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 84 | .name = "esp", |
Jan Engelhardt | 8b7c64d | 2008-04-15 11:48:25 +0200 | [diff] [blame] | 85 | .version = XTABLES_VERSION, |
Yasuyuki KOZAKAI | 0a04e8d | 2007-07-24 07:16:20 +0000 | [diff] [blame] | 86 | .size = XT_ALIGN(sizeof(struct xt_esp)), |
| 87 | .userspacesize = XT_ALIGN(sizeof(struct xt_esp)), |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 88 | .help = esp_help, |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 89 | .print = esp_print, |
| 90 | .save = esp_save, |
Jan Engelhardt | a3876fa | 2011-02-27 23:56:28 +0100 | [diff] [blame] | 91 | .x6_parse = esp_parse, |
| 92 | .x6_options = esp_opts, |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 93 | }; |
| 94 | |
| 95 | void |
| 96 | _init(void) |
| 97 | { |
Jan Engelhardt | 181dead | 2007-10-04 16:27:07 +0000 | [diff] [blame] | 98 | xtables_register_match(&esp_match); |
Rusty Russell | 5245182 | 2000-08-27 07:47:46 +0000 | [diff] [blame] | 99 | } |