[PATCH 5/5] dccp: Header option insertion routine for feature-negotiation

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Gerrit Renker
Date: Saturday, November 22, 2008 - 3:30 am

The patch extends existing code:
 * Confirm options divide into the confirmed value plus an optional preference
   list for SP values. Previously only the preference list was echoed for SP
   values, now the confirmed value is added as per RFC 4340, 6.1;
 * length and sanity checks are added to avoid illegal memory (or NULL) access.

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Acked-by: Ian McDonald <ian.mcdonald@jandi.co.nz>
---
 net/dccp/feat.h    |    2 +
 net/dccp/options.c |   91 ++++++++++++++++++----------------------------------
 2 files changed, 33 insertions(+), 60 deletions(-)

--- a/net/dccp/feat.h
+++ b/net/dccp/feat.h
@@ -140,4 +140,6 @@ extern void dccp_encode_value_var(const u64 value, u8 *to, const u8 len);
 extern u64  dccp_decode_value_var(const u8 *bf, const u8 len);
 
 extern int  dccp_insert_option_mandatory(struct sk_buff *skb);
+extern int  dccp_insert_fn_opt(struct sk_buff *skb, u8 type, u8 feat,
+			       u8 *val, u8 len, bool repeat_first);
 #endif /* _DCCP_FEAT_H */
--- a/net/dccp/options.c
+++ b/net/dccp/options.c
@@ -482,23 +482,46 @@ int dccp_insert_option_mandatory(struct sk_buff *skb)
 	return 0;
 }
 
