[PATCH 5/6] dccp: Processing Confirm options

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

Analogous to the previous patch, this adds code to interpret incoming Confirm
feature-negotiation options. Both functions operate on the feature-negotiation
list of either the request_sock (server) or the dccp_sock (client).

Thanks to Wei Yongjun for pointing out that it is overly restrictive to check
the entire list of confirmed SP values.

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/feat.c    |  100 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 net/dccp/options.c |   16 +-------
 3 files changed, 101 insertions(+), 17 deletions(-)

--- a/net/dccp/feat.h
+++ b/net/dccp/feat.h
@@ -118,8 +118,6 @@ extern int  dccp_feat_register_sp(struct sock *sk, u8 feat, u8 is_local,
 extern int  dccp_feat_register_nn(struct sock *sk, u8 feat, u64 val);
 extern int  dccp_feat_parse_options(struct sock *, struct dccp_request_sock *,
 				    u8 mand, u8 opt, u8 feat, u8 *val, u8 len);
-extern int  dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature,
-				   u8 *val, u8 len);
 extern void dccp_feat_clean(struct dccp_minisock *dmsk);
 extern int  dccp_feat_clone(struct sock *oldsk, struct sock *newsk);
 extern int  dccp_feat_clone_list(struct list_head const *, struct list_head *);
--- a/net/dccp/feat.c
+++ b/net/dccp/feat.c
@@ -104,6 +104,13 @@ static int dccp_feat_default_value(u8 feat_num)
 	return idx < 0 ? 0 : dccp_feat_table[idx].default_value;
 }
 
+/* Test for "Req'd" feature (RFC 4340, 6.4) */
+static inline int dccp_feat_must_be_understood(u8 feat_num)
+{
+	return	feat_num == DCCPF_CCID || feat_num == DCCPF_SHORT_SEQNOS ||
+		feat_num == DCCPF_SEQUENCE_WINDOW;
+}
+
 /* copy constructor, fval must not already contain allocated memory */
 static int dccp_feat_clone_sp_val(dccp_feat_val *fval, u8 const *val, u8 len)
 {
@@ -1099,7 +1106,6 @@ int dccp_feat_change_recv(struct sock *sk, u8 type, u8 feature, u8 *val, u8 len)
 }
 
 EXPORT_SYMBOL_GPL(dccp_feat_change_recv);
-#endif	/* (later) */
 
 int dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature,
 			   u8 *val, u8 len)
@@ -1154,6 +1160,7 @@ int dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature,
 }
 
 EXPORT_SYMBOL_GPL(dccp_feat_confirm_recv);
