[PATCH 11/37] dccp: Deprecate old setsockopt framework

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Gerrit Renker
Date: Thursday, August 28, 2008 - 10:44 am

The previous setsockopt interface, which passed socket options via struct
dccp_so_feat, is complicated/difficult to use. Continuing to support it leads to
ugly code since the old approach did not distinguish between NN and SP values.

This patch removes the old setsockopt interface and replaces it with two new
functions to register NN/SP values for feature negotiation. These are
essentially wrappers around the internal __feat_register functions, with
checking added to avoid
 * wrong usage (type);
 * changing values while the connection is in progress.

Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
---
 include/linux/dccp.h |    7 -----
 net/dccp/feat.c      |   72 ++++++++++++++++++-------------------------------
 net/dccp/feat.h      |    5 ++-
 net/dccp/proto.c     |   53 +-----------------------------------
 4 files changed, 32 insertions(+), 105 deletions(-)

--- a/include/linux/dccp.h
+++ b/include/linux/dccp.h
@@ -193,13 +193,6 @@ enum dccp_feature_numbers {
 	DCCPF_MAX_CCID_SPECIFIC = 255,
 };
 
-/* this structure is argument to DCCP_SOCKOPT_CHANGE_X */
-struct dccp_so_feat {
-	__u8 dccpsf_feat;
-	__u8 __user *dccpsf_val;
-	__u8 dccpsf_len;
-};
-
 /* DCCP socket options */
 #define DCCP_SOCKOPT_PACKET_SIZE	1 /* XXX deprecated, without effect */
 #define DCCP_SOCKOPT_SERVICE		2
--- a/net/dccp/feat.c
+++ b/net/dccp/feat.c
@@ -390,53 +390,35 @@ static int __feat_register_sp(struct list_head *fn, u8 feat, u8 is_local,
 	return dccp_feat_push_change(fn, feat, is_local, mandatory, &fval);
 }
 
-int dccp_feat_change(struct dccp_minisock *dmsk, u8 type, u8 feature,
-		     u8 *val, u8 len, gfp_t gfp)
-{
-	struct dccp_opt_pend *opt;
-
-	dccp_feat_debug(type, feature, *val);
-
-	if (len > 3) {
-		DCCP_WARN("invalid length %d\n", len);
+/**
+ * dccp_feat_register_sp  -  Register requests to change SP feature values
+ * @sk: client or listening socket
+ * @feat: one of %dccp_feature_numbers
+ * @is_local: whether the local (1) or remote (0) @feat is meant
+ * @list: array of preferred values, in descending order of preference
+ * @len: length of @list in bytes
+ */
+int dccp_feat_register_sp(struct sock *sk, u8 feat, u8 is_local,
+			  u8 const *list, u8 len)
+{	 /* any changes must be registered before establishing the connection */
+	if (sk->sk_state != DCCP_CLOSED)
+		return -EISCONN;
+	if (dccp_feat_type(feat) != FEAT_SP)
 		return -EINVAL;
-	}
-	/* XXX add further sanity checks */
-
-	/* check if that feature is already being negotiated */
-	list_for_each_entry(opt, &dmsk->dccpms_pending, dccpop_node) {
-		/* ok we found a negotiation for this option already */
-		if (opt->dccpop_feat == feature && opt->dccpop_type == type) {
-			dccp_pr_debug("Replacing old\n");
-			/* replace */
-			BUG_ON(opt->dccpop_val == NULL);
-			kfree(opt->dccpop_val);
-			opt->dccpop_val	 = val;
-			opt->dccpop_len	 = len;
-			opt->dccpop_conf = 0;
-			return 0;
-		}
-	}
-
-	/* negotiation for a new feature */
-	opt = kmalloc(sizeof(*opt), gfp);
-	if (opt == NULL)
-		return -ENOMEM;
-
-	opt->dccpop_type = type;
-	opt->dccpop_feat = feature;
-	opt->dccpop_len	 = len;
-	opt->dccpop_val	 = val;
-	opt->dccpop_conf = 0;
-	opt->dccpop_sc	 = NULL;
-
-	BUG_ON(opt->dccpop_val == NULL);
-
-	list_add_tail(&opt->dccpop_node, &dmsk->dccpms_pending);
-	return 0;
+	return __feat_register_sp(&dccp_sk(sk)->dccps_featneg, feat, is_local,
+				  0, list, len);
 }
 
-EXPORT_SYMBOL_GPL(dccp_feat_change);
+/* Analogous to dccp_feat_register_sp(), but for non-negotiable values */
+int dccp_feat_register_nn(struct sock *sk, u8 feat, u64 val)
+{
+	/* any changes must be registered before establishing the connection */
+	if (sk->sk_state != DCCP_CLOSED)
+		return -EISCONN;
+	if (dccp_feat_type(feat) != FEAT_NN)
+		return -EINVAL;
+	return __feat_register_nn(&dccp_sk(sk)->dccps_featneg, feat, 0, val);
+}
 
 /*
  *	Tracking features whose value depend on the choice of CCID
@@ -1134,7 +1116,7 @@ int dccp_feat_init(struct sock *sk)
 
 	/* Ack ratio */
 	rc = __feat_register_nn(&dp->dccps_featneg, DCCPF_ACK_RATIO, 0,
-				dmsk->dccpms_ack_ratio);
+				dp->dccps_l_ack_ratio);
 out:
 	return rc;
 }
