forked from Minki/linux
[DCCP]: Increment sequence numbers on retransmitted Response packets
Problem:
This commit is contained in:
parent
08a29e41bb
commit
e11d9d3080
@ -196,15 +196,17 @@ struct sock *dccp_check_req(struct sock *sk, struct sk_buff *skb,
|
|||||||
|
|
||||||
/* Check for retransmitted REQUEST */
|
/* Check for retransmitted REQUEST */
|
||||||
if (dccp_hdr(skb)->dccph_type == DCCP_PKT_REQUEST) {
|
if (dccp_hdr(skb)->dccph_type == DCCP_PKT_REQUEST) {
|
||||||
if (after48(DCCP_SKB_CB(skb)->dccpd_seq,
|
struct dccp_request_sock *dreq = dccp_rsk(req);
|
||||||
dccp_rsk(req)->dreq_isr)) {
|
|
||||||
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");
|
dccp_pr_debug("Retransmitted REQUEST\n");
|
||||||
/* Send another RESPONSE packet */
|
dreq->dreq_isr = DCCP_SKB_CB(skb)->dccpd_seq;
|
||||||
dccp_set_seqno(&dreq->dreq_iss, dreq->dreq_iss + 1);
|
/*
|
||||||
dccp_set_seqno(&dreq->dreq_isr,
|
* Send another RESPONSE packet
|
||||||
DCCP_SKB_CB(skb)->dccpd_seq);
|
* 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);
|
req->rsk_ops->rtx_syn_ack(sk, req, NULL);
|
||||||
}
|
}
|
||||||
/* Network Duplicate, discard packet */
|
/* Network Duplicate, discard packet */
|
||||||
|
@ -332,6 +332,8 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
|
|||||||
skb->dst = dst_clone(dst);
|
skb->dst = dst_clone(dst);
|
||||||
|
|
||||||
dreq = dccp_rsk(req);
|
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_type = DCCP_PKT_RESPONSE;
|
||||||
DCCP_SKB_CB(skb)->dccpd_seq = dreq->dreq_iss;
|
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);
|
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);
|
DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
|
||||||
return skb;
|
return skb;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user