Commit 8ca0d17b authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller

[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: default avatarArnaldo Carvalho de Melo <acme@mandriva.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a4bf3902
...@@ -19,10 +19,9 @@ ...@@ -19,10 +19,9 @@
#define DCCP_FEAT_SP_NOAGREE (-123) #define DCCP_FEAT_SP_NOAGREE (-123)
int dccp_feat_change(struct sock *sk, u8 type, u8 feature, u8 *val, u8 len, int dccp_feat_change(struct dccp_minisock *dmsk, u8 type, u8 feature,
gfp_t gfp) u8 *val, u8 len, gfp_t gfp)
{ {
struct dccp_minisock *dmsk = dccp_msk(sk);
struct dccp_opt_pend *opt; struct dccp_opt_pend *opt;
dccp_pr_debug("feat change type=%d feat=%d\n", type, feature); 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) ...@@ -307,9 +306,9 @@ static int dccp_feat_nn(struct sock *sk, u8 type, u8 feature, u8 *val, u8 len)
return 0; 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 */ /* XXX check if other confirms for that are queued and recycle slot */
struct dccp_opt_pend *opt = kzalloc(sizeof(*opt), GFP_ATOMIC); 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) ...@@ -388,7 +387,7 @@ int dccp_feat_change_recv(struct sock *sk, u8 type, u8 feature, u8 *val, u8 len)
* mandatory * mandatory
*/ */
if (rc != DCCP_FEAT_SP_NOAGREE) 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] */ /* generate the confirm [if required] */
...@@ -456,9 +455,8 @@ int dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature, ...@@ -456,9 +455,8 @@ int dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature,
EXPORT_SYMBOL_GPL(dccp_feat_confirm_recv); 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; struct dccp_opt_pend *opt, *next;
list_for_each_entry_safe(opt, next, &dmsk->dccpms_pending, list_for_each_entry_safe(opt, next, &dmsk->dccpms_pending,
...@@ -537,49 +535,49 @@ int dccp_feat_clone(struct sock *oldsk, struct sock *newsk) ...@@ -537,49 +535,49 @@ int dccp_feat_clone(struct sock *oldsk, struct sock *newsk)
return rc; return rc;
out_clean: out_clean:
dccp_feat_clean(newsk); dccp_feat_clean(newdmsk);
rc = -ENOMEM; rc = -ENOMEM;
goto out; goto out;
} }
EXPORT_SYMBOL_GPL(dccp_feat_clone); 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; int rc = -ENOMEM;
u8 *copy = kmalloc(len, GFP_KERNEL); u8 *copy = kmalloc(len, GFP_KERNEL);
if (copy != NULL) { if (copy != NULL) {
memcpy(copy, val, len); 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) if (rc)
kfree(copy); kfree(copy);
} }
return rc; 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; int rc;
INIT_LIST_HEAD(&dmsk->dccpms_pending); INIT_LIST_HEAD(&dmsk->dccpms_pending);
INIT_LIST_HEAD(&dmsk->dccpms_conf); INIT_LIST_HEAD(&dmsk->dccpms_conf);
/* CCID L */ /* 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); &dmsk->dccpms_tx_ccid, 1);
if (rc) if (rc)
goto out; goto out;
/* CCID R */ /* 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); &dmsk->dccpms_rx_ccid, 1);
if (rc) if (rc)
goto out; goto out;
/* Ack ratio */ /* 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); &dmsk->dccpms_ack_ratio, 1);
out: out:
return rc; return rc;
......
...@@ -14,15 +14,16 @@ ...@@ -14,15 +14,16 @@
#include <linux/types.h> #include <linux/types.h>
struct sock; struct sock;
struct dccp_minisock;
extern int dccp_feat_change(struct sock *sk, u8 type, u8 feature, extern int dccp_feat_change(struct dccp_minisock *dmsk, u8 type, u8 feature,
u8 *val, u8 len, gfp_t gfp); u8 *val, u8 len, gfp_t gfp);
extern int dccp_feat_change_recv(struct sock *sk, u8 type, u8 feature, extern int dccp_feat_change_recv(struct sock *sk, u8 type, u8 feature,
u8 *val, u8 len); u8 *val, u8 len);
extern int dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature, extern int dccp_feat_confirm_recv(struct sock *sk, u8 type, u8 feature,
u8 *val, u8 len); u8 *val, u8 len);
extern void dccp_feat_clean(struct sock *sk); 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(struct sock *oldsk, struct sock *newsk);
extern int dccp_feat_init(struct sock *sk); extern int dccp_feat_init(struct dccp_minisock *dmsk);
#endif /* _DCCP_FEAT_H */ #endif /* _DCCP_FEAT_H */
...@@ -180,7 +180,7 @@ int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized) ...@@ -180,7 +180,7 @@ int dccp_init_sock(struct sock *sk, const __u8 ctl_sock_initialized)
* setsockopt(CCIDs-I-want/accept). -acme * setsockopt(CCIDs-I-want/accept). -acme
*/ */
if (likely(ctl_sock_initialized)) { if (likely(ctl_sock_initialized)) {
int rc = dccp_feat_init(sk); int rc = dccp_feat_init(dmsk);
if (rc) if (rc)
return rc; return rc;
...@@ -229,6 +229,7 @@ EXPORT_SYMBOL_GPL(dccp_init_sock); ...@@ -229,6 +229,7 @@ EXPORT_SYMBOL_GPL(dccp_init_sock);
int dccp_destroy_sock(struct sock *sk) int dccp_destroy_sock(struct sock *sk)
{ {
struct dccp_sock *dp = dccp_sk(sk); struct dccp_sock *dp = dccp_sk(sk);
struct dccp_minisock *dmsk = dccp_msk(sk);
/* /*
* DCCP doesn't use sk_write_queue, just sk_send_head * DCCP doesn't use sk_write_queue, just sk_send_head
...@@ -246,7 +247,7 @@ int dccp_destroy_sock(struct sock *sk) ...@@ -246,7 +247,7 @@ int dccp_destroy_sock(struct sock *sk)
kfree(dp->dccps_service_list); kfree(dp->dccps_service_list);
dp->dccps_service_list = NULL; dp->dccps_service_list = NULL;
if (dccp_msk(sk)->dccpms_send_ack_vector) { if (dmsk->dccpms_send_ack_vector) {
dccp_ackvec_free(dp->dccps_hc_rx_ackvec); dccp_ackvec_free(dp->dccps_hc_rx_ackvec);
dp->dccps_hc_rx_ackvec = NULL; dp->dccps_hc_rx_ackvec = NULL;
} }
...@@ -255,7 +256,7 @@ int dccp_destroy_sock(struct sock *sk) ...@@ -255,7 +256,7 @@ int dccp_destroy_sock(struct sock *sk)
dp->dccps_hc_rx_ccid = dp->dccps_hc_tx_ccid = NULL; dp->dccps_hc_rx_ccid = dp->dccps_hc_tx_ccid = NULL;
/* clean up feature negotiation state */ /* clean up feature negotiation state */
dccp_feat_clean(sk); dccp_feat_clean(dmsk);
return 0; return 0;
} }
...@@ -441,8 +442,8 @@ static int dccp_setsockopt_change(struct sock *sk, int type, ...@@ -441,8 +442,8 @@ static int dccp_setsockopt_change(struct sock *sk, int type,
goto out_free_val; goto out_free_val;
} }
rc = dccp_feat_change(sk, type, opt.dccpsf_feat, val, opt.dccpsf_len, rc = dccp_feat_change(dccp_msk(sk), type, opt.dccpsf_feat,
GFP_KERNEL); val, opt.dccpsf_len, GFP_KERNEL);
if (rc) if (rc)
goto out_free_val; goto out_free_val;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment