From eff85fcb0b362d932e7d3febb2379968d8da46fa Mon Sep 17 00:00:00 2001 From: Gerrit Renker Date: Mon, 13 Nov 2006 13:12:07 -0200 Subject: [PATCH] --- yaml --- r: 41639 b: refs/heads/master c: e11d9d30802278af22e78d8c10f348b683670cd9 h: refs/heads/master i: 41637: 7b0f39e296d932f82f7f74749079fcfc794832ae 41635: 01caff53897555c4cdc9a5ca8c5cbbf9c4306aeb 41631: e9cf397bb5e96aa536e9139d96ef295c7f14e9f1 v: v3 --- [refs] | 2 +- trunk/net/dccp/minisocks.c | 16 +++++++++------- trunk/net/dccp/output.c | 4 ++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index ba5f4d6cadbd..ff56a26fcba9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 08a29e41bb6d6516b0f65e19381f537168d1768e +refs/heads/master: e11d9d30802278af22e78d8c10f348b683670cd9 diff --git a/trunk/net/dccp/minisocks.c b/trunk/net/dccp/minisocks.c index d3de696fe4bf..5b2773efd7c7 100644 --- a/trunk/net/dccp/minisocks.c +++ b/trunk/net/dccp/minisocks.c @@ -196,15 +196,17 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb, /* Check for retransmitted REQUEST */ if (dccp_hdr(skb)->dccph_type == DCCP_PKT_REQUEST) { - if (after48(DCCP_SKB_CB(skb)->dccpd_seq, - dccp_rsk(req)->dreq_isr)) { - struct dccp_request_sock *dreq = dccp_rsk(req); + struct dccp_request_sock *dreq = dccp_rsk(req); + if (after48(DCCP_SKB_CB(skb)->dccpd_seq, dreq->dreq_isr)) { dccp_pr_debug("Retransmitted REQUEST\n"); - /* Send another RESPONSE packet */ - dccp_set_seqno(&dreq->dreq_iss, dreq->dreq_iss + 1); - dccp_set_seqno(&dreq->dreq_isr, - DCCP_SKB_CB(skb)->dccpd_seq); + dreq->dreq_isr = DCCP_SKB_CB(skb)->dccpd_seq; + /* + * Send another RESPONSE packet + * To protect against Request floods, increment retrans + * counter (backoff, monitored by dccp_response_timer). + */ + req->retrans++; req->rsk_ops->rtx_syn_ack(sk, req, NULL); } /* Network Duplicate, discard packet */ diff --git a/trunk/net/dccp/output.c b/trunk/net/dccp/output.c index 992caedd7725..08ee5547a2f2 100644 --- a/trunk/net/dccp/output.c +++ b/trunk/net/dccp/output.c @@ -332,6 +332,8 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, skb->dst = dst_clone(dst); dreq = dccp_rsk(req); + if (inet_rsk(req)->acked) /* increase ISS upon retransmission */ + dccp_inc_seqno(&dreq->dreq_iss); DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE; DCCP_SKB_CB(skb)->dccpd_seq = dreq->dreq_iss; @@ -354,6 +356,8 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst, dccp_csum_outgoing(skb); + /* We use `acked' to remember that a Response was already sent. */ + inet_rsk(req)->acked = 1; DCCP_INC_STATS(DCCP_MIB_OUTSEGS); return skb; }