summaryrefslogtreecommitdiffstats
path: root/net/dccp/feat.c
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@mandriva.com>2006-03-20 22:51:53 -0800
committerDavid S. Miller <davem@davemloft.net>2006-03-20 22:51:53 -0800
commit8ca0d17bd716c0aa3f496714e0e304fc6b982ae3 (patch)
treea1e3881117aa4b687bacace28c794e7cc3522827 /net/dccp/feat.c
parenta4bf3902427a128455b8de299ff0918072b2e974 (diff)
downloadlinux-8ca0d17bd716c0aa3f496714e0e304fc6b982ae3.tar.bz2
[DCCP] feat: Pass dccp_minisock ptr where only the minisock is used
This is in preparation for having a dccp_minisock embedded into dccp_request_sock so that feature negotiation can be done prior to creating the full blown dccp_sock. Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/dccp/feat.c')
-rw-r--r--net/dccp/feat.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/net/dccp/feat.c b/net/dccp/feat.c
index b09064c4643d..e3dd30d36c8a 100644
--- a/net/dccp/feat.c
+++ b/net/dccp/feat.c
@@ -19,10 +19,9 @@
#define DCCP_FEAT_SP_NOAGREE (-123)
-int dccp_feat_change(struct sock *sk, u8 type, u8 feature, u8 *val, u8 len,
- gfp_t gfp)
+int dccp_feat_change(struct dccp_minisock *dmsk, u8 type, u8 feature,
+ u8 *val, u8 len, gfp_t gfp)
{
- struct dccp_minisock *dmsk = dccp_msk(sk);
struct dccp_opt_pend *opt;
dccp_pr_debug("feat change type=%d feat=%d\n", type, feature);
@@ -307,9 +306,9 @@ static int dccp_feat_nn(struct sock *sk, u8 type, u8 feature, u8 *val, u8 len)
return 0;
}
-static void dccp_feat_empty_confirm(struct sock *sk, u8 type, u8 feature)
+static void dccp_feat_empty_confirm(struct dccp_minisock *dmsk,
+ u8 type, u8 feature)
{
- struct dccp_minisock *dmsk = dccp_msk(sk);
/* XXX check if other confirms for that are queued and recycle slot */
struct dccp_opt_pend *opt = kzalloc(sizeof(*opt), GFP_ATOMIC);
@@ -388,7 +387,7 @@ int dccp_feat_change_recv(struct sock *sk, u8 type, u8 feature, u8 *val, u8 len)
* mandatory
*/
if (rc != DCCP_FEAT_SP_NOAGREE)
- dccp_feat_empty_confirm(sk, type, feature);
+ dccp_feat_empty_confirm(dccp_msk(sk), type, feature);
}
/* generate the confirm [if required] */
@@ -456,9 +455,8 @@ int dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature,
EXPORT_SYMBOL_GPL(dccp_feat_confirm_recv);
-void dccp_feat_clean(struct sock *sk)
+void dccp_feat_clean(struct dccp_minisock *dmsk)
{
- struct dccp_minisock *dmsk = dccp_msk(sk);
struct dccp_opt_pend *opt, *next;
list_for_each_entry_safe(opt, next, &dmsk->dccpms_pending,
@@ -537,49 +535,49 @@ out:
return rc;
out_clean:
- dccp_feat_clean(newsk);
+ dccp_feat_clean(newdmsk);
rc = -ENOMEM;
goto out;
}
EXPORT_SYMBOL_GPL(dccp_feat_clone);
-static int __dccp_feat_init(struct sock *sk, u8 type, u8 feat, u8 *val, u8 len)
+static int __dccp_feat_init(struct dccp_minisock *dmsk, u8 type, u8 feat,
+ u8 *val, u8 len)
{
int rc = -ENOMEM;
u8 *copy = kmalloc(len, GFP_KERNEL);
if (copy != NULL) {
memcpy(copy, val, len);
- rc = dccp_feat_change(sk, type, feat, copy, len, GFP_KERNEL);
+ rc = dccp_feat_change(dmsk, type, feat, copy, len, GFP_KERNEL);
if (rc)
kfree(copy);
}
return rc;
}
-int dccp_feat_init(struct sock *sk)
+int dccp_feat_init(struct dccp_minisock *dmsk)
{
- struct dccp_minisock *dmsk = dccp_msk(sk);
int rc;
INIT_LIST_HEAD(&dmsk->dccpms_pending);
INIT_LIST_HEAD(&dmsk->dccpms_conf);
/* CCID L */
- rc = __dccp_feat_init(sk, DCCPO_CHANGE_L, DCCPF_CCID,
+ rc = __dccp_feat_init(dmsk, DCCPO_CHANGE_L, DCCPF_CCID,
&dmsk->dccpms_tx_ccid, 1);
if (rc)
goto out;
/* CCID R */
- rc = __dccp_feat_init(sk, DCCPO_CHANGE_R, DCCPF_CCID,
+ rc = __dccp_feat_init(dmsk, DCCPO_CHANGE_R, DCCPF_CCID,
&dmsk->dccpms_rx_ccid, 1);
if (rc)
goto out;
/* Ack ratio */
- rc = __dccp_feat_init(sk, DCCPO_CHANGE_L, DCCPF_ACK_RATIO,
+ rc = __dccp_feat_init(dmsk, DCCPO_CHANGE_L, DCCPF_ACK_RATIO,
&dmsk->dccpms_ack_ratio, 1);
out:
return rc;