123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /*
- * Copyright (c) 2011 Patrick McHardy <kaber@trash.net>
- *
- * Based on Svenning Soerensen's IPv4 NETMAP target. Development of IPv6 NAT
- * funded by Astaro.
- */
- #include <stdio.h>
- #include <netdb.h>
- #include <string.h>
- #include <stdlib.h>
- #include <getopt.h>
- #include <xtables.h>
- #include <libiptc/libip6tc.h>
- #include <linux/netfilter/nf_nat.h>
- #define MODULENAME "NETMAP"
- enum {
- O_TO = 0,
- };
- static const struct xt_option_entry NETMAP_opts[] = {
- {.name = "to", .id = O_TO, .type = XTTYPE_HOSTMASK,
- .flags = XTOPT_MAND},
- XTOPT_TABLEEND,
- };
- static void NETMAP_help(void)
- {
- printf(MODULENAME" target options:\n"
- " --%s address[/mask]\n"
- " Network address to map to.\n\n",
- NETMAP_opts[0].name);
- }
- static void NETMAP_parse(struct xt_option_call *cb)
- {
- struct nf_nat_range *range = cb->data;
- unsigned int i;
- xtables_option_parse(cb);
- range->flags |= NF_NAT_RANGE_MAP_IPS;
- for (i = 0; i < 4; i++) {
- range->min_addr.ip6[i] = cb->val.haddr.ip6[i] &
- cb->val.hmask.ip6[i];
- range->max_addr.ip6[i] = range->min_addr.ip6[i] |
- ~cb->val.hmask.ip6[i];
- }
- }
- static void NETMAP_print(const void *ip, const struct xt_entry_target *target,
- int numeric)
- {
- const struct nf_nat_range *r = (const void *)target->data;
- struct in6_addr a;
- unsigned int i;
- int bits;
- a = r->min_addr.in6;
- printf("%s", xtables_ip6addr_to_numeric(&a));
- for (i = 0; i < 4; i++)
- a.s6_addr32[i] = ~(r->min_addr.ip6[i] ^ r->max_addr.ip6[i]);
- bits = ipv6_prefix_length(&a);
- if (bits < 0)
- printf("/%s", xtables_ip6addr_to_numeric(&a));
- else
- printf("/%d", bits);
- }
- static void NETMAP_save(const void *ip, const struct xt_entry_target *target)
- {
- printf(" --%s ", NETMAP_opts[0].name);
- NETMAP_print(ip, target, 0);
- }
- static struct xtables_target netmap_tg_reg = {
- .name = MODULENAME,
- .version = XTABLES_VERSION,
- .family = NFPROTO_IPV6,
- .size = XT_ALIGN(sizeof(struct nf_nat_range)),
- .userspacesize = XT_ALIGN(sizeof(struct nf_nat_range)),
- .help = NETMAP_help,
- .x6_parse = NETMAP_parse,
- .print = NETMAP_print,
- .save = NETMAP_save,
- .x6_options = NETMAP_opts,
- };
- void _init(void)
- {
- xtables_register_target(&netmap_tg_reg);
- }
|