--- a/net/dccp/feat.h
+++ b/net/dccp/feat.h
@@ -110,8 +110,9 @@ static inline void dccp_feat_debug(const u8 type, const u8 feat, const u8 val)
 #define dccp_feat_debug(type, feat, val)
 #endif /* CONFIG_IP_DCCP_DEBUG */
 
-extern int  dccp_feat_change(struct dccp_minisock *dmsk, u8 type, u8 feature,
-			     u8 *val, u8 len, gfp_t gfp);
+extern int  dccp_feat_register_sp(struct sock *sk, u8 feat, u8 is_local,
+				  u8 const *list, u8 len);
+extern int  dccp_feat_register_nn(struct sock *sk, u8 feat, u64 val);
 extern int  dccp_feat_change_recv(struct sock *sk, u8 type, u8 feature,
 				  u8 *val, u8 len);
 extern int  dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature,
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -470,44 +470,6 @@ static int dccp_setsockopt_service(struct sock *sk, const __be32 service,
 	return 0;
 }
 
-/* byte 1 is feature.  the rest is the preference list */
-static int dccp_setsockopt_change(struct sock *sk, int type,
-				  struct dccp_so_feat __user *optval)
-{
-	struct dccp_so_feat opt;
-	u8 *val;
-	int rc;
-
-	if (copy_from_user(&opt, optval, sizeof(opt)))
-		return -EFAULT;
-	/*
-	 * rfc4340: 6.1. Change Options
-	 */
-	if (opt.dccpsf_len < 1)
-		return -EINVAL;
-
-	val = kmalloc(opt.dccpsf_len, GFP_KERNEL);
-	if (!val)
-		return -ENOMEM;
-
-	if (copy_from_user(val, opt.dccpsf_val, opt.dccpsf_len)) {
-		rc = -EFAULT;
-		goto out_free_val;
-	}
-
-	rc = dccp_feat_change(dccp_msk(sk), type, opt.dccpsf_feat,
-			      val, opt.dccpsf_len, GFP_KERNEL);
-	if (rc)
-		goto out_free_val;
-
-out:
-	return rc;
-
-out_free_val:
-	kfree(val);
-	goto out;
-}
-
 static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
 		char __user *optval, int optlen)
 {
@@ -530,20 +492,9 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
 		err = 0;
 		break;
 	case DCCP_SOCKOPT_CHANGE_L:
-		if (optlen != sizeof(struct dccp_so_feat))
-			err = -EINVAL;
-		else
-			err = dccp_setsockopt_change(sk, DCCPO_CHANGE_L,
-						     (struct dccp_so_feat __user *)
-						     optval);
-		break;
 	case DCCP_SOCKOPT_CHANGE_R:
-		if (optlen != sizeof(struct dccp_so_feat))
-			err = -EINVAL;
-		else
-			err = dccp_setsockopt_change(sk, DCCPO_CHANGE_R,
-						     (struct dccp_so_feat __user *)
-						     optval);
+		DCCP_WARN("sockopt(CHANGE_L/R) is deprecated: fix your app\n");
+		err = 0;
 		break;
 	case DCCP_SOCKOPT_SERVER_TIMEWAIT:
 		if (dp->dccps_role != DCCP_ROLE_SERVER)
-- 
1.6.0.rc2

--
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)