diff options
-rw-r--r-- | net/dccp/ccids/ccid3.c | 37 | ||||
-rw-r--r-- | net/dccp/ccids/ccid3.h | 2 |
2 files changed, 9 insertions, 30 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index be1b8baaf298..90bc0a7da8e4 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
@@ -54,7 +54,6 @@ static const char *ccid3_tx_state_name(enum ccid3_hc_tx_states state) | |||
54 | [TFRC_SSTATE_NO_SENT] = "NO_SENT", | 54 | [TFRC_SSTATE_NO_SENT] = "NO_SENT", |
55 | [TFRC_SSTATE_NO_FBACK] = "NO_FBACK", | 55 | [TFRC_SSTATE_NO_FBACK] = "NO_FBACK", |
56 | [TFRC_SSTATE_FBACK] = "FBACK", | 56 | [TFRC_SSTATE_FBACK] = "FBACK", |
57 | [TFRC_SSTATE_TERM] = "TERM", | ||
58 | }; | 57 | }; |
59 | 58 | ||
60 | return ccid3_state_names[state]; | 59 | return ccid3_state_names[state]; |
@@ -208,10 +207,13 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data) | |||
208 | ccid3_pr_debug("%s(%p, state=%s) - entry\n", dccp_role(sk), sk, | 207 | ccid3_pr_debug("%s(%p, state=%s) - entry\n", dccp_role(sk), sk, |
209 | ccid3_tx_state_name(hc->tx_state)); | 208 | ccid3_tx_state_name(hc->tx_state)); |
210 | 209 | ||
210 | /* Ignore and do not restart after leaving the established state */ | ||
211 | if ((1 << sk->sk_state) & ~(DCCPF_OPEN | DCCPF_PARTOPEN)) | ||
212 | goto out; | ||
213 | |||
214 | /* Reset feedback state to "no feedback received" */ | ||
211 | if (hc->tx_state == TFRC_SSTATE_FBACK) | 215 | if (hc->tx_state == TFRC_SSTATE_FBACK) |
212 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK); | 216 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK); |
213 | else if (hc->tx_state != TFRC_SSTATE_NO_FBACK) | ||
214 | goto out; | ||
215 | 217 | ||
216 | /* | 218 | /* |
217 | * Determine new allowed sending rate X as per draft rfc3448bis-00, 4.4 | 219 | * Determine new allowed sending rate X as per draft rfc3448bis-00, 4.4 |
@@ -287,8 +289,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb) | |||
287 | if (unlikely(skb->len == 0)) | 289 | if (unlikely(skb->len == 0)) |
288 | return -EBADMSG; | 290 | return -EBADMSG; |
289 | 291 | ||
290 | switch (hc->tx_state) { | 292 | if (hc->tx_state == TFRC_SSTATE_NO_SENT) { |
291 | case TFRC_SSTATE_NO_SENT: | ||
292 | sk_reset_timer(sk, &hc->tx_no_feedback_timer, (jiffies + | 293 | sk_reset_timer(sk, &hc->tx_no_feedback_timer, (jiffies + |
293 | usecs_to_jiffies(TFRC_INITIAL_TIMEOUT))); | 294 | usecs_to_jiffies(TFRC_INITIAL_TIMEOUT))); |
294 | hc->tx_last_win_count = 0; | 295 | hc->tx_last_win_count = 0; |
@@ -323,9 +324,8 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb) | |||
323 | ccid3_update_send_interval(hc); | 324 | ccid3_update_send_interval(hc); |
324 | 325 | ||
325 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK); | 326 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK); |
326 | break; | 327 | |
327 | case TFRC_SSTATE_NO_FBACK: | 328 | } else { |
328 | case TFRC_SSTATE_FBACK: | ||
329 | delay = ktime_us_delta(hc->tx_t_nom, now); | 329 | delay = ktime_us_delta(hc->tx_t_nom, now); |
330 | ccid3_pr_debug("delay=%ld\n", (long)delay); | 330 | ccid3_pr_debug("delay=%ld\n", (long)delay); |
331 | /* | 331 | /* |
@@ -340,10 +340,6 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb) | |||
340 | return (u32)delay / USEC_PER_MSEC; | 340 | return (u32)delay / USEC_PER_MSEC; |
341 | 341 | ||
342 | ccid3_hc_tx_update_win_count(hc, now); | 342 | ccid3_hc_tx_update_win_count(hc, now); |
343 | break; | ||
344 | case TFRC_SSTATE_TERM: | ||
345 | DCCP_BUG("%s(%p) - Illegal state TERM", dccp_role(sk), sk); | ||
346 | return -EINVAL; | ||
347 | } | 343 | } |
348 | 344 | ||
349 | /* prepare to send now (add options etc.) */ | 345 | /* prepare to send now (add options etc.) */ |
@@ -379,11 +375,6 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) | |||
379 | if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK || | 375 | if (!(DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_ACK || |
380 | DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_DATAACK)) | 376 | DCCP_SKB_CB(skb)->dccpd_type == DCCP_PKT_DATAACK)) |
381 | return; | 377 | return; |
382 | /* ... and only in the established state */ | ||
383 | if (hc->tx_state != TFRC_SSTATE_FBACK && | ||
384 | hc->tx_state != TFRC_SSTATE_NO_FBACK) | ||
385 | return; | ||
386 | |||
387 | /* | 378 | /* |
388 | * Locate the acknowledged packet in the TX history. | 379 | * Locate the acknowledged packet in the TX history. |
389 | * | 380 | * |
@@ -529,9 +520,7 @@ static void ccid3_hc_tx_exit(struct sock *sk) | |||
529 | { | 520 | { |
530 | struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk); | 521 | struct ccid3_hc_tx_sock *hc = ccid3_hc_tx_sk(sk); |
531 | 522 | ||
532 | ccid3_hc_tx_set_state(sk, TFRC_SSTATE_TERM); | ||
533 | sk_stop_timer(sk, &hc->tx_no_feedback_timer); | 523 | sk_stop_timer(sk, &hc->tx_no_feedback_timer); |
534 | |||
535 | tfrc_tx_hist_purge(&hc->tx_hist); | 524 | tfrc_tx_hist_purge(&hc->tx_hist); |
536 | } | 525 | } |
537 | 526 | ||
@@ -590,7 +579,6 @@ static const char *ccid3_rx_state_name(enum ccid3_hc_rx_states state) | |||
590 | static const char *const ccid3_rx_state_names[] = { | 579 | static const char *const ccid3_rx_state_names[] = { |
591 | [TFRC_RSTATE_NO_DATA] = "NO_DATA", | 580 | [TFRC_RSTATE_NO_DATA] = "NO_DATA", |
592 | [TFRC_RSTATE_DATA] = "DATA", | 581 | [TFRC_RSTATE_DATA] = "DATA", |
593 | [TFRC_RSTATE_TERM] = "TERM", | ||
594 | }; | 582 | }; |
595 | 583 | ||
596 | return ccid3_rx_state_names[state]; | 584 | return ccid3_rx_state_names[state]; |
@@ -616,14 +604,9 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk, | |||
616 | { | 604 | { |
617 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); | 605 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); |
618 | struct dccp_sock *dp = dccp_sk(sk); | 606 | struct dccp_sock *dp = dccp_sk(sk); |
619 | ktime_t now; | 607 | ktime_t now = ktime_get_real(); |
620 | s64 delta = 0; | 608 | s64 delta = 0; |
621 | 609 | ||
622 | if (unlikely(hc->rx_state == TFRC_RSTATE_TERM)) | ||
623 | return; | ||
624 | |||
625 | now = ktime_get_real(); | ||
626 | |||
627 | switch (fbtype) { | 610 | switch (fbtype) { |
628 | case CCID3_FBACK_INITIAL: | 611 | case CCID3_FBACK_INITIAL: |
629 | hc->rx_x_recv = 0; | 612 | hc->rx_x_recv = 0; |
@@ -827,8 +810,6 @@ static void ccid3_hc_rx_exit(struct sock *sk) | |||
827 | { | 810 | { |
828 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); | 811 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); |
829 | 812 | ||
830 | ccid3_hc_rx_set_state(sk, TFRC_RSTATE_TERM); | ||
831 | |||
832 | tfrc_rx_hist_purge(&hc->rx_hist); | 813 | tfrc_rx_hist_purge(&hc->rx_hist); |
833 | tfrc_lh_cleanup(&hc->rx_li_hist); | 814 | tfrc_lh_cleanup(&hc->rx_li_hist); |
834 | } | 815 | } |
diff --git a/net/dccp/ccids/ccid3.h b/net/dccp/ccids/ccid3.h index 9eb90b863abd..89b047b0c79b 100644 --- a/net/dccp/ccids/ccid3.h +++ b/net/dccp/ccids/ccid3.h | |||
@@ -77,7 +77,6 @@ enum ccid3_hc_tx_states { | |||
77 | TFRC_SSTATE_NO_SENT = 1, | 77 | TFRC_SSTATE_NO_SENT = 1, |
78 | TFRC_SSTATE_NO_FBACK, | 78 | TFRC_SSTATE_NO_FBACK, |
79 | TFRC_SSTATE_FBACK, | 79 | TFRC_SSTATE_FBACK, |
80 | TFRC_SSTATE_TERM, | ||
81 | }; | 80 | }; |
82 | 81 | ||
83 | /** | 82 | /** |
@@ -130,7 +129,6 @@ static inline struct ccid3_hc_tx_sock *ccid3_hc_tx_sk(const struct sock *sk) | |||
130 | enum ccid3_hc_rx_states { | 129 | enum ccid3_hc_rx_states { |
131 | TFRC_RSTATE_NO_DATA = 1, | 130 | TFRC_RSTATE_NO_DATA = 1, |
132 | TFRC_RSTATE_DATA, | 131 | TFRC_RSTATE_DATA, |
133 | TFRC_RSTATE_TERM = 127, | ||
134 | }; | 132 | }; |
135 | 133 | ||
136 | /** | 134 | /** |