/* * Copyright (c) 2013 Patrick McHardy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include #include #include #include enum { O_SACK_PERM = 0, O_TIMESTAMP, O_WSCALE, O_MSS, O_ECN, }; static void SYNPROXY_help(void) { printf( "SYNPROXY target options:\n" " --sack-perm Set SACK_PERM\n" " --timestamp Set TIMESTAMP\n" " --wscale value Set window scaling factor\n" " --mss value Set MSS value\n" " --ecn Set ECN\n"); } static const struct xt_option_entry SYNPROXY_opts[] = { {.name = "sack-perm", .id = O_SACK_PERM, .type = XTTYPE_NONE, }, {.name = "timestamp", .id = O_TIMESTAMP, .type = XTTYPE_NONE, }, {.name = "wscale", .id = O_WSCALE, .type = XTTYPE_UINT32, }, {.name = "mss", .id = O_MSS, .type = XTTYPE_UINT32, }, {.name = "ecn", .id = O_ECN, .type = XTTYPE_NONE, }, XTOPT_TABLEEND, }; static void SYNPROXY_parse(struct xt_option_call *cb) { struct xt_synproxy_info *info = cb->data; xtables_option_parse(cb); switch (cb->entry->id) { case O_SACK_PERM: info->options |= XT_SYNPROXY_OPT_SACK_PERM; break; case O_TIMESTAMP: info->options |= XT_SYNPROXY_OPT_TIMESTAMP; break; case O_WSCALE: info->options |= XT_SYNPROXY_OPT_WSCALE; info->wscale = cb->val.u32; break; case O_MSS: info->options |= XT_SYNPROXY_OPT_MSS; info->mss = cb->val.u32; break; case O_ECN: info->options |= XT_SYNPROXY_OPT_ECN; break; } } static void SYNPROXY_check(struct xt_fcheck_call *cb) { } static void SYNPROXY_print(const void *ip, const struct xt_entry_target *target, int numeric) { const struct xt_synproxy_info *info = (const struct xt_synproxy_info *)target->data; printf(" SYNPROXY "); if (info->options & XT_SYNPROXY_OPT_SACK_PERM) printf("sack-perm "); if (info->options & XT_SYNPROXY_OPT_TIMESTAMP) printf("timestamp "); if (info->options & XT_SYNPROXY_OPT_WSCALE) printf("wscale %u ", info->wscale); if (info->options & XT_SYNPROXY_OPT_MSS) printf("mss %u ", info->mss); if (info->options & XT_SYNPROXY_OPT_ECN) printf("ecn "); } static void SYNPROXY_save(const void *ip, const struct xt_entry_target *target) { const struct xt_synproxy_info *info = (const struct xt_synproxy_info *)target->data; if (info->options & XT_SYNPROXY_OPT_SACK_PERM) printf(" --sack-perm"); if (info->options & XT_SYNPROXY_OPT_TIMESTAMP) printf(" --timestamp"); if (info->options & XT_SYNPROXY_OPT_WSCALE) printf(" --wscale %u", info->wscale); if (info->options & XT_SYNPROXY_OPT_MSS) printf(" --mss %u", info->mss); if (info->options & XT_SYNPROXY_OPT_ECN) printf(" --ecn"); } static struct xtables_target synproxy_tg_reg = { .family = NFPROTO_UNSPEC, .name = "SYNPROXY", .version = XTABLES_VERSION, .revision = 0, .size = XT_ALIGN(sizeof(struct xt_synproxy_info)), .userspacesize = XT_ALIGN(sizeof(struct xt_synproxy_info)), .help = SYNPROXY_help, .print = SYNPROXY_print, .save = SYNPROXY_save, .x6_parse = SYNPROXY_parse, .x6_fcheck = SYNPROXY_check, .x6_options = SYNPROXY_opts, }; void _init(void) { xtables_register_target(&synproxy_tg_reg); }