1*1da177e4SLinus Torvalds /* SCTP kernel reference Implementation 2*1da177e4SLinus Torvalds * (C) Copyright IBM Corp. 2001, 2004 3*1da177e4SLinus Torvalds * Copyright (c) 1999-2000 Cisco, Inc. 4*1da177e4SLinus Torvalds * Copyright (c) 1999-2001 Motorola, Inc. 5*1da177e4SLinus Torvalds * Copyright (c) 2001 Intel Corp. 6*1da177e4SLinus Torvalds * Copyright (c) 2001 Nokia, Inc. 7*1da177e4SLinus Torvalds * Copyright (c) 2001 La Monte H.P. Yarroll 8*1da177e4SLinus Torvalds * 9*1da177e4SLinus Torvalds * This file is part of the SCTP kernel reference Implementation 10*1da177e4SLinus Torvalds * 11*1da177e4SLinus Torvalds * Initialization/cleanup for SCTP protocol support. 12*1da177e4SLinus Torvalds * 13*1da177e4SLinus Torvalds * The SCTP reference implementation is free software; 14*1da177e4SLinus Torvalds * you can redistribute it and/or modify it under the terms of 15*1da177e4SLinus Torvalds * the GNU General Public License as published by 16*1da177e4SLinus Torvalds * the Free Software Foundation; either version 2, or (at your option) 17*1da177e4SLinus Torvalds * any later version. 18*1da177e4SLinus Torvalds * 19*1da177e4SLinus Torvalds * The SCTP reference implementation is distributed in the hope that it 20*1da177e4SLinus Torvalds * will be useful, but WITHOUT ANY WARRANTY; without even the implied 21*1da177e4SLinus Torvalds * ************************ 22*1da177e4SLinus Torvalds * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 23*1da177e4SLinus Torvalds * See the GNU General Public License for more details. 24*1da177e4SLinus Torvalds * 25*1da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License 26*1da177e4SLinus Torvalds * along with GNU CC; see the file COPYING. If not, write to 27*1da177e4SLinus Torvalds * the Free Software Foundation, 59 Temple Place - Suite 330, 28*1da177e4SLinus Torvalds * Boston, MA 02111-1307, USA. 29*1da177e4SLinus Torvalds * 30*1da177e4SLinus Torvalds * Please send any bug reports or fixes you make to the 31*1da177e4SLinus Torvalds * email address(es): 32*1da177e4SLinus Torvalds * lksctp developers <lksctp-developers@lists.sourceforge.net> 33*1da177e4SLinus Torvalds * 34*1da177e4SLinus Torvalds * Or submit a bug report through the following website: 35*1da177e4SLinus Torvalds * http://www.sf.net/projects/lksctp 36*1da177e4SLinus Torvalds * 37*1da177e4SLinus Torvalds * Written or modified by: 38*1da177e4SLinus Torvalds * La Monte H.P. Yarroll <piggy@acm.org> 39*1da177e4SLinus Torvalds * Karl Knutson <karl@athena.chicago.il.us> 40*1da177e4SLinus Torvalds * Jon Grimm <jgrimm@us.ibm.com> 41*1da177e4SLinus Torvalds * Sridhar Samudrala <sri@us.ibm.com> 42*1da177e4SLinus Torvalds * Daisy Chang <daisyc@us.ibm.com> 43*1da177e4SLinus Torvalds * Ardelle Fan <ardelle.fan@intel.com> 44*1da177e4SLinus Torvalds * 45*1da177e4SLinus Torvalds * Any bugs reported given to us we will try to fix... any fixes shared will 46*1da177e4SLinus Torvalds * be incorporated into the next SCTP release. 47*1da177e4SLinus Torvalds */ 48*1da177e4SLinus Torvalds 49*1da177e4SLinus Torvalds #include <linux/module.h> 50*1da177e4SLinus Torvalds #include <linux/init.h> 51*1da177e4SLinus Torvalds #include <linux/netdevice.h> 52*1da177e4SLinus Torvalds #include <linux/inetdevice.h> 53*1da177e4SLinus Torvalds #include <linux/seq_file.h> 54*1da177e4SLinus Torvalds #include <net/protocol.h> 55*1da177e4SLinus Torvalds #include <net/ip.h> 56*1da177e4SLinus Torvalds #include <net/ipv6.h> 57*1da177e4SLinus Torvalds #include <net/sctp/sctp.h> 58*1da177e4SLinus Torvalds #include <net/addrconf.h> 59*1da177e4SLinus Torvalds #include <net/inet_common.h> 60*1da177e4SLinus Torvalds #include <net/inet_ecn.h> 61*1da177e4SLinus Torvalds 62*1da177e4SLinus Torvalds /* Global data structures. */ 63*1da177e4SLinus Torvalds struct sctp_globals sctp_globals; 64*1da177e4SLinus Torvalds struct proc_dir_entry *proc_net_sctp; 65*1da177e4SLinus Torvalds DEFINE_SNMP_STAT(struct sctp_mib, sctp_statistics); 66*1da177e4SLinus Torvalds 67*1da177e4SLinus Torvalds struct idr sctp_assocs_id; 68*1da177e4SLinus Torvalds DEFINE_SPINLOCK(sctp_assocs_id_lock); 69*1da177e4SLinus Torvalds 70*1da177e4SLinus Torvalds /* This is the global socket data structure used for responding to 71*1da177e4SLinus Torvalds * the Out-of-the-blue (OOTB) packets. A control sock will be created 72*1da177e4SLinus Torvalds * for this socket at the initialization time. 73*1da177e4SLinus Torvalds */ 74*1da177e4SLinus Torvalds static struct socket *sctp_ctl_socket; 75*1da177e4SLinus Torvalds 76*1da177e4SLinus Torvalds static struct sctp_pf *sctp_pf_inet6_specific; 77*1da177e4SLinus Torvalds static struct sctp_pf *sctp_pf_inet_specific; 78*1da177e4SLinus Torvalds static struct sctp_af *sctp_af_v4_specific; 79*1da177e4SLinus Torvalds static struct sctp_af *sctp_af_v6_specific; 80*1da177e4SLinus Torvalds 81*1da177e4SLinus Torvalds kmem_cache_t *sctp_chunk_cachep; 82*1da177e4SLinus Torvalds kmem_cache_t *sctp_bucket_cachep; 83*1da177e4SLinus Torvalds 84*1da177e4SLinus Torvalds extern int sctp_snmp_proc_init(void); 85*1da177e4SLinus Torvalds extern int sctp_snmp_proc_exit(void); 86*1da177e4SLinus Torvalds extern int sctp_eps_proc_init(void); 87*1da177e4SLinus Torvalds extern int sctp_eps_proc_exit(void); 88*1da177e4SLinus Torvalds extern int sctp_assocs_proc_init(void); 89*1da177e4SLinus Torvalds extern int sctp_assocs_proc_exit(void); 90*1da177e4SLinus Torvalds 91*1da177e4SLinus Torvalds /* Return the address of the control sock. */ 92*1da177e4SLinus Torvalds struct sock *sctp_get_ctl_sock(void) 93*1da177e4SLinus Torvalds { 94*1da177e4SLinus Torvalds return sctp_ctl_socket->sk; 95*1da177e4SLinus Torvalds } 96*1da177e4SLinus Torvalds 97*1da177e4SLinus Torvalds /* Set up the proc fs entry for the SCTP protocol. */ 98*1da177e4SLinus Torvalds static __init int sctp_proc_init(void) 99*1da177e4SLinus Torvalds { 100*1da177e4SLinus Torvalds if (!proc_net_sctp) { 101*1da177e4SLinus Torvalds struct proc_dir_entry *ent; 102*1da177e4SLinus Torvalds ent = proc_mkdir("net/sctp", NULL); 103*1da177e4SLinus Torvalds if (ent) { 104*1da177e4SLinus Torvalds ent->owner = THIS_MODULE; 105*1da177e4SLinus Torvalds proc_net_sctp = ent; 106*1da177e4SLinus Torvalds } else 107*1da177e4SLinus Torvalds goto out_nomem; 108*1da177e4SLinus Torvalds } 109*1da177e4SLinus Torvalds 110*1da177e4SLinus Torvalds if (sctp_snmp_proc_init()) 111*1da177e4SLinus Torvalds goto out_nomem; 112*1da177e4SLinus Torvalds if (sctp_eps_proc_init()) 113*1da177e4SLinus Torvalds goto out_nomem; 114*1da177e4SLinus Torvalds if (sctp_assocs_proc_init()) 115*1da177e4SLinus Torvalds goto out_nomem; 116*1da177e4SLinus Torvalds 117*1da177e4SLinus Torvalds return 0; 118*1da177e4SLinus Torvalds 119*1da177e4SLinus Torvalds out_nomem: 120*1da177e4SLinus Torvalds return -ENOMEM; 121*1da177e4SLinus Torvalds } 122*1da177e4SLinus Torvalds 123*1da177e4SLinus Torvalds /* Clean up the proc fs entry for the SCTP protocol. 124*1da177e4SLinus Torvalds * Note: Do not make this __exit as it is used in the init error 125*1da177e4SLinus Torvalds * path. 126*1da177e4SLinus Torvalds */ 127*1da177e4SLinus Torvalds static void sctp_proc_exit(void) 128*1da177e4SLinus Torvalds { 129*1da177e4SLinus Torvalds sctp_snmp_proc_exit(); 130*1da177e4SLinus Torvalds sctp_eps_proc_exit(); 131*1da177e4SLinus Torvalds sctp_assocs_proc_exit(); 132*1da177e4SLinus Torvalds 133*1da177e4SLinus Torvalds if (proc_net_sctp) { 134*1da177e4SLinus Torvalds proc_net_sctp = NULL; 135*1da177e4SLinus Torvalds remove_proc_entry("net/sctp", NULL); 136*1da177e4SLinus Torvalds } 137*1da177e4SLinus Torvalds } 138*1da177e4SLinus Torvalds 139*1da177e4SLinus Torvalds /* Private helper to extract ipv4 address and stash them in 140*1da177e4SLinus Torvalds * the protocol structure. 141*1da177e4SLinus Torvalds */ 142*1da177e4SLinus Torvalds static void sctp_v4_copy_addrlist(struct list_head *addrlist, 143*1da177e4SLinus Torvalds struct net_device *dev) 144*1da177e4SLinus Torvalds { 145*1da177e4SLinus Torvalds struct in_device *in_dev; 146*1da177e4SLinus Torvalds struct in_ifaddr *ifa; 147*1da177e4SLinus Torvalds struct sctp_sockaddr_entry *addr; 148*1da177e4SLinus Torvalds 149*1da177e4SLinus Torvalds rcu_read_lock(); 150*1da177e4SLinus Torvalds if ((in_dev = __in_dev_get(dev)) == NULL) { 151*1da177e4SLinus Torvalds rcu_read_unlock(); 152*1da177e4SLinus Torvalds return; 153*1da177e4SLinus Torvalds } 154*1da177e4SLinus Torvalds 155*1da177e4SLinus Torvalds for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { 156*1da177e4SLinus Torvalds /* Add the address to the local list. */ 157*1da177e4SLinus Torvalds addr = t_new(struct sctp_sockaddr_entry, GFP_ATOMIC); 158*1da177e4SLinus Torvalds if (addr) { 159*1da177e4SLinus Torvalds addr->a.v4.sin_family = AF_INET; 160*1da177e4SLinus Torvalds addr->a.v4.sin_port = 0; 161*1da177e4SLinus Torvalds addr->a.v4.sin_addr.s_addr = ifa->ifa_local; 162*1da177e4SLinus Torvalds list_add_tail(&addr->list, addrlist); 163*1da177e4SLinus Torvalds } 164*1da177e4SLinus Torvalds } 165*1da177e4SLinus Torvalds 166*1da177e4SLinus Torvalds rcu_read_unlock(); 167*1da177e4SLinus Torvalds } 168*1da177e4SLinus Torvalds 169*1da177e4SLinus Torvalds /* Extract our IP addresses from the system and stash them in the 170*1da177e4SLinus Torvalds * protocol structure. 171*1da177e4SLinus Torvalds */ 172*1da177e4SLinus Torvalds static void __sctp_get_local_addr_list(void) 173*1da177e4SLinus Torvalds { 174*1da177e4SLinus Torvalds struct net_device *dev; 175*1da177e4SLinus Torvalds struct list_head *pos; 176*1da177e4SLinus Torvalds struct sctp_af *af; 177*1da177e4SLinus Torvalds 178*1da177e4SLinus Torvalds read_lock(&dev_base_lock); 179*1da177e4SLinus Torvalds for (dev = dev_base; dev; dev = dev->next) { 180*1da177e4SLinus Torvalds __list_for_each(pos, &sctp_address_families) { 181*1da177e4SLinus Torvalds af = list_entry(pos, struct sctp_af, list); 182*1da177e4SLinus Torvalds af->copy_addrlist(&sctp_local_addr_list, dev); 183*1da177e4SLinus Torvalds } 184*1da177e4SLinus Torvalds } 185*1da177e4SLinus Torvalds read_unlock(&dev_base_lock); 186*1da177e4SLinus Torvalds } 187*1da177e4SLinus Torvalds 188*1da177e4SLinus Torvalds static void sctp_get_local_addr_list(void) 189*1da177e4SLinus Torvalds { 190*1da177e4SLinus Torvalds unsigned long flags; 191*1da177e4SLinus Torvalds 192*1da177e4SLinus Torvalds sctp_spin_lock_irqsave(&sctp_local_addr_lock, flags); 193*1da177e4SLinus Torvalds __sctp_get_local_addr_list(); 194*1da177e4SLinus Torvalds sctp_spin_unlock_irqrestore(&sctp_local_addr_lock, flags); 195*1da177e4SLinus Torvalds } 196*1da177e4SLinus Torvalds 197*1da177e4SLinus Torvalds /* Free the existing local addresses. */ 198*1da177e4SLinus Torvalds static void __sctp_free_local_addr_list(void) 199*1da177e4SLinus Torvalds { 200*1da177e4SLinus Torvalds struct sctp_sockaddr_entry *addr; 201*1da177e4SLinus Torvalds struct list_head *pos, *temp; 202*1da177e4SLinus Torvalds 203*1da177e4SLinus Torvalds list_for_each_safe(pos, temp, &sctp_local_addr_list) { 204*1da177e4SLinus Torvalds addr = list_entry(pos, struct sctp_sockaddr_entry, list); 205*1da177e4SLinus Torvalds list_del(pos); 206*1da177e4SLinus Torvalds kfree(addr); 207*1da177e4SLinus Torvalds } 208*1da177e4SLinus Torvalds } 209*1da177e4SLinus Torvalds 210*1da177e4SLinus Torvalds /* Free the existing local addresses. */ 211*1da177e4SLinus Torvalds static void sctp_free_local_addr_list(void) 212*1da177e4SLinus Torvalds { 213*1da177e4SLinus Torvalds unsigned long flags; 214*1da177e4SLinus Torvalds 215*1da177e4SLinus Torvalds sctp_spin_lock_irqsave(&sctp_local_addr_lock, flags); 216*1da177e4SLinus Torvalds __sctp_free_local_addr_list(); 217*1da177e4SLinus Torvalds sctp_spin_unlock_irqrestore(&sctp_local_addr_lock, flags); 218*1da177e4SLinus Torvalds } 219*1da177e4SLinus Torvalds 220*1da177e4SLinus Torvalds /* Copy the local addresses which are valid for 'scope' into 'bp'. */ 221*1da177e4SLinus Torvalds int sctp_copy_local_addr_list(struct sctp_bind_addr *bp, sctp_scope_t scope, 222*1da177e4SLinus Torvalds int gfp, int copy_flags) 223*1da177e4SLinus Torvalds { 224*1da177e4SLinus Torvalds struct sctp_sockaddr_entry *addr; 225*1da177e4SLinus Torvalds int error = 0; 226*1da177e4SLinus Torvalds struct list_head *pos; 227*1da177e4SLinus Torvalds unsigned long flags; 228*1da177e4SLinus Torvalds 229*1da177e4SLinus Torvalds sctp_spin_lock_irqsave(&sctp_local_addr_lock, flags); 230*1da177e4SLinus Torvalds list_for_each(pos, &sctp_local_addr_list) { 231*1da177e4SLinus Torvalds addr = list_entry(pos, struct sctp_sockaddr_entry, list); 232*1da177e4SLinus Torvalds if (sctp_in_scope(&addr->a, scope)) { 233*1da177e4SLinus Torvalds /* Now that the address is in scope, check to see if 234*1da177e4SLinus Torvalds * the address type is really supported by the local 235*1da177e4SLinus Torvalds * sock as well as the remote peer. 236*1da177e4SLinus Torvalds */ 237*1da177e4SLinus Torvalds if ((((AF_INET == addr->a.sa.sa_family) && 238*1da177e4SLinus Torvalds (copy_flags & SCTP_ADDR4_PEERSUPP))) || 239*1da177e4SLinus Torvalds (((AF_INET6 == addr->a.sa.sa_family) && 240*1da177e4SLinus Torvalds (copy_flags & SCTP_ADDR6_ALLOWED) && 241*1da177e4SLinus Torvalds (copy_flags & SCTP_ADDR6_PEERSUPP)))) { 242*1da177e4SLinus Torvalds error = sctp_add_bind_addr(bp, &addr->a, 243*1da177e4SLinus Torvalds GFP_ATOMIC); 244*1da177e4SLinus Torvalds if (error) 245*1da177e4SLinus Torvalds goto end_copy; 246*1da177e4SLinus Torvalds } 247*1da177e4SLinus Torvalds } 248*1da177e4SLinus Torvalds } 249*1da177e4SLinus Torvalds 250*1da177e4SLinus Torvalds end_copy: 251*1da177e4SLinus Torvalds sctp_spin_unlock_irqrestore(&sctp_local_addr_lock, flags); 252*1da177e4SLinus Torvalds return error; 253*1da177e4SLinus Torvalds } 254*1da177e4SLinus Torvalds 255*1da177e4SLinus Torvalds /* Initialize a sctp_addr from in incoming skb. */ 256*1da177e4SLinus Torvalds static void sctp_v4_from_skb(union sctp_addr *addr, struct sk_buff *skb, 257*1da177e4SLinus Torvalds int is_saddr) 258*1da177e4SLinus Torvalds { 259*1da177e4SLinus Torvalds void *from; 260*1da177e4SLinus Torvalds __u16 *port; 261*1da177e4SLinus Torvalds struct sctphdr *sh; 262*1da177e4SLinus Torvalds 263*1da177e4SLinus Torvalds port = &addr->v4.sin_port; 264*1da177e4SLinus Torvalds addr->v4.sin_family = AF_INET; 265*1da177e4SLinus Torvalds 266*1da177e4SLinus Torvalds sh = (struct sctphdr *) skb->h.raw; 267*1da177e4SLinus Torvalds if (is_saddr) { 268*1da177e4SLinus Torvalds *port = ntohs(sh->source); 269*1da177e4SLinus Torvalds from = &skb->nh.iph->saddr; 270*1da177e4SLinus Torvalds } else { 271*1da177e4SLinus Torvalds *port = ntohs(sh->dest); 272*1da177e4SLinus Torvalds from = &skb->nh.iph->daddr; 273*1da177e4SLinus Torvalds } 274*1da177e4SLinus Torvalds memcpy(&addr->v4.sin_addr.s_addr, from, sizeof(struct in_addr)); 275*1da177e4SLinus Torvalds } 276*1da177e4SLinus Torvalds 277*1da177e4SLinus Torvalds /* Initialize an sctp_addr from a socket. */ 278*1da177e4SLinus Torvalds static void sctp_v4_from_sk(union sctp_addr *addr, struct sock *sk) 279*1da177e4SLinus Torvalds { 280*1da177e4SLinus Torvalds addr->v4.sin_family = AF_INET; 281*1da177e4SLinus Torvalds addr->v4.sin_port = inet_sk(sk)->num; 282*1da177e4SLinus Torvalds addr->v4.sin_addr.s_addr = inet_sk(sk)->rcv_saddr; 283*1da177e4SLinus Torvalds } 284*1da177e4SLinus Torvalds 285*1da177e4SLinus Torvalds /* Initialize sk->sk_rcv_saddr from sctp_addr. */ 286*1da177e4SLinus Torvalds static void sctp_v4_to_sk_saddr(union sctp_addr *addr, struct sock *sk) 287*1da177e4SLinus Torvalds { 288*1da177e4SLinus Torvalds inet_sk(sk)->rcv_saddr = addr->v4.sin_addr.s_addr; 289*1da177e4SLinus Torvalds } 290*1da177e4SLinus Torvalds 291*1da177e4SLinus Torvalds /* Initialize sk->sk_daddr from sctp_addr. */ 292*1da177e4SLinus Torvalds static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk) 293*1da177e4SLinus Torvalds { 294*1da177e4SLinus Torvalds inet_sk(sk)->daddr = addr->v4.sin_addr.s_addr; 295*1da177e4SLinus Torvalds } 296*1da177e4SLinus Torvalds 297*1da177e4SLinus Torvalds /* Initialize a sctp_addr from an address parameter. */ 298*1da177e4SLinus Torvalds static void sctp_v4_from_addr_param(union sctp_addr *addr, 299*1da177e4SLinus Torvalds union sctp_addr_param *param, 300*1da177e4SLinus Torvalds __u16 port, int iif) 301*1da177e4SLinus Torvalds { 302*1da177e4SLinus Torvalds addr->v4.sin_family = AF_INET; 303*1da177e4SLinus Torvalds addr->v4.sin_port = port; 304*1da177e4SLinus Torvalds addr->v4.sin_addr.s_addr = param->v4.addr.s_addr; 305*1da177e4SLinus Torvalds } 306*1da177e4SLinus Torvalds 307*1da177e4SLinus Torvalds /* Initialize an address parameter from a sctp_addr and return the length 308*1da177e4SLinus Torvalds * of the address parameter. 309*1da177e4SLinus Torvalds */ 310*1da177e4SLinus Torvalds static int sctp_v4_to_addr_param(const union sctp_addr *addr, 311*1da177e4SLinus Torvalds union sctp_addr_param *param) 312*1da177e4SLinus Torvalds { 313*1da177e4SLinus Torvalds int length = sizeof(sctp_ipv4addr_param_t); 314*1da177e4SLinus Torvalds 315*1da177e4SLinus Torvalds param->v4.param_hdr.type = SCTP_PARAM_IPV4_ADDRESS; 316*1da177e4SLinus Torvalds param->v4.param_hdr.length = ntohs(length); 317*1da177e4SLinus Torvalds param->v4.addr.s_addr = addr->v4.sin_addr.s_addr; 318*1da177e4SLinus Torvalds 319*1da177e4SLinus Torvalds return length; 320*1da177e4SLinus Torvalds } 321*1da177e4SLinus Torvalds 322*1da177e4SLinus Torvalds /* Initialize a sctp_addr from a dst_entry. */ 323*1da177e4SLinus Torvalds static void sctp_v4_dst_saddr(union sctp_addr *saddr, struct dst_entry *dst, 324*1da177e4SLinus Torvalds unsigned short port) 325*1da177e4SLinus Torvalds { 326*1da177e4SLinus Torvalds struct rtable *rt = (struct rtable *)dst; 327*1da177e4SLinus Torvalds saddr->v4.sin_family = AF_INET; 328*1da177e4SLinus Torvalds saddr->v4.sin_port = port; 329*1da177e4SLinus Torvalds saddr->v4.sin_addr.s_addr = rt->rt_src; 330*1da177e4SLinus Torvalds } 331*1da177e4SLinus Torvalds 332*1da177e4SLinus Torvalds /* Compare two addresses exactly. */ 333*1da177e4SLinus Torvalds static int sctp_v4_cmp_addr(const union sctp_addr *addr1, 334*1da177e4SLinus Torvalds const union sctp_addr *addr2) 335*1da177e4SLinus Torvalds { 336*1da177e4SLinus Torvalds if (addr1->sa.sa_family != addr2->sa.sa_family) 337*1da177e4SLinus Torvalds return 0; 338*1da177e4SLinus Torvalds if (addr1->v4.sin_port != addr2->v4.sin_port) 339*1da177e4SLinus Torvalds return 0; 340*1da177e4SLinus Torvalds if (addr1->v4.sin_addr.s_addr != addr2->v4.sin_addr.s_addr) 341*1da177e4SLinus Torvalds return 0; 342*1da177e4SLinus Torvalds 343*1da177e4SLinus Torvalds return 1; 344*1da177e4SLinus Torvalds } 345*1da177e4SLinus Torvalds 346*1da177e4SLinus Torvalds /* Initialize addr struct to INADDR_ANY. */ 347*1da177e4SLinus Torvalds static void sctp_v4_inaddr_any(union sctp_addr *addr, unsigned short port) 348*1da177e4SLinus Torvalds { 349*1da177e4SLinus Torvalds addr->v4.sin_family = AF_INET; 350*1da177e4SLinus Torvalds addr->v4.sin_addr.s_addr = INADDR_ANY; 351*1da177e4SLinus Torvalds addr->v4.sin_port = port; 352*1da177e4SLinus Torvalds } 353*1da177e4SLinus Torvalds 354*1da177e4SLinus Torvalds /* Is this a wildcard address? */ 355*1da177e4SLinus Torvalds static int sctp_v4_is_any(const union sctp_addr *addr) 356*1da177e4SLinus Torvalds { 357*1da177e4SLinus Torvalds return INADDR_ANY == addr->v4.sin_addr.s_addr; 358*1da177e4SLinus Torvalds } 359*1da177e4SLinus Torvalds 360*1da177e4SLinus Torvalds /* This function checks if the address is a valid address to be used for 361*1da177e4SLinus Torvalds * SCTP binding. 362*1da177e4SLinus Torvalds * 363*1da177e4SLinus Torvalds * Output: 364*1da177e4SLinus Torvalds * Return 0 - If the address is a non-unicast or an illegal address. 365*1da177e4SLinus Torvalds * Return 1 - If the address is a unicast. 366*1da177e4SLinus Torvalds */ 367*1da177e4SLinus Torvalds static int sctp_v4_addr_valid(union sctp_addr *addr, struct sctp_sock *sp) 368*1da177e4SLinus Torvalds { 369*1da177e4SLinus Torvalds /* Is this a non-unicast address or a unusable SCTP address? */ 370*1da177e4SLinus Torvalds if (IS_IPV4_UNUSABLE_ADDRESS(&addr->v4.sin_addr.s_addr)) 371*1da177e4SLinus Torvalds return 0; 372*1da177e4SLinus Torvalds 373*1da177e4SLinus Torvalds return 1; 374*1da177e4SLinus Torvalds } 375*1da177e4SLinus Torvalds 376*1da177e4SLinus Torvalds /* Should this be available for binding? */ 377*1da177e4SLinus Torvalds static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp) 378*1da177e4SLinus Torvalds { 379*1da177e4SLinus Torvalds int ret = inet_addr_type(addr->v4.sin_addr.s_addr); 380*1da177e4SLinus Torvalds 381*1da177e4SLinus Torvalds /* FIXME: ip_nonlocal_bind sysctl support. */ 382*1da177e4SLinus Torvalds 383*1da177e4SLinus Torvalds if (addr->v4.sin_addr.s_addr != INADDR_ANY && ret != RTN_LOCAL) 384*1da177e4SLinus Torvalds return 0; 385*1da177e4SLinus Torvalds return 1; 386*1da177e4SLinus Torvalds } 387*1da177e4SLinus Torvalds 388*1da177e4SLinus Torvalds /* Checking the loopback, private and other address scopes as defined in 389*1da177e4SLinus Torvalds * RFC 1918. The IPv4 scoping is based on the draft for SCTP IPv4 390*1da177e4SLinus Torvalds * scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>. 391*1da177e4SLinus Torvalds * 392*1da177e4SLinus Torvalds * Level 0 - unusable SCTP addresses 393*1da177e4SLinus Torvalds * Level 1 - loopback address 394*1da177e4SLinus Torvalds * Level 2 - link-local addresses 395*1da177e4SLinus Torvalds * Level 3 - private addresses. 396*1da177e4SLinus Torvalds * Level 4 - global addresses 397*1da177e4SLinus Torvalds * For INIT and INIT-ACK address list, let L be the level of 398*1da177e4SLinus Torvalds * of requested destination address, sender and receiver 399*1da177e4SLinus Torvalds * SHOULD include all of its addresses with level greater 400*1da177e4SLinus Torvalds * than or equal to L. 401*1da177e4SLinus Torvalds */ 402*1da177e4SLinus Torvalds static sctp_scope_t sctp_v4_scope(union sctp_addr *addr) 403*1da177e4SLinus Torvalds { 404*1da177e4SLinus Torvalds sctp_scope_t retval; 405*1da177e4SLinus Torvalds 406*1da177e4SLinus Torvalds /* Should IPv4 scoping be a sysctl configurable option 407*1da177e4SLinus Torvalds * so users can turn it off (default on) for certain 408*1da177e4SLinus Torvalds * unconventional networking environments? 409*1da177e4SLinus Torvalds */ 410*1da177e4SLinus Torvalds 411*1da177e4SLinus Torvalds /* Check for unusable SCTP addresses. */ 412*1da177e4SLinus Torvalds if (IS_IPV4_UNUSABLE_ADDRESS(&addr->v4.sin_addr.s_addr)) { 413*1da177e4SLinus Torvalds retval = SCTP_SCOPE_UNUSABLE; 414*1da177e4SLinus Torvalds } else if (LOOPBACK(addr->v4.sin_addr.s_addr)) { 415*1da177e4SLinus Torvalds retval = SCTP_SCOPE_LOOPBACK; 416*1da177e4SLinus Torvalds } else if (IS_IPV4_LINK_ADDRESS(&addr->v4.sin_addr.s_addr)) { 417*1da177e4SLinus Torvalds retval = SCTP_SCOPE_LINK; 418*1da177e4SLinus Torvalds } else if (IS_IPV4_PRIVATE_ADDRESS(&addr->v4.sin_addr.s_addr)) { 419*1da177e4SLinus Torvalds retval = SCTP_SCOPE_PRIVATE; 420*1da177e4SLinus Torvalds } else { 421*1da177e4SLinus Torvalds retval = SCTP_SCOPE_GLOBAL; 422*1da177e4SLinus Torvalds } 423*1da177e4SLinus Torvalds 424*1da177e4SLinus Torvalds return retval; 425*1da177e4SLinus Torvalds } 426*1da177e4SLinus Torvalds 427*1da177e4SLinus Torvalds /* Returns a valid dst cache entry for the given source and destination ip 428*1da177e4SLinus Torvalds * addresses. If an association is passed, trys to get a dst entry with a 429*1da177e4SLinus Torvalds * source address that matches an address in the bind address list. 430*1da177e4SLinus Torvalds */ 431*1da177e4SLinus Torvalds static struct dst_entry *sctp_v4_get_dst(struct sctp_association *asoc, 432*1da177e4SLinus Torvalds union sctp_addr *daddr, 433*1da177e4SLinus Torvalds union sctp_addr *saddr) 434*1da177e4SLinus Torvalds { 435*1da177e4SLinus Torvalds struct rtable *rt; 436*1da177e4SLinus Torvalds struct flowi fl; 437*1da177e4SLinus Torvalds struct sctp_bind_addr *bp; 438*1da177e4SLinus Torvalds rwlock_t *addr_lock; 439*1da177e4SLinus Torvalds struct sctp_sockaddr_entry *laddr; 440*1da177e4SLinus Torvalds struct list_head *pos; 441*1da177e4SLinus Torvalds struct dst_entry *dst = NULL; 442*1da177e4SLinus Torvalds union sctp_addr dst_saddr; 443*1da177e4SLinus Torvalds 444*1da177e4SLinus Torvalds memset(&fl, 0x0, sizeof(struct flowi)); 445*1da177e4SLinus Torvalds fl.fl4_dst = daddr->v4.sin_addr.s_addr; 446*1da177e4SLinus Torvalds fl.proto = IPPROTO_SCTP; 447*1da177e4SLinus Torvalds if (asoc) { 448*1da177e4SLinus Torvalds fl.fl4_tos = RT_CONN_FLAGS(asoc->base.sk); 449*1da177e4SLinus Torvalds fl.oif = asoc->base.sk->sk_bound_dev_if; 450*1da177e4SLinus Torvalds } 451*1da177e4SLinus Torvalds if (saddr) 452*1da177e4SLinus Torvalds fl.fl4_src = saddr->v4.sin_addr.s_addr; 453*1da177e4SLinus Torvalds 454*1da177e4SLinus Torvalds SCTP_DEBUG_PRINTK("%s: DST:%u.%u.%u.%u, SRC:%u.%u.%u.%u - ", 455*1da177e4SLinus Torvalds __FUNCTION__, NIPQUAD(fl.fl4_dst), 456*1da177e4SLinus Torvalds NIPQUAD(fl.fl4_src)); 457*1da177e4SLinus Torvalds 458*1da177e4SLinus Torvalds if (!ip_route_output_key(&rt, &fl)) { 459*1da177e4SLinus Torvalds dst = &rt->u.dst; 460*1da177e4SLinus Torvalds } 461*1da177e4SLinus Torvalds 462*1da177e4SLinus Torvalds /* If there is no association or if a source address is passed, no 463*1da177e4SLinus Torvalds * more validation is required. 464*1da177e4SLinus Torvalds */ 465*1da177e4SLinus Torvalds if (!asoc || saddr) 466*1da177e4SLinus Torvalds goto out; 467*1da177e4SLinus Torvalds 468*1da177e4SLinus Torvalds bp = &asoc->base.bind_addr; 469*1da177e4SLinus Torvalds addr_lock = &asoc->base.addr_lock; 470*1da177e4SLinus Torvalds 471*1da177e4SLinus Torvalds if (dst) { 472*1da177e4SLinus Torvalds /* Walk through the bind address list and look for a bind 473*1da177e4SLinus Torvalds * address that matches the source address of the returned dst. 474*1da177e4SLinus Torvalds */ 475*1da177e4SLinus Torvalds sctp_read_lock(addr_lock); 476*1da177e4SLinus Torvalds list_for_each(pos, &bp->address_list) { 477*1da177e4SLinus Torvalds laddr = list_entry(pos, struct sctp_sockaddr_entry, 478*1da177e4SLinus Torvalds list); 479*1da177e4SLinus Torvalds sctp_v4_dst_saddr(&dst_saddr, dst, bp->port); 480*1da177e4SLinus Torvalds if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a)) 481*1da177e4SLinus Torvalds goto out_unlock; 482*1da177e4SLinus Torvalds } 483*1da177e4SLinus Torvalds sctp_read_unlock(addr_lock); 484*1da177e4SLinus Torvalds 485*1da177e4SLinus Torvalds /* None of the bound addresses match the source address of the 486*1da177e4SLinus Torvalds * dst. So release it. 487*1da177e4SLinus Torvalds */ 488*1da177e4SLinus Torvalds dst_release(dst); 489*1da177e4SLinus Torvalds dst = NULL; 490*1da177e4SLinus Torvalds } 491*1da177e4SLinus Torvalds 492*1da177e4SLinus Torvalds /* Walk through the bind address list and try to get a dst that 493*1da177e4SLinus Torvalds * matches a bind address as the source address. 494*1da177e4SLinus Torvalds */ 495*1da177e4SLinus Torvalds sctp_read_lock(addr_lock); 496*1da177e4SLinus Torvalds list_for_each(pos, &bp->address_list) { 497*1da177e4SLinus Torvalds laddr = list_entry(pos, struct sctp_sockaddr_entry, list); 498*1da177e4SLinus Torvalds 499*1da177e4SLinus Torvalds if (AF_INET == laddr->a.sa.sa_family) { 500*1da177e4SLinus Torvalds fl.fl4_src = laddr->a.v4.sin_addr.s_addr; 501*1da177e4SLinus Torvalds if (!ip_route_output_key(&rt, &fl)) { 502*1da177e4SLinus Torvalds dst = &rt->u.dst; 503*1da177e4SLinus Torvalds goto out_unlock; 504*1da177e4SLinus Torvalds } 505*1da177e4SLinus Torvalds } 506*1da177e4SLinus Torvalds } 507*1da177e4SLinus Torvalds 508*1da177e4SLinus Torvalds out_unlock: 509*1da177e4SLinus Torvalds sctp_read_unlock(addr_lock); 510*1da177e4SLinus Torvalds out: 511*1da177e4SLinus Torvalds if (dst) 512*1da177e4SLinus Torvalds SCTP_DEBUG_PRINTK("rt_dst:%u.%u.%u.%u, rt_src:%u.%u.%u.%u\n", 513*1da177e4SLinus Torvalds NIPQUAD(rt->rt_dst), NIPQUAD(rt->rt_src)); 514*1da177e4SLinus Torvalds else 515*1da177e4SLinus Torvalds SCTP_DEBUG_PRINTK("NO ROUTE\n"); 516*1da177e4SLinus Torvalds 517*1da177e4SLinus Torvalds return dst; 518*1da177e4SLinus Torvalds } 519*1da177e4SLinus Torvalds 520*1da177e4SLinus Torvalds /* For v4, the source address is cached in the route entry(dst). So no need 521*1da177e4SLinus Torvalds * to cache it separately and hence this is an empty routine. 522*1da177e4SLinus Torvalds */ 523*1da177e4SLinus Torvalds static void sctp_v4_get_saddr(struct sctp_association *asoc, 524*1da177e4SLinus Torvalds struct dst_entry *dst, 525*1da177e4SLinus Torvalds union sctp_addr *daddr, 526*1da177e4SLinus Torvalds union sctp_addr *saddr) 527*1da177e4SLinus Torvalds { 528*1da177e4SLinus Torvalds struct rtable *rt = (struct rtable *)dst; 529*1da177e4SLinus Torvalds 530*1da177e4SLinus Torvalds if (rt) { 531*1da177e4SLinus Torvalds saddr->v4.sin_family = AF_INET; 532*1da177e4SLinus Torvalds saddr->v4.sin_port = asoc->base.bind_addr.port; 533*1da177e4SLinus Torvalds saddr->v4.sin_addr.s_addr = rt->rt_src; 534*1da177e4SLinus Torvalds } 535*1da177e4SLinus Torvalds } 536*1da177e4SLinus Torvalds 537*1da177e4SLinus Torvalds /* What interface did this skb arrive on? */ 538*1da177e4SLinus Torvalds static int sctp_v4_skb_iif(const struct sk_buff *skb) 539*1da177e4SLinus Torvalds { 540*1da177e4SLinus Torvalds return ((struct rtable *)skb->dst)->rt_iif; 541*1da177e4SLinus Torvalds } 542*1da177e4SLinus Torvalds 543*1da177e4SLinus Torvalds /* Was this packet marked by Explicit Congestion Notification? */ 544*1da177e4SLinus Torvalds static int sctp_v4_is_ce(const struct sk_buff *skb) 545*1da177e4SLinus Torvalds { 546*1da177e4SLinus Torvalds return INET_ECN_is_ce(skb->nh.iph->tos); 547*1da177e4SLinus Torvalds } 548*1da177e4SLinus Torvalds 549*1da177e4SLinus Torvalds /* Create and initialize a new sk for the socket returned by accept(). */ 550*1da177e4SLinus Torvalds static struct sock *sctp_v4_create_accept_sk(struct sock *sk, 551*1da177e4SLinus Torvalds struct sctp_association *asoc) 552*1da177e4SLinus Torvalds { 553*1da177e4SLinus Torvalds struct inet_sock *inet = inet_sk(sk); 554*1da177e4SLinus Torvalds struct inet_sock *newinet; 555*1da177e4SLinus Torvalds struct sock *newsk = sk_alloc(PF_INET, GFP_KERNEL, sk->sk_prot, 1); 556*1da177e4SLinus Torvalds 557*1da177e4SLinus Torvalds if (!newsk) 558*1da177e4SLinus Torvalds goto out; 559*1da177e4SLinus Torvalds 560*1da177e4SLinus Torvalds sock_init_data(NULL, newsk); 561*1da177e4SLinus Torvalds 562*1da177e4SLinus Torvalds newsk->sk_type = SOCK_STREAM; 563*1da177e4SLinus Torvalds 564*1da177e4SLinus Torvalds newsk->sk_no_check = sk->sk_no_check; 565*1da177e4SLinus Torvalds newsk->sk_reuse = sk->sk_reuse; 566*1da177e4SLinus Torvalds newsk->sk_shutdown = sk->sk_shutdown; 567*1da177e4SLinus Torvalds 568*1da177e4SLinus Torvalds newsk->sk_destruct = inet_sock_destruct; 569*1da177e4SLinus Torvalds newsk->sk_family = PF_INET; 570*1da177e4SLinus Torvalds newsk->sk_protocol = IPPROTO_SCTP; 571*1da177e4SLinus Torvalds newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; 572*1da177e4SLinus Torvalds sock_reset_flag(newsk, SOCK_ZAPPED); 573*1da177e4SLinus Torvalds 574*1da177e4SLinus Torvalds newinet = inet_sk(newsk); 575*1da177e4SLinus Torvalds 576*1da177e4SLinus Torvalds /* Initialize sk's sport, dport, rcv_saddr and daddr for 577*1da177e4SLinus Torvalds * getsockname() and getpeername() 578*1da177e4SLinus Torvalds */ 579*1da177e4SLinus Torvalds newinet->sport = inet->sport; 580*1da177e4SLinus Torvalds newinet->saddr = inet->saddr; 581*1da177e4SLinus Torvalds newinet->rcv_saddr = inet->rcv_saddr; 582*1da177e4SLinus Torvalds newinet->dport = htons(asoc->peer.port); 583*1da177e4SLinus Torvalds newinet->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr; 584*1da177e4SLinus Torvalds newinet->pmtudisc = inet->pmtudisc; 585*1da177e4SLinus Torvalds newinet->id = 0; 586*1da177e4SLinus Torvalds 587*1da177e4SLinus Torvalds newinet->uc_ttl = -1; 588*1da177e4SLinus Torvalds newinet->mc_loop = 1; 589*1da177e4SLinus Torvalds newinet->mc_ttl = 1; 590*1da177e4SLinus Torvalds newinet->mc_index = 0; 591*1da177e4SLinus Torvalds newinet->mc_list = NULL; 592*1da177e4SLinus Torvalds 593*1da177e4SLinus Torvalds #ifdef INET_REFCNT_DEBUG 594*1da177e4SLinus Torvalds atomic_inc(&inet_sock_nr); 595*1da177e4SLinus Torvalds #endif 596*1da177e4SLinus Torvalds 597*1da177e4SLinus Torvalds if (newsk->sk_prot->init(newsk)) { 598*1da177e4SLinus Torvalds sk_common_release(newsk); 599*1da177e4SLinus Torvalds newsk = NULL; 600*1da177e4SLinus Torvalds } 601*1da177e4SLinus Torvalds 602*1da177e4SLinus Torvalds out: 603*1da177e4SLinus Torvalds return newsk; 604*1da177e4SLinus Torvalds } 605*1da177e4SLinus Torvalds 606*1da177e4SLinus Torvalds /* Map address, empty for v4 family */ 607*1da177e4SLinus Torvalds static void sctp_v4_addr_v4map(struct sctp_sock *sp, union sctp_addr *addr) 608*1da177e4SLinus Torvalds { 609*1da177e4SLinus Torvalds /* Empty */ 610*1da177e4SLinus Torvalds } 611*1da177e4SLinus Torvalds 612*1da177e4SLinus Torvalds /* Dump the v4 addr to the seq file. */ 613*1da177e4SLinus Torvalds static void sctp_v4_seq_dump_addr(struct seq_file *seq, union sctp_addr *addr) 614*1da177e4SLinus Torvalds { 615*1da177e4SLinus Torvalds seq_printf(seq, "%d.%d.%d.%d ", NIPQUAD(addr->v4.sin_addr)); 616*1da177e4SLinus Torvalds } 617*1da177e4SLinus Torvalds 618*1da177e4SLinus Torvalds /* Event handler for inet address addition/deletion events. 619*1da177e4SLinus Torvalds * Basically, whenever there is an event, we re-build our local address list. 620*1da177e4SLinus Torvalds */ 621*1da177e4SLinus Torvalds int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev, 622*1da177e4SLinus Torvalds void *ptr) 623*1da177e4SLinus Torvalds { 624*1da177e4SLinus Torvalds unsigned long flags; 625*1da177e4SLinus Torvalds 626*1da177e4SLinus Torvalds sctp_spin_lock_irqsave(&sctp_local_addr_lock, flags); 627*1da177e4SLinus Torvalds __sctp_free_local_addr_list(); 628*1da177e4SLinus Torvalds __sctp_get_local_addr_list(); 629*1da177e4SLinus Torvalds sctp_spin_unlock_irqrestore(&sctp_local_addr_lock, flags); 630*1da177e4SLinus Torvalds 631*1da177e4SLinus Torvalds return NOTIFY_DONE; 632*1da177e4SLinus Torvalds } 633*1da177e4SLinus Torvalds 634*1da177e4SLinus Torvalds /* 635*1da177e4SLinus Torvalds * Initialize the control inode/socket with a control endpoint data 636*1da177e4SLinus Torvalds * structure. This endpoint is reserved exclusively for the OOTB processing. 637*1da177e4SLinus Torvalds */ 638*1da177e4SLinus Torvalds static int sctp_ctl_sock_init(void) 639*1da177e4SLinus Torvalds { 640*1da177e4SLinus Torvalds int err; 641*1da177e4SLinus Torvalds sa_family_t family; 642*1da177e4SLinus Torvalds 643*1da177e4SLinus Torvalds if (sctp_get_pf_specific(PF_INET6)) 644*1da177e4SLinus Torvalds family = PF_INET6; 645*1da177e4SLinus Torvalds else 646*1da177e4SLinus Torvalds family = PF_INET; 647*1da177e4SLinus Torvalds 648*1da177e4SLinus Torvalds err = sock_create_kern(family, SOCK_SEQPACKET, IPPROTO_SCTP, 649*1da177e4SLinus Torvalds &sctp_ctl_socket); 650*1da177e4SLinus Torvalds if (err < 0) { 651*1da177e4SLinus Torvalds printk(KERN_ERR 652*1da177e4SLinus Torvalds "SCTP: Failed to create the SCTP control socket.\n"); 653*1da177e4SLinus Torvalds return err; 654*1da177e4SLinus Torvalds } 655*1da177e4SLinus Torvalds sctp_ctl_socket->sk->sk_allocation = GFP_ATOMIC; 656*1da177e4SLinus Torvalds inet_sk(sctp_ctl_socket->sk)->uc_ttl = -1; 657*1da177e4SLinus Torvalds 658*1da177e4SLinus Torvalds return 0; 659*1da177e4SLinus Torvalds } 660*1da177e4SLinus Torvalds 661*1da177e4SLinus Torvalds /* Register address family specific functions. */ 662*1da177e4SLinus Torvalds int sctp_register_af(struct sctp_af *af) 663*1da177e4SLinus Torvalds { 664*1da177e4SLinus Torvalds switch (af->sa_family) { 665*1da177e4SLinus Torvalds case AF_INET: 666*1da177e4SLinus Torvalds if (sctp_af_v4_specific) 667*1da177e4SLinus Torvalds return 0; 668*1da177e4SLinus Torvalds sctp_af_v4_specific = af; 669*1da177e4SLinus Torvalds break; 670*1da177e4SLinus Torvalds case AF_INET6: 671*1da177e4SLinus Torvalds if (sctp_af_v6_specific) 672*1da177e4SLinus Torvalds return 0; 673*1da177e4SLinus Torvalds sctp_af_v6_specific = af; 674*1da177e4SLinus Torvalds break; 675*1da177e4SLinus Torvalds default: 676*1da177e4SLinus Torvalds return 0; 677*1da177e4SLinus Torvalds } 678*1da177e4SLinus Torvalds 679*1da177e4SLinus Torvalds INIT_LIST_HEAD(&af->list); 680*1da177e4SLinus Torvalds list_add_tail(&af->list, &sctp_address_families); 681*1da177e4SLinus Torvalds return 1; 682*1da177e4SLinus Torvalds } 683*1da177e4SLinus Torvalds 684*1da177e4SLinus Torvalds /* Get the table of functions for manipulating a particular address 685*1da177e4SLinus Torvalds * family. 686*1da177e4SLinus Torvalds */ 687*1da177e4SLinus Torvalds struct sctp_af *sctp_get_af_specific(sa_family_t family) 688*1da177e4SLinus Torvalds { 689*1da177e4SLinus Torvalds switch (family) { 690*1da177e4SLinus Torvalds case AF_INET: 691*1da177e4SLinus Torvalds return sctp_af_v4_specific; 692*1da177e4SLinus Torvalds case AF_INET6: 693*1da177e4SLinus Torvalds return sctp_af_v6_specific; 694*1da177e4SLinus Torvalds default: 695*1da177e4SLinus Torvalds return NULL; 696*1da177e4SLinus Torvalds } 697*1da177e4SLinus Torvalds } 698*1da177e4SLinus Torvalds 699*1da177e4SLinus Torvalds /* Common code to initialize a AF_INET msg_name. */ 700*1da177e4SLinus Torvalds static void sctp_inet_msgname(char *msgname, int *addr_len) 701*1da177e4SLinus Torvalds { 702*1da177e4SLinus Torvalds struct sockaddr_in *sin; 703*1da177e4SLinus Torvalds 704*1da177e4SLinus Torvalds sin = (struct sockaddr_in *)msgname; 705*1da177e4SLinus Torvalds *addr_len = sizeof(struct sockaddr_in); 706*1da177e4SLinus Torvalds sin->sin_family = AF_INET; 707*1da177e4SLinus Torvalds memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); 708*1da177e4SLinus Torvalds } 709*1da177e4SLinus Torvalds 710*1da177e4SLinus Torvalds /* Copy the primary address of the peer primary address as the msg_name. */ 711*1da177e4SLinus Torvalds static void sctp_inet_event_msgname(struct sctp_ulpevent *event, char *msgname, 712*1da177e4SLinus Torvalds int *addr_len) 713*1da177e4SLinus Torvalds { 714*1da177e4SLinus Torvalds struct sockaddr_in *sin, *sinfrom; 715*1da177e4SLinus Torvalds 716*1da177e4SLinus Torvalds if (msgname) { 717*1da177e4SLinus Torvalds struct sctp_association *asoc; 718*1da177e4SLinus Torvalds 719*1da177e4SLinus Torvalds asoc = event->asoc; 720*1da177e4SLinus Torvalds sctp_inet_msgname(msgname, addr_len); 721*1da177e4SLinus Torvalds sin = (struct sockaddr_in *)msgname; 722*1da177e4SLinus Torvalds sinfrom = &asoc->peer.primary_addr.v4; 723*1da177e4SLinus Torvalds sin->sin_port = htons(asoc->peer.port); 724*1da177e4SLinus Torvalds sin->sin_addr.s_addr = sinfrom->sin_addr.s_addr; 725*1da177e4SLinus Torvalds } 726*1da177e4SLinus Torvalds } 727*1da177e4SLinus Torvalds 728*1da177e4SLinus Torvalds /* Initialize and copy out a msgname from an inbound skb. */ 729*1da177e4SLinus Torvalds static void sctp_inet_skb_msgname(struct sk_buff *skb, char *msgname, int *len) 730*1da177e4SLinus Torvalds { 731*1da177e4SLinus Torvalds struct sctphdr *sh; 732*1da177e4SLinus Torvalds struct sockaddr_in *sin; 733*1da177e4SLinus Torvalds 734*1da177e4SLinus Torvalds if (msgname) { 735*1da177e4SLinus Torvalds sctp_inet_msgname(msgname, len); 736*1da177e4SLinus Torvalds sin = (struct sockaddr_in *)msgname; 737*1da177e4SLinus Torvalds sh = (struct sctphdr *)skb->h.raw; 738*1da177e4SLinus Torvalds sin->sin_port = sh->source; 739*1da177e4SLinus Torvalds sin->sin_addr.s_addr = skb->nh.iph->saddr; 740*1da177e4SLinus Torvalds } 741*1da177e4SLinus Torvalds } 742*1da177e4SLinus Torvalds 743*1da177e4SLinus Torvalds /* Do we support this AF? */ 744*1da177e4SLinus Torvalds static int sctp_inet_af_supported(sa_family_t family, struct sctp_sock *sp) 745*1da177e4SLinus Torvalds { 746*1da177e4SLinus Torvalds /* PF_INET only supports AF_INET addresses. */ 747*1da177e4SLinus Torvalds return (AF_INET == family); 748*1da177e4SLinus Torvalds } 749*1da177e4SLinus Torvalds 750*1da177e4SLinus Torvalds /* Address matching with wildcards allowed. */ 751*1da177e4SLinus Torvalds static int sctp_inet_cmp_addr(const union sctp_addr *addr1, 752*1da177e4SLinus Torvalds const union sctp_addr *addr2, 753*1da177e4SLinus Torvalds struct sctp_sock *opt) 754*1da177e4SLinus Torvalds { 755*1da177e4SLinus Torvalds /* PF_INET only supports AF_INET addresses. */ 756*1da177e4SLinus Torvalds if (addr1->sa.sa_family != addr2->sa.sa_family) 757*1da177e4SLinus Torvalds return 0; 758*1da177e4SLinus Torvalds if (INADDR_ANY == addr1->v4.sin_addr.s_addr || 759*1da177e4SLinus Torvalds INADDR_ANY == addr2->v4.sin_addr.s_addr) 760*1da177e4SLinus Torvalds return 1; 761*1da177e4SLinus Torvalds if (addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr) 762*1da177e4SLinus Torvalds return 1; 763*1da177e4SLinus Torvalds 764*1da177e4SLinus Torvalds return 0; 765*1da177e4SLinus Torvalds } 766*1da177e4SLinus Torvalds 767*1da177e4SLinus Torvalds /* Verify that provided sockaddr looks bindable. Common verification has 768*1da177e4SLinus Torvalds * already been taken care of. 769*1da177e4SLinus Torvalds */ 770*1da177e4SLinus Torvalds static int sctp_inet_bind_verify(struct sctp_sock *opt, union sctp_addr *addr) 771*1da177e4SLinus Torvalds { 772*1da177e4SLinus Torvalds return sctp_v4_available(addr, opt); 773*1da177e4SLinus Torvalds } 774*1da177e4SLinus Torvalds 775*1da177e4SLinus Torvalds /* Verify that sockaddr looks sendable. Common verification has already 776*1da177e4SLinus Torvalds * been taken care of. 777*1da177e4SLinus Torvalds */ 778*1da177e4SLinus Torvalds static int sctp_inet_send_verify(struct sctp_sock *opt, union sctp_addr *addr) 779*1da177e4SLinus Torvalds { 780*1da177e4SLinus Torvalds return 1; 781*1da177e4SLinus Torvalds } 782*1da177e4SLinus Torvalds 783*1da177e4SLinus Torvalds /* Fill in Supported Address Type information for INIT and INIT-ACK 784*1da177e4SLinus Torvalds * chunks. Returns number of addresses supported. 785*1da177e4SLinus Torvalds */ 786*1da177e4SLinus Torvalds static int sctp_inet_supported_addrs(const struct sctp_sock *opt, 787*1da177e4SLinus Torvalds __u16 *types) 788*1da177e4SLinus Torvalds { 789*1da177e4SLinus Torvalds types[0] = SCTP_PARAM_IPV4_ADDRESS; 790*1da177e4SLinus Torvalds return 1; 791*1da177e4SLinus Torvalds } 792*1da177e4SLinus Torvalds 793*1da177e4SLinus Torvalds /* Wrapper routine that calls the ip transmit routine. */ 794*1da177e4SLinus Torvalds static inline int sctp_v4_xmit(struct sk_buff *skb, 795*1da177e4SLinus Torvalds struct sctp_transport *transport, int ipfragok) 796*1da177e4SLinus Torvalds { 797*1da177e4SLinus Torvalds SCTP_DEBUG_PRINTK("%s: skb:%p, len:%d, " 798*1da177e4SLinus Torvalds "src:%u.%u.%u.%u, dst:%u.%u.%u.%u\n", 799*1da177e4SLinus Torvalds __FUNCTION__, skb, skb->len, 800*1da177e4SLinus Torvalds NIPQUAD(((struct rtable *)skb->dst)->rt_src), 801*1da177e4SLinus Torvalds NIPQUAD(((struct rtable *)skb->dst)->rt_dst)); 802*1da177e4SLinus Torvalds 803*1da177e4SLinus Torvalds SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS); 804*1da177e4SLinus Torvalds return ip_queue_xmit(skb, ipfragok); 805*1da177e4SLinus Torvalds } 806*1da177e4SLinus Torvalds 807*1da177e4SLinus Torvalds static struct sctp_af sctp_ipv4_specific; 808*1da177e4SLinus Torvalds 809*1da177e4SLinus Torvalds static struct sctp_pf sctp_pf_inet = { 810*1da177e4SLinus Torvalds .event_msgname = sctp_inet_event_msgname, 811*1da177e4SLinus Torvalds .skb_msgname = sctp_inet_skb_msgname, 812*1da177e4SLinus Torvalds .af_supported = sctp_inet_af_supported, 813*1da177e4SLinus Torvalds .cmp_addr = sctp_inet_cmp_addr, 814*1da177e4SLinus Torvalds .bind_verify = sctp_inet_bind_verify, 815*1da177e4SLinus Torvalds .send_verify = sctp_inet_send_verify, 816*1da177e4SLinus Torvalds .supported_addrs = sctp_inet_supported_addrs, 817*1da177e4SLinus Torvalds .create_accept_sk = sctp_v4_create_accept_sk, 818*1da177e4SLinus Torvalds .addr_v4map = sctp_v4_addr_v4map, 819*1da177e4SLinus Torvalds .af = &sctp_ipv4_specific, 820*1da177e4SLinus Torvalds }; 821*1da177e4SLinus Torvalds 822*1da177e4SLinus Torvalds /* Notifier for inetaddr addition/deletion events. */ 823*1da177e4SLinus Torvalds static struct notifier_block sctp_inetaddr_notifier = { 824*1da177e4SLinus Torvalds .notifier_call = sctp_inetaddr_event, 825*1da177e4SLinus Torvalds }; 826*1da177e4SLinus Torvalds 827*1da177e4SLinus Torvalds /* Socket operations. */ 828*1da177e4SLinus Torvalds static struct proto_ops inet_seqpacket_ops = { 829*1da177e4SLinus Torvalds .family = PF_INET, 830*1da177e4SLinus Torvalds .owner = THIS_MODULE, 831*1da177e4SLinus Torvalds .release = inet_release, /* Needs to be wrapped... */ 832*1da177e4SLinus Torvalds .bind = inet_bind, 833*1da177e4SLinus Torvalds .connect = inet_dgram_connect, 834*1da177e4SLinus Torvalds .socketpair = sock_no_socketpair, 835*1da177e4SLinus Torvalds .accept = inet_accept, 836*1da177e4SLinus Torvalds .getname = inet_getname, /* Semantics are different. */ 837*1da177e4SLinus Torvalds .poll = sctp_poll, 838*1da177e4SLinus Torvalds .ioctl = inet_ioctl, 839*1da177e4SLinus Torvalds .listen = sctp_inet_listen, 840*1da177e4SLinus Torvalds .shutdown = inet_shutdown, /* Looks harmless. */ 841*1da177e4SLinus Torvalds .setsockopt = sock_common_setsockopt, /* IP_SOL IP_OPTION is a problem. */ 842*1da177e4SLinus Torvalds .getsockopt = sock_common_getsockopt, 843*1da177e4SLinus Torvalds .sendmsg = inet_sendmsg, 844*1da177e4SLinus Torvalds .recvmsg = sock_common_recvmsg, 845*1da177e4SLinus Torvalds .mmap = sock_no_mmap, 846*1da177e4SLinus Torvalds .sendpage = sock_no_sendpage, 847*1da177e4SLinus Torvalds }; 848*1da177e4SLinus Torvalds 849*1da177e4SLinus Torvalds /* Registration with AF_INET family. */ 850*1da177e4SLinus Torvalds static struct inet_protosw sctp_seqpacket_protosw = { 851*1da177e4SLinus Torvalds .type = SOCK_SEQPACKET, 852*1da177e4SLinus Torvalds .protocol = IPPROTO_SCTP, 853*1da177e4SLinus Torvalds .prot = &sctp_prot, 854*1da177e4SLinus Torvalds .ops = &inet_seqpacket_ops, 855*1da177e4SLinus Torvalds .capability = -1, 856*1da177e4SLinus Torvalds .no_check = 0, 857*1da177e4SLinus Torvalds .flags = SCTP_PROTOSW_FLAG 858*1da177e4SLinus Torvalds }; 859*1da177e4SLinus Torvalds static struct inet_protosw sctp_stream_protosw = { 860*1da177e4SLinus Torvalds .type = SOCK_STREAM, 861*1da177e4SLinus Torvalds .protocol = IPPROTO_SCTP, 862*1da177e4SLinus Torvalds .prot = &sctp_prot, 863*1da177e4SLinus Torvalds .ops = &inet_seqpacket_ops, 864*1da177e4SLinus Torvalds .capability = -1, 865*1da177e4SLinus Torvalds .no_check = 0, 866*1da177e4SLinus Torvalds .flags = SCTP_PROTOSW_FLAG 867*1da177e4SLinus Torvalds }; 868*1da177e4SLinus Torvalds 869*1da177e4SLinus Torvalds /* Register with IP layer. */ 870*1da177e4SLinus Torvalds static struct net_protocol sctp_protocol = { 871*1da177e4SLinus Torvalds .handler = sctp_rcv, 872*1da177e4SLinus Torvalds .err_handler = sctp_v4_err, 873*1da177e4SLinus Torvalds .no_policy = 1, 874*1da177e4SLinus Torvalds }; 875*1da177e4SLinus Torvalds 876*1da177e4SLinus Torvalds /* IPv4 address related functions. */ 877*1da177e4SLinus Torvalds static struct sctp_af sctp_ipv4_specific = { 878*1da177e4SLinus Torvalds .sctp_xmit = sctp_v4_xmit, 879*1da177e4SLinus Torvalds .setsockopt = ip_setsockopt, 880*1da177e4SLinus Torvalds .getsockopt = ip_getsockopt, 881*1da177e4SLinus Torvalds .get_dst = sctp_v4_get_dst, 882*1da177e4SLinus Torvalds .get_saddr = sctp_v4_get_saddr, 883*1da177e4SLinus Torvalds .copy_addrlist = sctp_v4_copy_addrlist, 884*1da177e4SLinus Torvalds .from_skb = sctp_v4_from_skb, 885*1da177e4SLinus Torvalds .from_sk = sctp_v4_from_sk, 886*1da177e4SLinus Torvalds .to_sk_saddr = sctp_v4_to_sk_saddr, 887*1da177e4SLinus Torvalds .to_sk_daddr = sctp_v4_to_sk_daddr, 888*1da177e4SLinus Torvalds .from_addr_param= sctp_v4_from_addr_param, 889*1da177e4SLinus Torvalds .to_addr_param = sctp_v4_to_addr_param, 890*1da177e4SLinus Torvalds .dst_saddr = sctp_v4_dst_saddr, 891*1da177e4SLinus Torvalds .cmp_addr = sctp_v4_cmp_addr, 892*1da177e4SLinus Torvalds .addr_valid = sctp_v4_addr_valid, 893*1da177e4SLinus Torvalds .inaddr_any = sctp_v4_inaddr_any, 894*1da177e4SLinus Torvalds .is_any = sctp_v4_is_any, 895*1da177e4SLinus Torvalds .available = sctp_v4_available, 896*1da177e4SLinus Torvalds .scope = sctp_v4_scope, 897*1da177e4SLinus Torvalds .skb_iif = sctp_v4_skb_iif, 898*1da177e4SLinus Torvalds .is_ce = sctp_v4_is_ce, 899*1da177e4SLinus Torvalds .seq_dump_addr = sctp_v4_seq_dump_addr, 900*1da177e4SLinus Torvalds .net_header_len = sizeof(struct iphdr), 901*1da177e4SLinus Torvalds .sockaddr_len = sizeof(struct sockaddr_in), 902*1da177e4SLinus Torvalds .sa_family = AF_INET, 903*1da177e4SLinus Torvalds }; 904*1da177e4SLinus Torvalds 905*1da177e4SLinus Torvalds struct sctp_pf *sctp_get_pf_specific(sa_family_t family) { 906*1da177e4SLinus Torvalds 907*1da177e4SLinus Torvalds switch (family) { 908*1da177e4SLinus Torvalds case PF_INET: 909*1da177e4SLinus Torvalds return sctp_pf_inet_specific; 910*1da177e4SLinus Torvalds case PF_INET6: 911*1da177e4SLinus Torvalds return sctp_pf_inet6_specific; 912*1da177e4SLinus Torvalds default: 913*1da177e4SLinus Torvalds return NULL; 914*1da177e4SLinus Torvalds } 915*1da177e4SLinus Torvalds } 916*1da177e4SLinus Torvalds 917*1da177e4SLinus Torvalds /* Register the PF specific function table. */ 918*1da177e4SLinus Torvalds int sctp_register_pf(struct sctp_pf *pf, sa_family_t family) 919*1da177e4SLinus Torvalds { 920*1da177e4SLinus Torvalds switch (family) { 921*1da177e4SLinus Torvalds case PF_INET: 922*1da177e4SLinus Torvalds if (sctp_pf_inet_specific) 923*1da177e4SLinus Torvalds return 0; 924*1da177e4SLinus Torvalds sctp_pf_inet_specific = pf; 925*1da177e4SLinus Torvalds break; 926*1da177e4SLinus Torvalds case PF_INET6: 927*1da177e4SLinus Torvalds if (sctp_pf_inet6_specific) 928*1da177e4SLinus Torvalds return 0; 929*1da177e4SLinus Torvalds sctp_pf_inet6_specific = pf; 930*1da177e4SLinus Torvalds break; 931*1da177e4SLinus Torvalds default: 932*1da177e4SLinus Torvalds return 0; 933*1da177e4SLinus Torvalds } 934*1da177e4SLinus Torvalds return 1; 935*1da177e4SLinus Torvalds } 936*1da177e4SLinus Torvalds 937*1da177e4SLinus Torvalds static int __init init_sctp_mibs(void) 938*1da177e4SLinus Torvalds { 939*1da177e4SLinus Torvalds sctp_statistics[0] = alloc_percpu(struct sctp_mib); 940*1da177e4SLinus Torvalds if (!sctp_statistics[0]) 941*1da177e4SLinus Torvalds return -ENOMEM; 942*1da177e4SLinus Torvalds sctp_statistics[1] = alloc_percpu(struct sctp_mib); 943*1da177e4SLinus Torvalds if (!sctp_statistics[1]) { 944*1da177e4SLinus Torvalds free_percpu(sctp_statistics[0]); 945*1da177e4SLinus Torvalds return -ENOMEM; 946*1da177e4SLinus Torvalds } 947*1da177e4SLinus Torvalds return 0; 948*1da177e4SLinus Torvalds 949*1da177e4SLinus Torvalds } 950*1da177e4SLinus Torvalds 951*1da177e4SLinus Torvalds static void cleanup_sctp_mibs(void) 952*1da177e4SLinus Torvalds { 953*1da177e4SLinus Torvalds free_percpu(sctp_statistics[0]); 954*1da177e4SLinus Torvalds free_percpu(sctp_statistics[1]); 955*1da177e4SLinus Torvalds } 956*1da177e4SLinus Torvalds 957*1da177e4SLinus Torvalds /* Initialize the universe into something sensible. */ 958*1da177e4SLinus Torvalds SCTP_STATIC __init int sctp_init(void) 959*1da177e4SLinus Torvalds { 960*1da177e4SLinus Torvalds int i; 961*1da177e4SLinus Torvalds int status = -EINVAL; 962*1da177e4SLinus Torvalds unsigned long goal; 963*1da177e4SLinus Torvalds int order; 964*1da177e4SLinus Torvalds 965*1da177e4SLinus Torvalds /* SCTP_DEBUG sanity check. */ 966*1da177e4SLinus Torvalds if (!sctp_sanity_check()) 967*1da177e4SLinus Torvalds goto out; 968*1da177e4SLinus Torvalds 969*1da177e4SLinus Torvalds status = proto_register(&sctp_prot, 1); 970*1da177e4SLinus Torvalds if (status) 971*1da177e4SLinus Torvalds goto out; 972*1da177e4SLinus Torvalds 973*1da177e4SLinus Torvalds /* Add SCTP to inet_protos hash table. */ 974*1da177e4SLinus Torvalds status = -EAGAIN; 975*1da177e4SLinus Torvalds if (inet_add_protocol(&sctp_protocol, IPPROTO_SCTP) < 0) 976*1da177e4SLinus Torvalds goto err_add_protocol; 977*1da177e4SLinus Torvalds 978*1da177e4SLinus Torvalds /* Add SCTP(TCP and UDP style) to inetsw linked list. */ 979*1da177e4SLinus Torvalds inet_register_protosw(&sctp_seqpacket_protosw); 980*1da177e4SLinus Torvalds inet_register_protosw(&sctp_stream_protosw); 981*1da177e4SLinus Torvalds 982*1da177e4SLinus Torvalds /* Allocate a cache pools. */ 983*1da177e4SLinus Torvalds status = -ENOBUFS; 984*1da177e4SLinus Torvalds sctp_bucket_cachep = kmem_cache_create("sctp_bind_bucket", 985*1da177e4SLinus Torvalds sizeof(struct sctp_bind_bucket), 986*1da177e4SLinus Torvalds 0, SLAB_HWCACHE_ALIGN, 987*1da177e4SLinus Torvalds NULL, NULL); 988*1da177e4SLinus Torvalds 989*1da177e4SLinus Torvalds if (!sctp_bucket_cachep) 990*1da177e4SLinus Torvalds goto err_bucket_cachep; 991*1da177e4SLinus Torvalds 992*1da177e4SLinus Torvalds sctp_chunk_cachep = kmem_cache_create("sctp_chunk", 993*1da177e4SLinus Torvalds sizeof(struct sctp_chunk), 994*1da177e4SLinus Torvalds 0, SLAB_HWCACHE_ALIGN, 995*1da177e4SLinus Torvalds NULL, NULL); 996*1da177e4SLinus Torvalds if (!sctp_chunk_cachep) 997*1da177e4SLinus Torvalds goto err_chunk_cachep; 998*1da177e4SLinus Torvalds 999*1da177e4SLinus Torvalds /* Allocate and initialise sctp mibs. */ 1000*1da177e4SLinus Torvalds status = init_sctp_mibs(); 1001*1da177e4SLinus Torvalds if (status) 1002*1da177e4SLinus Torvalds goto err_init_mibs; 1003*1da177e4SLinus Torvalds 1004*1da177e4SLinus Torvalds /* Initialize proc fs directory. */ 1005*1da177e4SLinus Torvalds status = sctp_proc_init(); 1006*1da177e4SLinus Torvalds if (status) 1007*1da177e4SLinus Torvalds goto err_init_proc; 1008*1da177e4SLinus Torvalds 1009*1da177e4SLinus Torvalds /* Initialize object count debugging. */ 1010*1da177e4SLinus Torvalds sctp_dbg_objcnt_init(); 1011*1da177e4SLinus Torvalds 1012*1da177e4SLinus Torvalds /* Initialize the SCTP specific PF functions. */ 1013*1da177e4SLinus Torvalds sctp_register_pf(&sctp_pf_inet, PF_INET); 1014*1da177e4SLinus Torvalds /* 1015*1da177e4SLinus Torvalds * 14. Suggested SCTP Protocol Parameter Values 1016*1da177e4SLinus Torvalds */ 1017*1da177e4SLinus Torvalds /* The following protocol parameters are RECOMMENDED: */ 1018*1da177e4SLinus Torvalds /* RTO.Initial - 3 seconds */ 1019*1da177e4SLinus Torvalds sctp_rto_initial = SCTP_RTO_INITIAL; 1020*1da177e4SLinus Torvalds /* RTO.Min - 1 second */ 1021*1da177e4SLinus Torvalds sctp_rto_min = SCTP_RTO_MIN; 1022*1da177e4SLinus Torvalds /* RTO.Max - 60 seconds */ 1023*1da177e4SLinus Torvalds sctp_rto_max = SCTP_RTO_MAX; 1024*1da177e4SLinus Torvalds /* RTO.Alpha - 1/8 */ 1025*1da177e4SLinus Torvalds sctp_rto_alpha = SCTP_RTO_ALPHA; 1026*1da177e4SLinus Torvalds /* RTO.Beta - 1/4 */ 1027*1da177e4SLinus Torvalds sctp_rto_beta = SCTP_RTO_BETA; 1028*1da177e4SLinus Torvalds 1029*1da177e4SLinus Torvalds /* Valid.Cookie.Life - 60 seconds */ 1030*1da177e4SLinus Torvalds sctp_valid_cookie_life = 60 * HZ; 1031*1da177e4SLinus Torvalds 1032*1da177e4SLinus Torvalds /* Whether Cookie Preservative is enabled(1) or not(0) */ 1033*1da177e4SLinus Torvalds sctp_cookie_preserve_enable = 1; 1034*1da177e4SLinus Torvalds 1035*1da177e4SLinus Torvalds /* Max.Burst - 4 */ 1036*1da177e4SLinus Torvalds sctp_max_burst = SCTP_MAX_BURST; 1037*1da177e4SLinus Torvalds 1038*1da177e4SLinus Torvalds /* Association.Max.Retrans - 10 attempts 1039*1da177e4SLinus Torvalds * Path.Max.Retrans - 5 attempts (per destination address) 1040*1da177e4SLinus Torvalds * Max.Init.Retransmits - 8 attempts 1041*1da177e4SLinus Torvalds */ 1042*1da177e4SLinus Torvalds sctp_max_retrans_association = 10; 1043*1da177e4SLinus Torvalds sctp_max_retrans_path = 5; 1044*1da177e4SLinus Torvalds sctp_max_retrans_init = 8; 1045*1da177e4SLinus Torvalds 1046*1da177e4SLinus Torvalds /* HB.interval - 30 seconds */ 1047*1da177e4SLinus Torvalds sctp_hb_interval = 30 * HZ; 1048*1da177e4SLinus Torvalds 1049*1da177e4SLinus Torvalds /* Implementation specific variables. */ 1050*1da177e4SLinus Torvalds 1051*1da177e4SLinus Torvalds /* Initialize default stream count setup information. */ 1052*1da177e4SLinus Torvalds sctp_max_instreams = SCTP_DEFAULT_INSTREAMS; 1053*1da177e4SLinus Torvalds sctp_max_outstreams = SCTP_DEFAULT_OUTSTREAMS; 1054*1da177e4SLinus Torvalds 1055*1da177e4SLinus Torvalds /* Initialize handle used for association ids. */ 1056*1da177e4SLinus Torvalds idr_init(&sctp_assocs_id); 1057*1da177e4SLinus Torvalds 1058*1da177e4SLinus Torvalds /* Size and allocate the association hash table. 1059*1da177e4SLinus Torvalds * The methodology is similar to that of the tcp hash tables. 1060*1da177e4SLinus Torvalds */ 1061*1da177e4SLinus Torvalds if (num_physpages >= (128 * 1024)) 1062*1da177e4SLinus Torvalds goal = num_physpages >> (22 - PAGE_SHIFT); 1063*1da177e4SLinus Torvalds else 1064*1da177e4SLinus Torvalds goal = num_physpages >> (24 - PAGE_SHIFT); 1065*1da177e4SLinus Torvalds 1066*1da177e4SLinus Torvalds for (order = 0; (1UL << order) < goal; order++) 1067*1da177e4SLinus Torvalds ; 1068*1da177e4SLinus Torvalds 1069*1da177e4SLinus Torvalds do { 1070*1da177e4SLinus Torvalds sctp_assoc_hashsize = (1UL << order) * PAGE_SIZE / 1071*1da177e4SLinus Torvalds sizeof(struct sctp_hashbucket); 1072*1da177e4SLinus Torvalds if ((sctp_assoc_hashsize > (64 * 1024)) && order > 0) 1073*1da177e4SLinus Torvalds continue; 1074*1da177e4SLinus Torvalds sctp_assoc_hashtable = (struct sctp_hashbucket *) 1075*1da177e4SLinus Torvalds __get_free_pages(GFP_ATOMIC, order); 1076*1da177e4SLinus Torvalds } while (!sctp_assoc_hashtable && --order > 0); 1077*1da177e4SLinus Torvalds if (!sctp_assoc_hashtable) { 1078*1da177e4SLinus Torvalds printk(KERN_ERR "SCTP: Failed association hash alloc.\n"); 1079*1da177e4SLinus Torvalds status = -ENOMEM; 1080*1da177e4SLinus Torvalds goto err_ahash_alloc; 1081*1da177e4SLinus Torvalds } 1082*1da177e4SLinus Torvalds for (i = 0; i < sctp_assoc_hashsize; i++) { 1083*1da177e4SLinus Torvalds rwlock_init(&sctp_assoc_hashtable[i].lock); 1084*1da177e4SLinus Torvalds sctp_assoc_hashtable[i].chain = NULL; 1085*1da177e4SLinus Torvalds } 1086*1da177e4SLinus Torvalds 1087*1da177e4SLinus Torvalds /* Allocate and initialize the endpoint hash table. */ 1088*1da177e4SLinus Torvalds sctp_ep_hashsize = 64; 1089*1da177e4SLinus Torvalds sctp_ep_hashtable = (struct sctp_hashbucket *) 1090*1da177e4SLinus Torvalds kmalloc(64 * sizeof(struct sctp_hashbucket), GFP_KERNEL); 1091*1da177e4SLinus Torvalds if (!sctp_ep_hashtable) { 1092*1da177e4SLinus Torvalds printk(KERN_ERR "SCTP: Failed endpoint_hash alloc.\n"); 1093*1da177e4SLinus Torvalds status = -ENOMEM; 1094*1da177e4SLinus Torvalds goto err_ehash_alloc; 1095*1da177e4SLinus Torvalds } 1096*1da177e4SLinus Torvalds for (i = 0; i < sctp_ep_hashsize; i++) { 1097*1da177e4SLinus Torvalds rwlock_init(&sctp_ep_hashtable[i].lock); 1098*1da177e4SLinus Torvalds sctp_ep_hashtable[i].chain = NULL; 1099*1da177e4SLinus Torvalds } 1100*1da177e4SLinus Torvalds 1101*1da177e4SLinus Torvalds /* Allocate and initialize the SCTP port hash table. */ 1102*1da177e4SLinus Torvalds do { 1103*1da177e4SLinus Torvalds sctp_port_hashsize = (1UL << order) * PAGE_SIZE / 1104*1da177e4SLinus Torvalds sizeof(struct sctp_bind_hashbucket); 1105*1da177e4SLinus Torvalds if ((sctp_port_hashsize > (64 * 1024)) && order > 0) 1106*1da177e4SLinus Torvalds continue; 1107*1da177e4SLinus Torvalds sctp_port_hashtable = (struct sctp_bind_hashbucket *) 1108*1da177e4SLinus Torvalds __get_free_pages(GFP_ATOMIC, order); 1109*1da177e4SLinus Torvalds } while (!sctp_port_hashtable && --order > 0); 1110*1da177e4SLinus Torvalds if (!sctp_port_hashtable) { 1111*1da177e4SLinus Torvalds printk(KERN_ERR "SCTP: Failed bind hash alloc."); 1112*1da177e4SLinus Torvalds status = -ENOMEM; 1113*1da177e4SLinus Torvalds goto err_bhash_alloc; 1114*1da177e4SLinus Torvalds } 1115*1da177e4SLinus Torvalds for (i = 0; i < sctp_port_hashsize; i++) { 1116*1da177e4SLinus Torvalds spin_lock_init(&sctp_port_hashtable[i].lock); 1117*1da177e4SLinus Torvalds sctp_port_hashtable[i].chain = NULL; 1118*1da177e4SLinus Torvalds } 1119*1da177e4SLinus Torvalds 1120*1da177e4SLinus Torvalds spin_lock_init(&sctp_port_alloc_lock); 1121*1da177e4SLinus Torvalds sctp_port_rover = sysctl_local_port_range[0] - 1; 1122*1da177e4SLinus Torvalds 1123*1da177e4SLinus Torvalds printk(KERN_INFO "SCTP: Hash tables configured " 1124*1da177e4SLinus Torvalds "(established %d bind %d)\n", 1125*1da177e4SLinus Torvalds sctp_assoc_hashsize, sctp_port_hashsize); 1126*1da177e4SLinus Torvalds 1127*1da177e4SLinus Torvalds /* Disable ADDIP by default. */ 1128*1da177e4SLinus Torvalds sctp_addip_enable = 0; 1129*1da177e4SLinus Torvalds 1130*1da177e4SLinus Torvalds /* Enable PR-SCTP by default. */ 1131*1da177e4SLinus Torvalds sctp_prsctp_enable = 1; 1132*1da177e4SLinus Torvalds 1133*1da177e4SLinus Torvalds sctp_sysctl_register(); 1134*1da177e4SLinus Torvalds 1135*1da177e4SLinus Torvalds INIT_LIST_HEAD(&sctp_address_families); 1136*1da177e4SLinus Torvalds sctp_register_af(&sctp_ipv4_specific); 1137*1da177e4SLinus Torvalds 1138*1da177e4SLinus Torvalds status = sctp_v6_init(); 1139*1da177e4SLinus Torvalds if (status) 1140*1da177e4SLinus Torvalds goto err_v6_init; 1141*1da177e4SLinus Torvalds 1142*1da177e4SLinus Torvalds /* Initialize the control inode/socket for handling OOTB packets. */ 1143*1da177e4SLinus Torvalds if ((status = sctp_ctl_sock_init())) { 1144*1da177e4SLinus Torvalds printk (KERN_ERR 1145*1da177e4SLinus Torvalds "SCTP: Failed to initialize the SCTP control sock.\n"); 1146*1da177e4SLinus Torvalds goto err_ctl_sock_init; 1147*1da177e4SLinus Torvalds } 1148*1da177e4SLinus Torvalds 1149*1da177e4SLinus Torvalds /* Initialize the local address list. */ 1150*1da177e4SLinus Torvalds INIT_LIST_HEAD(&sctp_local_addr_list); 1151*1da177e4SLinus Torvalds spin_lock_init(&sctp_local_addr_lock); 1152*1da177e4SLinus Torvalds 1153*1da177e4SLinus Torvalds /* Register notifier for inet address additions/deletions. */ 1154*1da177e4SLinus Torvalds register_inetaddr_notifier(&sctp_inetaddr_notifier); 1155*1da177e4SLinus Torvalds 1156*1da177e4SLinus Torvalds sctp_get_local_addr_list(); 1157*1da177e4SLinus Torvalds 1158*1da177e4SLinus Torvalds __unsafe(THIS_MODULE); 1159*1da177e4SLinus Torvalds status = 0; 1160*1da177e4SLinus Torvalds out: 1161*1da177e4SLinus Torvalds return status; 1162*1da177e4SLinus Torvalds err_add_protocol: 1163*1da177e4SLinus Torvalds proto_unregister(&sctp_prot); 1164*1da177e4SLinus Torvalds err_ctl_sock_init: 1165*1da177e4SLinus Torvalds sctp_v6_exit(); 1166*1da177e4SLinus Torvalds err_v6_init: 1167*1da177e4SLinus Torvalds sctp_sysctl_unregister(); 1168*1da177e4SLinus Torvalds list_del(&sctp_ipv4_specific.list); 1169*1da177e4SLinus Torvalds free_pages((unsigned long)sctp_port_hashtable, 1170*1da177e4SLinus Torvalds get_order(sctp_port_hashsize * 1171*1da177e4SLinus Torvalds sizeof(struct sctp_bind_hashbucket))); 1172*1da177e4SLinus Torvalds err_bhash_alloc: 1173*1da177e4SLinus Torvalds kfree(sctp_ep_hashtable); 1174*1da177e4SLinus Torvalds err_ehash_alloc: 1175*1da177e4SLinus Torvalds free_pages((unsigned long)sctp_assoc_hashtable, 1176*1da177e4SLinus Torvalds get_order(sctp_assoc_hashsize * 1177*1da177e4SLinus Torvalds sizeof(struct sctp_hashbucket))); 1178*1da177e4SLinus Torvalds err_ahash_alloc: 1179*1da177e4SLinus Torvalds sctp_dbg_objcnt_exit(); 1180*1da177e4SLinus Torvalds err_init_proc: 1181*1da177e4SLinus Torvalds sctp_proc_exit(); 1182*1da177e4SLinus Torvalds cleanup_sctp_mibs(); 1183*1da177e4SLinus Torvalds err_init_mibs: 1184*1da177e4SLinus Torvalds kmem_cache_destroy(sctp_chunk_cachep); 1185*1da177e4SLinus Torvalds err_chunk_cachep: 1186*1da177e4SLinus Torvalds kmem_cache_destroy(sctp_bucket_cachep); 1187*1da177e4SLinus Torvalds err_bucket_cachep: 1188*1da177e4SLinus Torvalds inet_del_protocol(&sctp_protocol, IPPROTO_SCTP); 1189*1da177e4SLinus Torvalds inet_unregister_protosw(&sctp_seqpacket_protosw); 1190*1da177e4SLinus Torvalds inet_unregister_protosw(&sctp_stream_protosw); 1191*1da177e4SLinus Torvalds goto out; 1192*1da177e4SLinus Torvalds } 1193*1da177e4SLinus Torvalds 1194*1da177e4SLinus Torvalds /* Exit handler for the SCTP protocol. */ 1195*1da177e4SLinus Torvalds SCTP_STATIC __exit void sctp_exit(void) 1196*1da177e4SLinus Torvalds { 1197*1da177e4SLinus Torvalds /* BUG. This should probably do something useful like clean 1198*1da177e4SLinus Torvalds * up all the remaining associations and all that memory. 1199*1da177e4SLinus Torvalds */ 1200*1da177e4SLinus Torvalds 1201*1da177e4SLinus Torvalds /* Unregister notifier for inet address additions/deletions. */ 1202*1da177e4SLinus Torvalds unregister_inetaddr_notifier(&sctp_inetaddr_notifier); 1203*1da177e4SLinus Torvalds 1204*1da177e4SLinus Torvalds /* Free the local address list. */ 1205*1da177e4SLinus Torvalds sctp_free_local_addr_list(); 1206*1da177e4SLinus Torvalds 1207*1da177e4SLinus Torvalds /* Free the control endpoint. */ 1208*1da177e4SLinus Torvalds sock_release(sctp_ctl_socket); 1209*1da177e4SLinus Torvalds 1210*1da177e4SLinus Torvalds sctp_v6_exit(); 1211*1da177e4SLinus Torvalds sctp_sysctl_unregister(); 1212*1da177e4SLinus Torvalds list_del(&sctp_ipv4_specific.list); 1213*1da177e4SLinus Torvalds 1214*1da177e4SLinus Torvalds free_pages((unsigned long)sctp_assoc_hashtable, 1215*1da177e4SLinus Torvalds get_order(sctp_assoc_hashsize * 1216*1da177e4SLinus Torvalds sizeof(struct sctp_hashbucket))); 1217*1da177e4SLinus Torvalds kfree(sctp_ep_hashtable); 1218*1da177e4SLinus Torvalds free_pages((unsigned long)sctp_port_hashtable, 1219*1da177e4SLinus Torvalds get_order(sctp_port_hashsize * 1220*1da177e4SLinus Torvalds sizeof(struct sctp_bind_hashbucket))); 1221*1da177e4SLinus Torvalds 1222*1da177e4SLinus Torvalds kmem_cache_destroy(sctp_chunk_cachep); 1223*1da177e4SLinus Torvalds kmem_cache_destroy(sctp_bucket_cachep); 1224*1da177e4SLinus Torvalds 1225*1da177e4SLinus Torvalds sctp_dbg_objcnt_exit(); 1226*1da177e4SLinus Torvalds sctp_proc_exit(); 1227*1da177e4SLinus Torvalds cleanup_sctp_mibs(); 1228*1da177e4SLinus Torvalds 1229*1da177e4SLinus Torvalds inet_del_protocol(&sctp_protocol, IPPROTO_SCTP); 1230*1da177e4SLinus Torvalds inet_unregister_protosw(&sctp_seqpacket_protosw); 1231*1da177e4SLinus Torvalds inet_unregister_protosw(&sctp_stream_protosw); 1232*1da177e4SLinus Torvalds proto_unregister(&sctp_prot); 1233*1da177e4SLinus Torvalds } 1234*1da177e4SLinus Torvalds 1235*1da177e4SLinus Torvalds module_init(sctp_init); 1236*1da177e4SLinus Torvalds module_exit(sctp_exit); 1237*1da177e4SLinus Torvalds 1238*1da177e4SLinus Torvalds MODULE_AUTHOR("Linux Kernel SCTP developers <lksctp-developers@lists.sourceforge.net>"); 1239*1da177e4SLinus Torvalds MODULE_DESCRIPTION("Support for the SCTP protocol (RFC2960)"); 1240*1da177e4SLinus Torvalds MODULE_LICENSE("GPL"); 1241