Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[firefly-linux-kernel-4.4.55.git] / net / sctp / protocol.c
index 0b65354aaf64978a68836f1cb9754e4101cbc35b..c4986d0f74190bc17c8177ccd54e9bbaf36594e8 100644 (file)
@@ -102,6 +102,8 @@ struct sock *sctp_get_ctl_sock(void)
 /* Set up the proc fs entry for the SCTP protocol. */
 static __init int sctp_proc_init(void)
 {
+       if (percpu_counter_init(&sctp_sockets_allocated, 0))
+               goto out_nomem;
 #ifdef CONFIG_PROC_FS
        if (!proc_net_sctp) {
                struct proc_dir_entry *ent;
@@ -110,7 +112,7 @@ static __init int sctp_proc_init(void)
                        ent->owner = THIS_MODULE;
                        proc_net_sctp = ent;
                } else
-                       goto out_nomem;
+                       goto out_free_percpu;
        }
 
        if (sctp_snmp_proc_init())
@@ -135,11 +137,14 @@ out_snmp_proc_init:
                proc_net_sctp = NULL;
                remove_proc_entry("sctp", init_net.proc_net);
        }
-out_nomem:
-       return -ENOMEM;
+out_free_percpu:
+       percpu_counter_destroy(&sctp_sockets_allocated);
 #else
        return 0;
 #endif /* CONFIG_PROC_FS */
+
+out_nomem:
+       return -ENOMEM;
 }
 
 /* Clean up the proc fs entry for the SCTP protocol.
@@ -482,9 +487,8 @@ static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc,
        if (saddr)
                fl.fl4_src = saddr->v4.sin_addr.s_addr;
 
-       SCTP_DEBUG_PRINTK("%s: DST:%u.%u.%u.%u, SRC:%u.%u.%u.%u - ",
-                         __func__, NIPQUAD(fl.fl4_dst),
-                         NIPQUAD(fl.fl4_src));
+       SCTP_DEBUG_PRINTK("%s: DST:%pI4, SRC:%pI4 - ",
+                         __func__, &fl.fl4_dst, &fl.fl4_src);
 
        if (!ip_route_output_key(&init_net, &rt, &fl)) {
                dst = &rt->u.dst;
@@ -540,8 +544,8 @@ out_unlock:
        rcu_read_unlock();
 out:
        if (dst)
-               SCTP_DEBUG_PRINTK("rt_dst:%u.%u.%u.%u, rt_src:%u.%u.%u.%u\n",
-                                 NIPQUAD(rt->rt_dst), NIPQUAD(rt->rt_src));
+               SCTP_DEBUG_PRINTK("rt_dst:%pI4, rt_src:%pI4\n",
+                                 &rt->rt_dst, &rt->rt_src);
        else
                SCTP_DEBUG_PRINTK("NO ROUTE\n");
 
@@ -646,7 +650,7 @@ static void sctp_v4_addr_v4map(struct sctp_sock *sp, union sctp_addr *addr)
 /* Dump the v4 addr to the seq file. */
 static void sctp_v4_seq_dump_addr(struct seq_file *seq, union sctp_addr *addr)
 {
-       seq_printf(seq, "%d.%d.%d.%d ", NIPQUAD(addr->v4.sin_addr));
+       seq_printf(seq, "%pI4 ", &addr->v4.sin_addr);
 }
 
 static void sctp_v4_ecn_capable(struct sock *sk)
@@ -713,15 +717,20 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
 static int sctp_ctl_sock_init(void)
 {
        int err;
-       sa_family_t family;
+       sa_family_t family = PF_INET;
 
        if (sctp_get_pf_specific(PF_INET6))
                family = PF_INET6;
-       else
-               family = PF_INET;
 
        err = inet_ctl_sock_create(&sctp_ctl_sock, family,
                                   SOCK_SEQPACKET, IPPROTO_SCTP, &init_net);
+
+       /* If IPv6 socket could not be created, try the IPv4 socket */
+       if (err < 0 && family == PF_INET6)
+               err = inet_ctl_sock_create(&sctp_ctl_sock, AF_INET,
+                                          SOCK_SEQPACKET, IPPROTO_SCTP,
+                                          &init_net);
+
        if (err < 0) {
                printk(KERN_ERR
                       "SCTP: Failed to create the SCTP control socket.\n");
@@ -866,11 +875,10 @@ static inline int sctp_v4_xmit(struct sk_buff *skb,
 {
        struct inet_sock *inet = inet_sk(skb->sk);
 
-       SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, "
-                         "src:%u.%u.%u.%u, dst:%u.%u.%u.%u\n",
+       SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, src:%pI4, dst:%pI4\n",
                          __func__, skb, skb->len,
-                         NIPQUAD(skb->rtable->rt_src),
-                         NIPQUAD(skb->rtable->rt_dst));
+                         &skb->rtable->rt_src,
+                         &skb->rtable->rt_dst);
 
        inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ?
                         IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
@@ -1319,9 +1327,8 @@ SCTP_STATIC __init int sctp_init(void)
 out:
        return status;
 err_v6_add_protocol:
-       sctp_v6_del_protocol();
-err_add_protocol:
        sctp_v4_del_protocol();
+err_add_protocol:
        inet_ctl_sock_destroy(sctp_ctl_sock);
 err_ctl_sock_init:
        sctp_v6_protosw_exit();
@@ -1332,7 +1339,6 @@ err_protosw_init:
        sctp_v4_pf_exit();
        sctp_v6_pf_exit();
        sctp_sysctl_unregister();
-       list_del(&sctp_af_inet.list);
        free_pages((unsigned long)sctp_port_hashtable,
                   get_order(sctp_port_hashsize *
                             sizeof(struct sctp_bind_hashbucket)));
@@ -1380,7 +1386,6 @@ SCTP_STATIC __exit void sctp_exit(void)
        sctp_v4_pf_exit();
 
        sctp_sysctl_unregister();
-       list_del(&sctp_af_inet.list);
 
        free_pages((unsigned long)sctp_assoc_hashtable,
                   get_order(sctp_assoc_hashsize *