+#endif	/* (later) */
 
 void dccp_feat_clean(struct dccp_minisock *dmsk)
 {
@@ -1350,6 +1357,93 @@ not_valid_or_not_known:
 }
 
 /**
+ * dccp_feat_confirm_recv  -  Process received Confirm options
+ * @fn: feature-negotiation list to update
+ * @is_mandatory: whether @opt was preceded by a Mandatory option
+ * @opt: %DCCPO_CONFIRM_L or %DCCPO_CONFIRM_R
+ * @feat: one of %dccp_feature_numbers
+ * @val: NN value or SP value/preference list
+ * @len: length of @val in bytes
+ * @server: whether this node is server (1) or client (0)
+ */
+static u8 dccp_feat_confirm_recv(struct list_head *fn, u8 is_mandatory, u8 opt,
+				 u8 feat, u8 *val, u8 len, const bool server)
+{
+	u8 *plist, plen, type = dccp_feat_type(feat);
+	const bool local = (opt == DCCPO_CONFIRM_R);
+	struct dccp_feat_entry *entry = dccp_feat_list_lookup(fn, feat, local);
+
+	if (entry == NULL) {	/* nothing queued: ignore or handle error */
+		if (is_mandatory && type == FEAT_UNKNOWN)
+			return DCCP_RESET_CODE_MANDATORY_ERROR;
+
+		if (!local && type == FEAT_NN)		/* 6.3.2 */
+			goto confirmation_failed;
+		return 0;
+	}
+
+	if (entry->state != FEAT_CHANGING)		/* 6.6.2 */
+		return 0;
+
+	if (len == 0) {
+		if (dccp_feat_must_be_understood(feat))	/* 6.6.7 */
+			goto confirmation_failed;
+		/*
+		 * Empty Confirm during connection setup: this means reverting
+		 * to the `old' value, which in this case is the default. Since
+		 * we handle default values automatically when no other values
+		 * have been set, we revert to the old value by removing this
+		 * entry from the list.
+		 */
+		dccp_feat_list_pop(entry);
+		return 0;
+	}
+
+	if (type == FEAT_NN) {
+		if (len > sizeof(entry->val.nn))
+			goto confirmation_failed;
+
+		if (entry->val.nn == dccp_decode_value_var(val, len))
+			goto confirmation_succeeded;
+
+		DCCP_WARN("Bogus Confirm for non-existing value\n");
+		goto confirmation_failed;
+	}
+
+	/*
+	 * Parsing SP Confirms: the first element of @val is the preferred
+	 * SP value which the peer confirms, the remainder depends on @len.
+	 * Note that only the confirmed value need to be a valid SP value.
+	 */
+	if (!dccp_feat_is_valid_sp_val(feat, *val))
+		goto confirmation_failed;
+
+	if (len == 1) {		/* peer didn't supply a preference list */
+		plist = val;
+		plen  = len;
+	} else {		/* preferred value + preference list */
+		plist = val + 1;
+		plen  = len - 1;
+	}
+
+	/* Check whether the peer got the reconciliation right (6.6.8) */
+	if (dccp_feat_reconcile(&entry->val, plist, plen, server, 0) != *val) {
+		DCCP_WARN("Confirm selected the wrong value %u\n", *val);
+		return DCCP_RESET_CODE_OPTION_ERROR;
+	}
+	entry->val.sp.vec[0] = *val;
+
+confirmation_succeeded:
+	entry->state = FEAT_STABLE;
+	return 0;
+
+confirmation_failed:
+	DCCP_WARN("Confirmation failed\n");
+	return is_mandatory ? DCCP_RESET_CODE_MANDATORY_ERROR
+			    : DCCP_RESET_CODE_OPTION_ERROR;
+}
+
+/**
  * dccp_feat_parse_options  -  Process Feature-Negotiation Options
  * @sk: for general use and used by the client during connection setup
  * @dreq: used by the server during connection setup
@@ -1379,6 +1473,10 @@ int dccp_feat_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
 		case DCCPO_CHANGE_R:
 			return dccp_feat_change_recv(fn, mandatory, opt, feat,
 						     val, len, server);
+		case DCCPO_CONFIRM_R:
+		case DCCPO_CONFIRM_L:
+			return dccp_feat_confirm_recv(fn, mandatory, opt, feat,
+						      val, len, server);
 		}
 	}
 	return 0;	/* ignore FN options in all other states */
--- a/net/dccp/options.c
+++ b/net/dccp/options.c
@@ -134,26 +134,14 @@ int dccp_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
 			dccp_pr_debug("%s opt: NDP count=%llu\n", dccp_role(sk),
 				      (unsigned long long)opt_recv->dccpor_ndp);
 			break;
-		case DCCPO_CHANGE_L:
-		case DCCPO_CHANGE_R:
-			if (pkt_type == DCCP_PKT_DATA)
+		case DCCPO_CHANGE_L ... DCCPO_CONFIRM_R:
+			if (pkt_type == DCCP_PKT_DATA)      /* RFC 4340, 6 */
 				break;
 			rc = dccp_feat_parse_options(sk, dreq, mandatory, opt,
 						    *value, value + 1, len - 1);
 			if (rc)
 				goto out_featneg_failed;
 			break;
-		case DCCPO_CONFIRM_L:
-			/* fall through */
-		case DCCPO_CONFIRM_R:
-			if (pkt_type == DCCP_PKT_DATA)
-				break;
-			if (len < 2)	/* FIXME this disallows empty confirm */
-				goto out_invalid_option;
-			if (dccp_feat_confirm_recv(sk, opt, *value,
-						   value + 1, len - 1))
-				goto out_invalid_option;
-			break;
 		case DCCPO_ACK_VECTOR_0:
 		case DCCPO_ACK_VECTOR_1:
 			if (dccp_packet_without_ack(skb))   /* RFC 4340, 11.4 */
--
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)
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)