Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 78446
b: refs/heads/master
c: af3b867
h: refs/heads/master
v: v3
  • Loading branch information
Gerrit Renker authored and David S. Miller committed Jan 28, 2008
1 parent 15ddcc1 commit b8365fc
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b4d4f7c70fd3361c6c889752e08ea9be304cf5f4
refs/heads/master: af3b867e2f6b72422bc7aacb1f1e26f47a9649bc
1 change: 1 addition & 0 deletions trunk/net/dccp/dccp.h
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,7 @@ static inline int dccp_ack_pending(const struct sock *sk)
}

extern int dccp_insert_options(struct sock *sk, struct sk_buff *skb);
extern int dccp_insert_options_rsk(struct dccp_request_sock*, struct sk_buff*);
extern int dccp_insert_option_elapsed_time(struct sock *sk,
struct sk_buff *skb,
u32 elapsed_time);
Expand Down
32 changes: 22 additions & 10 deletions trunk/net/dccp/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,18 @@ static int dccp_insert_options_feat(struct sock *sk, struct sk_buff *skb)
return 0;
}

/* The length of all options needs to be a multiple of 4 (5.8) */
static void dccp_insert_option_padding(struct sk_buff *skb)
{
int padding = DCCP_SKB_CB(skb)->dccpd_opt_len % 4;

if (padding != 0) {
padding = 4 - padding;
memset(skb_push(skb, padding), 0, padding);
DCCP_SKB_CB(skb)->dccpd_opt_len += padding;
}
}

int dccp_insert_options(struct sock *sk, struct sk_buff *skb)
{
struct dccp_sock *dp = dccp_sk(sk);
Expand Down Expand Up @@ -580,18 +592,18 @@ int dccp_insert_options(struct sock *sk, struct sk_buff *skb)
dccp_insert_option_timestamp_echo(dp, NULL, skb))
return -1;

/* XXX: insert other options when appropriate */
dccp_insert_option_padding(skb);
return 0;
}

if (DCCP_SKB_CB(skb)->dccpd_opt_len != 0) {
/* The length of all options has to be a multiple of 4 */
int padding = DCCP_SKB_CB(skb)->dccpd_opt_len % 4;
int dccp_insert_options_rsk(struct dccp_request_sock *dreq, struct sk_buff *skb)
{
DCCP_SKB_CB(skb)->dccpd_opt_len = 0;

if (padding != 0) {
padding = 4 - padding;
memset(skb_push(skb, padding), 0, padding);
DCCP_SKB_CB(skb)->dccpd_opt_len += padding;
}
}
if (dreq->dreq_timestamp_echo != 0 &&
dccp_insert_option_timestamp_echo(NULL, dreq, skb))
return -1;

dccp_insert_option_padding(skb);
return 0;
}
2 changes: 1 addition & 1 deletion trunk/net/dccp/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
DCCP_SKB_CB(skb)->dccpd_type = DCCP_PKT_RESPONSE;
DCCP_SKB_CB(skb)->dccpd_seq = dreq->dreq_iss;

if (dccp_insert_options(sk, skb)) {
if (dccp_insert_options_rsk(dreq, skb)) {
kfree_skb(skb);
return NULL;
}
Expand Down

0 comments on commit b8365fc

Please sign in to comment.