10c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy/*
20c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy * Copyright (c) 2012-2013 Patrick McHardy <kaber@trash.net>
30c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy */
40c3753b1d4226a6e7bea9619415cf40cadee1e58Patrick McHardy
51871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy#include <stdio.h>
62fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt#include <string.h>
71871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy#include <xtables.h>
81871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy#include <linux/netfilter_ipv6/ip6_tables.h>
91871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy#include <linux/netfilter_ipv6/ip6t_NPT.h>
101871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
111871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardyenum {
121871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	O_SRC_PFX	= 1 << 0,
131871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	O_DST_PFX	= 1 << 1,
141871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy};
151871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
167b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weberstatic const struct xt_option_entry DNPT_options[] = {
171871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	{ .name = "src-pfx", .id = O_SRC_PFX, .type = XTTYPE_HOSTMASK,
181871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	  .flags = XTOPT_MAND },
191871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	{ .name = "dst-pfx", .id = O_DST_PFX, .type = XTTYPE_HOSTMASK,
201871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	  .flags = XTOPT_MAND },
211871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	{ }
221871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy};
231871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
247b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weberstatic void DNPT_help(void)
251871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy{
267b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weber	printf("DNPT target options:"
271871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	       "\n"
281871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	       " --src-pfx prefix/length\n"
291871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	       " --dst-pfx prefix/length\n"
301871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	       "\n");
311871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy}
321871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
337b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weberstatic void DNPT_parse(struct xt_option_call *cb)
341871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy{
351871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	struct ip6t_npt_tginfo *npt = cb->data;
361871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
371871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	xtables_option_parse(cb);
381871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	switch (cb->entry->id) {
391871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	case O_SRC_PFX:
401871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy		npt->src_pfx = cb->val.haddr;
411871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy		npt->src_pfx_len = cb->val.hlen;
421871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy		break;
431871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	case O_DST_PFX:
441871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy		npt->dst_pfx = cb->val.haddr;
451871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy		npt->dst_pfx_len = cb->val.hlen;
461871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy		break;
471871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	}
481871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy}
491871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
507b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weberstatic void DNPT_print(const void *ip, const struct xt_entry_target *target,
511871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy		       int numeric)
521871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy{
531871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	const struct ip6t_npt_tginfo *npt = (const void *)target->data;
541871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
551871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	printf("src-pfx %s/%u ", xtables_ip6addr_to_numeric(&npt->src_pfx.in6),
561871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy				 npt->src_pfx_len);
571871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	printf("dst-pfx %s/%u ", xtables_ip6addr_to_numeric(&npt->dst_pfx.in6),
581871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy				 npt->dst_pfx_len);
591871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy}
601871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
612fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardtstatic void DNPT_save(const void *ip, const struct xt_entry_target *target)
622fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt{
632fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt	static const struct in6_addr zero_addr;
642fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt	const struct ip6t_npt_tginfo *info = (const void *)target->data;
652fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt
662fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt	if (memcmp(&info->src_pfx.in6, &zero_addr, sizeof(zero_addr)) != 0 ||
672fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt	    info->src_pfx_len != 0)
682fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt		printf("--src-pfx %s/%u ",
692fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt		       xtables_ip6addr_to_numeric(&info->src_pfx.in6),
702fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt		       info->src_pfx_len);
712fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt	if (memcmp(&info->dst_pfx.in6, &zero_addr, sizeof(zero_addr)) != 0 ||
722fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt	    info->dst_pfx_len != 0)
732fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt		printf("--dst-pfx %s/%u ",
742fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt		       xtables_ip6addr_to_numeric(&info->dst_pfx.in6),
752fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt		       info->dst_pfx_len);
762fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt}
772fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt
781871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardystatic struct xtables_target snpt_tg_reg = {
791871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	.name		= "DNPT",
801871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	.version	= XTABLES_VERSION,
811871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	.family		= NFPROTO_IPV6,
821871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	.size		= XT_ALIGN(sizeof(struct ip6t_npt_tginfo)),
831871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	.userspacesize	= offsetof(struct ip6t_npt_tginfo, adjustment),
847b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weber	.help		= DNPT_help,
857b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weber	.x6_parse	= DNPT_parse,
867b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weber	.print		= DNPT_print,
872fda8fcef0f3c321fb03953b8ecc424a2bad4476Jan Engelhardt	.save		= DNPT_save,
887b04e3ef3a6ffccb23de83ef3b2d8f5aeaaa09e5Ulrich Weber	.x6_options	= DNPT_options,
891871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy};
901871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy
911871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardyvoid _init(void)
921871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy{
931871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy	xtables_register_target(&snpt_tg_reg);
941871796877956ee68a39092c6fc3678e5a9d1d88Patrick McHardy}
95