skb->nh.raw = saveip;
skb->h.raw = savesctp;
if (!sk) {
- ICMP6_INC_STATS_BH(idev, Icmp6InErrors);
+ ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INERRORS);
goto out;
}
__FUNCTION__, skb, skb->len,
NIP6(fl.fl6_src), NIP6(fl.fl6_dst));
- SCTP_INC_STATS(SctpOutSCTPPacks);
+ SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS);
return ip6_xmit(sk, skb, &fl, np->opt, ipfragok);
}
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
struct sctp6_sock *newsctp6sk;
- newsk = sk_alloc(PF_INET6, GFP_KERNEL, sizeof(struct sctp6_sock),
- sk->sk_slab);
+ newsk = sk_alloc(PF_INET6, GFP_KERNEL, sk->sk_prot->slab_obj_size,
+ sk->sk_prot->slab);
if (!newsk)
goto out;
#endif
if (newsk->sk_prot->init(newsk)) {
- inet_sock_release(newsk);
+ sk_common_release(newsk);
newsk = NULL;
}
.ioctl = inet6_ioctl,
.listen = sctp_inet_listen,
.shutdown = inet_shutdown,
- .setsockopt = inet_setsockopt,
- .getsockopt = inet_getsockopt,
+ .setsockopt = sock_common_setsockopt,
+ .getsockopt = sock_common_getsockopt,
.sendmsg = inet_sendmsg,
- .recvmsg = inet_recvmsg,
+ .recvmsg = sock_common_recvmsg,
.mmap = sock_no_mmap,
};
static struct inet_protosw sctpv6_seqpacket_protosw = {
.type = SOCK_SEQPACKET,
.protocol = IPPROTO_SCTP,
- .prot = &sctp_prot,
+ .prot = &sctpv6_prot,
.ops = &inet6_seqpacket_ops,
.capability = -1,
.no_check = 0,
static struct inet_protosw sctpv6_stream_protosw = {
.type = SOCK_STREAM,
.protocol = IPPROTO_SCTP,
- .prot = &sctp_prot,
+ .prot = &sctpv6_prot,
.ops = &inet6_seqpacket_ops,
.capability = -1,
.no_check = 0,
/* Initialize IPv6 support and register with inet6 stack. */
int sctp_v6_init(void)
{
+ int rc = sk_alloc_slab(&sctpv6_prot, "sctpv6_sock");
+
+ if (rc)
+ goto out;
/* Register inet6 protocol. */
+ rc = -EAGAIN;
if (inet6_add_protocol(&sctpv6_protocol, IPPROTO_SCTP) < 0)
- return -EAGAIN;
+ goto out_sctp_free_slab;
/* Add SCTPv6(UDP and TCP style) to inetsw6 linked list. */
inet6_register_protosw(&sctpv6_seqpacket_protosw);
/* Register notifier for inet6 address additions/deletions. */
register_inet6addr_notifier(&sctp_inetaddr_notifier);
-
- return 0;
+ rc = 0;
+out:
+ return rc;
+out_sctp_free_slab:
+ sk_free_slab(&sctpv6_prot);
+ goto out;
}
/* IPv6 specific exit support. */
inet6_unregister_protosw(&sctpv6_seqpacket_protosw);
inet6_unregister_protosw(&sctpv6_stream_protosw);
unregister_inet6addr_notifier(&sctp_inetaddr_notifier);
+ sk_free_slab(&sctpv6_prot);
}