From: Vlad Yasevich <vyasevich@gmail.com>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: David Miller <davem@davemloft.net>,
linux-sctp@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Jan Ariyasu <jan.ariyasu@hp.com>,
Jan Ariyasu <jan.ariyasu@gmail.com>,
Neil Horman <nhorman@tuxdriver.com>,
Thomas Graf <tgraf@infradead.org>, Xi Wang <xi.wang@gmail.com>
Subject: Re: [PATCH net-next 5/9] sctp: Make the ctl_sock per network namespace
Date: Wed, 15 Aug 2012 03:19:29 +0000 [thread overview]
Message-ID: <502B1541.2070200@gmail.com> (raw)
In-Reply-To: <877gtbq2th.fsf_-_@xmission.com>
On 08/06/2012 02:43 PM, Eric W. Biederman wrote:
>
> - Kill sctp_get_ctl_sock, it is useless now.
> - Pass struct net where needed so net->sctp.ctl_sock is accessible.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
> ---
> include/net/netns/sctp.h | 8 +++++++
> include/net/sctp/sctp.h | 1 -
> net/sctp/input.c | 4 +-
> net/sctp/protocol.c | 47 ++++++++++++++++++---------------------------
> net/sctp/sm_statefuns.c | 45 ++++++++++++++++++++++++++++++-------------
> 5 files changed, 60 insertions(+), 45 deletions(-)
>
> diff --git a/include/net/netns/sctp.h b/include/net/netns/sctp.h
> index cbd684e..29e36b4 100644
> --- a/include/net/netns/sctp.h
> +++ b/include/net/netns/sctp.h
> @@ -1,7 +1,15 @@
> #ifndef __NETNS_SCTP_H__
> #define __NETNS_SCTP_H__
>
> +struct sock;
> +
> struct netns_sctp {
> + /* This is the global socket data structure used for responding to
> + * the Out-of-the-blue (OOTB) packets. A control sock will be created
> + * for this socket at the initialization time.
> + */
> + struct sock *ctl_sock;
> +
> /* This is the global local address list.
> * We actively maintain this complete list of addresses on
> * the system by catching address add/delete events.
> diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
> index 00c9205..550a81b 100644
> --- a/include/net/sctp/sctp.h
> +++ b/include/net/sctp/sctp.h
> @@ -114,7 +114,6 @@
> /*
> * sctp/protocol.c
> */
> -extern struct sock *sctp_get_ctl_sock(void);
> extern int sctp_copy_local_addr_list(struct net *, struct sctp_bind_addr *,
> sctp_scope_t, gfp_t gfp,
> int flags);
> diff --git a/net/sctp/input.c b/net/sctp/input.c
> index a7e9a85..c9a0449 100644
> --- a/net/sctp/input.c
> +++ b/net/sctp/input.c
> @@ -204,7 +204,7 @@ int sctp_rcv(struct sk_buff *skb)
> sctp_endpoint_put(ep);
> ep = NULL;
> }
> - sk = sctp_get_ctl_sock();
> + sk = net->sctp.ctl_sock;
> ep = sctp_sk(sk)->ep;
> sctp_endpoint_hold(ep);
> rcvr = &ep->base;
> @@ -795,7 +795,7 @@ static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(struct net *net,
> goto hit;
> }
>
> - ep = sctp_sk((sctp_get_ctl_sock()))->ep;
> + ep = sctp_sk(net->sctp.ctl_sock)->ep;
>
> hit:
> sctp_endpoint_hold(ep);
> diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
> index 291e682..6193d20 100644
> --- a/net/sctp/protocol.c
> +++ b/net/sctp/protocol.c
> @@ -78,12 +78,6 @@ struct proc_dir_entry *proc_net_sctp;
> struct idr sctp_assocs_id;
> DEFINE_SPINLOCK(sctp_assocs_id_lock);
>
> -/* This is the global socket data structure used for responding to
> - * the Out-of-the-blue (OOTB) packets. A control sock will be created
> - * for this socket at the initialization time.
> - */
> -static struct sock *sctp_ctl_sock;
> -
> static struct sctp_pf *sctp_pf_inet6_specific;
> static struct sctp_pf *sctp_pf_inet_specific;
> static struct sctp_af *sctp_af_v4_specific;
> @@ -96,12 +90,6 @@ long sysctl_sctp_mem[3];
> int sysctl_sctp_rmem[3];
> int sysctl_sctp_wmem[3];
>
> -/* Return the address of the control sock. */
> -struct sock *sctp_get_ctl_sock(void)
> -{
> - return sctp_ctl_sock;
> -}
> -
> /* Set up the proc fs entry for the SCTP protocol. */
> static __init int sctp_proc_init(void)
> {
> @@ -822,7 +810,7 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
> * Initialize the control inode/socket with a control endpoint data
> * structure. This endpoint is reserved exclusively for the OOTB processing.
> */
> -static int sctp_ctl_sock_init(void)
> +static int sctp_ctl_sock_init(struct net *net)
> {
> int err;
> sa_family_t family = PF_INET;
> @@ -830,14 +818,14 @@ static int sctp_ctl_sock_init(void)
> if (sctp_get_pf_specific(PF_INET6))
> family = PF_INET6;
>
> - err = inet_ctl_sock_create(&sctp_ctl_sock, family,
> - SOCK_SEQPACKET, IPPROTO_SCTP, &init_net);
> + err = inet_ctl_sock_create(&net->sctp.ctl_sock, family,
> + SOCK_SEQPACKET, IPPROTO_SCTP, net);
>
> /* If IPv6 socket could not be created, try the IPv4 socket */
> if (err < 0 && family = PF_INET6)
> - err = inet_ctl_sock_create(&sctp_ctl_sock, AF_INET,
> + err = inet_ctl_sock_create(&net->sctp.ctl_sock, AF_INET,
> SOCK_SEQPACKET, IPPROTO_SCTP,
> - &init_net);
> + net);
>
> if (err < 0) {
> pr_err("Failed to create the SCTP control socket\n");
> @@ -1196,6 +1184,14 @@ static void sctp_v4_del_protocol(void)
>
> static int sctp_net_init(struct net *net)
> {
> + int status;
> +
> + /* Initialize the control inode/socket for handling OOTB packets. */
> + if ((status = sctp_ctl_sock_init(net))) {
> + pr_err("Failed to initialize the SCTP control sock\n");
> + goto err_ctl_sock_init;
> + }
> +
> /* Initialize the local address list. */
> INIT_LIST_HEAD(&net->sctp.local_addr_list);
> spin_lock_init(&net->sctp.local_addr_lock);
> @@ -1210,6 +1206,9 @@ static int sctp_net_init(struct net *net)
> (unsigned long)net);
>
> return 0;
> +
> +err_ctl_sock_init:
> + return status;
> }
>
> static void sctp_net_exit(struct net *net)
> @@ -1217,6 +1216,9 @@ static void sctp_net_exit(struct net *net)
> /* Free the local address list */
> sctp_free_addr_wq(net);
> sctp_free_local_addr_list(net);
> +
> + /* Free the control endpoint. */
> + inet_ctl_sock_destroy(net->sctp.ctl_sock);
> }
>
> static struct pernet_operations sctp_net_ops = {
> @@ -1438,12 +1440,6 @@ SCTP_STATIC __init int sctp_init(void)
> if (status)
> goto err_v6_protosw_init;
>
> - /* Initialize the control inode/socket for handling OOTB packets. */
> - if ((status = sctp_ctl_sock_init())) {
> - pr_err("Failed to initialize the SCTP control sock\n");
> - goto err_ctl_sock_init;
> - }
> -
> status = register_pernet_subsys(&sctp_net_ops);
> if (status)
> goto err_register_pernet_subsys;
> @@ -1465,8 +1461,6 @@ err_v6_add_protocol:
> err_add_protocol:
> unregister_pernet_subsys(&sctp_net_ops);
> err_register_pernet_subsys:
> - inet_ctl_sock_destroy(sctp_ctl_sock);
> -err_ctl_sock_init:
> sctp_v6_protosw_exit();
> err_v6_protosw_init:
> sctp_v4_protosw_exit();
> @@ -1506,9 +1500,6 @@ SCTP_STATIC __exit void sctp_exit(void)
> sctp_v6_del_protocol();
> sctp_v4_del_protocol();
>
> - /* Free the control endpoint. */
> - inet_ctl_sock_destroy(sctp_ctl_sock);
> -
> unregister_pernet_subsys(&sctp_net_ops);
>
> /* Free protosw registrations */
> diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
> index 9fca103..f2daf61 100644
> --- a/net/sctp/sm_statefuns.c
> +++ b/net/sctp/sm_statefuns.c
> @@ -74,7 +74,8 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
> static int sctp_eat_data(const struct sctp_association *asoc,
> struct sctp_chunk *chunk,
> sctp_cmd_seq_t *commands);
> -static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc,
> +static struct sctp_packet *sctp_ootb_pkt_new(struct net *net,
> + const struct sctp_association *asoc,
> const struct sctp_chunk *chunk);
> static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
> const struct sctp_association *asoc,
> @@ -301,6 +302,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
> struct sctp_chunk *err_chunk;
> struct sctp_packet *packet;
> sctp_unrecognized_param_t *unk_param;
> + struct net *net;
> int len;
>
> /* 6.10 Bundling
> @@ -318,7 +320,8 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
> /* If the packet is an OOTB packet which is temporarily on the
> * control endpoint, respond with an ABORT.
> */
> - if (ep = sctp_sk((sctp_get_ctl_sock()))->ep) {
> + net = sock_net(ep->base.sk);
> + if (ep = sctp_sk(net->sctp.ctl_sock)->ep) {
> SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
> }
> @@ -646,11 +649,13 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
> int error = 0;
> struct sctp_chunk *err_chk_p;
> struct sock *sk;
> + struct net *net;
>
> /* If the packet is an OOTB packet which is temporarily on the
> * control endpoint, respond with an ABORT.
> */
> - if (ep = sctp_sk((sctp_get_ctl_sock()))->ep) {
> + net = sock_net(ep->base.sk);
> + if (ep = sctp_sk(net->sctp.ctl_sock)->ep) {
> SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
> }
> @@ -1171,7 +1176,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep,
> /* Helper function to send out an abort for the restart
> * condition.
> */
> -static int sctp_sf_send_restart_abort(union sctp_addr *ssa,
> +static int sctp_sf_send_restart_abort(struct net *net, union sctp_addr *ssa,
> struct sctp_chunk *init,
> sctp_cmd_seq_t *commands)
> {
> @@ -1197,7 +1202,7 @@ static int sctp_sf_send_restart_abort(union sctp_addr *ssa,
> errhdr->length = htons(len);
>
> /* Assign to the control socket. */
> - ep = sctp_sk((sctp_get_ctl_sock()))->ep;
> + ep = sctp_sk(net->sctp.ctl_sock)->ep;
>
> /* Association is NULL since this may be a restart attack and we
> * want to send back the attacker's vtag.
> @@ -1240,6 +1245,7 @@ static int sctp_sf_check_restart_addrs(const struct sctp_association *new_asoc,
> struct sctp_chunk *init,
> sctp_cmd_seq_t *commands)
> {
> + struct net *net = sock_net(new_asoc->base.sk);
> struct sctp_transport *new_addr;
> int ret = 1;
>
> @@ -1258,7 +1264,7 @@ static int sctp_sf_check_restart_addrs(const struct sctp_association *new_asoc,
> transports) {
> if (!list_has_sctp_addr(&asoc->peer.transport_addr_list,
> &new_addr->ipaddr)) {
> - sctp_sf_send_restart_abort(&new_addr->ipaddr, init,
> + sctp_sf_send_restart_abort(net, &new_addr->ipaddr, init,
> commands);
> ret = 0;
> break;
> @@ -1650,10 +1656,11 @@ sctp_disposition_t sctp_sf_do_5_2_3_initack(const struct sctp_endpoint *ep,
> const sctp_subtype_t type,
> void *arg, sctp_cmd_seq_t *commands)
> {
> + struct net *net = sock_net(ep->base.sk);
> /* Per the above section, we'll discard the chunk if we have an
> * endpoint. If this is an OOTB INIT-ACK, treat it as such.
> */
> - if (ep = sctp_sk((sctp_get_ctl_sock()))->ep)
> + if (ep = sctp_sk(net->sctp.ctl_sock)->ep)
> return sctp_sf_ootb(ep, asoc, type, arg, commands);
> else
> return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
> @@ -3163,8 +3170,10 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
> struct sctp_packet *packet = NULL;
> struct sctp_chunk *chunk = arg;
> struct sctp_chunk *abort;
> + struct net *net;
>
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (packet) {
> /* Make an ABORT. The T bit will be set if the asoc
> @@ -3425,8 +3434,10 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
> struct sctp_packet *packet = NULL;
> struct sctp_chunk *chunk = arg;
> struct sctp_chunk *shut;
> + struct net *net;
>
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (packet) {
> /* Make an SHUTDOWN_COMPLETE.
> @@ -4262,6 +4273,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
> struct sctp_packet *packet = NULL;
> struct sctp_chunk *chunk = arg;
> struct sctp_chunk *abort = NULL;
> + struct net *net;
>
> /* SCTP-AUTH, Section 6.3:
> * It should be noted that if the receiver wants to tear
> @@ -4282,6 +4294,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
> if (!abort)
> goto nomem;
>
> + net = sock_net(ep->base.sk);
> if (asoc) {
> /* Treat INIT-ACK as a special case during COOKIE-WAIT. */
> if (chunk->chunk_hdr->type = SCTP_CID_INIT_ACK &&
> @@ -4319,7 +4332,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
> SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> }
> } else {
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (!packet)
> goto nomem_pkt;
> @@ -5825,8 +5838,10 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
> {
> struct sctp_packet *packet;
> struct sctp_chunk *abort;
> + struct net *net;
>
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (packet) {
> /* Make an ABORT.
> @@ -5858,7 +5873,8 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
> }
>
> /* Allocate a packet for responding in the OOTB conditions. */
> -static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc,
> +static struct sctp_packet *sctp_ootb_pkt_new(struct net *net,
> + const struct sctp_association *asoc,
> const struct sctp_chunk *chunk)
> {
> struct sctp_packet *packet;
> @@ -5919,7 +5935,7 @@ static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc
> * the source address.
> */
> sctp_transport_route(transport, (union sctp_addr *)&chunk->dest,
> - sctp_sk(sctp_get_ctl_sock()));
> + sctp_sk(net->sctp.ctl_sock));
>
> packet = sctp_packet_init(&transport->packet, transport, sport, dport);
> packet = sctp_packet_config(packet, vtag, 0);
> @@ -5946,7 +5962,8 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
> struct sctp_packet *packet;
>
> if (err_chunk) {
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + struct net *net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
> if (packet) {
> struct sctp_signed_cookie *cookie;
>
>
WARNING: multiple messages have this Message-ID (diff)
From: Vlad Yasevich <vyasevich@gmail.com>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: David Miller <davem@davemloft.net>,
linux-sctp@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Jan Ariyasu <jan.ariyasu@hp.com>,
Jan Ariyasu <jan.ariyasu@gmail.com>,
Neil Horman <nhorman@tuxdriver.com>,
Thomas Graf <tgraf@infradead.org>, Xi Wang <xi.wang@gmail.com>
Subject: Re: [PATCH net-next 5/9] sctp: Make the ctl_sock per network namespace
Date: Tue, 14 Aug 2012 23:19:29 -0400 [thread overview]
Message-ID: <502B1541.2070200@gmail.com> (raw)
In-Reply-To: <877gtbq2th.fsf_-_@xmission.com>
On 08/06/2012 02:43 PM, Eric W. Biederman wrote:
>
> - Kill sctp_get_ctl_sock, it is useless now.
> - Pass struct net where needed so net->sctp.ctl_sock is accessible.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: Vlad Yasevich <vyasevich@gmail.com>
> ---
> include/net/netns/sctp.h | 8 +++++++
> include/net/sctp/sctp.h | 1 -
> net/sctp/input.c | 4 +-
> net/sctp/protocol.c | 47 ++++++++++++++++++---------------------------
> net/sctp/sm_statefuns.c | 45 ++++++++++++++++++++++++++++++-------------
> 5 files changed, 60 insertions(+), 45 deletions(-)
>
> diff --git a/include/net/netns/sctp.h b/include/net/netns/sctp.h
> index cbd684e..29e36b4 100644
> --- a/include/net/netns/sctp.h
> +++ b/include/net/netns/sctp.h
> @@ -1,7 +1,15 @@
> #ifndef __NETNS_SCTP_H__
> #define __NETNS_SCTP_H__
>
> +struct sock;
> +
> struct netns_sctp {
> + /* This is the global socket data structure used for responding to
> + * the Out-of-the-blue (OOTB) packets. A control sock will be created
> + * for this socket at the initialization time.
> + */
> + struct sock *ctl_sock;
> +
> /* This is the global local address list.
> * We actively maintain this complete list of addresses on
> * the system by catching address add/delete events.
> diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
> index 00c9205..550a81b 100644
> --- a/include/net/sctp/sctp.h
> +++ b/include/net/sctp/sctp.h
> @@ -114,7 +114,6 @@
> /*
> * sctp/protocol.c
> */
> -extern struct sock *sctp_get_ctl_sock(void);
> extern int sctp_copy_local_addr_list(struct net *, struct sctp_bind_addr *,
> sctp_scope_t, gfp_t gfp,
> int flags);
> diff --git a/net/sctp/input.c b/net/sctp/input.c
> index a7e9a85..c9a0449 100644
> --- a/net/sctp/input.c
> +++ b/net/sctp/input.c
> @@ -204,7 +204,7 @@ int sctp_rcv(struct sk_buff *skb)
> sctp_endpoint_put(ep);
> ep = NULL;
> }
> - sk = sctp_get_ctl_sock();
> + sk = net->sctp.ctl_sock;
> ep = sctp_sk(sk)->ep;
> sctp_endpoint_hold(ep);
> rcvr = &ep->base;
> @@ -795,7 +795,7 @@ static struct sctp_endpoint *__sctp_rcv_lookup_endpoint(struct net *net,
> goto hit;
> }
>
> - ep = sctp_sk((sctp_get_ctl_sock()))->ep;
> + ep = sctp_sk(net->sctp.ctl_sock)->ep;
>
> hit:
> sctp_endpoint_hold(ep);
> diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
> index 291e682..6193d20 100644
> --- a/net/sctp/protocol.c
> +++ b/net/sctp/protocol.c
> @@ -78,12 +78,6 @@ struct proc_dir_entry *proc_net_sctp;
> struct idr sctp_assocs_id;
> DEFINE_SPINLOCK(sctp_assocs_id_lock);
>
> -/* This is the global socket data structure used for responding to
> - * the Out-of-the-blue (OOTB) packets. A control sock will be created
> - * for this socket at the initialization time.
> - */
> -static struct sock *sctp_ctl_sock;
> -
> static struct sctp_pf *sctp_pf_inet6_specific;
> static struct sctp_pf *sctp_pf_inet_specific;
> static struct sctp_af *sctp_af_v4_specific;
> @@ -96,12 +90,6 @@ long sysctl_sctp_mem[3];
> int sysctl_sctp_rmem[3];
> int sysctl_sctp_wmem[3];
>
> -/* Return the address of the control sock. */
> -struct sock *sctp_get_ctl_sock(void)
> -{
> - return sctp_ctl_sock;
> -}
> -
> /* Set up the proc fs entry for the SCTP protocol. */
> static __init int sctp_proc_init(void)
> {
> @@ -822,7 +810,7 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
> * Initialize the control inode/socket with a control endpoint data
> * structure. This endpoint is reserved exclusively for the OOTB processing.
> */
> -static int sctp_ctl_sock_init(void)
> +static int sctp_ctl_sock_init(struct net *net)
> {
> int err;
> sa_family_t family = PF_INET;
> @@ -830,14 +818,14 @@ static int sctp_ctl_sock_init(void)
> if (sctp_get_pf_specific(PF_INET6))
> family = PF_INET6;
>
> - err = inet_ctl_sock_create(&sctp_ctl_sock, family,
> - SOCK_SEQPACKET, IPPROTO_SCTP, &init_net);
> + err = inet_ctl_sock_create(&net->sctp.ctl_sock, family,
> + SOCK_SEQPACKET, IPPROTO_SCTP, net);
>
> /* If IPv6 socket could not be created, try the IPv4 socket */
> if (err < 0 && family == PF_INET6)
> - err = inet_ctl_sock_create(&sctp_ctl_sock, AF_INET,
> + err = inet_ctl_sock_create(&net->sctp.ctl_sock, AF_INET,
> SOCK_SEQPACKET, IPPROTO_SCTP,
> - &init_net);
> + net);
>
> if (err < 0) {
> pr_err("Failed to create the SCTP control socket\n");
> @@ -1196,6 +1184,14 @@ static void sctp_v4_del_protocol(void)
>
> static int sctp_net_init(struct net *net)
> {
> + int status;
> +
> + /* Initialize the control inode/socket for handling OOTB packets. */
> + if ((status = sctp_ctl_sock_init(net))) {
> + pr_err("Failed to initialize the SCTP control sock\n");
> + goto err_ctl_sock_init;
> + }
> +
> /* Initialize the local address list. */
> INIT_LIST_HEAD(&net->sctp.local_addr_list);
> spin_lock_init(&net->sctp.local_addr_lock);
> @@ -1210,6 +1206,9 @@ static int sctp_net_init(struct net *net)
> (unsigned long)net);
>
> return 0;
> +
> +err_ctl_sock_init:
> + return status;
> }
>
> static void sctp_net_exit(struct net *net)
> @@ -1217,6 +1216,9 @@ static void sctp_net_exit(struct net *net)
> /* Free the local address list */
> sctp_free_addr_wq(net);
> sctp_free_local_addr_list(net);
> +
> + /* Free the control endpoint. */
> + inet_ctl_sock_destroy(net->sctp.ctl_sock);
> }
>
> static struct pernet_operations sctp_net_ops = {
> @@ -1438,12 +1440,6 @@ SCTP_STATIC __init int sctp_init(void)
> if (status)
> goto err_v6_protosw_init;
>
> - /* Initialize the control inode/socket for handling OOTB packets. */
> - if ((status = sctp_ctl_sock_init())) {
> - pr_err("Failed to initialize the SCTP control sock\n");
> - goto err_ctl_sock_init;
> - }
> -
> status = register_pernet_subsys(&sctp_net_ops);
> if (status)
> goto err_register_pernet_subsys;
> @@ -1465,8 +1461,6 @@ err_v6_add_protocol:
> err_add_protocol:
> unregister_pernet_subsys(&sctp_net_ops);
> err_register_pernet_subsys:
> - inet_ctl_sock_destroy(sctp_ctl_sock);
> -err_ctl_sock_init:
> sctp_v6_protosw_exit();
> err_v6_protosw_init:
> sctp_v4_protosw_exit();
> @@ -1506,9 +1500,6 @@ SCTP_STATIC __exit void sctp_exit(void)
> sctp_v6_del_protocol();
> sctp_v4_del_protocol();
>
> - /* Free the control endpoint. */
> - inet_ctl_sock_destroy(sctp_ctl_sock);
> -
> unregister_pernet_subsys(&sctp_net_ops);
>
> /* Free protosw registrations */
> diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
> index 9fca103..f2daf61 100644
> --- a/net/sctp/sm_statefuns.c
> +++ b/net/sctp/sm_statefuns.c
> @@ -74,7 +74,8 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
> static int sctp_eat_data(const struct sctp_association *asoc,
> struct sctp_chunk *chunk,
> sctp_cmd_seq_t *commands);
> -static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc,
> +static struct sctp_packet *sctp_ootb_pkt_new(struct net *net,
> + const struct sctp_association *asoc,
> const struct sctp_chunk *chunk);
> static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
> const struct sctp_association *asoc,
> @@ -301,6 +302,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
> struct sctp_chunk *err_chunk;
> struct sctp_packet *packet;
> sctp_unrecognized_param_t *unk_param;
> + struct net *net;
> int len;
>
> /* 6.10 Bundling
> @@ -318,7 +320,8 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
> /* If the packet is an OOTB packet which is temporarily on the
> * control endpoint, respond with an ABORT.
> */
> - if (ep == sctp_sk((sctp_get_ctl_sock()))->ep) {
> + net = sock_net(ep->base.sk);
> + if (ep == sctp_sk(net->sctp.ctl_sock)->ep) {
> SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
> }
> @@ -646,11 +649,13 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
> int error = 0;
> struct sctp_chunk *err_chk_p;
> struct sock *sk;
> + struct net *net;
>
> /* If the packet is an OOTB packet which is temporarily on the
> * control endpoint, respond with an ABORT.
> */
> - if (ep == sctp_sk((sctp_get_ctl_sock()))->ep) {
> + net = sock_net(ep->base.sk);
> + if (ep == sctp_sk(net->sctp.ctl_sock)->ep) {
> SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
> }
> @@ -1171,7 +1176,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(const struct sctp_endpoint *ep,
> /* Helper function to send out an abort for the restart
> * condition.
> */
> -static int sctp_sf_send_restart_abort(union sctp_addr *ssa,
> +static int sctp_sf_send_restart_abort(struct net *net, union sctp_addr *ssa,
> struct sctp_chunk *init,
> sctp_cmd_seq_t *commands)
> {
> @@ -1197,7 +1202,7 @@ static int sctp_sf_send_restart_abort(union sctp_addr *ssa,
> errhdr->length = htons(len);
>
> /* Assign to the control socket. */
> - ep = sctp_sk((sctp_get_ctl_sock()))->ep;
> + ep = sctp_sk(net->sctp.ctl_sock)->ep;
>
> /* Association is NULL since this may be a restart attack and we
> * want to send back the attacker's vtag.
> @@ -1240,6 +1245,7 @@ static int sctp_sf_check_restart_addrs(const struct sctp_association *new_asoc,
> struct sctp_chunk *init,
> sctp_cmd_seq_t *commands)
> {
> + struct net *net = sock_net(new_asoc->base.sk);
> struct sctp_transport *new_addr;
> int ret = 1;
>
> @@ -1258,7 +1264,7 @@ static int sctp_sf_check_restart_addrs(const struct sctp_association *new_asoc,
> transports) {
> if (!list_has_sctp_addr(&asoc->peer.transport_addr_list,
> &new_addr->ipaddr)) {
> - sctp_sf_send_restart_abort(&new_addr->ipaddr, init,
> + sctp_sf_send_restart_abort(net, &new_addr->ipaddr, init,
> commands);
> ret = 0;
> break;
> @@ -1650,10 +1656,11 @@ sctp_disposition_t sctp_sf_do_5_2_3_initack(const struct sctp_endpoint *ep,
> const sctp_subtype_t type,
> void *arg, sctp_cmd_seq_t *commands)
> {
> + struct net *net = sock_net(ep->base.sk);
> /* Per the above section, we'll discard the chunk if we have an
> * endpoint. If this is an OOTB INIT-ACK, treat it as such.
> */
> - if (ep == sctp_sk((sctp_get_ctl_sock()))->ep)
> + if (ep == sctp_sk(net->sctp.ctl_sock)->ep)
> return sctp_sf_ootb(ep, asoc, type, arg, commands);
> else
> return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
> @@ -3163,8 +3170,10 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
> struct sctp_packet *packet = NULL;
> struct sctp_chunk *chunk = arg;
> struct sctp_chunk *abort;
> + struct net *net;
>
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (packet) {
> /* Make an ABORT. The T bit will be set if the asoc
> @@ -3425,8 +3434,10 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
> struct sctp_packet *packet = NULL;
> struct sctp_chunk *chunk = arg;
> struct sctp_chunk *shut;
> + struct net *net;
>
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (packet) {
> /* Make an SHUTDOWN_COMPLETE.
> @@ -4262,6 +4273,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
> struct sctp_packet *packet = NULL;
> struct sctp_chunk *chunk = arg;
> struct sctp_chunk *abort = NULL;
> + struct net *net;
>
> /* SCTP-AUTH, Section 6.3:
> * It should be noted that if the receiver wants to tear
> @@ -4282,6 +4294,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
> if (!abort)
> goto nomem;
>
> + net = sock_net(ep->base.sk);
> if (asoc) {
> /* Treat INIT-ACK as a special case during COOKIE-WAIT. */
> if (chunk->chunk_hdr->type == SCTP_CID_INIT_ACK &&
> @@ -4319,7 +4332,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
> SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> }
> } else {
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (!packet)
> goto nomem_pkt;
> @@ -5825,8 +5838,10 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
> {
> struct sctp_packet *packet;
> struct sctp_chunk *abort;
> + struct net *net;
>
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
>
> if (packet) {
> /* Make an ABORT.
> @@ -5858,7 +5873,8 @@ static struct sctp_packet *sctp_abort_pkt_new(const struct sctp_endpoint *ep,
> }
>
> /* Allocate a packet for responding in the OOTB conditions. */
> -static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc,
> +static struct sctp_packet *sctp_ootb_pkt_new(struct net *net,
> + const struct sctp_association *asoc,
> const struct sctp_chunk *chunk)
> {
> struct sctp_packet *packet;
> @@ -5919,7 +5935,7 @@ static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc
> * the source address.
> */
> sctp_transport_route(transport, (union sctp_addr *)&chunk->dest,
> - sctp_sk(sctp_get_ctl_sock()));
> + sctp_sk(net->sctp.ctl_sock));
>
> packet = sctp_packet_init(&transport->packet, transport, sport, dport);
> packet = sctp_packet_config(packet, vtag, 0);
> @@ -5946,7 +5962,8 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
> struct sctp_packet *packet;
>
> if (err_chunk) {
> - packet = sctp_ootb_pkt_new(asoc, chunk);
> + struct net *net = sock_net(ep->base.sk);
> + packet = sctp_ootb_pkt_new(net, asoc, chunk);
> if (packet) {
> struct sctp_signed_cookie *cookie;
>
>
next prev parent reply other threads:[~2012-08-15 3:19 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-04 21:30 [PATCH 00/13] SCTP: Enable netns Jan Ariyasu
2012-08-04 21:30 ` Jan Ariyasu
2012-08-04 23:57 ` David Miller
2012-08-04 23:57 ` David Miller
2012-08-06 18:20 ` Eric W. Biederman
2012-08-06 18:20 ` Eric W. Biederman
2012-08-06 18:38 ` [PATCH net-next 0/9] sctp: Basic support for network namespaces Eric W. Biederman
2012-08-06 18:38 ` Eric W. Biederman
2012-08-06 18:39 ` [PATCH net-next 1/9] sctp: Make the port hash table use struct net in it's key Eric W. Biederman
2012-08-06 18:39 ` Eric W. Biederman
2012-08-15 3:18 ` Vlad Yasevich
2012-08-15 3:18 ` Vlad Yasevich
2012-08-06 18:40 ` [PATCH net-next 2/9] sctp: Make the endpoint hashtable handle multiple network namespaces Eric W. Biederman
2012-08-06 18:40 ` Eric W. Biederman
2012-08-15 3:18 ` Vlad Yasevich
2012-08-15 3:18 ` Vlad Yasevich
2012-08-06 18:41 ` [PATCH net-next 3/9] sctp: Make the association " Eric W. Biederman
2012-08-06 18:41 ` Eric W. Biederman
2012-08-15 3:18 ` Vlad Yasevich
2012-08-15 3:18 ` Vlad Yasevich
2012-08-06 18:42 ` [PATCH net-next 4/9] sctp: Make the address lists per network namespace Eric W. Biederman
2012-08-06 18:42 ` Eric W. Biederman
2012-08-15 3:19 ` Vlad Yasevich
2012-08-15 3:19 ` Vlad Yasevich
2012-08-06 18:43 ` [PATCH net-next 5/9] sctp: Make the ctl_sock " Eric W. Biederman
2012-08-06 18:43 ` Eric W. Biederman
2012-08-15 3:19 ` Vlad Yasevich [this message]
2012-08-15 3:19 ` Vlad Yasevich
2012-08-06 18:44 ` [PATCH net-next 6/9] sctp: Move the percpu sockets counter out of sctp_proc_init Eric W. Biederman
2012-08-06 18:44 ` Eric W. Biederman
2012-08-15 3:19 ` Vlad Yasevich
2012-08-15 3:19 ` Vlad Yasevich
2012-08-06 18:45 ` [PATCH net-next 7/9] sctp: Make the proc files per network namespace Eric W. Biederman
2012-08-06 18:45 ` Eric W. Biederman
2012-08-15 3:19 ` Vlad Yasevich
2012-08-15 3:19 ` Vlad Yasevich
2012-08-06 18:46 ` [PATCH net-next 8/9] sctp: Enable sctp in all network namespaces Eric W. Biederman
2012-08-06 18:46 ` Eric W. Biederman
2012-08-15 3:20 ` Vlad Yasevich
2012-08-15 3:20 ` Vlad Yasevich
2012-08-06 18:47 ` [PATCH net-next 9/9] sctp: Make the mib per network namespace Eric W. Biederman
2012-08-06 18:47 ` Eric W. Biederman
2012-08-15 3:20 ` Vlad Yasevich
2012-08-15 3:20 ` Vlad Yasevich
2012-08-07 17:17 ` [PATCH net-next 0/7] sctp: network namespace support Part 2: per net tunables Eric W. Biederman
2012-08-07 17:17 ` Eric W. Biederman
2012-08-07 17:23 ` [PATCH net-next 1/7] sctp: Add infrastructure for per net sysctls Eric W. Biederman
2012-08-07 17:23 ` Eric W. Biederman
2012-08-15 3:20 ` Vlad Yasevich
2012-08-15 3:20 ` Vlad Yasevich
2012-08-07 17:25 ` [PATCH net-next 2/7] sctp: Push struct net down to sctp_chunk_event_lookup Eric W. Biederman
2012-08-07 17:25 ` Eric W. Biederman
2012-08-07 17:26 ` [PATCH net-next 3/7] sctp: Push struct net down into sctp_transport_init Eric W. Biederman
2012-08-07 17:26 ` Eric W. Biederman
2012-08-07 17:27 ` [PATCH net-next 4/7] sctp: Push struct net down into sctp_in_scope Eric W. Biederman
2012-08-07 17:27 ` Eric W. Biederman
2012-08-07 17:28 ` [PATCH net-next 5/7] sctp: Push struct net down into all of the state machine functions Eric W. Biederman
2012-08-07 17:29 ` [PATCH net-next 6/7] sctp: Push struct net down into sctp_verify_ext_param Eric W. Biederman
2012-08-07 17:29 ` Eric W. Biederman
2012-08-07 17:29 ` [PATCH net-next 7/7] sctp: Make sysctl tunables per net Eric W. Biederman
2012-08-07 17:29 ` Eric W. Biederman
2012-08-09 6:20 ` [PATCH net-next 0/7] sctp: network namespace support Part 2: per net tunables David Miller
2012-08-09 6:20 ` David Miller
2012-08-09 14:07 ` Vlad Yasevich
2012-08-09 14:07 ` Vlad Yasevich
2012-08-14 21:14 ` David Miller
2012-08-14 21:14 ` David Miller
2012-08-15 3:16 ` Vlad Yasevich
2012-08-15 3:16 ` Vlad Yasevich
2012-08-15 3:21 ` Vlad Yasevich
2012-08-15 3:21 ` Vlad Yasevich
2012-08-15 6:10 ` David Miller
2012-08-15 6:10 ` David Miller
2012-08-06 19:21 ` [PATCH 00/13] SCTP: Enable netns Vlad Yasevich
2012-08-06 19:21 ` Vlad Yasevich
2012-08-06 19:50 ` Eric W. Biederman
2012-08-06 19:50 ` Eric W. Biederman
2012-08-06 20:06 ` Vlad Yasevich
2012-08-06 20:06 ` Vlad Yasevich
2012-08-06 20:47 ` David Miller
2012-08-06 20:47 ` David Miller
2012-08-06 21:39 ` Vlad Yasevich
2012-08-06 21:39 ` Vlad Yasevich
2012-08-06 23:06 ` Eric W. Biederman
2012-08-06 23:06 ` Eric W. Biederman
2012-08-15 3:23 ` Vlad Yasevich
2012-08-15 3:23 ` Vlad Yasevich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=502B1541.2070200@gmail.com \
--to=vyasevich@gmail.com \
--cc=davem@davemloft.net \
--cc=ebiederm@xmission.com \
--cc=jan.ariyasu@gmail.com \
--cc=jan.ariyasu@hp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sctp@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nhorman@tuxdriver.com \
--cc=tgraf@infradead.org \
--cc=xi.wang@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.