|
@@ -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_type = DCCP_PKT_RESPONSE;
|
|
DCCP_SKB_CB(skb)->dccpd_seq = dreq->dreq_iss;
|
|
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 */
|
|
/* Build and checksum header */
|
|
dh = dccp_zeroed_hdr(skb, dccp_header_size);
|
|
dh = dccp_zeroed_hdr(skb, dccp_header_size);
|
|
@@ -363,6 +365,9 @@ struct sk_buff *dccp_make_response(struct sock *sk, struct dst_entry *dst,
|
|
inet_rsk(req)->acked = 1;
|
|
inet_rsk(req)->acked = 1;
|
|
DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
|
|
DCCP_INC_STATS(DCCP_MIB_OUTSEGS);
|
|
return skb;
|
|
return skb;
|
|
|
|
+response_failed:
|
|
|
|
+ kfree_skb(skb);
|
|
|
|
+ return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
EXPORT_SYMBOL_GPL(dccp_make_response);
|
|
EXPORT_SYMBOL_GPL(dccp_make_response);
|