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