diff options
Diffstat (limited to 'net/dccp/options.c')
-rw-r--r-- | net/dccp/options.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/net/dccp/options.c b/net/dccp/options.c index 0c996d8c79a3..bedb5daaa3c5 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c | |||
@@ -537,6 +537,18 @@ static int dccp_insert_options_feat(struct sock *sk, struct sk_buff *skb) | |||
537 | return 0; | 537 | return 0; |
538 | } | 538 | } |
539 | 539 | ||
540 | /* The length of all options needs to be a multiple of 4 (5.8) */ | ||
541 | static void dccp_insert_option_padding(struct sk_buff *skb) | ||
542 | { | ||
543 | int padding = DCCP_SKB_CB(skb)->dccpd_opt_len % 4; | ||
544 | |||
545 | if (padding != 0) { | ||
546 | padding = 4 - padding; | ||
547 | memset(skb_push(skb, padding), 0, padding); | ||
548 | DCCP_SKB_CB(skb)->dccpd_opt_len += padding; | ||
549 | } | ||
550 | } | ||
551 | |||
540 | int dccp_insert_options(struct sock *sk, struct sk_buff *skb) | 552 | int dccp_insert_options(struct sock *sk, struct sk_buff *skb) |
541 | { | 553 | { |
542 | struct dccp_sock *dp = dccp_sk(sk); | 554 | struct dccp_sock *dp = dccp_sk(sk); |
@@ -580,18 +592,18 @@ int dccp_insert_options(struct sock *sk, struct sk_buff *skb) | |||
580 | dccp_insert_option_timestamp_echo(dp, NULL, skb)) | 592 | dccp_insert_option_timestamp_echo(dp, NULL, skb)) |
581 | return -1; | 593 | return -1; |
582 | 594 | ||
583 | /* XXX: insert other options when appropriate */ | 595 | dccp_insert_option_padding(skb); |
596 | return 0; | ||
597 | } | ||
584 | 598 | ||
585 | if (DCCP_SKB_CB(skb)->dccpd_opt_len != 0) { | 599 | int dccp_insert_options_rsk(struct dccp_request_sock *dreq, struct sk_buff *skb) |
586 | /* The length of all options has to be a multiple of 4 */ | 600 | { |
587 | int padding = DCCP_SKB_CB(skb)->dccpd_opt_len % 4; | 601 | DCCP_SKB_CB(skb)->dccpd_opt_len = 0; |
588 | 602 | ||
589 | if (padding != 0) { | 603 | if (dreq->dreq_timestamp_echo != 0 && |
590 | padding = 4 - padding; | 604 | dccp_insert_option_timestamp_echo(NULL, dreq, skb)) |
591 | memset(skb_push(skb, padding), 0, padding); | 605 | return -1; |
592 | DCCP_SKB_CB(skb)->dccpd_opt_len += padding; | ||
593 | } | ||
594 | } | ||
595 | 606 | ||
607 | dccp_insert_option_padding(skb); | ||
596 | return 0; | 608 | return 0; |
597 | } | 609 | } |