From patchwork Fri Jan 22 03:16:43 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Allen Simpson X-Patchwork-Id: 43469 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44667B7CD9 for ; Fri, 22 Jan 2010 14:16:52 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755866Ab0AVDQr (ORCPT ); Thu, 21 Jan 2010 22:16:47 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755863Ab0AVDQr (ORCPT ); Thu, 21 Jan 2010 22:16:47 -0500 Received: from mail-iw0-f196.google.com ([209.85.223.196]:63809 "EHLO mail-iw0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752344Ab0AVDQq (ORCPT ); Thu, 21 Jan 2010 22:16:46 -0500 Received: by iwn34 with SMTP id 34so638669iwn.21 for ; Thu, 21 Jan 2010 19:16:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:references:in-reply-to :content-type; bh=TsmhW0kSGiNwufgujO97qzUvspJgHqQA1Zp4Y5P17tE=; b=KMOxPC1Dk1MBGLcyVUBLalqlMIHInPkbUet9eGXF4F7dd1+qEmRjA9RdS5HcJhuHoB DRiPswepbTbnqSLv7lV5ELyUdkHQrOJLdD/S6F6mwVLjThLFTMzCLMUW458g4/vBC7V4 Rcvtee98oeveCtb4XqphFsvULV44d/J2+BM4Y= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type; b=qiRl9qB5t3OLygkwoF7g1Px6ABPPtOpG0CFsMGIZ+nB4Tozi+FoS3LBYkzENbJ4ol4 mi9WcCu29xyAxzvjnwFItKqgZ239+XBiqgbeBBrrWjjqkzl1/+4ARn3tptielAL/LKHt P3fvNwY0FphFVXtsbKHJ0Ge39m+2JCLJoUCxA= Received: by 10.231.149.75 with SMTP id s11mr1180856ibv.77.1264130205832; Thu, 21 Jan 2010 19:16:45 -0800 (PST) Received: from Wastrel.local (c-68-40-195-221.hsd1.mi.comcast.net [68.40.195.221]) by mx.google.com with ESMTPS id 21sm1183056iwn.2.2010.01.21.19.16.44 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 21 Jan 2010 19:16:45 -0800 (PST) Message-ID: <4B59189B.4020808@gmail.com> Date: Thu, 21 Jan 2010 22:16:43 -0500 From: William Allen Simpson User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: Linux Kernel Network Developers Subject: [PATCH v3 1/3] TCPCT part 2e: accept SYNACK data References: <4B59163C.2060002@gmail.com> In-Reply-To: <4B59163C.2060002@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When accompanied by cookie option, Initiator (client) queues incoming SYNACK transaction data. This is a straightforward re-implementation of an earlier (year-old) patch that no longer applies cleanly, with permission of the original author (Adam Langley). The patch was previously reviewed: http://thread.gmane.org/gmane.linux.network/102586 This function will also be used in subsequent patches that implement additional features. Requires: TCPCT part 1g: Responder Cookie => Initiator net: tcp_header_len_th and tcp_option_len_th Signed-off-by: William.Allen.Simpson@gmail.com --- net/ipv4/tcp_input.c | 26 +++++++++++++++++++++++++- 1 files changed, 25 insertions(+), 1 deletions(-) diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 8e0f6ae..165040e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -5395,6 +5395,12 @@ discard: return 0; } +/* + * Returns: + * +1 on reset, + * 0 success and/or SYNACK data, + * -1 on discard. + */ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, struct tcphdr *th) { @@ -5403,6 +5409,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, struct tcp_sock *tp = tcp_sk(sk); struct tcp_cookie_values *cvp = tp->cookie_values; int saved_clamp = tp->rx_opt.mss_clamp; + int queued = 0; tcp_parse_options(skb, &tp->rx_opt, &hash_location, 0); @@ -5509,6 +5516,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, - TCPOLEN_COOKIE_BASE; int cookie_pair_size = cookie_size + cvp->cookie_desired; + int tcp_header_len = tcp_header_len_th(th); /* A cookie extension option was sent and returned. * Note that each incoming SYNACK replaces the @@ -5524,6 +5532,19 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, hash_location, cookie_size); cvp->cookie_pair_size = cookie_pair_size; } + + queued = skb->len - tcp_header_len; + if (queued > 0) { + /* Queue incoming transaction data. */ + __skb_pull(skb, tcp_header_len); + __skb_queue_tail(&sk->sk_receive_queue, skb); + skb_set_owner_r(skb, sk); + sk->sk_data_ready(sk, 0); + cvp->s_data_in = 1; /* true */ + tp->rcv_nxt = TCP_SKB_CB(skb)->end_seq; + tp->rcv_wup = TCP_SKB_CB(skb)->end_seq; + tp->copied_seq = TCP_SKB_CB(skb)->seq + 1; + } } smp_mb(); @@ -5577,11 +5598,14 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, TCP_DELACK_MAX, TCP_RTO_MAX); discard: - __kfree_skb(skb); + if (queued <= 0) + __kfree_skb(skb); return 0; } else { tcp_send_ack(sk); } + if (queued > 0) + return 0; return -1; }