You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.4 KiB
127 lines
3.4 KiB
|
|
/* |
|
* Copyright (c) 2013 Patrick McHardy <kaber@trash.net> |
|
* |
|
* 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 <stdbool.h> |
|
#include <stdio.h> |
|
#include <xtables.h> |
|
#include <linux/netfilter/xt_SYNPROXY.h> |
|
|
|
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); |
|
}
|
|
|