On Tue, Jun 25, 2019 at 08:42:04AM +0300, Ibrahim Ercan wrote: > Syn proxy isn't setting mss value correctly on client syn-ack packet. > It was sending same mss value with client send instead of the value user set > in iptables rule. This patch fix that wrong behavior by passing client mss > information to synproxy_send_client_synack correctly. > > Signed-off-by: Ibrahim Ercan <ibrahim.er...@labristeknoloji.com> > --- > net/ipv4/netfilter/ipt_SYNPROXY.c | 9 ++++++--- > net/ipv6/netfilter/ip6t_SYNPROXY.c | 9 ++++++--- > 2 files changed, 12 insertions(+), 6 deletions(-) > > diff --git a/net/ipv4/netfilter/ipt_SYNPROXY.c > b/net/ipv4/netfilter/ipt_SYNPROXY.c > index 64d9563..e0bd504 100644 > --- a/net/ipv4/netfilter/ipt_SYNPROXY.c > +++ b/net/ipv4/netfilter/ipt_SYNPROXY.c > @@ -69,13 +69,13 @@ synproxy_send_tcp(struct net *net, > static void > synproxy_send_client_synack(struct net *net, > const struct sk_buff *skb, const struct tcphdr *th, > - const struct synproxy_options *opts) > + const struct synproxy_options *opts, const u16 > client_mssinfo) > { > struct sk_buff *nskb; > struct iphdr *iph, *niph; > struct tcphdr *nth; > unsigned int tcp_hdr_size; > - u16 mss = opts->mss; > + u16 mss = client_mssinfo; > > iph = ip_hdr(skb); > > @@ -264,6 +264,7 @@ synproxy_tg4(struct sk_buff *skb, const struct > xt_action_param *par) > struct synproxy_net *snet = synproxy_pernet(net); > struct synproxy_options opts = {}; > struct tcphdr *th, _th; > + u16 client_mssinfo; > > if (nf_ip_checksum(skb, xt_hooknum(par), par->thoff, IPPROTO_TCP)) > return NF_DROP; > @@ -283,6 +284,8 @@ synproxy_tg4(struct sk_buff *skb, const struct > xt_action_param *par) > opts.options |= XT_SYNPROXY_OPT_ECN; > > opts.options &= info->options; > + client_mssinfo = opts.mss; > + opts.mss = info->mss;
No need for this new client_mssinfo variable, right? I mean, you can just set: opts.mss = info->mss; and use it from synproxy_send_client_synack(). This patch will be smaller. > if (opts.options & XT_SYNPROXY_OPT_TIMESTAMP) > synproxy_init_timestamp_cookie(info, &opts); > else > @@ -290,7 +293,7 @@ synproxy_tg4(struct sk_buff *skb, const struct > xt_action_param *par) > XT_SYNPROXY_OPT_SACK_PERM | > XT_SYNPROXY_OPT_ECN); > > - synproxy_send_client_synack(net, skb, th, &opts); > + synproxy_send_client_synack(net, skb, th, &opts, > client_mssinfo); > consume_skb(skb); > return NF_STOLEN; > } else if (th->ack && !(th->fin || th->rst || th->syn)) {