diff options
| -rw-r--r-- | net/dccp/output.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/net/dccp/output.c b/net/dccp/output.c index d19d48195013..d06945c7d3df 100644 --- a/net/dccp/output.c +++ b/net/dccp/output.c | |||
| @@ -53,8 +53,11 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 53 | dccp_packet_hdr_len(dcb->dccpd_type); | 53 | dccp_packet_hdr_len(dcb->dccpd_type); |
| 54 | int err, set_ack = 1; | 54 | int err, set_ack = 1; |
| 55 | u64 ackno = dp->dccps_gsr; | 55 | u64 ackno = dp->dccps_gsr; |
| 56 | 56 | /* | |
| 57 | dccp_inc_seqno(&dp->dccps_gss); | 57 | * Increment GSS here already in case the option code needs it. |
| 58 | * Update GSS for real only if option processing below succeeds. | ||
| 59 | */ | ||
| 60 | dcb->dccpd_seq = ADD48(dp->dccps_gss, 1); | ||
| 58 | 61 | ||
| 59 | switch (dcb->dccpd_type) { | 62 | switch (dcb->dccpd_type) { |
| 60 | case DCCP_PKT_DATA: | 63 | case DCCP_PKT_DATA: |
| @@ -66,6 +69,9 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 66 | 69 | ||
| 67 | case DCCP_PKT_REQUEST: | 70 | case DCCP_PKT_REQUEST: |
| 68 | set_ack = 0; | 71 | set_ack = 0; |
| 72 | /* Use ISS on the first (non-retransmitted) Request. */ | ||
| 73 | if (icsk->icsk_retransmits == 0) | ||
| 74 | dcb->dccpd_seq = dp->dccps_iss; | ||
| 69 | /* fall through */ | 75 | /* fall through */ |
| 70 | 76 | ||
| 71 | case DCCP_PKT_SYNC: | 77 | case DCCP_PKT_SYNC: |
| @@ -84,8 +90,6 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 84 | break; | 90 | break; |
| 85 | } | 91 | } |
| 86 | 92 | ||
| 87 | dcb->dccpd_seq = dp->dccps_gss; | ||
| 88 | |||
| 89 | if (dccp_insert_options(sk, skb)) { | 93 | if (dccp_insert_options(sk, skb)) { |
| 90 | kfree_skb(skb); | 94 | kfree_skb(skb); |
| 91 | return -EPROTO; | 95 | return -EPROTO; |
| @@ -103,7 +107,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 103 | /* XXX For now we're using only 48 bits sequence numbers */ | 107 | /* XXX For now we're using only 48 bits sequence numbers */ |
| 104 | dh->dccph_x = 1; | 108 | dh->dccph_x = 1; |
| 105 | 109 | ||
| 106 | dp->dccps_awh = dp->dccps_gss; | 110 | dccp_update_gss(sk, dcb->dccpd_seq); |
| 107 | dccp_hdr_set_seq(dh, dp->dccps_gss); | 111 | dccp_hdr_set_seq(dh, dp->dccps_gss); |
| 108 | if (set_ack) | 112 | if (set_ack) |
| 109 | dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), ackno); | 113 | dccp_hdr_set_ack(dccp_hdr_ack_bits(skb), ackno); |
| @@ -112,6 +116,11 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 112 | case DCCP_PKT_REQUEST: | 116 | case DCCP_PKT_REQUEST: |
| 113 | dccp_hdr_request(skb)->dccph_req_service = | 117 | dccp_hdr_request(skb)->dccph_req_service = |
| 114 | dp->dccps_service; | 118 | dp->dccps_service; |
| 119 | /* | ||
| 120 | * Limit Ack window to ISS <= P.ackno <= GSS, so that | ||
| 121 | * only Responses to Requests we sent are considered. | ||
| 122 | */ | ||
| 123 | dp->dccps_awl = dp->dccps_iss; | ||
| 115 | break; | 124 | break; |
| 116 | case DCCP_PKT_RESET: | 125 | case DCCP_PKT_RESET: |
| 117 | dccp_hdr_reset(skb)->dccph_reset_code = | 126 | dccp_hdr_reset(skb)->dccph_reset_code = |
| @@ -449,19 +458,7 @@ static inline void dccp_connect_init(struct sock *sk) | |||
| 449 | 458 | ||
| 450 | dccp_sync_mss(sk, dst_mtu(dst)); | 459 | dccp_sync_mss(sk, dst_mtu(dst)); |
| 451 | 460 | ||
| 452 | /* | 461 | /* Initialise GAR as per 8.5; AWL/AWH are set in dccp_transmit_skb() */ |
| 453 | * SWL and AWL are initially adjusted so that they are not less than | ||
| 454 | * the initial Sequence Numbers received and sent, respectively: | ||
| 455 | * SWL := max(GSR + 1 - floor(W/4), ISR), | ||
| 456 | * AWL := max(GSS - W' + 1, ISS). | ||
| 457 | * These adjustments MUST be applied only at the beginning of the | ||
| 458 | * connection. | ||
| 459 | */ | ||
| 460 | dccp_update_gss(sk, dp->dccps_iss); | ||
| 461 | dccp_set_seqno(&dp->dccps_awl, max48(dp->dccps_awl, dp->dccps_iss)); | ||
| 462 | |||
| 463 | /* S.GAR - greatest valid acknowledgement number received on a non-Sync; | ||
| 464 | * initialized to S.ISS (sec. 8.5) */ | ||
| 465 | dp->dccps_gar = dp->dccps_iss; | 462 | dp->dccps_gar = dp->dccps_iss; |
| 466 | 463 | ||
| 467 | icsk->icsk_retransmits = 0; | 464 | icsk->icsk_retransmits = 0; |
