Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 111461
b: refs/heads/master
c: d4c8741
h: refs/heads/master
i:
  111459: fb5773c
v: v3
  • Loading branch information
Gerrit Renker committed Sep 4, 2008
1 parent 3b1413d commit a7197dc
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 5 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: 093e1f46cf162913d05e1d4eeb01baa3e297b683
refs/heads/master: d4c8741c431e07cfc66eb2b4c3a17b8d4975d9c0
1 change: 1 addition & 0 deletions trunk/net/dccp/dccp.h
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,7 @@ static inline int dccp_ack_pending(const struct sock *sk)
}

extern int dccp_feat_finalise_settings(struct dccp_sock *dp);
extern int dccp_feat_server_ccid_dependencies(struct dccp_request_sock *dreq);
extern void dccp_feat_list_purge(struct list_head *fn_list);

extern int dccp_insert_options(struct sock *sk, struct sk_buff *skb);
Expand Down
25 changes: 25 additions & 0 deletions trunk/net/dccp/feat.c
Original file line number Diff line number Diff line change
Expand Up @@ -601,6 +601,31 @@ int dccp_feat_finalise_settings(struct dccp_sock *dp)
return 0;
}

/**
* dccp_feat_server_ccid_dependencies - Resolve CCID-dependent features
* It is the server which resolves the dependencies once the CCID has been
* fully negotiated. If no CCID has been negotiated, it uses the default CCID.
*/
int dccp_feat_server_ccid_dependencies(struct dccp_request_sock *dreq)
{
struct list_head *fn = &dreq->dreq_featneg;
struct dccp_feat_entry *entry;
u8 is_local, ccid;

for (is_local = 0; is_local <= 1; is_local++) {
entry = dccp_feat_list_lookup(fn, DCCPF_CCID, is_local);

if (entry != NULL && !entry->empty_confirm)
ccid = entry->val.sp.vec[0];
else
ccid = dccp_feat_default_value(DCCPF_CCID);

if (dccp_feat_propagate_ccid(fn, ccid, is_local))
return -1;
}
return 0;
}

static int dccp_feat_update_ccid(struct sock *sk, u8 type, u8 new_ccid_nr)
{
struct dccp_sock *dp = dccp_sk(sk);
Expand Down
13 changes: 9 additions & 4 deletions trunk/net/dccp/output.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,10 +339,12 @@ 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_rsk(dreq, skb)) {
kfree_skb(skb);
return NULL;
}
/* Resolve feature dependencies resulting from choice of CCID */
if (dccp_feat_server_ccid_dependencies(dreq))
goto response_failed;

if (dccp_insert_options_rsk(dreq, skb))
goto response_failed;

/* Build and checksum header */
dh = dccp_zeroed_hdr(skb, dccp_header_size);
Expand All @@ -363,6 +365,9 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
inet_rsk(req)->acked = 1;
DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
return skb;
response_failed:
kfree_skb(skb);
return NULL;
}

EXPORT_SYMBOL_GPL(dccp_make_response);
Expand Down

0 comments on commit a7197dc

Please sign in to comment.