-static int dccp_insert_feat_opt(struct sk_buff *skb, u8 type, u8 feat,
-				u8 *val, u8 len)
+/**
+ * dccp_insert_fn_opt  -  Insert single Feature-Negotiation option into @skb
+ * @type: %DCCPO_CHANGE_L, %DCCPO_CHANGE_R, %DCCPO_CONFIRM_L, %DCCPO_CONFIRM_R
+ * @feat: one out of %dccp_feature_numbers
+ * @val: NN value or SP array (preferred element first) to copy
+ * @len: true length of @val in bytes (excluding first element repetition)
+ * @repeat_first: whether to copy the first element of @val twice
+ * The last argument is used to construct Confirm options, where the preferred
+ * value and the preference list appear separately (RFC 4340, 6.3.1). Preference
+ * lists are kept such that the preferred entry is always first, so we only need
+ * to copy twice, and avoid the overhead of cloning into a bigger array.
+ */
+int dccp_insert_fn_opt(struct sk_buff *skb, u8 type, u8 feat,
+		       u8 *val, u8 len, bool repeat_first)
 {
-	u8 *to;
+	u8 tot_len, *to;
 
-	if (DCCP_SKB_CB(skb)->dccpd_opt_len + len + 3 > DCCP_MAX_OPT_LEN) {
-		DCCP_WARN("packet too small for feature %d option!\n", feat);
+	/* take the `Feature' field and possible repetition into account */
+	if (len > (DCCP_SINGLE_OPT_MAXLEN - 2)) {
+		DCCP_WARN("length %u for feature %u too large\n", len, feat);
 		return -1;
 	}
 
-	DCCP_SKB_CB(skb)->dccpd_opt_len += len + 3;
+	if (unlikely(val == NULL || len == 0))
+		len = repeat_first = 0;
+	tot_len = 3 + repeat_first + len;
+
+	if (DCCP_SKB_CB(skb)->dccpd_opt_len + tot_len > DCCP_MAX_OPT_LEN) {
+		DCCP_WARN("packet too small for feature %d option!\n", feat);
+		return -1;
+	}
+	DCCP_SKB_CB(skb)->dccpd_opt_len += tot_len;
 
-	to    = skb_push(skb, len + 3);
+	to    = skb_push(skb, tot_len);
 	*to++ = type;
-	*to++ = len + 3;
+	*to++ = tot_len;
 	*to++ = feat;
 
+	if (repeat_first)
+		*to++ = *val;
 	if (len)
 		memcpy(to, val, len);
 
@@ -508,51 +531,6 @@ static int dccp_insert_feat_opt(struct sk_buff *skb, u8 type, u8 feat,
 	return 0;
 }
 
-static int dccp_insert_options_feat(struct sock *sk, struct sk_buff *skb)
-{
-	struct dccp_minisock *dmsk = dccp_msk(sk);
-	struct dccp_opt_pend *opt, *next;
-	int change = 0;
-
-	/* confirm any options [NN opts] */
-	list_for_each_entry_safe(opt, next, &dmsk->dccpms_conf, dccpop_node) {
-		dccp_insert_feat_opt(skb, opt->dccpop_type,
-				     opt->dccpop_feat, opt->dccpop_val,
-				     opt->dccpop_len);
-		/* fear empty confirms */
-		if (opt->dccpop_val)
-			kfree(opt->dccpop_val);
-		kfree(opt);
-	}
-	INIT_LIST_HEAD(&dmsk->dccpms_conf);
-
-	/* see which features we need to send */
-	list_for_each_entry(opt, &dmsk->dccpms_pending, dccpop_node) {
-		/* see if we need to send any confirm */
-		if (opt->dccpop_sc) {
-			dccp_insert_feat_opt(skb, opt->dccpop_type + 1,
-					     opt->dccpop_feat,
-					     opt->dccpop_sc->dccpoc_val,
-					     opt->dccpop_sc->dccpoc_len);
-
-			BUG_ON(!opt->dccpop_sc->dccpoc_val);
-			kfree(opt->dccpop_sc->dccpoc_val);
-			kfree(opt->dccpop_sc);
-			opt->dccpop_sc = NULL;
-		}
-
-		/* any option not confirmed, re-send it */
-		if (!opt->dccpop_conf) {
-			dccp_insert_feat_opt(skb, opt->dccpop_type,
-					     opt->dccpop_feat, opt->dccpop_val,
-					     opt->dccpop_len);
-			change++;
-		}
-	}
-
-	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)
 {
@@ -589,13 +567,6 @@ int dccp_insert_options(struct sock *sk, struct sk_buff *skb)
 		dp->dccps_hc_rx_insert_options = 0;
 	}
 
-	/* Feature negotiation */
-	/* Data packets can't do feat negotiation */
-	if (DCCP_SKB_CB(skb)->dccpd_type != DCCP_PKT_DATA &&
-	    DCCP_SKB_CB(skb)->dccpd_type != DCCP_PKT_DATAACK &&
-	    dccp_insert_options_feat(sk, skb))
-		return -1;
-
 	/*
 	 * Obtain RTT sample from Request/Response exchange.
 	 * This is currently used in CCID 3 initialisation.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 08/37] dccp: Query supported CCIDs, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 10/37] dccp: Mechanism to resolve CCID dependencies, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 11/37] dccp: Deprecate old setsockopt framework, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 13/37] dccp: Deprecate Ack Ratio sysctl, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 14/37] dccp: Tidy up setsockopt calls, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 16/37] dccp: API to query the current TX/RX CCID, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 18/37] dccp: Support for Mandatory options, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 22/37] dccp: Preference list reconciliation, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 24/37] dccp: Processing Confirm options, Gerrit Renker, (Thu Aug 28, 10:44 am)
[PATCH 25/37] dccp: Feature activation handlers, Gerrit Renker, (Thu Aug 28, 10:45 am)
Re: [PATCH 03/37] dccp: List management for new feature ne ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 12:43 pm)
Re: [PATCH 04/37] dccp: Per-socket initialisation of featu ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 12:53 pm)
Re: [PATCH 06/37] dccp: Limit feature negotiation to conne ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 1:50 pm)
Re: [PATCH 07/37] dccp: Registration routines for changing ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 1:54 pm)
Re: [PATCH 08/37] dccp: Query supported CCIDs, Arnaldo Carvalho de Melo, (Thu Aug 28, 2:00 pm)
Re: [PATCH 09/37] dccp: Resolve dependencies of features o ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 2:07 pm)
Re: [PATCH 12/37] dccp: Feature negotiation for minimum-ch ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 2:25 pm)
Re: [PATCH 13/37] dccp: Deprecate Ack Ratio sysctl, Arnaldo Carvalho de Melo, (Thu Aug 28, 2:26 pm)
Re: [PATCH 14/37] dccp: Tidy up setsockopt calls, Arnaldo Carvalho de Melo, (Thu Aug 28, 2:35 pm)
Re: [PATCH 15/37] dccp: Set per-connection CCIDs via socke ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 2:45 pm)
Re: [PATCH 16/37] dccp: API to query the current TX/RX CCID, Arnaldo Carvalho de Melo, (Thu Aug 28, 2:47 pm)
Re: [PATCH 17/37] dccp: Increase the scope of variable-len ..., Arnaldo Carvalho de Melo, (Thu Aug 28, 2:48 pm)
Re: [PATCH 18/37] dccp: Support for Mandatory options, Arnaldo Carvalho de Melo, (Thu Aug 28, 2:50 pm)
Re: [PATCH 08/37] dccp: Query supported CCIDs, Gerrit Renker, (Thu Aug 28, 11:17 pm)
Re: [PATCH 14/37] dccp: Tidy up setsockopt calls, Gerrit Renker, (Thu Aug 28, 11:57 pm)
Re: [PATCH 14/37] dccp: Tidy up setsockopt calls, Eugene Teo, (Fri Aug 29, 2:25 am)
Re: [PATCH 08/37] dccp: Query supported CCIDs, Gerrit Renker, (Sat Aug 30, 6:52 am)
Re: [PATCH 14/37] dccp: Tidy up setsockopt calls, Gerrit Renker, (Sat Aug 30, 6:52 am)
Re: [PATCH 0/37] --- Summary of revision changes so far, Gerrit Renker, (Sat Aug 30, 10:25 am)
Re: [PATCH 25/37] dccp: Feature activation handlers, Wei Yongjun, (Mon Sep 1, 11:34 pm)
Re: net-next-2.6 [pull-request] [PATCH 0/37] dccp: Revised ..., Arnaldo Carvalho de Melo, (Tue Sep 2, 6:50 am)
Re: [PATCH 25/37] dccp: Feature activation handlers, Gerrit Renker, (Tue Sep 2, 9:38 pm)
Re: [PATCH 25/37] dccp: Feature activation handlers, Wei Yongjun, (Tue Sep 2, 10:42 pm)
Re: [PATCH 09/37] dccp: Resolve dependencies of features o ..., Arnaldo Carvalho de Melo, (Wed Sep 3, 5:59 pm)
Re: [PATCH 25/37] dccp: Feature activation handlers, Gerrit Renker, (Wed Sep 3, 10:12 pm)
Re: What to do with DCCP, David Miller, (Wed Sep 10, 10:53 pm)
Re: net-next-2.6 [pull-request] [PATCH 0/37] dccp: Revised ..., Arnaldo Carvalho de Melo, (Thu Sep 11, 7:02 am)
Re: What to do with DCCP, Gerrit Renker, (Thu Sep 11, 10:16 pm)
[PATCH 5/5] dccp: Cleanup routines for feature negotiation, Gerrit Renker, (Mon Sep 22, 12:21 am)
Re: [PATCH 1/5] dccp: Basic data structure for feature neg ..., Arnaldo Carvalho de Melo, (Mon Sep 22, 7:10 am)
Re: [PATCH 2/5] dccp: Implement lookup table for feature-n ..., Arnaldo Carvalho de Melo, (Mon Sep 22, 7:21 am)
Re: [PATCH 2/5] dccp: Implement lookup table for feature-n ..., Arnaldo Carvalho de Melo, (Mon Sep 22, 9:49 am)
Re: [PATCH 2/5] dccp: Implement lookup table for feature-n ..., Arnaldo Carvalho de Melo, (Mon Sep 22, 10:00 am)
Re: [PATCH 2/5] dccp: Implement lookup table for feature-n ..., Arnaldo Carvalho de Melo, (Wed Sep 24, 6:58 am)
Re: v2 [PATCH 1/5] dccp: Basic data structure for feature ..., Arnaldo Carvalho de Melo, (Wed Sep 24, 6:59 am)
Re: v2 [PATCH 2/5] dccp: Implement lookup table for featur ..., Arnaldo Carvalho de Melo, (Wed Sep 24, 7:01 am)
[PATCH 3/4] dccp: Query supported CCIDs, Gerrit Renker, (Wed Nov 5, 10:40 pm)
Re: [PATCH 3/4] dccp: Query supported CCIDs, David Miller, (Mon Nov 10, 2:16 pm)
v2 [PATCH 3/4] dccp: Query supported CCIDs, Gerrit Renker, (Tue Nov 11, 11:37 pm)
Re: v2 [PATCH 3/4] dccp: Query supported CCIDs, David Miller, (Wed Nov 12, 1:49 am)
[PATCH 1/5] dccp: Mechanism to resolve CCID dependencies, Gerrit Renker, (Sat Nov 15, 5:11 am)
[PATCH 2/5] dccp: Deprecate old setsockopt framework, Gerrit Renker, (Sat Nov 15, 5:11 am)
[PATCH 4/5] dccp: Deprecate Ack Ratio sysctl, Gerrit Renker, (Sat Nov 15, 5:11 am)
[PATCH 5/5] dccp: Tidy up setsockopt calls, Gerrit Renker, (Sat Nov 15, 5:11 am)
Re: [PATCH 2/5] dccp: Deprecate old setsockopt framework, David Miller, (Sun Nov 16, 11:53 pm)
Re: [PATCH 4/5] dccp: Deprecate Ack Ratio sysctl, David Miller, (Sun Nov 16, 11:56 pm)
Re: [PATCH 5/5] dccp: Tidy up setsockopt calls, David Miller, (Sun Nov 16, 11:57 pm)
Re: [PATCH 2/5] dccp: Deprecate old setsockopt framework, Gerrit Renker, (Mon Nov 17, 8:31 am)
[PATCH 2/5] dccp: API to query the current TX/RX CCID, Gerrit Renker, (Sat Nov 22, 3:30 am)
[PATCH 4/5] dccp: Support for Mandatory options, Gerrit Renker, (Sat Nov 22, 3:30 am)
[PATCH 5/5] dccp: Header option insertion routine for feat ..., Gerrit Renker, (Sat Nov 22, 3:30 am)
Re: [PATCH 4/5] dccp: Support for Mandatory options, David Miller, (Sun Nov 23, 5:09 pm)
[PATCH 3/6] dccp: Preference list reconciliation, Gerrit Renker, (Sun Nov 30, 6:22 am)
[PATCH 5/6] dccp: Processing Confirm options, Gerrit Renker, (Sun Nov 30, 6:22 am)
[PATCH 6/6] dccp: Feature activation handlers, Gerrit Renker, (Sun Nov 30, 6:22 am)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Michał Mirosław, (Sat Dec 13, 6:55 am)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Michał Mirosław, (Sun Dec 14, 7:50 am)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Arnaldo Carvalho de Melo, (Mon Dec 15, 6:48 am)
Re: [PATCH 4/5] dccp: Initialisation and type-checking of ..., Arnaldo Carvalho de Melo, (Mon Dec 15, 7:15 am)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Arnaldo Carvalho de Melo, (Tue Dec 16, 4:19 am)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Michał Mirosław, (Tue Dec 16, 4:31 am)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Arnaldo Carvalho de Melo, (Tue Dec 16, 3:25 pm)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Arnaldo Carvalho de Melo, (Wed Dec 17, 6:13 am)
Re: [PATCH 2/5] dccp: Auto-load (when supported) CCID plug ..., Arnaldo Carvalho de Melo, (Thu Dec 18, 7:01 am)