blob: 294338b44f59fb1ea0a0918f700bb880ebd82100 [file] [log] [blame]
Rusty Russell52451822000-08-27 07:47:46 +00001#include <stdio.h>
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +00002#include <xtables.h>
3#include <linux/netfilter/xt_esp.h>
Rusty Russell52451822000-08-27 07:47:46 +00004
Jan Engelhardta3876fa2011-02-27 23:56:28 +01005enum {
6 O_ESPSPI = 0,
7};
8
Jan Engelhardt181dead2007-10-04 16:27:07 +00009static void esp_help(void)
Rusty Russell52451822000-08-27 07:47:46 +000010{
11 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020012"esp match options:\n"
Jan Engelhardt96727922008-08-13 14:42:41 +020013"[!] --espspi spi[:spi]\n"
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020014" match spi (range)\n");
Rusty Russell52451822000-08-27 07:47:46 +000015}
16
Jan Engelhardta3876fa2011-02-27 23:56:28 +010017static 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 Russell52451822000-08-27 07:47:46 +000022};
23
Jan Engelhardta3876fa2011-02-27 23:56:28 +010024static void esp_parse(struct xt_option_call *cb)
Rusty Russell52451822000-08-27 07:47:46 +000025{
Jan Engelhardta3876fa2011-02-27 23:56:28 +010026 struct xt_esp *espinfo = cb->data;
Rusty Russell52451822000-08-27 07:47:46 +000027
Jan Engelhardta3876fa2011-02-27 23:56:28 +010028 xtables_option_parse(cb);
Jan Engelhardt6944f2c2011-05-24 23:50:29 +020029 if (cb->nvals == 1)
30 espinfo->spis[1] = espinfo->spis[0];
Jan Engelhardta3876fa2011-02-27 23:56:28 +010031 if (cb->invert)
32 espinfo->invflags |= XT_ESP_INV_SPI;
Rusty Russell52451822000-08-27 07:47:46 +000033}
34
Rusty Russell52451822000-08-27 07:47:46 +000035static void
Jan Engelhardt7ac40522011-01-07 12:34:04 +010036print_spis(const char *name, uint32_t min, uint32_t max,
Rusty Russell52451822000-08-27 07:47:46 +000037 int invert)
38{
39 const char *inv = invert ? "!" : "";
40
41 if (min != 0 || max != 0xFFFFFFFF || invert) {
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000042 if (min == max)
Jan Engelhardt73866352010-12-18 02:04:59 +010043 printf(" %s:%s%u", name, inv, min);
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000044 else
Jan Engelhardt73866352010-12-18 02:04:59 +010045 printf(" %ss:%s%u:%u", name, inv, min, max);
Rusty Russell52451822000-08-27 07:47:46 +000046 }
47}
48
Rusty Russell52451822000-08-27 07:47:46 +000049static void
Jan Engelhardt181dead2007-10-04 16:27:07 +000050esp_print(const void *ip, const struct xt_entry_match *match, int numeric)
Rusty Russell52451822000-08-27 07:47:46 +000051{
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000052 const struct xt_esp *esp = (struct xt_esp *)match->data;
Rusty Russell52451822000-08-27 07:47:46 +000053
Jan Engelhardt73866352010-12-18 02:04:59 +010054 printf(" esp");
Rusty Russell52451822000-08-27 07:47:46 +000055 print_spis("spi", esp->spis[0], esp->spis[1],
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000056 esp->invflags & XT_ESP_INV_SPI);
57 if (esp->invflags & ~XT_ESP_INV_MASK)
Jan Engelhardt73866352010-12-18 02:04:59 +010058 printf(" Unknown invflags: 0x%X",
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000059 esp->invflags & ~XT_ESP_INV_MASK);
Rusty Russell52451822000-08-27 07:47:46 +000060}
61
Jan Engelhardt181dead2007-10-04 16:27:07 +000062static void esp_save(const void *ip, const struct xt_entry_match *match)
Rusty Russell52451822000-08-27 07:47:46 +000063{
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000064 const struct xt_esp *espinfo = (struct xt_esp *)match->data;
Rusty Russell52451822000-08-27 07:47:46 +000065
Harald Weltef0ac8142002-03-26 12:50:28 +000066 if (!(espinfo->spis[0] == 0
67 && espinfo->spis[1] == 0xFFFFFFFF)) {
Jan Engelhardt73866352010-12-18 02:04:59 +010068 printf("%s --espspi ",
69 (espinfo->invflags & XT_ESP_INV_SPI) ? " !" : "");
Rusty Russell52451822000-08-27 07:47:46 +000070 if (espinfo->spis[0]
71 != espinfo->spis[1])
Jan Engelhardt73866352010-12-18 02:04:59 +010072 printf("%u:%u",
Rusty Russell52451822000-08-27 07:47:46 +000073 espinfo->spis[0],
74 espinfo->spis[1]);
75 else
Jan Engelhardt73866352010-12-18 02:04:59 +010076 printf("%u",
Rusty Russell52451822000-08-27 07:47:46 +000077 espinfo->spis[0]);
78 }
79
80}
81
Jan Engelhardt181dead2007-10-04 16:27:07 +000082static struct xtables_match esp_match = {
Jan Engelhardtc5e85732009-06-12 20:55:44 +020083 .family = NFPROTO_UNSPEC,
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000084 .name = "esp",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020085 .version = XTABLES_VERSION,
Yasuyuki KOZAKAI0a04e8d2007-07-24 07:16:20 +000086 .size = XT_ALIGN(sizeof(struct xt_esp)),
87 .userspacesize = XT_ALIGN(sizeof(struct xt_esp)),
Jan Engelhardt181dead2007-10-04 16:27:07 +000088 .help = esp_help,
Jan Engelhardt181dead2007-10-04 16:27:07 +000089 .print = esp_print,
90 .save = esp_save,
Jan Engelhardta3876fa2011-02-27 23:56:28 +010091 .x6_parse = esp_parse,
92 .x6_options = esp_opts,
Rusty Russell52451822000-08-27 07:47:46 +000093};
94
95void
96_init(void)
97{
Jan Engelhardt181dead2007-10-04 16:27:07 +000098 xtables_register_match(&esp_match);
Rusty Russell52451822000-08-27 07:47:46 +000099}