diff options
-rw-r--r-- | include/linux/dccp.h | 2 | ||||
-rw-r--r-- | net/dccp/ccids/ccid3.c | 5 | ||||
-rw-r--r-- | net/dccp/options.c | 11 |
3 files changed, 14 insertions, 4 deletions
diff --git a/include/linux/dccp.h b/include/linux/dccp.h index 007c290f74d4..5e0af0d08a93 100644 --- a/include/linux/dccp.h +++ b/include/linux/dccp.h | |||
@@ -433,6 +433,8 @@ struct dccp_sock { | |||
433 | struct ccid *dccps_hc_tx_ccid; | 433 | struct ccid *dccps_hc_tx_ccid; |
434 | struct dccp_options_received dccps_options_received; | 434 | struct dccp_options_received dccps_options_received; |
435 | enum dccp_role dccps_role:2; | 435 | enum dccp_role dccps_role:2; |
436 | __u8 dccps_hc_rx_insert_options:1; | ||
437 | __u8 dccps_hc_tx_insert_options:1; | ||
436 | }; | 438 | }; |
437 | 439 | ||
438 | static inline struct dccp_sock *dccp_sk(const struct sock *sk) | 440 | static inline struct dccp_sock *dccp_sk(const struct sock *sk) |
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index ae0500c79d07..37fd9eb8daaf 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
@@ -358,10 +358,12 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, | |||
358 | } | 358 | } |
359 | 359 | ||
360 | /* Can we send? if so add options and add to packet history */ | 360 | /* Can we send? if so add options and add to packet history */ |
361 | if (rc == 0) | 361 | if (rc == 0) { |
362 | dp->dccps_hc_tx_insert_options = 1; | ||
362 | new_packet->dccphtx_ccval = | 363 | new_packet->dccphtx_ccval = |
363 | DCCP_SKB_CB(skb)->dccpd_ccval = | 364 | DCCP_SKB_CB(skb)->dccpd_ccval = |
364 | hctx->ccid3hctx_last_win_count; | 365 | hctx->ccid3hctx_last_win_count; |
366 | } | ||
365 | out: | 367 | out: |
366 | return rc; | 368 | return rc; |
367 | } | 369 | } |
@@ -811,6 +813,7 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk) | |||
811 | hcrx->ccid3hcrx_pinv = ~0; | 813 | hcrx->ccid3hcrx_pinv = ~0; |
812 | else | 814 | else |
813 | hcrx->ccid3hcrx_pinv = 1000000 / hcrx->ccid3hcrx_p; | 815 | hcrx->ccid3hcrx_pinv = 1000000 / hcrx->ccid3hcrx_p; |
816 | dp->dccps_hc_rx_insert_options = 1; | ||
814 | dccp_send_ack(sk); | 817 | dccp_send_ack(sk); |
815 | } | 818 | } |
816 | 819 | ||
diff --git a/net/dccp/options.c b/net/dccp/options.c index 382c5894acb2..7ad2f4266ff9 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c | |||
@@ -505,13 +505,18 @@ void dccp_insert_options(struct sock *sk, struct sk_buff *skb) | |||
505 | (dp->dccps_hc_rx_ackpkts->dccpap_buf_ackno != | 505 | (dp->dccps_hc_rx_ackpkts->dccpap_buf_ackno != |
506 | DCCP_MAX_SEQNO + 1)) | 506 | DCCP_MAX_SEQNO + 1)) |
507 | dccp_insert_option_ack_vector(sk, skb); | 507 | dccp_insert_option_ack_vector(sk, skb); |
508 | |||
509 | if (dp->dccps_timestamp_echo != 0) | 508 | if (dp->dccps_timestamp_echo != 0) |
510 | dccp_insert_option_timestamp_echo(sk, skb); | 509 | dccp_insert_option_timestamp_echo(sk, skb); |
511 | } | 510 | } |
512 | 511 | ||
513 | ccid_hc_rx_insert_options(dp->dccps_hc_rx_ccid, sk, skb); | 512 | if (dp->dccps_hc_rx_insert_options) { |
514 | ccid_hc_tx_insert_options(dp->dccps_hc_tx_ccid, sk, skb); | 513 | ccid_hc_rx_insert_options(dp->dccps_hc_rx_ccid, sk, skb); |
514 | dp->dccps_hc_rx_insert_options = 0; | ||
515 | } | ||
516 | if (dp->dccps_hc_tx_insert_options) { | ||
517 | ccid_hc_tx_insert_options(dp->dccps_hc_tx_ccid, sk, skb); | ||
518 | dp->dccps_hc_tx_insert_options = 0; | ||
519 | } | ||
515 | 520 | ||
516 | /* XXX: insert other options when appropriate */ | 521 | /* XXX: insert other options when appropriate */ |
517 | 522 | ||