All of lore.kernel.org
 help / color / mirror / Atom feed
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 9/9] sctp: Make the mib per network namespace
Date: Wed, 15 Aug 2012 03:20:33 +0000	[thread overview]
Message-ID: <502B1581.7080506@gmail.com> (raw)
In-Reply-To: <87lihroo10.fsf_-_@xmission.com>

On 08/06/2012 02:47 PM, Eric W. Biederman wrote:
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>

Acked-by: Vlad Yasevich <vyasevich@gmail.com>
> ---
>   include/net/netns/sctp.h |    3 +
>   include/net/sctp/sctp.h  |    9 +--
>   net/sctp/associola.c     |    2 +-
>   net/sctp/chunk.c         |    2 +-
>   net/sctp/endpointola.c   |    2 +-
>   net/sctp/input.c         |   22 +++---
>   net/sctp/ipv6.c          |    4 +-
>   net/sctp/output.c        |    2 +-
>   net/sctp/outqueue.c      |   18 +++--
>   net/sctp/proc.c          |    5 +-
>   net/sctp/protocol.c      |   27 ++++----
>   net/sctp/sm_statefuns.c  |  163 +++++++++++++++++++++++++++------------------
>   net/sctp/ulpqueue.c      |   18 ++++--
>   13 files changed, 158 insertions(+), 119 deletions(-)
>
> diff --git a/include/net/netns/sctp.h b/include/net/netns/sctp.h
> index 9c20a82..06ccddf 100644
> --- a/include/net/netns/sctp.h
> +++ b/include/net/netns/sctp.h
> @@ -3,8 +3,11 @@
>
>   struct sock;
>   struct proc_dir_entry;
> +struct sctp_mib;
>
>   struct netns_sctp {
> +	DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics);
> +
>   #ifdef CONFIG_PROC_FS
>   	struct proc_dir_entry *proc_net_sctp;
>   #endif
> diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
> index ca716da..b0e6fe5 100644
> --- a/include/net/sctp/sctp.h
> +++ b/include/net/sctp/sctp.h
> @@ -221,11 +221,10 @@ extern struct kmem_cache *sctp_bucket_cachep __read_mostly;
>   #define sctp_bh_unlock_sock(sk)  bh_unlock_sock(sk)
>
>   /* SCTP SNMP MIB stats handlers */
> -DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics);
> -#define SCTP_INC_STATS(field)      SNMP_INC_STATS(sctp_statistics, field)
> -#define SCTP_INC_STATS_BH(field)   SNMP_INC_STATS_BH(sctp_statistics, field)
> -#define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field)
> -#define SCTP_DEC_STATS(field)      SNMP_DEC_STATS(sctp_statistics, field)
> +#define SCTP_INC_STATS(net, field)      SNMP_INC_STATS((net)->sctp.sctp_statistics, field)
> +#define SCTP_INC_STATS_BH(net, field)   SNMP_INC_STATS_BH((net)->sctp.sctp_statistics, field)
> +#define SCTP_INC_STATS_USER(net, field) SNMP_INC_STATS_USER((net)->sctp.sctp_statistics, field)
> +#define SCTP_DEC_STATS(net, field)      SNMP_DEC_STATS((net)->sctp.sctp_statistics, field)
>
>   #endif /* !TEST_FRAME */
>
> diff --git a/net/sctp/associola.c b/net/sctp/associola.c
> index ed4930b..8a1f27a 100644
> --- a/net/sctp/associola.c
> +++ b/net/sctp/associola.c
> @@ -1150,7 +1150,7 @@ static void sctp_assoc_bh_rcv(struct work_struct *work)
>   		if (sctp_chunk_is_data(chunk))
>   			asoc->peer.last_data_from = chunk->transport;
>   		else
> -			SCTP_INC_STATS(SCTP_MIB_INCTRLCHUNKS);
> +			SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_INCTRLCHUNKS);
>
>   		if (chunk->transport)
>   			chunk->transport->last_time_heard = jiffies;
> diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c
> index 6c85564..7c2df9c 100644
> --- a/net/sctp/chunk.c
> +++ b/net/sctp/chunk.c
> @@ -257,7 +257,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
>   	offset = 0;
>
>   	if ((whole > 1) || (whole && over))
> -		SCTP_INC_STATS_USER(SCTP_MIB_FRAGUSRMSGS);
> +		SCTP_INC_STATS_USER(sock_net(asoc->base.sk), SCTP_MIB_FRAGUSRMSGS);
>
>   	/* Create chunks for all the full sized DATA chunks. */
>   	for (i=0, len=first_len; i < whole; i++) {
> diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c
> index 6b76393..3edca80 100644
> --- a/net/sctp/endpointola.c
> +++ b/net/sctp/endpointola.c
> @@ -478,7 +478,7 @@ normal:
>   		if (asoc && sctp_chunk_is_data(chunk))
>   			asoc->peer.last_data_from = chunk->transport;
>   		else
> -			SCTP_INC_STATS(SCTP_MIB_INCTRLCHUNKS);
> +			SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_INCTRLCHUNKS);
>
>   		if (chunk->transport)
>   			chunk->transport->last_time_heard = jiffies;
> diff --git a/net/sctp/input.c b/net/sctp/input.c
> index c9a0449..5308301 100644
> --- a/net/sctp/input.c
> +++ b/net/sctp/input.c
> @@ -83,7 +83,7 @@ static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb);
>
>
>   /* Calculate the SCTP checksum of an SCTP packet.  */
> -static inline int sctp_rcv_checksum(struct sk_buff *skb)
> +static inline int sctp_rcv_checksum(struct net *net, struct sk_buff *skb)
>   {
>   	struct sctphdr *sh = sctp_hdr(skb);
>   	__le32 cmp = sh->checksum;
> @@ -99,7 +99,7 @@ static inline int sctp_rcv_checksum(struct sk_buff *skb)
>
>   	if (val != cmp) {
>   		/* CRC failure, dump it. */
> -		SCTP_INC_STATS_BH(SCTP_MIB_CHECKSUMERRORS);
> +		SCTP_INC_STATS_BH(net, SCTP_MIB_CHECKSUMERRORS);
>   		return -1;
>   	}
>   	return 0;
> @@ -137,7 +137,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	if (skb->pkt_type!=PACKET_HOST)
>   		goto discard_it;
>
> -	SCTP_INC_STATS_BH(SCTP_MIB_INSCTPPACKS);
> +	SCTP_INC_STATS_BH(net, SCTP_MIB_INSCTPPACKS);
>
>   	if (skb_linearize(skb))
>   		goto discard_it;
> @@ -149,7 +149,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	if (skb->len < sizeof(struct sctphdr))
>   		goto discard_it;
>   	if (!sctp_checksum_disable && !skb_csum_unnecessary(skb) &&
> -		  sctp_rcv_checksum(skb) < 0)
> +		  sctp_rcv_checksum(net, skb) < 0)
>   		goto discard_it;
>
>   	skb_pull(skb, sizeof(struct sctphdr));
> @@ -220,7 +220,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	 */
>   	if (!asoc) {
>   		if (sctp_rcv_ootb(skb)) {
> -			SCTP_INC_STATS_BH(SCTP_MIB_OUTOFBLUES);
> +			SCTP_INC_STATS_BH(net, SCTP_MIB_OUTOFBLUES);
>   			goto discard_release;
>   		}
>   	}
> @@ -276,9 +276,9 @@ int sctp_rcv(struct sk_buff *skb)
>   			skb = NULL; /* sctp_chunk_free already freed the skb */
>   			goto discard_release;
>   		}
> -		SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG);
> +		SCTP_INC_STATS_BH(net, SCTP_MIB_IN_PKT_BACKLOG);
>   	} else {
> -		SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_SOFTIRQ);
> +		SCTP_INC_STATS_BH(net, SCTP_MIB_IN_PKT_SOFTIRQ);
>   		sctp_inq_push(&chunk->rcvr->inqueue, chunk);
>   	}
>
> @@ -293,7 +293,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	return 0;
>
>   discard_it:
> -	SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_DISCARDS);
> +	SCTP_INC_STATS_BH(net, SCTP_MIB_IN_PKT_DISCARDS);
>   	kfree_skb(skb);
>   	return 0;
>
> @@ -543,7 +543,7 @@ struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *skb,
>   	 * servers this needs to be solved differently.
>   	 */
>   	if (sock_owned_by_user(sk))
> -		NET_INC_STATS_BH(&init_net, LINUX_MIB_LOCKDROPPEDICMPS);
> +		NET_INC_STATS_BH(net, LINUX_MIB_LOCKDROPPEDICMPS);
>
>   	*app = asoc;
>   	*tpp = transport;
> @@ -593,7 +593,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)
>   	struct net *net = dev_net(skb->dev);
>
>   	if (skb->len < ihlen + 8) {
> -		ICMP_INC_STATS_BH(&init_net, ICMP_MIB_INERRORS);
> +		ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
>   		return;
>   	}
>
> @@ -607,7 +607,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)
>   	skb->network_header = saveip;
>   	skb->transport_header = savesctp;
>   	if (!sk) {
> -		ICMP_INC_STATS_BH(&init_net, ICMP_MIB_INERRORS);
> +		ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
>   		return;
>   	}
>   	/* Warning:  The sock lock is held.  Remember to call
> diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
> index a18cda6..ea14cb4 100644
> --- a/net/sctp/ipv6.c
> +++ b/net/sctp/ipv6.c
> @@ -169,7 +169,7 @@ SCTP_STATIC void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
>   	skb->network_header   = saveip;
>   	skb->transport_header = savesctp;
>   	if (!sk) {
> -		ICMP6_INC_STATS_BH(dev_net(skb->dev), idev, ICMP6_MIB_INERRORS);
> +		ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_INERRORS);
>   		goto out;
>   	}
>
> @@ -243,7 +243,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport)
>   			  __func__, skb, skb->len,
>   			  &fl6.saddr, &fl6.daddr);
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
> +	SCTP_INC_STATS(sock_net(sk), SCTP_MIB_OUTSCTPPACKS);
>
>   	if (!(transport->param_flags & SPP_PMTUD_ENABLE))
>   		skb->local_df = 1;
> diff --git a/net/sctp/output.c b/net/sctp/output.c
> index 838e18b..0c6359b 100644
> --- a/net/sctp/output.c
> +++ b/net/sctp/output.c
> @@ -597,7 +597,7 @@ out:
>   	return err;
>   no_route:
>   	kfree_skb(nskb);
> -	IP_INC_STATS_BH(&init_net, IPSTATS_MIB_OUTNOROUTES);
> +	IP_INC_STATS_BH(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES);
>
>   	/* FIXME: Returning the 'err' will effect all the associations
>   	 * associated with a socket, although only one of the paths of the
> diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
> index e7aa177c..072bf6a 100644
> --- a/net/sctp/outqueue.c
> +++ b/net/sctp/outqueue.c
> @@ -299,6 +299,7 @@ void sctp_outq_free(struct sctp_outq *q)
>   /* Put a new chunk in an sctp_outq.  */
>   int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk)
>   {
> +	struct net *net = sock_net(q->asoc->base.sk);
>   	int error = 0;
>
>   	SCTP_DEBUG_PRINTK("sctp_outq_tail(%p, %p[%s])\n",
> @@ -337,15 +338,15 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk)
>
>   			sctp_outq_tail_data(q, chunk);
>   			if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
> -				SCTP_INC_STATS(SCTP_MIB_OUTUNORDERCHUNKS);
> +				SCTP_INC_STATS(net, SCTP_MIB_OUTUNORDERCHUNKS);
>   			else
> -				SCTP_INC_STATS(SCTP_MIB_OUTORDERCHUNKS);
> +				SCTP_INC_STATS(net, SCTP_MIB_OUTORDERCHUNKS);
>   			q->empty = 0;
>   			break;
>   		}
>   	} else {
>   		list_add_tail(&chunk->list, &q->control_chunk_list);
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   	}
>
>   	if (error < 0)
> @@ -478,11 +479,12 @@ void sctp_retransmit_mark(struct sctp_outq *q,
>   void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport,
>   		     sctp_retransmit_reason_t reason)
>   {
> +	struct net *net = sock_net(q->asoc->base.sk);
>   	int error = 0;
>
>   	switch(reason) {
>   	case SCTP_RTXR_T3_RTX:
> -		SCTP_INC_STATS(SCTP_MIB_T3_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_T3_RETRANSMITS);
>   		sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_T3_RTX);
>   		/* Update the retran path if the T3-rtx timer has expired for
>   		 * the current retran path.
> @@ -493,15 +495,15 @@ void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport,
>   			transport->asoc->unack_data;
>   		break;
>   	case SCTP_RTXR_FAST_RTX:
> -		SCTP_INC_STATS(SCTP_MIB_FAST_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_FAST_RETRANSMITS);
>   		sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX);
>   		q->fast_rtx = 1;
>   		break;
>   	case SCTP_RTXR_PMTUD:
> -		SCTP_INC_STATS(SCTP_MIB_PMTUD_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_PMTUD_RETRANSMITS);
>   		break;
>   	case SCTP_RTXR_T1_RTX:
> -		SCTP_INC_STATS(SCTP_MIB_T1_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_T1_RETRANSMITS);
>   		transport->asoc->init_retries++;
>   		break;
>   	default:
> @@ -1914,6 +1916,6 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
>
>   	if (ftsn_chunk) {
>   		list_add_tail(&ftsn_chunk->list, &q->control_chunk_list);
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
>   	}
>   }
> diff --git a/net/sctp/proc.c b/net/sctp/proc.c
> index dc79a3a..3e62ee5 100644
> --- a/net/sctp/proc.c
> +++ b/net/sctp/proc.c
> @@ -83,12 +83,9 @@ static int sctp_snmp_seq_show(struct seq_file *seq, void *v)
>   	struct net *net = seq->private;
>   	int i;
>
> -	if (!net_eq(net, &init_net))
> -		return 0;
> -
>   	for (i = 0; sctp_snmp_list[i].name != NULL; i++)
>   		seq_printf(seq, "%-32s\t%ld\n", sctp_snmp_list[i].name,
> -			   snmp_fold_field((void __percpu **)sctp_statistics,
> +			   snmp_fold_field((void __percpu **)net->sctp.sctp_statistics,
>   				      sctp_snmp_list[i].entry));
>
>   	return 0;
> diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
> index ab35691..69bdc72 100644
> --- a/net/sctp/protocol.c
> +++ b/net/sctp/protocol.c
> @@ -69,7 +69,6 @@
>
>   /* Global data structures. */
>   struct sctp_globals sctp_globals __read_mostly;
> -DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics) __read_mostly;
>
>   struct idr sctp_assocs_id;
>   DEFINE_SPINLOCK(sctp_assocs_id_lock);
> @@ -961,7 +960,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
>   	inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ?
>   			 IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
> +	SCTP_INC_STATS(sock_net(&inet->sk), SCTP_MIB_OUTSCTPPACKS);
>   	return ip_queue_xmit(skb, &transport->fl);
>   }
>
> @@ -1102,16 +1101,16 @@ int sctp_register_pf(struct sctp_pf *pf, sa_family_t family)
>   	return 1;
>   }
>
> -static inline int init_sctp_mibs(void)
> +static inline int init_sctp_mibs(struct net *net)
>   {
> -	return snmp_mib_init((void __percpu **)sctp_statistics,
> +	return snmp_mib_init((void __percpu **)net->sctp.sctp_statistics,
>   			     sizeof(struct sctp_mib),
>   			     __alignof__(struct sctp_mib));
>   }
>
> -static inline void cleanup_sctp_mibs(void)
> +static inline void cleanup_sctp_mibs(struct net *net)
>   {
> -	snmp_mib_free((void __percpu **)sctp_statistics);
> +	snmp_mib_free((void __percpu **)net->sctp.sctp_statistics);
>   }
>
>   static void sctp_v4_pf_init(void)
> @@ -1170,6 +1169,11 @@ static int sctp_net_init(struct net *net)
>   {
>   	int status;
>
> +	/* Allocate and initialise sctp mibs.  */
> +	status = init_sctp_mibs(net);
> +	if (status)
> +		goto err_init_mibs;
> +
>   	/* Initialize proc fs directory.  */
>   	status = sctp_proc_init(net);
>   	if (status)
> @@ -1199,6 +1203,8 @@ static int sctp_net_init(struct net *net)
>   err_ctl_sock_init:
>   	sctp_proc_exit(net);
>   err_init_proc:
> +	cleanup_sctp_mibs(net);
> +err_init_mibs:
>   	return status;
>   }
>
> @@ -1212,6 +1218,7 @@ static void sctp_net_exit(struct net *net)
>   	inet_ctl_sock_destroy(net->sctp.ctl_sock);
>
>   	sctp_proc_exit(net);
> +	cleanup_sctp_mibs(net);
>   }
>
>   static struct pernet_operations sctp_net_ops = {
> @@ -1249,11 +1256,6 @@ SCTP_STATIC __init int sctp_init(void)
>   	if (!sctp_chunk_cachep)
>   		goto err_chunk_cachep;
>
> -	/* Allocate and initialise sctp mibs.  */
> -	status = init_sctp_mibs();
> -	if (status)
> -		goto err_init_mibs;
> -
>   	status = percpu_counter_init(&sctp_sockets_allocated, 0);
>   	if (status)
>   		goto err_percpu_counter_init;
> @@ -1473,8 +1475,6 @@ err_ahash_alloc:
>   	sctp_dbg_objcnt_exit();
>   	percpu_counter_destroy(&sctp_sockets_allocated);
>   err_percpu_counter_init:
> -	cleanup_sctp_mibs();
> -err_init_mibs:
>   	kmem_cache_destroy(sctp_chunk_cachep);
>   err_chunk_cachep:
>   	kmem_cache_destroy(sctp_bucket_cachep);
> @@ -1514,7 +1514,6 @@ SCTP_STATIC __exit void sctp_exit(void)
>
>   	sctp_dbg_objcnt_exit();
>   	percpu_counter_destroy(&sctp_sockets_allocated);
> -	cleanup_sctp_mibs();
>
>   	rcu_barrier(); /* Wait for completion of call_rcu()'s */
>
> diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
> index f2daf61..bee5e2c 100644
> --- a/net/sctp/sm_statefuns.c
> +++ b/net/sctp/sm_statefuns.c
> @@ -213,6 +213,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
>   {
>   	struct sctp_chunk *chunk = arg;
>   	struct sctp_ulpevent *ev;
> +	struct net *net;
>
>   	if (!sctp_vtag_verify_either(chunk, asoc))
>   		return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
> @@ -260,8 +261,9 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
>
> -	SCTP_INC_STATS(SCTP_MIB_SHUTDOWNS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL());
>
> @@ -322,7 +324,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
>   	 */
>   	net = sock_net(ep->base.sk);
>   	if (ep = sctp_sk(net->sctp.ctl_sock)->ep) {
> -		SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
>   		return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
>   	}
>
> @@ -369,7 +371,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
>   			if (packet) {
>   				sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   						SCTP_PACKET(packet));
> -				SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +				SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   				return SCTP_DISPOSITION_CONSUME;
>   			} else {
>   				return SCTP_DISPOSITION_NOMEM;
> @@ -540,7 +542,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
>   			if (packet) {
>   				sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   						SCTP_PACKET(packet));
> -				SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +				SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
>   				error = SCTP_ERROR_INV_PARAM;
>   			}
>   		}
> @@ -559,7 +561,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
>   		if (sctp_auth_recv_cid(SCTP_CID_ABORT, asoc))
>   			return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
>
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +		SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_ABORTEDS);
>   		return sctp_stop_t1_and_abort(commands, error, ECONNREFUSED,
>   						asoc, chunk->transport);
>   	}
> @@ -656,7 +658,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
>   	 */
>   	net = sock_net(ep->base.sk);
>   	if (ep = sctp_sk(net->sctp.ctl_sock)->ep) {
> -		SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
>   		return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
>   	}
>
> @@ -809,8 +811,8 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -	SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> -	SCTP_INC_STATS(SCTP_MIB_PASSIVEESTABS);
> +	SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_PASSIVEESTABS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
>
>   	if (new_asoc->autoclose)
> @@ -868,6 +870,7 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep,
>   {
>   	struct sctp_chunk *chunk = arg;
>   	struct sctp_ulpevent *ev;
> +	struct net *net;
>
>   	if (!sctp_vtag_verify(chunk, asoc))
>   		return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
> @@ -897,8 +900,9 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep,
>   			SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -	SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> -	SCTP_INC_STATS(SCTP_MIB_ACTIVEESTABS);
> +	net = sock_net(ep->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_ACTIVEESTABS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
>   	if (asoc->autoclose)
>   		sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START,
> @@ -972,13 +976,15 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
>   	struct sctp_transport *transport = (struct sctp_transport *) arg;
>
>   	if (asoc->overall_error_count >= asoc->max_retrans) {
> +		struct net *net;
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
>   				SCTP_ERROR(ETIMEDOUT));
>   		/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		net = sock_net(ep->base.sk);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_DELETE_TCB;
>   	}
>
> @@ -1213,7 +1219,7 @@ static int sctp_sf_send_restart_abort(struct net *net, union sctp_addr *ssa,
>   		goto out;
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, SCTP_PACKET(pkt));
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +	SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   	/* Discard the rest of the inbound packet. */
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
> @@ -1427,7 +1433,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
>   			if (packet) {
>   				sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   						SCTP_PACKET(packet));
> -				SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +				SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
>   				retval = SCTP_DISPOSITION_CONSUME;
>   			} else {
>   				retval = SCTP_DISPOSITION_NOMEM;
> @@ -1791,7 +1797,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -	SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(sock_net(new_asoc->base.sk), SCTP_MIB_CURRESTAB);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
>
>   	repl = sctp_make_cookie_ack(new_asoc, chunk);
> @@ -1883,7 +1889,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
>   				SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   				SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -		SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_CURRESTAB);
>   		sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START,
>   				SCTP_NULL());
>
> @@ -2417,6 +2423,7 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
>   	struct sctp_chunk *chunk = arg;
>   	unsigned int len;
>   	__be16 error = SCTP_ERROR_NO_ERROR;
> +	struct net *net;
>
>   	/* See if we have an error cause code in the chunk.  */
>   	len = ntohs(chunk->chunk_hdr->length);
> @@ -2433,8 +2440,9 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET));
>   	/* ASSOC_FAILED will DELETE_TCB. */
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error));
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(ep->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	return SCTP_DISPOSITION_ABORT;
>   }
> @@ -2521,7 +2529,7 @@ static sctp_disposition_t sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
>   	SCTP_DEBUG_PRINTK("ABORT received (INIT).\n");
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_ABORTEDS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
>   			SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(sk_err));
> @@ -2904,11 +2912,11 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
>   		break;
>   	case SCTP_IERROR_HIGH_TSN:
>   	case SCTP_IERROR_BAD_STREAM:
> -		SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
>   		goto discard_noforce;
>   	case SCTP_IERROR_DUP_TSN:
>   	case SCTP_IERROR_IGNORE_TSN:
> -		SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
>   		goto discard_force;
>   	case SCTP_IERROR_NO_DATA:
>   		goto consume;
> @@ -3197,7 +3205,7 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   				SCTP_PACKET(packet));
>
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   		sctp_sf_pdiscard(ep, asoc, type, arg, commands);
>   		return SCTP_DISPOSITION_CONSUME;
> @@ -3260,6 +3268,7 @@ sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep,
>   	struct sctp_chunk *chunk = arg;
>   	struct sctp_chunk *reply;
>   	struct sctp_ulpevent *ev;
> +	struct net *net;
>
>   	if (!sctp_vtag_verify(chunk, asoc))
>   		return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
> @@ -3299,8 +3308,9 @@ sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep,
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
> -	SCTP_INC_STATS(SCTP_MIB_SHUTDOWNS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply));
>
>   	/* ...and remove all record of the association. */
> @@ -3346,8 +3356,10 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
>   	__u8 *ch_end;
>   	int ootb_shut_ack = 0;
>   	int ootb_cookie_ack = 0;
> +	struct net *net;
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
>
>   	ch = (sctp_chunkhdr_t *) chunk->chunk_hdr;
>   	do {
> @@ -3461,7 +3473,7 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   				SCTP_PACKET(packet));
>
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   		/* If the chunk length is invalid, we don't want to process
>   		 * the reset of the packet.
> @@ -3508,7 +3520,7 @@ sctp_disposition_t sctp_sf_do_8_5_1_E_sa(const struct sctp_endpoint *ep,
>   	 * packet and the state function that handles OOTB SHUTDOWN_ACK is
>   	 * called with a NULL association.
>   	 */
> -	SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +	SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTOFBLUES);
>
>   	return sctp_sf_shut_8_4_5(ep, NULL, type, arg, commands);
>   }
> @@ -3699,6 +3711,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
>   	 */
>   	if (ADDIP_SERIAL_gte(rcvd_serial, sent_serial + 1) &&
>   	    !(asoc->addip_last_asconf)) {
> +		struct net *net;
>   		abort = sctp_make_abort(asoc, asconf_ack,
>   					sizeof(sctp_errhdr_t));
>   		if (abort) {
> @@ -3716,12 +3729,14 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
>   				SCTP_ERROR(ECONNABORTED));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		net = sock_net(asoc->base.sk);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_ABORT;
>   	}
>
>   	if ((rcvd_serial = sent_serial) && asoc->addip_last_asconf) {
> +		struct net *net;
>   		sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
>   				SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
>
> @@ -3750,8 +3765,9 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
>   				SCTP_ERROR(ECONNABORTED));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		net = sock_net(asoc->base.sk);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_ABORT;
>   	}
>
> @@ -4222,7 +4238,7 @@ sctp_disposition_t sctp_sf_pdiscard(const struct sctp_endpoint *ep,
>   				    void *arg,
>   				    sctp_cmd_seq_t *commands)
>   {
> -	SCTP_INC_STATS(SCTP_MIB_IN_PKT_DISCARDS);
> +	SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_PKT_DISCARDS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
>
>   	return SCTP_DISPOSITION_CONSUME;
> @@ -4315,7 +4331,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
>   		}
>
>   		sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   		if (asoc->state <= SCTP_STATE_COOKIE_ECHOED) {
>   			sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
> @@ -4329,7 +4345,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
>   					SCTP_ERROR(ECONNABORTED));
>   			sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   					SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
> -			SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +			SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		}
>   	} else {
>   		packet = sctp_ootb_pkt_new(net, asoc, chunk);
> @@ -4347,10 +4363,10 @@ static sctp_disposition_t sctp_sf_abort_violation(
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   			SCTP_PACKET(packet));
>
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   	}
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
>
>   discard:
>   	sctp_sf_pdiscard(ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
> @@ -4410,6 +4426,7 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
>   	struct sctp_chunk *chunk =  arg;
>   	struct sctp_paramhdr *param = ext;
>   	struct sctp_chunk *abort = NULL;
> +	struct net *net;
>
>   	if (sctp_auth_recv_cid(SCTP_CID_ABORT, asoc))
>   		goto discard;
> @@ -4419,15 +4436,16 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
>   	if (!abort)
>   		goto nomem;
>
> +	net = sock_net(asoc->base.sk);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
> -	SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +	SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
>   			SCTP_ERROR(ECONNABORTED));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   			SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
>
>   discard:
>   	sctp_sf_pdiscard(ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
> @@ -4757,6 +4775,7 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
>   	 */
>   	struct sctp_chunk *abort = arg;
>   	sctp_disposition_t retval;
> +	struct net *net;
>
>   	retval = SCTP_DISPOSITION_CONSUME;
>
> @@ -4772,8 +4791,9 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   			SCTP_PERR(SCTP_ERROR_USER_ABORT));
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	return retval;
>   }
> @@ -4824,13 +4844,15 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_shutdown(
>   	void *arg,
>   	sctp_cmd_seq_t *commands)
>   {
> +	struct net *net = sock_net(asoc->base.sk);
> +
>   	sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
>   			SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
>
> -	SCTP_INC_STATS(SCTP_MIB_SHUTDOWNS);
> +	SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL());
>
> @@ -4886,6 +4908,7 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
>   {
>   	struct sctp_chunk *abort = arg;
>   	sctp_disposition_t retval;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	/* Stop T1-init timer */
>   	sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
> @@ -4897,7 +4920,7 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
>
>   	/* Even if we can't send the ABORT due to low memory delete the
>   	 * TCB.  This is a departure from our typical NOMEM handling.
> @@ -5318,8 +5341,9 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
>   					sctp_cmd_seq_t *commands)
>   {
>   	struct sctp_transport *transport = arg;
> +	struct net *net = sock_net(asoc->base.sk);
>
> -	SCTP_INC_STATS(SCTP_MIB_T3_RTX_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T3_RTX_EXPIREDS);
>
>   	if (asoc->overall_error_count >= asoc->max_retrans) {
>   		if (asoc->state = SCTP_STATE_SHUTDOWN_PENDING) {
> @@ -5340,8 +5364,8 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
>   			/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
>   			sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   					SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -			SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -			SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +			SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +			SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   			return SCTP_DISPOSITION_DELETE_TCB;
>   		}
>   	}
> @@ -5403,7 +5427,8 @@ sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
>   				       void *arg,
>   				       sctp_cmd_seq_t *commands)
>   {
> -	SCTP_INC_STATS(SCTP_MIB_DELAY_SACK_EXPIREDS);
> +	struct net *net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_DELAY_SACK_EXPIREDS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE());
>   	return SCTP_DISPOSITION_CONSUME;
>   }
> @@ -5436,9 +5461,10 @@ sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
>   	struct sctp_chunk *repl = NULL;
>   	struct sctp_bind_addr *bp;
>   	int attempts = asoc->init_err_counter + 1;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
> -	SCTP_INC_STATS(SCTP_MIB_T1_INIT_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T1_INIT_EXPIREDS);
>
>   	if (attempts <= asoc->max_init_attempts) {
>   		bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
> @@ -5496,9 +5522,10 @@ sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep
>   {
>   	struct sctp_chunk *repl = NULL;
>   	int attempts = asoc->init_err_counter + 1;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
> -	SCTP_INC_STATS(SCTP_MIB_T1_COOKIE_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T1_COOKIE_EXPIREDS);
>
>   	if (attempts <= asoc->max_init_attempts) {
>   		repl = sctp_make_cookie_echo(asoc, NULL);
> @@ -5543,9 +5570,10 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep,
>   					   sctp_cmd_seq_t *commands)
>   {
>   	struct sctp_chunk *reply = NULL;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T2 expired.\n");
> -	SCTP_INC_STATS(SCTP_MIB_T2_SHUTDOWN_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T2_SHUTDOWN_EXPIREDS);
>
>   	((struct sctp_association *)asoc)->shutdown_retries++;
>
> @@ -5555,8 +5583,8 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep,
>   		/* Note:  CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_DELETE_TCB;
>   	}
>
> @@ -5613,8 +5641,9 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
>   {
>   	struct sctp_chunk *chunk = asoc->addip_last_asconf;
>   	struct sctp_transport *transport = chunk->transport;
> +	struct net *net = sock_net(asoc->base.sk);
>
> -	SCTP_INC_STATS(SCTP_MIB_T4_RTO_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T4_RTO_EXPIREDS);
>
>   	/* ADDIP 4.1 B1) Increment the error counters and perform path failure
>   	 * detection on the appropriate destination address as defined in
> @@ -5639,8 +5668,8 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
>   				SCTP_ERROR(ETIMEDOUT));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_ABORT;
>   	}
>
> @@ -5682,9 +5711,10 @@ sctp_disposition_t sctp_sf_t5_timer_expire(const struct sctp_endpoint *ep,
>   					   sctp_cmd_seq_t *commands)
>   {
>   	struct sctp_chunk *reply = NULL;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T5 expired.\n");
> -	SCTP_INC_STATS(SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS);
>
>   	reply = sctp_make_abort(asoc, NULL, 0);
>   	if (!reply)
> @@ -5696,8 +5726,8 @@ sctp_disposition_t sctp_sf_t5_timer_expire(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   			SCTP_PERR(SCTP_ERROR_NO_ERROR));
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	return SCTP_DISPOSITION_DELETE_TCB;
>   nomem:
> @@ -5716,9 +5746,10 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire(
>   	void *arg,
>   	sctp_cmd_seq_t *commands)
>   {
> +	struct net *net = sock_net(asoc->base.sk);
>   	int disposition;
>
> -	SCTP_INC_STATS(SCTP_MIB_AUTOCLOSE_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_AUTOCLOSE_EXPIREDS);
>
>   	/* From 9.2 Shutdown of an Association
>   	 * Upon receipt of the SHUTDOWN primitive from its upper
> @@ -5976,7 +6007,7 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
>   			sctp_packet_append_chunk(packet, err_chunk);
>   			sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   					SCTP_PACKET(packet));
> -			SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +			SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   		} else
>   			sctp_chunk_free (err_chunk);
>   	}
> @@ -5996,6 +6027,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   	__u32 tsn;
>   	struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
>   	struct sock *sk = asoc->base.sk;
> +	struct net *net;
>   	u16 ssn;
>   	u16 sid;
>   	u8 ordered = 0;
> @@ -6112,6 +6144,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   	 * No User Data:  This error cause is returned to the originator of a
>   	 * DATA chunk if a received DATA chunk has no user data.
>   	 */
> +	net = sock_net(sk);
>   	if (unlikely(0 = datalen)) {
>   		err = sctp_make_abort_no_data(asoc, chunk, tsn);
>   		if (err) {
> @@ -6126,8 +6159,8 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   				SCTP_ERROR(ECONNABORTED));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_DATA));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_IERROR_NO_DATA;
>   	}
>
> @@ -6137,9 +6170,9 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   	 * if we renege and the chunk arrives again.
>   	 */
>   	if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
> -		SCTP_INC_STATS(SCTP_MIB_INUNORDERCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_INUNORDERCHUNKS);
>   	else {
> -		SCTP_INC_STATS(SCTP_MIB_INORDERCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_INORDERCHUNKS);
>   		ordered = 1;
>   	}
>
> diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c
> index f5a6a4f..360d869 100644
> --- a/net/sctp/ulpqueue.c
> +++ b/net/sctp/ulpqueue.c
> @@ -326,7 +326,9 @@ static void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
>    * payload was fragmented on the way and ip had to reassemble them.
>    * We add the rest of skb's to the first skb's fraglist.
>    */
> -static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *queue, struct sk_buff *f_frag, struct sk_buff *l_frag)
> +static struct sctp_ulpevent *sctp_make_reassembled_event(struct net *net,
> +	struct sk_buff_head *queue, struct sk_buff *f_frag,
> +	struct sk_buff *l_frag)
>   {
>   	struct sk_buff *pos;
>   	struct sk_buff *new = NULL;
> @@ -394,7 +396,7 @@ static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *qu
>   	}
>
>   	event = sctp_skb2event(f_frag);
> -	SCTP_INC_STATS(SCTP_MIB_REASMUSRMSGS);
> +	SCTP_INC_STATS(net, SCTP_MIB_REASMUSRMSGS);
>
>   	return event;
>   }
> @@ -493,7 +495,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ul
>   		cevent = sctp_skb2event(pd_first);
>   		pd_point = sctp_sk(asoc->base.sk)->pd_point;
>   		if (pd_point && pd_point <= pd_len) {
> -			retval = sctp_make_reassembled_event(&ulpq->reasm,
> +			retval = sctp_make_reassembled_event(sock_net(asoc->base.sk),
> +							     &ulpq->reasm,
>   							     pd_first,
>   							     pd_last);
>   			if (retval)
> @@ -503,7 +506,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ul
>   done:
>   	return retval;
>   found:
> -	retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, pos);
> +	retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
> +					     &ulpq->reasm, first_frag, pos);
>   	if (retval)
>   		retval->msg_flags |= MSG_EOR;
>   	goto done;
> @@ -563,7 +567,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq)
>   	 * further.
>   	 */
>   done:
> -	retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag);
> +	retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
> +					&ulpq->reasm, first_frag, last_frag);
>   	if (retval && is_last)
>   		retval->msg_flags |= MSG_EOR;
>
> @@ -655,7 +660,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq)
>   	 * further.
>   	 */
>   done:
> -	retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag);
> +	retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
> +					&ulpq->reasm, first_frag, last_frag);
>   	return retval;
>   }
>
>


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 9/9] sctp: Make the mib per network namespace
Date: Tue, 14 Aug 2012 23:20:33 -0400	[thread overview]
Message-ID: <502B1581.7080506@gmail.com> (raw)
In-Reply-To: <87lihroo10.fsf_-_@xmission.com>

