diff options
Diffstat (limited to 'net/sctp/sm_sideeffect.c')
| -rw-r--r-- | net/sctp/sm_sideeffect.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index 823947170a33..2d7d8a5db2ac 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
| @@ -157,9 +157,12 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force, | |||
| 157 | { | 157 | { |
| 158 | __u32 ctsn, max_tsn_seen; | 158 | __u32 ctsn, max_tsn_seen; |
| 159 | struct sctp_chunk *sack; | 159 | struct sctp_chunk *sack; |
| 160 | struct sctp_transport *trans = asoc->peer.last_data_from; | ||
| 160 | int error = 0; | 161 | int error = 0; |
| 161 | 162 | ||
| 162 | if (force) | 163 | if (force || |
| 164 | (!trans && (asoc->param_flags & SPP_SACKDELAY_DISABLE)) || | ||
| 165 | (trans && (trans->param_flags & SPP_SACKDELAY_DISABLE))) | ||
| 163 | asoc->peer.sack_needed = 1; | 166 | asoc->peer.sack_needed = 1; |
| 164 | 167 | ||
| 165 | ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map); | 168 | ctsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map); |
| @@ -189,7 +192,22 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force, | |||
| 189 | if (!asoc->peer.sack_needed) { | 192 | if (!asoc->peer.sack_needed) { |
| 190 | /* We will need a SACK for the next packet. */ | 193 | /* We will need a SACK for the next packet. */ |
| 191 | asoc->peer.sack_needed = 1; | 194 | asoc->peer.sack_needed = 1; |
| 192 | goto out; | 195 | |
| 196 | /* Set the SACK delay timeout based on the | ||
| 197 | * SACK delay for the last transport | ||
| 198 | * data was received from, or the default | ||
| 199 | * for the association. | ||
| 200 | */ | ||
| 201 | if (trans) | ||
| 202 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = | ||
| 203 | trans->sackdelay; | ||
| 204 | else | ||
| 205 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = | ||
| 206 | asoc->sackdelay; | ||
| 207 | |||
| 208 | /* Restart the SACK timer. */ | ||
| 209 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART, | ||
| 210 | SCTP_TO(SCTP_EVENT_TIMEOUT_SACK)); | ||
| 193 | } else { | 211 | } else { |
| 194 | if (asoc->a_rwnd > asoc->rwnd) | 212 | if (asoc->a_rwnd > asoc->rwnd) |
| 195 | asoc->a_rwnd = asoc->rwnd; | 213 | asoc->a_rwnd = asoc->rwnd; |
| @@ -205,7 +223,7 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force, | |||
| 205 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, | 223 | sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP, |
| 206 | SCTP_TO(SCTP_EVENT_TIMEOUT_SACK)); | 224 | SCTP_TO(SCTP_EVENT_TIMEOUT_SACK)); |
| 207 | } | 225 | } |
| 208 | out: | 226 | |
| 209 | return error; | 227 | return error; |
| 210 | nomem: | 228 | nomem: |
| 211 | error = -ENOMEM; | 229 | error = -ENOMEM; |
| @@ -415,7 +433,7 @@ static void sctp_do_8_2_transport_strike(struct sctp_association *asoc, | |||
| 415 | asoc->overall_error_count++; | 433 | asoc->overall_error_count++; |
| 416 | 434 | ||
| 417 | if (transport->state != SCTP_INACTIVE && | 435 | if (transport->state != SCTP_INACTIVE && |
| 418 | (transport->error_count++ >= transport->max_retrans)) { | 436 | (transport->error_count++ >= transport->pathmaxrxt)) { |
| 419 | SCTP_DEBUG_PRINTK_IPADDR("transport_strike:association %p", | 437 | SCTP_DEBUG_PRINTK_IPADDR("transport_strike:association %p", |
| 420 | " transport IP: port:%d failed.\n", | 438 | " transport IP: port:%d failed.\n", |
| 421 | asoc, | 439 | asoc, |
