blob: 8cf167c4fa4e42c79cda8ebe82ba46b644423ee0 [file] [log] [blame]
Rusty Russell52451822000-08-27 07:47:46 +00001#include <stdio.h>
Jan Engelhardt5d9678a2008-11-20 10:15:35 +01002#include <xtables.h>
Rusty Russell52451822000-08-27 07:47:46 +00003#include <linux/netfilter_ipv4/ipt_ah.h>
Jan Engelhardtddac6c52008-09-01 14:22:19 +02004
Jan Engelhardt4d6ede02011-02-16 01:59:18 +01005enum {
6 O_AHSPI = 0,
7};
8
Jan Engelhardt59d16402007-10-04 16:28:39 +00009static void ah_help(void)
Rusty Russell52451822000-08-27 07:47:46 +000010{
11 printf(
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020012"ah match options:\n"
Jan Engelhardt96727922008-08-13 14:42:41 +020013"[!] --ahspi 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 Engelhardt4d6ede02011-02-16 01:59:18 +010017static 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 Russell52451822000-08-27 07:47:46 +000022};
23
Jan Engelhardt4d6ede02011-02-16 01:59:18 +010024static void ah_parse(struct xt_option_call *cb)
Rusty Russell52451822000-08-27 07:47:46 +000025{
Jan Engelhardt4d6ede02011-02-16 01:59:18 +010026 struct ipt_ah *ahinfo = cb->data;
Rusty Russell52451822000-08-27 07:47:46 +000027
Jan Engelhardt4d6ede02011-02-16 01:59:18 +010028 xtables_option_parse(cb);
Jan Engelhardt6944f2c2011-05-24 23:50:29 +020029 if (cb->nvals == 1)
30 ahinfo->spis[1] = ahinfo->spis[0];
Jan Engelhardt4d6ede02011-02-16 01:59:18 +010031 if (cb->invert)
32 ahinfo->invflags |= IPT_AH_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) {
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 Russell52451822000-08-27 07:47:46 +000052 }
53}
54
Jan Engelhardt59d16402007-10-04 16:28:39 +000055static void ah_print(const void *ip, const struct xt_entry_match *match,
56 int numeric)
Rusty Russell52451822000-08-27 07:47:46 +000057{
58 const struct ipt_ah *ah = (struct ipt_ah *)match->data;
59
Jan Engelhardt73866352010-12-18 02:04:59 +010060 printf(" ah ");
Rusty Russell52451822000-08-27 07:47:46 +000061 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 Engelhardt73866352010-12-18 02:04:59 +010064 printf(" Unknown invflags: 0x%X",
Rusty Russell52451822000-08-27 07:47:46 +000065 ah->invflags & ~IPT_AH_INV_MASK);
66}
67
Jan Engelhardt59d16402007-10-04 16:28:39 +000068static void ah_save(const void *ip, const struct xt_entry_match *match)
Rusty Russell52451822000-08-27 07:47:46 +000069{
70 const struct ipt_ah *ahinfo = (struct ipt_ah *)match->data;
71
Harald Weltef0ac8142002-03-26 12:50:28 +000072 if (!(ahinfo->spis[0] == 0
73 && ahinfo->spis[1] == 0xFFFFFFFF)) {
Jan Engelhardt73866352010-12-18 02:04:59 +010074 printf("%s --ahspi ",
75 (ahinfo->invflags & IPT_AH_INV_SPI) ? " !" : "");
Rusty Russell52451822000-08-27 07:47:46 +000076 if (ahinfo->spis[0]
77 != ahinfo->spis[1])
Jan Engelhardt73866352010-12-18 02:04:59 +010078 printf("%u:%u",
Rusty Russell52451822000-08-27 07:47:46 +000079 ahinfo->spis[0],
80 ahinfo->spis[1]);
81 else
Jan Engelhardt73866352010-12-18 02:04:59 +010082 printf("%u",
Rusty Russell52451822000-08-27 07:47:46 +000083 ahinfo->spis[0]);
84 }
85
86}
87
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020088static struct xtables_match ah_mt_reg = {
Pablo Neira8caee8b2004-12-28 13:11:59 +000089 .name = "ah",
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020090 .version = XTABLES_VERSION,
Jan Engelhardt03d99482008-11-18 12:27:54 +010091 .family = NFPROTO_IPV4,
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +020092 .size = XT_ALIGN(sizeof(struct ipt_ah)),
93 .userspacesize = XT_ALIGN(sizeof(struct ipt_ah)),
Jan Engelhardt59d16402007-10-04 16:28:39 +000094 .help = ah_help,
Jan Engelhardt59d16402007-10-04 16:28:39 +000095 .print = ah_print,
96 .save = ah_save,
Jan Engelhardt4d6ede02011-02-16 01:59:18 +010097 .x6_parse = ah_parse,
98 .x6_options = ah_opts,
Rusty Russell52451822000-08-27 07:47:46 +000099};
100
101void
102_init(void)
103{
Jan Engelhardt8b7c64d2008-04-15 11:48:25 +0200104 xtables_register_match(&ah_mt_reg);
Rusty Russell52451822000-08-27 07:47:46 +0000105}