On 08/06/2012 02:47 PM, Eric W. Biederman wrote:
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>

Acked-by: Vlad Yasevich <vyasevich@gmail.com>
> ---
>   include/net/netns/sctp.h |    3 +
>   include/net/sctp/sctp.h  |    9 +--
>   net/sctp/associola.c     |    2 +-
>   net/sctp/chunk.c         |    2 +-
>   net/sctp/endpointola.c   |    2 +-
>   net/sctp/input.c         |   22 +++---
>   net/sctp/ipv6.c          |    4 +-
>   net/sctp/output.c        |    2 +-
>   net/sctp/outqueue.c      |   18 +++--
>   net/sctp/proc.c          |    5 +-
>   net/sctp/protocol.c      |   27 ++++----
>   net/sctp/sm_statefuns.c  |  163 +++++++++++++++++++++++++++------------------
>   net/sctp/ulpqueue.c      |   18 ++++--
>   13 files changed, 158 insertions(+), 119 deletions(-)
>
> diff --git a/include/net/netns/sctp.h b/include/net/netns/sctp.h
> index 9c20a82..06ccddf 100644
> --- a/include/net/netns/sctp.h
> +++ b/include/net/netns/sctp.h
> @@ -3,8 +3,11 @@
>
>   struct sock;
>   struct proc_dir_entry;
> +struct sctp_mib;
>
>   struct netns_sctp {
> +	DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics);
> +
>   #ifdef CONFIG_PROC_FS
>   	struct proc_dir_entry *proc_net_sctp;
>   #endif
> diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
> index ca716da..b0e6fe5 100644
> --- a/include/net/sctp/sctp.h
> +++ b/include/net/sctp/sctp.h
> @@ -221,11 +221,10 @@ extern struct kmem_cache *sctp_bucket_cachep __read_mostly;
>   #define sctp_bh_unlock_sock(sk)  bh_unlock_sock(sk)
>
>   /* SCTP SNMP MIB stats handlers */
> -DECLARE_SNMP_STAT(struct sctp_mib, sctp_statistics);
> -#define SCTP_INC_STATS(field)      SNMP_INC_STATS(sctp_statistics, field)
> -#define SCTP_INC_STATS_BH(field)   SNMP_INC_STATS_BH(sctp_statistics, field)
> -#define SCTP_INC_STATS_USER(field) SNMP_INC_STATS_USER(sctp_statistics, field)
> -#define SCTP_DEC_STATS(field)      SNMP_DEC_STATS(sctp_statistics, field)
> +#define SCTP_INC_STATS(net, field)      SNMP_INC_STATS((net)->sctp.sctp_statistics, field)
> +#define SCTP_INC_STATS_BH(net, field)   SNMP_INC_STATS_BH((net)->sctp.sctp_statistics, field)
> +#define SCTP_INC_STATS_USER(net, field) SNMP_INC_STATS_USER((net)->sctp.sctp_statistics, field)
> +#define SCTP_DEC_STATS(net, field)      SNMP_DEC_STATS((net)->sctp.sctp_statistics, field)
>
>   #endif /* !TEST_FRAME */
>
> diff --git a/net/sctp/associola.c b/net/sctp/associola.c
> index ed4930b..8a1f27a 100644
> --- a/net/sctp/associola.c
> +++ b/net/sctp/associola.c
> @@ -1150,7 +1150,7 @@ static void sctp_assoc_bh_rcv(struct work_struct *work)
>   		if (sctp_chunk_is_data(chunk))
>   			asoc->peer.last_data_from = chunk->transport;
>   		else
> -			SCTP_INC_STATS(SCTP_MIB_INCTRLCHUNKS);
> +			SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_INCTRLCHUNKS);
>
>   		if (chunk->transport)
>   			chunk->transport->last_time_heard = jiffies;
> diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c
> index 6c85564..7c2df9c 100644
> --- a/net/sctp/chunk.c
> +++ b/net/sctp/chunk.c
> @@ -257,7 +257,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc,
>   	offset = 0;
>
>   	if ((whole > 1) || (whole && over))
> -		SCTP_INC_STATS_USER(SCTP_MIB_FRAGUSRMSGS);
> +		SCTP_INC_STATS_USER(sock_net(asoc->base.sk), SCTP_MIB_FRAGUSRMSGS);
>
>   	/* Create chunks for all the full sized DATA chunks. */
>   	for (i=0, len=first_len; i < whole; i++) {
> diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c
> index 6b76393..3edca80 100644
> --- a/net/sctp/endpointola.c
> +++ b/net/sctp/endpointola.c
> @@ -478,7 +478,7 @@ normal:
>   		if (asoc && sctp_chunk_is_data(chunk))
>   			asoc->peer.last_data_from = chunk->transport;
>   		else
> -			SCTP_INC_STATS(SCTP_MIB_INCTRLCHUNKS);
> +			SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_INCTRLCHUNKS);
>
>   		if (chunk->transport)
>   			chunk->transport->last_time_heard = jiffies;
> diff --git a/net/sctp/input.c b/net/sctp/input.c
> index c9a0449..5308301 100644
> --- a/net/sctp/input.c
> +++ b/net/sctp/input.c
> @@ -83,7 +83,7 @@ static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb);
>
>
>   /* Calculate the SCTP checksum of an SCTP packet.  */
> -static inline int sctp_rcv_checksum(struct sk_buff *skb)
> +static inline int sctp_rcv_checksum(struct net *net, struct sk_buff *skb)
>   {
>   	struct sctphdr *sh = sctp_hdr(skb);
>   	__le32 cmp = sh->checksum;
> @@ -99,7 +99,7 @@ static inline int sctp_rcv_checksum(struct sk_buff *skb)
>
>   	if (val != cmp) {
>   		/* CRC failure, dump it. */
> -		SCTP_INC_STATS_BH(SCTP_MIB_CHECKSUMERRORS);
> +		SCTP_INC_STATS_BH(net, SCTP_MIB_CHECKSUMERRORS);
>   		return -1;
>   	}
>   	return 0;
> @@ -137,7 +137,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	if (skb->pkt_type!=PACKET_HOST)
>   		goto discard_it;
>
> -	SCTP_INC_STATS_BH(SCTP_MIB_INSCTPPACKS);
> +	SCTP_INC_STATS_BH(net, SCTP_MIB_INSCTPPACKS);
>
>   	if (skb_linearize(skb))
>   		goto discard_it;
> @@ -149,7 +149,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	if (skb->len < sizeof(struct sctphdr))
>   		goto discard_it;
>   	if (!sctp_checksum_disable && !skb_csum_unnecessary(skb) &&
> -		  sctp_rcv_checksum(skb) < 0)
> +		  sctp_rcv_checksum(net, skb) < 0)
>   		goto discard_it;
>
>   	skb_pull(skb, sizeof(struct sctphdr));
> @@ -220,7 +220,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	 */
>   	if (!asoc) {
>   		if (sctp_rcv_ootb(skb)) {
> -			SCTP_INC_STATS_BH(SCTP_MIB_OUTOFBLUES);
> +			SCTP_INC_STATS_BH(net, SCTP_MIB_OUTOFBLUES);
>   			goto discard_release;
>   		}
>   	}
> @@ -276,9 +276,9 @@ int sctp_rcv(struct sk_buff *skb)
>   			skb = NULL; /* sctp_chunk_free already freed the skb */
>   			goto discard_release;
>   		}
> -		SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG);
> +		SCTP_INC_STATS_BH(net, SCTP_MIB_IN_PKT_BACKLOG);
>   	} else {
> -		SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_SOFTIRQ);
> +		SCTP_INC_STATS_BH(net, SCTP_MIB_IN_PKT_SOFTIRQ);
>   		sctp_inq_push(&chunk->rcvr->inqueue, chunk);
>   	}
>
> @@ -293,7 +293,7 @@ int sctp_rcv(struct sk_buff *skb)
>   	return 0;
>
>   discard_it:
> -	SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_DISCARDS);
> +	SCTP_INC_STATS_BH(net, SCTP_MIB_IN_PKT_DISCARDS);
>   	kfree_skb(skb);
>   	return 0;
>
> @@ -543,7 +543,7 @@ struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *skb,
>   	 * servers this needs to be solved differently.
>   	 */
>   	if (sock_owned_by_user(sk))
> -		NET_INC_STATS_BH(&init_net, LINUX_MIB_LOCKDROPPEDICMPS);
> +		NET_INC_STATS_BH(net, LINUX_MIB_LOCKDROPPEDICMPS);
>
>   	*app = asoc;
>   	*tpp = transport;
> @@ -593,7 +593,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)
>   	struct net *net = dev_net(skb->dev);
>
>   	if (skb->len < ihlen + 8) {
> -		ICMP_INC_STATS_BH(&init_net, ICMP_MIB_INERRORS);
> +		ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
>   		return;
>   	}
>
> @@ -607,7 +607,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)
>   	skb->network_header = saveip;
>   	skb->transport_header = savesctp;
>   	if (!sk) {
> -		ICMP_INC_STATS_BH(&init_net, ICMP_MIB_INERRORS);
> +		ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS);
>   		return;
>   	}
>   	/* Warning:  The sock lock is held.  Remember to call
> diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
> index a18cda6..ea14cb4 100644
> --- a/net/sctp/ipv6.c
> +++ b/net/sctp/ipv6.c
> @@ -169,7 +169,7 @@ SCTP_STATIC void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
>   	skb->network_header   = saveip;
>   	skb->transport_header = savesctp;
>   	if (!sk) {
> -		ICMP6_INC_STATS_BH(dev_net(skb->dev), idev, ICMP6_MIB_INERRORS);
> +		ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_INERRORS);
>   		goto out;
>   	}
>
> @@ -243,7 +243,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport)
>   			  __func__, skb, skb->len,
>   			  &fl6.saddr, &fl6.daddr);
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
> +	SCTP_INC_STATS(sock_net(sk), SCTP_MIB_OUTSCTPPACKS);
>
>   	if (!(transport->param_flags & SPP_PMTUD_ENABLE))
>   		skb->local_df = 1;
> diff --git a/net/sctp/output.c b/net/sctp/output.c
> index 838e18b..0c6359b 100644
> --- a/net/sctp/output.c
> +++ b/net/sctp/output.c
> @@ -597,7 +597,7 @@ out:
>   	return err;
>   no_route:
>   	kfree_skb(nskb);
> -	IP_INC_STATS_BH(&init_net, IPSTATS_MIB_OUTNOROUTES);
> +	IP_INC_STATS_BH(sock_net(asoc->base.sk), IPSTATS_MIB_OUTNOROUTES);
>
>   	/* FIXME: Returning the 'err' will effect all the associations
>   	 * associated with a socket, although only one of the paths of the
> diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
> index e7aa177c..072bf6a 100644
> --- a/net/sctp/outqueue.c
> +++ b/net/sctp/outqueue.c
> @@ -299,6 +299,7 @@ void sctp_outq_free(struct sctp_outq *q)
>   /* Put a new chunk in an sctp_outq.  */
>   int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk)
>   {
> +	struct net *net = sock_net(q->asoc->base.sk);
>   	int error = 0;
>
>   	SCTP_DEBUG_PRINTK("sctp_outq_tail(%p, %p[%s])\n",
> @@ -337,15 +338,15 @@ int sctp_outq_tail(struct sctp_outq *q, struct sctp_chunk *chunk)
>
>   			sctp_outq_tail_data(q, chunk);
>   			if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
> -				SCTP_INC_STATS(SCTP_MIB_OUTUNORDERCHUNKS);
> +				SCTP_INC_STATS(net, SCTP_MIB_OUTUNORDERCHUNKS);
>   			else
> -				SCTP_INC_STATS(SCTP_MIB_OUTORDERCHUNKS);
> +				SCTP_INC_STATS(net, SCTP_MIB_OUTORDERCHUNKS);
>   			q->empty = 0;
>   			break;
>   		}
>   	} else {
>   		list_add_tail(&chunk->list, &q->control_chunk_list);
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   	}
>
>   	if (error < 0)
> @@ -478,11 +479,12 @@ void sctp_retransmit_mark(struct sctp_outq *q,
>   void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport,
>   		     sctp_retransmit_reason_t reason)
>   {
> +	struct net *net = sock_net(q->asoc->base.sk);
>   	int error = 0;
>
>   	switch(reason) {
>   	case SCTP_RTXR_T3_RTX:
> -		SCTP_INC_STATS(SCTP_MIB_T3_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_T3_RETRANSMITS);
>   		sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_T3_RTX);
>   		/* Update the retran path if the T3-rtx timer has expired for
>   		 * the current retran path.
> @@ -493,15 +495,15 @@ void sctp_retransmit(struct sctp_outq *q, struct sctp_transport *transport,
>   			transport->asoc->unack_data;
>   		break;
>   	case SCTP_RTXR_FAST_RTX:
> -		SCTP_INC_STATS(SCTP_MIB_FAST_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_FAST_RETRANSMITS);
>   		sctp_transport_lower_cwnd(transport, SCTP_LOWER_CWND_FAST_RTX);
>   		q->fast_rtx = 1;
>   		break;
>   	case SCTP_RTXR_PMTUD:
> -		SCTP_INC_STATS(SCTP_MIB_PMTUD_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_PMTUD_RETRANSMITS);
>   		break;
>   	case SCTP_RTXR_T1_RTX:
> -		SCTP_INC_STATS(SCTP_MIB_T1_RETRANSMITS);
> +		SCTP_INC_STATS(net, SCTP_MIB_T1_RETRANSMITS);
>   		transport->asoc->init_retries++;
>   		break;
>   	default:
> @@ -1914,6 +1916,6 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
>
>   	if (ftsn_chunk) {
>   		list_add_tail(&ftsn_chunk->list, &q->control_chunk_list);
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
>   	}
>   }
> diff --git a/net/sctp/proc.c b/net/sctp/proc.c
> index dc79a3a..3e62ee5 100644
> --- a/net/sctp/proc.c
> +++ b/net/sctp/proc.c
> @@ -83,12 +83,9 @@ static int sctp_snmp_seq_show(struct seq_file *seq, void *v)
>   	struct net *net = seq->private;
>   	int i;
>
> -	if (!net_eq(net, &init_net))
> -		return 0;
> -
>   	for (i = 0; sctp_snmp_list[i].name != NULL; i++)
>   		seq_printf(seq, "%-32s\t%ld\n", sctp_snmp_list[i].name,
> -			   snmp_fold_field((void __percpu **)sctp_statistics,
> +			   snmp_fold_field((void __percpu **)net->sctp.sctp_statistics,
>   				      sctp_snmp_list[i].entry));
>
>   	return 0;
> diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
> index ab35691..69bdc72 100644
> --- a/net/sctp/protocol.c
> +++ b/net/sctp/protocol.c
> @@ -69,7 +69,6 @@
>
>   /* Global data structures. */
>   struct sctp_globals sctp_globals __read_mostly;
> -DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics) __read_mostly;
>
>   struct idr sctp_assocs_id;
>   DEFINE_SPINLOCK(sctp_assocs_id_lock);
> @@ -961,7 +960,7 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
>   	inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ?
>   			 IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
> +	SCTP_INC_STATS(sock_net(&inet->sk), SCTP_MIB_OUTSCTPPACKS);
>   	return ip_queue_xmit(skb, &transport->fl);
>   }
>
> @@ -1102,16 +1101,16 @@ int sctp_register_pf(struct sctp_pf *pf, sa_family_t family)
>   	return 1;
>   }
>
> -static inline int init_sctp_mibs(void)
> +static inline int init_sctp_mibs(struct net *net)
>   {
> -	return snmp_mib_init((void __percpu **)sctp_statistics,
> +	return snmp_mib_init((void __percpu **)net->sctp.sctp_statistics,
>   			     sizeof(struct sctp_mib),
>   			     __alignof__(struct sctp_mib));
>   }
>
> -static inline void cleanup_sctp_mibs(void)
> +static inline void cleanup_sctp_mibs(struct net *net)
>   {
> -	snmp_mib_free((void __percpu **)sctp_statistics);
> +	snmp_mib_free((void __percpu **)net->sctp.sctp_statistics);
>   }
>
>   static void sctp_v4_pf_init(void)
> @@ -1170,6 +1169,11 @@ static int sctp_net_init(struct net *net)
>   {
>   	int status;
>
> +	/* Allocate and initialise sctp mibs.  */
> +	status = init_sctp_mibs(net);
> +	if (status)
> +		goto err_init_mibs;
> +
>   	/* Initialize proc fs directory.  */
>   	status = sctp_proc_init(net);
>   	if (status)
> @@ -1199,6 +1203,8 @@ static int sctp_net_init(struct net *net)
>   err_ctl_sock_init:
>   	sctp_proc_exit(net);
>   err_init_proc:
> +	cleanup_sctp_mibs(net);
> +err_init_mibs:
>   	return status;
>   }
>
> @@ -1212,6 +1218,7 @@ static void sctp_net_exit(struct net *net)
>   	inet_ctl_sock_destroy(net->sctp.ctl_sock);
>
>   	sctp_proc_exit(net);
> +	cleanup_sctp_mibs(net);
>   }
>
>   static struct pernet_operations sctp_net_ops = {
> @@ -1249,11 +1256,6 @@ SCTP_STATIC __init int sctp_init(void)
>   	if (!sctp_chunk_cachep)
>   		goto err_chunk_cachep;
>
> -	/* Allocate and initialise sctp mibs.  */
> -	status = init_sctp_mibs();
> -	if (status)
> -		goto err_init_mibs;
> -
>   	status = percpu_counter_init(&sctp_sockets_allocated, 0);
>   	if (status)
>   		goto err_percpu_counter_init;
> @@ -1473,8 +1475,6 @@ err_ahash_alloc:
>   	sctp_dbg_objcnt_exit();
>   	percpu_counter_destroy(&sctp_sockets_allocated);
>   err_percpu_counter_init:
> -	cleanup_sctp_mibs();
> -err_init_mibs:
>   	kmem_cache_destroy(sctp_chunk_cachep);
>   err_chunk_cachep:
>   	kmem_cache_destroy(sctp_bucket_cachep);
> @@ -1514,7 +1514,6 @@ SCTP_STATIC __exit void sctp_exit(void)
>
>   	sctp_dbg_objcnt_exit();
>   	percpu_counter_destroy(&sctp_sockets_allocated);
> -	cleanup_sctp_mibs();
>
>   	rcu_barrier(); /* Wait for completion of call_rcu()'s */
>
> diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
> index f2daf61..bee5e2c 100644
> --- a/net/sctp/sm_statefuns.c
> +++ b/net/sctp/sm_statefuns.c
> @@ -213,6 +213,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
>   {
>   	struct sctp_chunk *chunk = arg;
>   	struct sctp_ulpevent *ev;
> +	struct net *net;
>
>   	if (!sctp_vtag_verify_either(chunk, asoc))
>   		return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
> @@ -260,8 +261,9 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
>
> -	SCTP_INC_STATS(SCTP_MIB_SHUTDOWNS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL());
>
> @@ -322,7 +324,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
>   	 */
>   	net = sock_net(ep->base.sk);
>   	if (ep == sctp_sk(net->sctp.ctl_sock)->ep) {
> -		SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
>   		return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
>   	}
>
> @@ -369,7 +371,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
>   			if (packet) {
>   				sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   						SCTP_PACKET(packet));
> -				SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +				SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   				return SCTP_DISPOSITION_CONSUME;
>   			} else {
>   				return SCTP_DISPOSITION_NOMEM;
> @@ -540,7 +542,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
>   			if (packet) {
>   				sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   						SCTP_PACKET(packet));
> -				SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +				SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
>   				error = SCTP_ERROR_INV_PARAM;
>   			}
>   		}
> @@ -559,7 +561,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(const struct sctp_endpoint *ep,
>   		if (sctp_auth_recv_cid(SCTP_CID_ABORT, asoc))
>   			return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
>
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +		SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_ABORTEDS);
>   		return sctp_stop_t1_and_abort(commands, error, ECONNREFUSED,
>   						asoc, chunk->transport);
>   	}
> @@ -656,7 +658,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
>   	 */
>   	net = sock_net(ep->base.sk);
>   	if (ep == sctp_sk(net->sctp.ctl_sock)->ep) {
> -		SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
>   		return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
>   	}
>
> @@ -809,8 +811,8 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -	SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> -	SCTP_INC_STATS(SCTP_MIB_PASSIVEESTABS);
> +	SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_PASSIVEESTABS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
>
>   	if (new_asoc->autoclose)
> @@ -868,6 +870,7 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep,
>   {
>   	struct sctp_chunk *chunk = arg;
>   	struct sctp_ulpevent *ev;
> +	struct net *net;
>
>   	if (!sctp_vtag_verify(chunk, asoc))
>   		return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
> @@ -897,8 +900,9 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(const struct sctp_endpoint *ep,
>   			SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -	SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> -	SCTP_INC_STATS(SCTP_MIB_ACTIVEESTABS);
> +	net = sock_net(ep->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_ACTIVEESTABS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
>   	if (asoc->autoclose)
>   		sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START,
> @@ -972,13 +976,15 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
>   	struct sctp_transport *transport = (struct sctp_transport *) arg;
>
>   	if (asoc->overall_error_count >= asoc->max_retrans) {
> +		struct net *net;
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
>   				SCTP_ERROR(ETIMEDOUT));
>   		/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		net = sock_net(ep->base.sk);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_DELETE_TCB;
>   	}
>
> @@ -1213,7 +1219,7 @@ static int sctp_sf_send_restart_abort(struct net *net, union sctp_addr *ssa,
>   		goto out;
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT, SCTP_PACKET(pkt));
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +	SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   	/* Discard the rest of the inbound packet. */
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
> @@ -1427,7 +1433,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
>   			if (packet) {
>   				sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   						SCTP_PACKET(packet));
> -				SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +				SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTCTRLCHUNKS);
>   				retval = SCTP_DISPOSITION_CONSUME;
>   			} else {
>   				retval = SCTP_DISPOSITION_NOMEM;
> @@ -1791,7 +1797,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -	SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(sock_net(new_asoc->base.sk), SCTP_MIB_CURRESTAB);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START, SCTP_NULL());
>
>   	repl = sctp_make_cookie_ack(new_asoc, chunk);
> @@ -1883,7 +1889,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
>   				SCTP_TO(SCTP_EVENT_TIMEOUT_T1_COOKIE));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   				SCTP_STATE(SCTP_STATE_ESTABLISHED));
> -		SCTP_INC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_CURRESTAB);
>   		sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_START,
>   				SCTP_NULL());
>
> @@ -2417,6 +2423,7 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
>   	struct sctp_chunk *chunk = arg;
>   	unsigned int len;
>   	__be16 error = SCTP_ERROR_NO_ERROR;
> +	struct net *net;
>
>   	/* See if we have an error cause code in the chunk.  */
>   	len = ntohs(chunk->chunk_hdr->length);
> @@ -2433,8 +2440,9 @@ static sctp_disposition_t __sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET));
>   	/* ASSOC_FAILED will DELETE_TCB. */
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error));
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(ep->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	return SCTP_DISPOSITION_ABORT;
>   }
> @@ -2521,7 +2529,7 @@ static sctp_disposition_t sctp_stop_t1_and_abort(sctp_cmd_seq_t *commands,
>   	SCTP_DEBUG_PRINTK("ABORT received (INIT).\n");
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_ABORTEDS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
>   			SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(sk_err));
> @@ -2904,11 +2912,11 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
>   		break;
>   	case SCTP_IERROR_HIGH_TSN:
>   	case SCTP_IERROR_BAD_STREAM:
> -		SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
>   		goto discard_noforce;
>   	case SCTP_IERROR_DUP_TSN:
>   	case SCTP_IERROR_IGNORE_TSN:
> -		SCTP_INC_STATS(SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
> +		SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_DATA_CHUNK_DISCARDS);
>   		goto discard_force;
>   	case SCTP_IERROR_NO_DATA:
>   		goto consume;
> @@ -3197,7 +3205,7 @@ static sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   				SCTP_PACKET(packet));
>
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   		sctp_sf_pdiscard(ep, asoc, type, arg, commands);
>   		return SCTP_DISPOSITION_CONSUME;
> @@ -3260,6 +3268,7 @@ sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep,
>   	struct sctp_chunk *chunk = arg;
>   	struct sctp_chunk *reply;
>   	struct sctp_ulpevent *ev;
> +	struct net *net;
>
>   	if (!sctp_vtag_verify(chunk, asoc))
>   		return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
> @@ -3299,8 +3308,9 @@ sctp_disposition_t sctp_sf_do_9_2_final(const struct sctp_endpoint *ep,
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
> -	SCTP_INC_STATS(SCTP_MIB_SHUTDOWNS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(reply));
>
>   	/* ...and remove all record of the association. */
> @@ -3346,8 +3356,10 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
>   	__u8 *ch_end;
>   	int ootb_shut_ack = 0;
>   	int ootb_cookie_ack = 0;
> +	struct net *net;
>
> -	SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
>
>   	ch = (sctp_chunkhdr_t *) chunk->chunk_hdr;
>   	do {
> @@ -3461,7 +3473,7 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   				SCTP_PACKET(packet));
>
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   		/* If the chunk length is invalid, we don't want to process
>   		 * the reset of the packet.
> @@ -3508,7 +3520,7 @@ sctp_disposition_t sctp_sf_do_8_5_1_E_sa(const struct sctp_endpoint *ep,
>   	 * packet and the state function that handles OOTB SHUTDOWN_ACK is
>   	 * called with a NULL association.
>   	 */
> -	SCTP_INC_STATS(SCTP_MIB_OUTOFBLUES);
> +	SCTP_INC_STATS(sock_net(ep->base.sk), SCTP_MIB_OUTOFBLUES);
>
>   	return sctp_sf_shut_8_4_5(ep, NULL, type, arg, commands);
>   }
> @@ -3699,6 +3711,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
>   	 */
>   	if (ADDIP_SERIAL_gte(rcvd_serial, sent_serial + 1) &&
>   	    !(asoc->addip_last_asconf)) {
> +		struct net *net;
>   		abort = sctp_make_abort(asoc, asconf_ack,
>   					sizeof(sctp_errhdr_t));
>   		if (abort) {
> @@ -3716,12 +3729,14 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
>   				SCTP_ERROR(ECONNABORTED));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		net = sock_net(asoc->base.sk);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_ABORT;
>   	}
>
>   	if ((rcvd_serial == sent_serial) && asoc->addip_last_asconf) {
> +		struct net *net;
>   		sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
>   				SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
>
> @@ -3750,8 +3765,9 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
>   				SCTP_ERROR(ECONNABORTED));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		net = sock_net(asoc->base.sk);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_ABORT;
>   	}
>
> @@ -4222,7 +4238,7 @@ sctp_disposition_t sctp_sf_pdiscard(const struct sctp_endpoint *ep,
>   				    void *arg,
>   				    sctp_cmd_seq_t *commands)
>   {
> -	SCTP_INC_STATS(SCTP_MIB_IN_PKT_DISCARDS);
> +	SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_IN_PKT_DISCARDS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
>
>   	return SCTP_DISPOSITION_CONSUME;
> @@ -4315,7 +4331,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
>   		}
>
>   		sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   		if (asoc->state <= SCTP_STATE_COOKIE_ECHOED) {
>   			sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
> @@ -4329,7 +4345,7 @@ static sctp_disposition_t sctp_sf_abort_violation(
>   					SCTP_ERROR(ECONNABORTED));
>   			sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   					SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
> -			SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +			SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		}
>   	} else {
>   		packet = sctp_ootb_pkt_new(net, asoc, chunk);
> @@ -4347,10 +4363,10 @@ static sctp_disposition_t sctp_sf_abort_violation(
>   		sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   			SCTP_PACKET(packet));
>
> -		SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   	}
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
>
>   discard:
>   	sctp_sf_pdiscard(ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
> @@ -4410,6 +4426,7 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
>   	struct sctp_chunk *chunk =  arg;
>   	struct sctp_paramhdr *param = ext;
>   	struct sctp_chunk *abort = NULL;
> +	struct net *net;
>
>   	if (sctp_auth_recv_cid(SCTP_CID_ABORT, asoc))
>   		goto discard;
> @@ -4419,15 +4436,16 @@ static sctp_disposition_t sctp_sf_violation_paramlen(
>   	if (!abort)
>   		goto nomem;
>
> +	net = sock_net(asoc->base.sk);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
> -	SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +	SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
>   			SCTP_ERROR(ECONNABORTED));
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   			SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
>
>   discard:
>   	sctp_sf_pdiscard(ep, asoc, SCTP_ST_CHUNK(0), arg, commands);
> @@ -4757,6 +4775,7 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
>   	 */
>   	struct sctp_chunk *abort = arg;
>   	sctp_disposition_t retval;
> +	struct net *net;
>
>   	retval = SCTP_DISPOSITION_CONSUME;
>
> @@ -4772,8 +4791,9 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   			SCTP_PERR(SCTP_ERROR_USER_ABORT));
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	return retval;
>   }
> @@ -4824,13 +4844,15 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_shutdown(
>   	void *arg,
>   	sctp_cmd_seq_t *commands)
>   {
> +	struct net *net = sock_net(asoc->base.sk);
> +
>   	sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
>   			SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
>
> -	SCTP_INC_STATS(SCTP_MIB_SHUTDOWNS);
> +	SCTP_INC_STATS(net, SCTP_MIB_SHUTDOWNS);
>
>   	sctp_add_cmd_sf(commands, SCTP_CMD_DELETE_TCB, SCTP_NULL());
>
> @@ -4886,6 +4908,7 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
>   {
>   	struct sctp_chunk *abort = arg;
>   	sctp_disposition_t retval;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	/* Stop T1-init timer */
>   	sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
> @@ -4897,7 +4920,7 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
>   	sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
>   			SCTP_STATE(SCTP_STATE_CLOSED));
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
>
>   	/* Even if we can't send the ABORT due to low memory delete the
>   	 * TCB.  This is a departure from our typical NOMEM handling.
> @@ -5318,8 +5341,9 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
>   					sctp_cmd_seq_t *commands)
>   {
>   	struct sctp_transport *transport = arg;
> +	struct net *net = sock_net(asoc->base.sk);
>
> -	SCTP_INC_STATS(SCTP_MIB_T3_RTX_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T3_RTX_EXPIREDS);
>
>   	if (asoc->overall_error_count >= asoc->max_retrans) {
>   		if (asoc->state == SCTP_STATE_SHUTDOWN_PENDING) {
> @@ -5340,8 +5364,8 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
>   			/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
>   			sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   					SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -			SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -			SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +			SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +			SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   			return SCTP_DISPOSITION_DELETE_TCB;
>   		}
>   	}
> @@ -5403,7 +5427,8 @@ sctp_disposition_t sctp_sf_do_6_2_sack(const struct sctp_endpoint *ep,
>   				       void *arg,
>   				       sctp_cmd_seq_t *commands)
>   {
> -	SCTP_INC_STATS(SCTP_MIB_DELAY_SACK_EXPIREDS);
> +	struct net *net = sock_net(asoc->base.sk);
> +	SCTP_INC_STATS(net, SCTP_MIB_DELAY_SACK_EXPIREDS);
>   	sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_FORCE());
>   	return SCTP_DISPOSITION_CONSUME;
>   }
> @@ -5436,9 +5461,10 @@ sctp_disposition_t sctp_sf_t1_init_timer_expire(const struct sctp_endpoint *ep,
>   	struct sctp_chunk *repl = NULL;
>   	struct sctp_bind_addr *bp;
>   	int attempts = asoc->init_err_counter + 1;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T1 expired (INIT).\n");
> -	SCTP_INC_STATS(SCTP_MIB_T1_INIT_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T1_INIT_EXPIREDS);
>
>   	if (attempts <= asoc->max_init_attempts) {
>   		bp = (struct sctp_bind_addr *) &asoc->base.bind_addr;
> @@ -5496,9 +5522,10 @@ sctp_disposition_t sctp_sf_t1_cookie_timer_expire(const struct sctp_endpoint *ep
>   {
>   	struct sctp_chunk *repl = NULL;
>   	int attempts = asoc->init_err_counter + 1;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T1 expired (COOKIE-ECHO).\n");
> -	SCTP_INC_STATS(SCTP_MIB_T1_COOKIE_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T1_COOKIE_EXPIREDS);
>
>   	if (attempts <= asoc->max_init_attempts) {
>   		repl = sctp_make_cookie_echo(asoc, NULL);
> @@ -5543,9 +5570,10 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep,
>   					   sctp_cmd_seq_t *commands)
>   {
>   	struct sctp_chunk *reply = NULL;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T2 expired.\n");
> -	SCTP_INC_STATS(SCTP_MIB_T2_SHUTDOWN_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T2_SHUTDOWN_EXPIREDS);
>
>   	((struct sctp_association *)asoc)->shutdown_retries++;
>
> @@ -5555,8 +5583,8 @@ sctp_disposition_t sctp_sf_t2_timer_expire(const struct sctp_endpoint *ep,
>   		/* Note:  CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_DELETE_TCB;
>   	}
>
> @@ -5613,8 +5641,9 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
>   {
>   	struct sctp_chunk *chunk = asoc->addip_last_asconf;
>   	struct sctp_transport *transport = chunk->transport;
> +	struct net *net = sock_net(asoc->base.sk);
>
> -	SCTP_INC_STATS(SCTP_MIB_T4_RTO_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T4_RTO_EXPIREDS);
>
>   	/* ADDIP 4.1 B1) Increment the error counters and perform path failure
>   	 * detection on the appropriate destination address as defined in
> @@ -5639,8 +5668,8 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
>   				SCTP_ERROR(ETIMEDOUT));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_ERROR));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_DISPOSITION_ABORT;
>   	}
>
> @@ -5682,9 +5711,10 @@ sctp_disposition_t sctp_sf_t5_timer_expire(const struct sctp_endpoint *ep,
>   					   sctp_cmd_seq_t *commands)
>   {
>   	struct sctp_chunk *reply = NULL;
> +	struct net *net = sock_net(asoc->base.sk);
>
>   	SCTP_DEBUG_PRINTK("Timer T5 expired.\n");
> -	SCTP_INC_STATS(SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS);
>
>   	reply = sctp_make_abort(asoc, NULL, 0);
>   	if (!reply)
> @@ -5696,8 +5726,8 @@ sctp_disposition_t sctp_sf_t5_timer_expire(const struct sctp_endpoint *ep,
>   	sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   			SCTP_PERR(SCTP_ERROR_NO_ERROR));
>
> -	SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -	SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +	SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +	SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>
>   	return SCTP_DISPOSITION_DELETE_TCB;
>   nomem:
> @@ -5716,9 +5746,10 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire(
>   	void *arg,
>   	sctp_cmd_seq_t *commands)
>   {
> +	struct net *net = sock_net(asoc->base.sk);
>   	int disposition;
>
> -	SCTP_INC_STATS(SCTP_MIB_AUTOCLOSE_EXPIREDS);
> +	SCTP_INC_STATS(net, SCTP_MIB_AUTOCLOSE_EXPIREDS);
>
>   	/* From 9.2 Shutdown of an Association
>   	 * Upon receipt of the SHUTDOWN primitive from its upper
> @@ -5976,7 +6007,7 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
>   			sctp_packet_append_chunk(packet, err_chunk);
>   			sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
>   					SCTP_PACKET(packet));
> -			SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS);
> +			SCTP_INC_STATS(net, SCTP_MIB_OUTCTRLCHUNKS);
>   		} else
>   			sctp_chunk_free (err_chunk);
>   	}
> @@ -5996,6 +6027,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   	__u32 tsn;
>   	struct sctp_tsnmap *map = (struct sctp_tsnmap *)&asoc->peer.tsn_map;
>   	struct sock *sk = asoc->base.sk;
> +	struct net *net;
>   	u16 ssn;
>   	u16 sid;
>   	u8 ordered = 0;
> @@ -6112,6 +6144,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   	 * No User Data:  This error cause is returned to the originator of a
>   	 * DATA chunk if a received DATA chunk has no user data.
>   	 */
> +	net = sock_net(sk);
>   	if (unlikely(0 == datalen)) {
>   		err = sctp_make_abort_no_data(asoc, chunk, tsn);
>   		if (err) {
> @@ -6126,8 +6159,8 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   				SCTP_ERROR(ECONNABORTED));
>   		sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
>   				SCTP_PERR(SCTP_ERROR_NO_DATA));
> -		SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
> -		SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
> +		SCTP_INC_STATS(net, SCTP_MIB_ABORTEDS);
> +		SCTP_DEC_STATS(net, SCTP_MIB_CURRESTAB);
>   		return SCTP_IERROR_NO_DATA;
>   	}
>
> @@ -6137,9 +6170,9 @@ static int sctp_eat_data(const struct sctp_association *asoc,
>   	 * if we renege and the chunk arrives again.
>   	 */
>   	if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED)
> -		SCTP_INC_STATS(SCTP_MIB_INUNORDERCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_INUNORDERCHUNKS);
>   	else {
> -		SCTP_INC_STATS(SCTP_MIB_INORDERCHUNKS);
> +		SCTP_INC_STATS(net, SCTP_MIB_INORDERCHUNKS);
>   		ordered = 1;
>   	}
>
> diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c
> index f5a6a4f..360d869 100644
> --- a/net/sctp/ulpqueue.c
> +++ b/net/sctp/ulpqueue.c
> @@ -326,7 +326,9 @@ static void sctp_ulpq_store_reasm(struct sctp_ulpq *ulpq,
>    * payload was fragmented on the way and ip had to reassemble them.
>    * We add the rest of skb's to the first skb's fraglist.
>    */
> -static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *queue, struct sk_buff *f_frag, struct sk_buff *l_frag)
> +static struct sctp_ulpevent *sctp_make_reassembled_event(struct net *net,
> +	struct sk_buff_head *queue, struct sk_buff *f_frag,
> +	struct sk_buff *l_frag)
>   {
>   	struct sk_buff *pos;
>   	struct sk_buff *new = NULL;
> @@ -394,7 +396,7 @@ static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *qu
>   	}
>
>   	event = sctp_skb2event(f_frag);
> -	SCTP_INC_STATS(SCTP_MIB_REASMUSRMSGS);
> +	SCTP_INC_STATS(net, SCTP_MIB_REASMUSRMSGS);
>
>   	return event;
>   }
> @@ -493,7 +495,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ul
>   		cevent = sctp_skb2event(pd_first);
>   		pd_point = sctp_sk(asoc->base.sk)->pd_point;
>   		if (pd_point && pd_point <= pd_len) {
> -			retval = sctp_make_reassembled_event(&ulpq->reasm,
> +			retval = sctp_make_reassembled_event(sock_net(asoc->base.sk),
> +							     &ulpq->reasm,
>   							     pd_first,
>   							     pd_last);
>   			if (retval)
> @@ -503,7 +506,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_reassembled(struct sctp_ulpq *ul
>   done:
>   	return retval;
>   found:
> -	retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, pos);
> +	retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
> +					     &ulpq->reasm, first_frag, pos);
>   	if (retval)
>   		retval->msg_flags |= MSG_EOR;
>   	goto done;
> @@ -563,7 +567,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_partial(struct sctp_ulpq *ulpq)
>   	 * further.
>   	 */
>   done:
> -	retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag);
> +	retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
> +					&ulpq->reasm, first_frag, last_frag);
>   	if (retval && is_last)
>   		retval->msg_flags |= MSG_EOR;
>
> @@ -655,7 +660,8 @@ static struct sctp_ulpevent *sctp_ulpq_retrieve_first(struct sctp_ulpq *ulpq)
>   	 * further.
>   	 */
>   done:
> -	retval = sctp_make_reassembled_event(&ulpq->reasm, first_frag, last_frag);
> +	retval = sctp_make_reassembled_event(sock_net(ulpq->asoc->base.sk),
> +					&ulpq->reasm, first_frag, last_frag);
>   	return retval;
>   }
>
>


  reply	other threads:[~2012-08-15  3:20 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
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 [this message]
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=502B1581.7080506@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.