Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /* SCTP kernel implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * (C) Copyright IBM Corp. 2001, 2004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  * Copyright (c) 1999-2000 Cisco, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * Copyright (c) 1999-2001 Motorola, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  * Copyright (c) 2001 Intel Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  * Copyright (c) 2001 Nokia, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  * Copyright (c) 2001 La Monte H.P. Yarroll
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  * This file is part of the SCTP kernel implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)  * Initialization/cleanup for SCTP protocol support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)  * Please send any bug reports or fixes you make to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15)  * email address(es):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16)  *    lksctp developers <linux-sctp@vger.kernel.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18)  * Written or modified by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19)  *    La Monte H.P. Yarroll <piggy@acm.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20)  *    Karl Knutson <karl@athena.chicago.il.us>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21)  *    Jon Grimm <jgrimm@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22)  *    Sridhar Samudrala <sri@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23)  *    Daisy Chang <daisyc@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24)  *    Ardelle Fan <ardelle.fan@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #include <linux/inetdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #include <linux/memblock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) #include <linux/swap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) #include <net/net_namespace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) #include <net/protocol.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) #include <net/ip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) #include <net/ipv6.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) #include <net/route.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) #include <net/sctp/sctp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #include <net/addrconf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) #include <net/inet_common.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #include <net/inet_ecn.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) #define MAX_SCTP_PORT_HASH_ENTRIES (64 * 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) /* Global data structures. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) struct sctp_globals sctp_globals __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) struct idr sctp_assocs_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) DEFINE_SPINLOCK(sctp_assocs_id_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) static struct sctp_pf *sctp_pf_inet6_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) static struct sctp_pf *sctp_pf_inet_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) static struct sctp_af *sctp_af_v4_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) static struct sctp_af *sctp_af_v6_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) struct kmem_cache *sctp_chunk_cachep __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) struct kmem_cache *sctp_bucket_cachep __read_mostly;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) long sysctl_sctp_mem[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) int sysctl_sctp_rmem[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) int sysctl_sctp_wmem[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) /* Private helper to extract ipv4 address and stash them in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69)  * the protocol structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) static void sctp_v4_copy_addrlist(struct list_head *addrlist,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 				  struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	struct in_device *in_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 	struct in_ifaddr *ifa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 	struct sctp_sockaddr_entry *addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	if ((in_dev = __in_dev_get_rcu(dev)) == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	in_dev_for_each_ifa_rcu(ifa, in_dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 		/* Add the address to the local list.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 		addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 		if (addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 			addr->a.v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 			addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 			addr->valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 			INIT_LIST_HEAD(&addr->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 			list_add_tail(&addr->list, addrlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) /* Extract our IP addresses from the system and stash them in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100)  * protocol structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) static void sctp_get_local_addr_list(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	struct list_head *pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	struct sctp_af *af;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	for_each_netdev_rcu(net, dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 		list_for_each(pos, &sctp_address_families) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 			af = list_entry(pos, struct sctp_af, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 			af->copy_addrlist(&net->sctp.local_addr_list, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) /* Free the existing local addresses.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) static void sctp_free_local_addr_list(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 	struct sctp_sockaddr_entry *addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	struct list_head *pos, *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	list_for_each_safe(pos, temp, &net->sctp.local_addr_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 		addr = list_entry(pos, struct sctp_sockaddr_entry, list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 		list_del(pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 		kfree(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) /* Copy the local addresses which are valid for 'scope' into 'bp'.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *bp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 			      enum sctp_scope scope, gfp_t gfp, int copy_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	struct sctp_sockaddr_entry *addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	union sctp_addr laddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 	int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 	list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 		if (!addr->valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 		if (!sctp_in_scope(net, &addr->a, scope))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 		/* Now that the address is in scope, check to see if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 		 * the address type is really supported by the local
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 		 * sock as well as the remote peer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 		if (addr->a.sa.sa_family == AF_INET &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 		    (!(copy_flags & SCTP_ADDR4_ALLOWED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 		     !(copy_flags & SCTP_ADDR4_PEERSUPP)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 		if (addr->a.sa.sa_family == AF_INET6 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 		    (!(copy_flags & SCTP_ADDR6_ALLOWED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 		     !(copy_flags & SCTP_ADDR6_PEERSUPP)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 		laddr = addr->a;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 		/* also works for setting ipv6 address port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 		laddr.v4.sin_port = htons(bp->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 		if (sctp_bind_addr_state(bp, &laddr) != -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 		error = sctp_add_bind_addr(bp, &addr->a, sizeof(addr->a),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 					   SCTP_ADDR_SRC, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 		if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) /* Copy over any ip options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) static void sctp_v4_copy_ip_options(struct sock *sk, struct sock *newsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	struct inet_sock *newinet, *inet = inet_sk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	struct ip_options_rcu *inet_opt, *newopt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	newinet = inet_sk(newsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	inet_opt = rcu_dereference(inet->inet_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	if (inet_opt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 		newopt = sock_kmalloc(newsk, sizeof(*inet_opt) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 				      inet_opt->opt.optlen, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 		if (newopt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 			memcpy(newopt, inet_opt, sizeof(*inet_opt) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 			       inet_opt->opt.optlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 			pr_err("%s: Failed to copy ip options\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	RCU_INIT_POINTER(newinet->inet_opt, newopt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) /* Account for the IP options */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) static int sctp_v4_ip_options_len(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	struct inet_sock *inet = inet_sk(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	struct ip_options_rcu *inet_opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	int len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	inet_opt = rcu_dereference(inet->inet_opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	if (inet_opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 		len = inet_opt->opt.optlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) /* Initialize a sctp_addr from in incoming skb.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) static void sctp_v4_from_skb(union sctp_addr *addr, struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 			     int is_saddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	/* Always called on head skb, so this is safe */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	struct sctphdr *sh = sctp_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	struct sockaddr_in *sa = &addr->v4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	addr->v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	if (is_saddr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 		sa->sin_port = sh->source;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 		sa->sin_addr.s_addr = ip_hdr(skb)->saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 		sa->sin_port = sh->dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 		sa->sin_addr.s_addr = ip_hdr(skb)->daddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	memset(sa->sin_zero, 0, sizeof(sa->sin_zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) /* Initialize an sctp_addr from a socket. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) static void sctp_v4_from_sk(union sctp_addr *addr, struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	addr->v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	addr->v4.sin_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	addr->v4.sin_addr.s_addr = inet_sk(sk)->inet_rcv_saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) /* Initialize sk->sk_rcv_saddr from sctp_addr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) static void sctp_v4_to_sk_saddr(union sctp_addr *addr, struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	inet_sk(sk)->inet_rcv_saddr = addr->v4.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) /* Initialize sk->sk_daddr from sctp_addr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	inet_sk(sk)->inet_daddr = addr->v4.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) /* Initialize a sctp_addr from an address parameter. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) static bool sctp_v4_from_addr_param(union sctp_addr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 				    union sctp_addr_param *param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 				    __be16 port, int iif)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	if (ntohs(param->v4.param_hdr.length) < sizeof(struct sctp_ipv4addr_param))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 		return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	addr->v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	addr->v4.sin_port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	addr->v4.sin_addr.s_addr = param->v4.addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) /* Initialize an address parameter from a sctp_addr and return the length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272)  * of the address parameter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) static int sctp_v4_to_addr_param(const union sctp_addr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) 				 union sctp_addr_param *param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	int length = sizeof(struct sctp_ipv4addr_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	param->v4.param_hdr.type = SCTP_PARAM_IPV4_ADDRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	param->v4.param_hdr.length = htons(length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	param->v4.addr.s_addr = addr->v4.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	return length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) /* Initialize a sctp_addr from a dst_entry. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) static void sctp_v4_dst_saddr(union sctp_addr *saddr, struct flowi4 *fl4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 			      __be16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	saddr->v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	saddr->v4.sin_port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	saddr->v4.sin_addr.s_addr = fl4->saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	memset(saddr->v4.sin_zero, 0, sizeof(saddr->v4.sin_zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) /* Compare two addresses exactly. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) static int sctp_v4_cmp_addr(const union sctp_addr *addr1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 			    const union sctp_addr *addr2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 	if (addr1->sa.sa_family != addr2->sa.sa_family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	if (addr1->v4.sin_port != addr2->v4.sin_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	if (addr1->v4.sin_addr.s_addr != addr2->v4.sin_addr.s_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) /* Initialize addr struct to INADDR_ANY. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) static void sctp_v4_inaddr_any(union sctp_addr *addr, __be16 port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	addr->v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	addr->v4.sin_addr.s_addr = htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	addr->v4.sin_port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) /* Is this a wildcard address? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) static int sctp_v4_is_any(const union sctp_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 	return htonl(INADDR_ANY) == addr->v4.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) /* This function checks if the address is a valid address to be used for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326)  * SCTP binding.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328)  * Output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329)  * Return 0 - If the address is a non-unicast or an illegal address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330)  * Return 1 - If the address is a unicast.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) static int sctp_v4_addr_valid(union sctp_addr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 			      struct sctp_sock *sp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 			      const struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	/* IPv4 addresses not allowed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 	if (sp && ipv6_only_sock(sctp_opt2sk(sp)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	/* Is this a non-unicast address or a unusable SCTP address? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	if (IS_IPV4_UNUSABLE_ADDRESS(addr->v4.sin_addr.s_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	/* Is this a broadcast address? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 	if (skb && skb_rtable(skb)->rt_flags & RTCF_BROADCAST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) /* Should this be available for binding?   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) static int sctp_v4_available(union sctp_addr *addr, struct sctp_sock *sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	struct net *net = sock_net(&sp->inet.sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	int ret = inet_addr_type(net, addr->v4.sin_addr.s_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	if (addr->v4.sin_addr.s_addr != htonl(INADDR_ANY) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 	   ret != RTN_LOCAL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	   !sp->inet.freebind &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	   !net->ipv4.sysctl_ip_nonlocal_bind)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	if (ipv6_only_sock(sctp_opt2sk(sp)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) /* Checking the loopback, private and other address scopes as defined in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371)  * RFC 1918.   The IPv4 scoping is based on the draft for SCTP IPv4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372)  * scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374)  * Level 0 - unusable SCTP addresses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375)  * Level 1 - loopback address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376)  * Level 2 - link-local addresses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377)  * Level 3 - private addresses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378)  * Level 4 - global addresses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379)  * For INIT and INIT-ACK address list, let L be the level of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380)  * requested destination address, sender and receiver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381)  * SHOULD include all of its addresses with level greater
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382)  * than or equal to L.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384)  * IPv4 scoping can be controlled through sysctl option
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385)  * net.sctp.addr_scope_policy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) static enum sctp_scope sctp_v4_scope(union sctp_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	enum sctp_scope retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	/* Check for unusable SCTP addresses. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	if (IS_IPV4_UNUSABLE_ADDRESS(addr->v4.sin_addr.s_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 		retval =  SCTP_SCOPE_UNUSABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 	} else if (ipv4_is_loopback(addr->v4.sin_addr.s_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 		retval = SCTP_SCOPE_LOOPBACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	} else if (ipv4_is_linklocal_169(addr->v4.sin_addr.s_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 		retval = SCTP_SCOPE_LINK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 	} else if (ipv4_is_private_10(addr->v4.sin_addr.s_addr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 		   ipv4_is_private_172(addr->v4.sin_addr.s_addr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 		   ipv4_is_private_192(addr->v4.sin_addr.s_addr) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 		   ipv4_is_test_198(addr->v4.sin_addr.s_addr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 		retval = SCTP_SCOPE_PRIVATE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 		retval = SCTP_SCOPE_GLOBAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) /* Returns a valid dst cache entry for the given source and destination ip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411)  * addresses. If an association is passed, trys to get a dst entry with a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412)  * source address that matches an address in the bind address list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 				struct flowi *fl, struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	struct sctp_association *asoc = t->asoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	struct rtable *rt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 	struct flowi _fl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	struct flowi4 *fl4 = &_fl.u.ip4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	struct sctp_bind_addr *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	struct sctp_sockaddr_entry *laddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	struct dst_entry *dst = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	union sctp_addr *daddr = &t->ipaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	union sctp_addr dst_saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	__u8 tos = inet_sk(sk)->tos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	if (t->dscp & SCTP_DSCP_SET_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 		tos = t->dscp & SCTP_DSCP_VAL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	memset(&_fl, 0x0, sizeof(_fl));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 	fl4->daddr  = daddr->v4.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	fl4->fl4_dport = daddr->v4.sin_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	fl4->flowi4_proto = IPPROTO_SCTP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	if (asoc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 		fl4->flowi4_tos = RT_CONN_FLAGS_TOS(asoc->base.sk, tos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 		fl4->flowi4_oif = asoc->base.sk->sk_bound_dev_if;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 		fl4->fl4_sport = htons(asoc->base.bind_addr.port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	if (saddr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 		fl4->saddr = saddr->v4.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 		if (!fl4->fl4_sport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 			fl4->fl4_sport = saddr->v4.sin_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	pr_debug("%s: dst:%pI4, src:%pI4 - ", __func__, &fl4->daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 		 &fl4->saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	rt = ip_route_output_key(sock_net(sk), fl4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	if (!IS_ERR(rt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 		dst = &rt->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 		t->dst = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 		memcpy(fl, &_fl, sizeof(_fl));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 	/* If there is no association or if a source address is passed, no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 	 * more validation is required.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 	if (!asoc || saddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 	bp = &asoc->base.bind_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 	if (dst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 		/* Walk through the bind address list and look for a bind
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 		 * address that matches the source address of the returned dst.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 		sctp_v4_dst_saddr(&dst_saddr, fl4, htons(bp->port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 		rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 		list_for_each_entry_rcu(laddr, &bp->address_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 			if (!laddr->valid || (laddr->state == SCTP_ADDR_DEL) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 			    (laddr->state != SCTP_ADDR_SRC &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 			    !asoc->src_out_of_asoc_ok))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 			if (sctp_v4_cmp_addr(&dst_saddr, &laddr->a))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 				goto out_unlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 		rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 		/* None of the bound addresses match the source address of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 		 * dst. So release it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 		dst_release(dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 		dst = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 	/* Walk through the bind address list and try to get a dst that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	 * matches a bind address as the source address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 	rcu_read_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	list_for_each_entry_rcu(laddr, &bp->address_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 		struct net_device *odev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 		if (!laddr->valid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) 		if (laddr->state != SCTP_ADDR_SRC ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 		    AF_INET != laddr->a.sa.sa_family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 		fl4->fl4_sport = laddr->a.v4.sin_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 		flowi4_update_output(fl4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 				     asoc->base.sk->sk_bound_dev_if,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 				     RT_CONN_FLAGS_TOS(asoc->base.sk, tos),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 				     daddr->v4.sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 				     laddr->a.v4.sin_addr.s_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 		rt = ip_route_output_key(sock_net(sk), fl4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 		if (IS_ERR(rt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 		/* Ensure the src address belongs to the output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 		 * interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 		odev = __ip_dev_find(sock_net(sk), laddr->a.v4.sin_addr.s_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 				     false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 		if (!odev || odev->ifindex != fl4->flowi4_oif) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 			if (!dst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 				dst = &rt->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 				t->dst = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 				memcpy(fl, &_fl, sizeof(_fl));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 				dst_release(&rt->dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 		dst_release(dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 		dst = &rt->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 		t->dst = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 		memcpy(fl, &_fl, sizeof(_fl));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) out_unlock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 	rcu_read_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	if (dst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 		pr_debug("rt_dst:%pI4, rt_src:%pI4\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 			 &fl->u.ip4.daddr, &fl->u.ip4.saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 		t->dst = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 		pr_debug("no route\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) /* For v4, the source address is cached in the route entry(dst). So no need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546)  * to cache it separately and hence this is an empty routine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) static void sctp_v4_get_saddr(struct sctp_sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 			      struct sctp_transport *t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 			      struct flowi *fl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	union sctp_addr *saddr = &t->saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	struct rtable *rt = (struct rtable *)t->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	if (rt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 		saddr->v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 		saddr->v4.sin_addr.s_addr = fl->u.ip4.saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) /* What interface did this skb arrive on? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) static int sctp_v4_skb_iif(const struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	return inet_iif(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) /* Was this packet marked by Explicit Congestion Notification? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) static int sctp_v4_is_ce(const struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	return INET_ECN_is_ce(ip_hdr(skb)->tos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) /* Create and initialize a new sk for the socket returned by accept(). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) static struct sock *sctp_v4_create_accept_sk(struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 					     struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 					     bool kern)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 	struct sock *newsk = sk_alloc(sock_net(sk), PF_INET, GFP_KERNEL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 			sk->sk_prot, kern);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	struct inet_sock *newinet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	if (!newsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	sock_init_data(NULL, newsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	sctp_copy_sock(newsk, sk, asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 	sock_reset_flag(newsk, SOCK_ZAPPED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	sctp_v4_copy_ip_options(sk, newsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	newinet = inet_sk(newsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	newinet->inet_daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	sk_refcnt_debug_inc(newsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	if (newsk->sk_prot->init(newsk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 		sk_common_release(newsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 		newsk = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	return newsk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) static int sctp_v4_addr_to_user(struct sctp_sock *sp, union sctp_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 	/* No address mapping for V4 sockets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	return sizeof(struct sockaddr_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) /* Dump the v4 addr to the seq file. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) static void sctp_v4_seq_dump_addr(struct seq_file *seq, union sctp_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	seq_printf(seq, "%pI4 ", &addr->v4.sin_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) static void sctp_v4_ecn_capable(struct sock *sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	INET_ECN_xmit(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) static void sctp_addr_wq_timeout_handler(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	struct net *net = from_timer(net, t, sctp.addr_wq_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	struct sctp_sockaddr_entry *addrw, *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 	struct sctp_sock *sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 	spin_lock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	list_for_each_entry_safe(addrw, temp, &net->sctp.addr_waitq, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 		pr_debug("%s: the first ent in wq:%p is addr:%pISc for cmd:%d at "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 			 "entry:%p\n", __func__, &net->sctp.addr_waitq, &addrw->a.sa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 			 addrw->state, addrw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 		/* Now we send an ASCONF for each association */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 		/* Note. we currently don't handle link local IPv6 addressees */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 		if (addrw->a.sa.sa_family == AF_INET6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 			struct in6_addr *in6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 			if (ipv6_addr_type(&addrw->a.v6.sin6_addr) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 			    IPV6_ADDR_LINKLOCAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 				goto free_next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 			in6 = (struct in6_addr *)&addrw->a.v6.sin6_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 			if (ipv6_chk_addr(net, in6, NULL, 0) == 0 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 			    addrw->state == SCTP_ADDR_NEW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 				unsigned long timeo_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 				pr_debug("%s: this is on DAD, trying %d sec "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 					 "later\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 					 SCTP_ADDRESS_TICK_DELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 				timeo_val = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 				timeo_val += msecs_to_jiffies(SCTP_ADDRESS_TICK_DELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 				mod_timer(&net->sctp.addr_wq_timer, timeo_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 		list_for_each_entry(sp, &net->sctp.auto_asconf_splist, auto_asconf_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 			struct sock *sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 			sk = sctp_opt2sk(sp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 			/* ignore bound-specific endpoints */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 			if (!sctp_is_ep_boundall(sk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 				continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 			bh_lock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 			if (sctp_asconf_mgmt(sp, addrw) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 				pr_debug("%s: sctp_asconf_mgmt failed\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 			bh_unlock_sock(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) #if IS_ENABLED(CONFIG_IPV6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) free_next:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 		list_del(&addrw->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 		kfree(addrw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 	spin_unlock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) static void sctp_free_addr_wq(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	struct sctp_sockaddr_entry *addrw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	struct sctp_sockaddr_entry *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	spin_lock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 	del_timer(&net->sctp.addr_wq_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	list_for_each_entry_safe(addrw, temp, &net->sctp.addr_waitq, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 		list_del(&addrw->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 		kfree(addrw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	spin_unlock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) /* lookup the entry for the same address in the addr_waitq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700)  * sctp_addr_wq MUST be locked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) static struct sctp_sockaddr_entry *sctp_addr_wq_lookup(struct net *net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 					struct sctp_sockaddr_entry *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	struct sctp_sockaddr_entry *addrw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 	list_for_each_entry(addrw, &net->sctp.addr_waitq, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 		if (addrw->a.sa.sa_family != addr->a.sa.sa_family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 		if (addrw->a.sa.sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 			if (addrw->a.v4.sin_addr.s_addr ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 			    addr->a.v4.sin_addr.s_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 				return addrw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 		} else if (addrw->a.sa.sa_family == AF_INET6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 			if (ipv6_addr_equal(&addrw->a.v6.sin6_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 			    &addr->a.v6.sin6_addr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 				return addrw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) void sctp_addr_wq_mgmt(struct net *net, struct sctp_sockaddr_entry *addr, int cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 	struct sctp_sockaddr_entry *addrw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	unsigned long timeo_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	/* first, we check if an opposite message already exist in the queue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	 * If we found such message, it is removed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 	 * This operation is a bit stupid, but the DHCP client attaches the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 	 * new address after a couple of addition and deletion of that address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 	spin_lock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 	/* Offsets existing events in addr_wq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 	addrw = sctp_addr_wq_lookup(net, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 	if (addrw) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 		if (addrw->state != cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 			pr_debug("%s: offsets existing entry for %d, addr:%pISc "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 				 "in wq:%p\n", __func__, addrw->state, &addrw->a.sa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 				 &net->sctp.addr_waitq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 			list_del(&addrw->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 			kfree(addrw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 		spin_unlock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 	/* OK, we have to add the new address to the wait queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 	addrw = kmemdup(addr, sizeof(struct sctp_sockaddr_entry), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 	if (addrw == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 		spin_unlock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 	addrw->state = cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 	list_add_tail(&addrw->list, &net->sctp.addr_waitq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 	pr_debug("%s: add new entry for cmd:%d, addr:%pISc in wq:%p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 		 __func__, addrw->state, &addrw->a.sa, &net->sctp.addr_waitq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 	if (!timer_pending(&net->sctp.addr_wq_timer)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 		timeo_val = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 		timeo_val += msecs_to_jiffies(SCTP_ADDRESS_TICK_DELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 		mod_timer(&net->sctp.addr_wq_timer, timeo_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 	spin_unlock_bh(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) /* Event handler for inet address addition/deletion events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771)  * The sctp_local_addr_list needs to be protocted by a spin lock since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772)  * multiple notifiers (say IPv4 and IPv6) may be running at the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773)  * time and thus corrupt the list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774)  * The reader side is protected with RCU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 			       void *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 	struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 	struct sctp_sockaddr_entry *addr = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 	struct sctp_sockaddr_entry *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 	struct net *net = dev_net(ifa->ifa_dev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	int found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 	switch (ev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 	case NETDEV_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 		addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 		if (addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 			addr->a.v4.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 			addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 			addr->valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 			spin_lock_bh(&net->sctp.local_addr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 			list_add_tail_rcu(&addr->list, &net->sctp.local_addr_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 			sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_NEW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 			spin_unlock_bh(&net->sctp.local_addr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 	case NETDEV_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		spin_lock_bh(&net->sctp.local_addr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 		list_for_each_entry_safe(addr, temp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 					&net->sctp.local_addr_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 			if (addr->a.sa.sa_family == AF_INET &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 					addr->a.v4.sin_addr.s_addr ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 					ifa->ifa_local) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 				sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_DEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 				found = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 				addr->valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 				list_del_rcu(&addr->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 		spin_unlock_bh(&net->sctp.local_addr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 		if (found)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 			kfree_rcu(addr, rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 	return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822)  * Initialize the control inode/socket with a control endpoint data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823)  * structure.  This endpoint is reserved exclusively for the OOTB processing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) static int sctp_ctl_sock_init(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 	sa_family_t family = PF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 	if (sctp_get_pf_specific(PF_INET6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 		family = PF_INET6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 	err = inet_ctl_sock_create(&net->sctp.ctl_sock, family,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 				   SOCK_SEQPACKET, IPPROTO_SCTP, net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 	/* If IPv6 socket could not be created, try the IPv4 socket */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 	if (err < 0 && family == PF_INET6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 		err = inet_ctl_sock_create(&net->sctp.ctl_sock, AF_INET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 					   SOCK_SEQPACKET, IPPROTO_SCTP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 					   net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 	if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 		pr_err("Failed to create the SCTP control socket\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 		return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) /* Register address family specific functions. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) int sctp_register_af(struct sctp_af *af)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	switch (af->sa_family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	case AF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 		if (sctp_af_v4_specific)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 		sctp_af_v4_specific = af;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 	case AF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 		if (sctp_af_v6_specific)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 		sctp_af_v6_specific = af;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	INIT_LIST_HEAD(&af->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	list_add_tail(&af->list, &sctp_address_families);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) /* Get the table of functions for manipulating a particular address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873)  * family.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) struct sctp_af *sctp_get_af_specific(sa_family_t family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	switch (family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	case AF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 		return sctp_af_v4_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	case AF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 		return sctp_af_v6_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) /* Common code to initialize a AF_INET msg_name. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) static void sctp_inet_msgname(char *msgname, int *addr_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 	struct sockaddr_in *sin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	sin = (struct sockaddr_in *)msgname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 	*addr_len = sizeof(struct sockaddr_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	sin->sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) /* Copy the primary address of the peer primary address as the msg_name. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) static void sctp_inet_event_msgname(struct sctp_ulpevent *event, char *msgname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 				    int *addr_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 	struct sockaddr_in *sin, *sinfrom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 	if (msgname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 		struct sctp_association *asoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 		asoc = event->asoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 		sctp_inet_msgname(msgname, addr_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) 		sin = (struct sockaddr_in *)msgname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 		sinfrom = &asoc->peer.primary_addr.v4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 		sin->sin_port = htons(asoc->peer.port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 		sin->sin_addr.s_addr = sinfrom->sin_addr.s_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) /* Initialize and copy out a msgname from an inbound skb. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) static void sctp_inet_skb_msgname(struct sk_buff *skb, char *msgname, int *len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 	if (msgname) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 		struct sctphdr *sh = sctp_hdr(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) 		struct sockaddr_in *sin = (struct sockaddr_in *)msgname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 		sctp_inet_msgname(msgname, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 		sin->sin_port = sh->source;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 		sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) /* Do we support this AF? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) static int sctp_inet_af_supported(sa_family_t family, struct sctp_sock *sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	/* PF_INET only supports AF_INET addresses. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	return AF_INET == family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) /* Address matching with wildcards allowed. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) static int sctp_inet_cmp_addr(const union sctp_addr *addr1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 			      const union sctp_addr *addr2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 			      struct sctp_sock *opt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 	/* PF_INET only supports AF_INET addresses. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 	if (addr1->sa.sa_family != addr2->sa.sa_family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	if (htonl(INADDR_ANY) == addr1->v4.sin_addr.s_addr ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	    htonl(INADDR_ANY) == addr2->v4.sin_addr.s_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	if (addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) /* Verify that provided sockaddr looks bindable.  Common verification has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954)  * already been taken care of.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) static int sctp_inet_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	return sctp_v4_available(addr, opt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) /* Verify that sockaddr looks sendable.  Common verification has already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962)  * been taken care of.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) static int sctp_inet_send_verify(struct sctp_sock *opt, union sctp_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) /* Fill in Supported Address Type information for INIT and INIT-ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970)  * chunks.  Returns number of addresses supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) static int sctp_inet_supported_addrs(const struct sctp_sock *opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 				     __be16 *types)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	types[0] = SCTP_PARAM_IPV4_ADDRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) /* Wrapper routine that calls the ip transmit routine. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) static inline int sctp_v4_xmit(struct sk_buff *skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 			       struct sctp_transport *transport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	struct inet_sock *inet = inet_sk(skb->sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	__u8 dscp = inet->tos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	pr_debug("%s: skb:%p, len:%d, src:%pI4, dst:%pI4\n", __func__, skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 		 skb->len, &transport->fl.u.ip4.saddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 		 &transport->fl.u.ip4.daddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 	if (transport->dscp & SCTP_DSCP_SET_MASK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 		dscp = transport->dscp & SCTP_DSCP_VAL_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	inet->pmtudisc = transport->param_flags & SPP_PMTUD_ENABLE ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 			 IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 	SCTP_INC_STATS(sock_net(&inet->sk), SCTP_MIB_OUTSCTPPACKS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 	return __ip_queue_xmit(&inet->sk, skb, &transport->fl, dscp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) static struct sctp_af sctp_af_inet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) static struct sctp_pf sctp_pf_inet = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 	.event_msgname = sctp_inet_event_msgname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 	.skb_msgname   = sctp_inet_skb_msgname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 	.af_supported  = sctp_inet_af_supported,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 	.cmp_addr      = sctp_inet_cmp_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 	.bind_verify   = sctp_inet_bind_verify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	.send_verify   = sctp_inet_send_verify,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	.supported_addrs = sctp_inet_supported_addrs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 	.create_accept_sk = sctp_v4_create_accept_sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	.addr_to_user  = sctp_v4_addr_to_user,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 	.to_sk_saddr   = sctp_v4_to_sk_saddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	.to_sk_daddr   = sctp_v4_to_sk_daddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	.copy_ip_options = sctp_v4_copy_ip_options,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	.af            = &sctp_af_inet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) /* Notifier for inetaddr addition/deletion events.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) static struct notifier_block sctp_inetaddr_notifier = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 	.notifier_call = sctp_inetaddr_event,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) /* Socket operations.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) static const struct proto_ops inet_seqpacket_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 	.family		   = PF_INET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	.owner		   = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	.release	   = inet_release,	/* Needs to be wrapped... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	.bind		   = inet_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	.connect	   = sctp_inet_connect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 	.socketpair	   = sock_no_socketpair,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 	.accept		   = inet_accept,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	.getname	   = inet_getname,	/* Semantics are different.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	.poll		   = sctp_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	.ioctl		   = inet_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	.gettstamp	   = sock_gettstamp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	.listen		   = sctp_inet_listen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	.shutdown	   = inet_shutdown,	/* Looks harmless.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	.setsockopt	   = sock_common_setsockopt, /* IP_SOL IP_OPTION is a problem */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	.getsockopt	   = sock_common_getsockopt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 	.sendmsg	   = inet_sendmsg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 	.recvmsg	   = inet_recvmsg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	.mmap		   = sock_no_mmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	.sendpage	   = sock_no_sendpage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) /* Registration with AF_INET family.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) static struct inet_protosw sctp_seqpacket_protosw = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	.type       = SOCK_SEQPACKET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	.protocol   = IPPROTO_SCTP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	.prot       = &sctp_prot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	.ops        = &inet_seqpacket_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 	.flags      = SCTP_PROTOSW_FLAG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) static struct inet_protosw sctp_stream_protosw = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	.type       = SOCK_STREAM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	.protocol   = IPPROTO_SCTP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	.prot       = &sctp_prot,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 	.ops        = &inet_seqpacket_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	.flags      = SCTP_PROTOSW_FLAG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) /* Register with IP layer.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) static const struct net_protocol sctp_protocol = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	.handler     = sctp_rcv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 	.err_handler = sctp_v4_err,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 	.no_policy   = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 	.netns_ok    = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) 	.icmp_strict_tag_validation = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /* IPv4 address related functions.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) static struct sctp_af sctp_af_inet = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) 	.sa_family	   = AF_INET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 	.sctp_xmit	   = sctp_v4_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 	.setsockopt	   = ip_setsockopt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	.getsockopt	   = ip_getsockopt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	.get_dst	   = sctp_v4_get_dst,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	.get_saddr	   = sctp_v4_get_saddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	.copy_addrlist	   = sctp_v4_copy_addrlist,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 	.from_skb	   = sctp_v4_from_skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	.from_sk	   = sctp_v4_from_sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	.from_addr_param   = sctp_v4_from_addr_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	.to_addr_param	   = sctp_v4_to_addr_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	.cmp_addr	   = sctp_v4_cmp_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	.addr_valid	   = sctp_v4_addr_valid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 	.inaddr_any	   = sctp_v4_inaddr_any,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	.is_any		   = sctp_v4_is_any,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	.available	   = sctp_v4_available,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	.scope		   = sctp_v4_scope,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	.skb_iif	   = sctp_v4_skb_iif,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	.is_ce		   = sctp_v4_is_ce,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 	.seq_dump_addr	   = sctp_v4_seq_dump_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	.ecn_capable	   = sctp_v4_ecn_capable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	.net_header_len	   = sizeof(struct iphdr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	.sockaddr_len	   = sizeof(struct sockaddr_in),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	.ip_options_len	   = sctp_v4_ip_options_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) struct sctp_pf *sctp_get_pf_specific(sa_family_t family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	switch (family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	case PF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 		return sctp_pf_inet_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 	case PF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 		return sctp_pf_inet6_specific;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) /* Register the PF specific function table.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) int sctp_register_pf(struct sctp_pf *pf, sa_family_t family)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	switch (family) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	case PF_INET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 		if (sctp_pf_inet_specific)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 		sctp_pf_inet_specific = pf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	case PF_INET6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		if (sctp_pf_inet6_specific)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 			return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 		sctp_pf_inet6_specific = pf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 	return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) static inline int init_sctp_mibs(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	net->sctp.sctp_statistics = alloc_percpu(struct sctp_mib);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	if (!net->sctp.sctp_statistics)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) static inline void cleanup_sctp_mibs(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	free_percpu(net->sctp.sctp_statistics);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) static void sctp_v4_pf_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 	/* Initialize the SCTP specific PF functions. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 	sctp_register_pf(&sctp_pf_inet, PF_INET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 	sctp_register_af(&sctp_af_inet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) static void sctp_v4_pf_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	list_del(&sctp_af_inet.list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) static int sctp_v4_protosw_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 	rc = proto_register(&sctp_prot, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 		return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	/* Register SCTP(UDP and TCP style) with socket layer.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	inet_register_protosw(&sctp_seqpacket_protosw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 	inet_register_protosw(&sctp_stream_protosw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) static void sctp_v4_protosw_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	inet_unregister_protosw(&sctp_stream_protosw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	inet_unregister_protosw(&sctp_seqpacket_protosw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	proto_unregister(&sctp_prot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) static int sctp_v4_add_protocol(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	/* Register notifier for inet address additions/deletions. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	register_inetaddr_notifier(&sctp_inetaddr_notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	/* Register SCTP with inet layer.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	if (inet_add_protocol(&sctp_protocol, IPPROTO_SCTP) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 		return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) static void sctp_v4_del_protocol(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 	inet_del_protocol(&sctp_protocol, IPPROTO_SCTP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	unregister_inetaddr_notifier(&sctp_inetaddr_notifier);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) static int __net_init sctp_defaults_init(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 	int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 	 * 14. Suggested SCTP Protocol Parameter Values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 	/* The following protocol parameters are RECOMMENDED:  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 	/* RTO.Initial              - 3  seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	net->sctp.rto_initial			= SCTP_RTO_INITIAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 	/* RTO.Min                  - 1  second */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	net->sctp.rto_min	 		= SCTP_RTO_MIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 	/* RTO.Max                 -  60 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	net->sctp.rto_max 			= SCTP_RTO_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	/* RTO.Alpha                - 1/8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	net->sctp.rto_alpha			= SCTP_RTO_ALPHA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	/* RTO.Beta                 - 1/4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	net->sctp.rto_beta			= SCTP_RTO_BETA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	/* Valid.Cookie.Life        - 60  seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 	net->sctp.valid_cookie_life		= SCTP_DEFAULT_COOKIE_LIFE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 	/* Whether Cookie Preservative is enabled(1) or not(0) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	net->sctp.cookie_preserve_enable 	= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	/* Default sctp sockets to use md5 as their hmac alg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) #if defined (CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	net->sctp.sctp_hmac_alg			= "md5";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) #elif defined (CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	net->sctp.sctp_hmac_alg			= "sha1";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	net->sctp.sctp_hmac_alg			= NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 	/* Max.Burst		    - 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 	net->sctp.max_burst			= SCTP_DEFAULT_MAX_BURST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	/* Disable of Primary Path Switchover by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	net->sctp.ps_retrans = SCTP_PS_RETRANS_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 	/* Enable pf state by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 	net->sctp.pf_enable = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	/* Ignore pf exposure feature by default */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 	net->sctp.pf_expose = SCTP_PF_EXPOSE_UNSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 	/* Association.Max.Retrans  - 10 attempts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	 * Path.Max.Retrans         - 5  attempts (per destination address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 	 * Max.Init.Retransmits     - 8  attempts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 	net->sctp.max_retrans_association	= 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 	net->sctp.max_retrans_path		= 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	net->sctp.max_retrans_init		= 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 	/* Sendbuffer growth	    - do per-socket accounting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	net->sctp.sndbuf_policy			= 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	/* Rcvbuffer growth	    - do per-socket accounting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 	net->sctp.rcvbuf_policy			= 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	/* HB.interval              - 30 seconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 	net->sctp.hb_interval			= SCTP_DEFAULT_TIMEOUT_HEARTBEAT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	/* delayed SACK timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	net->sctp.sack_timeout			= SCTP_DEFAULT_TIMEOUT_SACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	/* Disable ADDIP by default. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	net->sctp.addip_enable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	net->sctp.addip_noauth = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 	net->sctp.default_auto_asconf = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	/* Enable PR-SCTP by default. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	net->sctp.prsctp_enable = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	/* Disable RECONF by default. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 	net->sctp.reconf_enable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 	/* Disable AUTH by default. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 	net->sctp.auth_enable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 	/* Enable ECN by default. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	net->sctp.ecn_enable = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	/* Set SCOPE policy to enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 	net->sctp.scope_policy = SCTP_SCOPE_POLICY_ENABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 	/* Set the default rwnd update threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	net->sctp.rwnd_upd_shift = SCTP_DEFAULT_RWND_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	/* Initialize maximum autoclose timeout. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	net->sctp.max_autoclose		= INT_MAX / HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 	status = sctp_sysctl_net_register(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 		goto err_sysctl_register;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	/* Allocate and initialise sctp mibs.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	status = init_sctp_mibs(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 		goto err_init_mibs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 	/* Initialize proc fs directory.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	status = sctp_proc_init(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 		goto err_init_proc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	sctp_dbg_objcnt_init(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 	/* Initialize the local address list. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 	INIT_LIST_HEAD(&net->sctp.local_addr_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 	spin_lock_init(&net->sctp.local_addr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 	sctp_get_local_addr_list(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	/* Initialize the address event list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 	INIT_LIST_HEAD(&net->sctp.addr_waitq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 	INIT_LIST_HEAD(&net->sctp.auto_asconf_splist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 	spin_lock_init(&net->sctp.addr_wq_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 	net->sctp.addr_wq_timer.expires = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	timer_setup(&net->sctp.addr_wq_timer, sctp_addr_wq_timeout_handler, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) err_init_proc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 	cleanup_sctp_mibs(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) err_init_mibs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	sctp_sysctl_net_unregister(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) err_sysctl_register:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) static void __net_exit sctp_defaults_exit(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 	/* Free the local address list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 	sctp_free_addr_wq(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 	sctp_free_local_addr_list(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 	remove_proc_subtree("sctp", net->proc_net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 	net->sctp.proc_net_sctp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 	cleanup_sctp_mibs(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	sctp_sysctl_net_unregister(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) static struct pernet_operations sctp_defaults_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	.init = sctp_defaults_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 	.exit = sctp_defaults_exit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) static int __net_init sctp_ctrlsock_init(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 	int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 	/* Initialize the control inode/socket for handling OOTB packets.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	status = sctp_ctl_sock_init(net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 		pr_err("Failed to initialize the SCTP control sock\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) static void __net_exit sctp_ctrlsock_exit(struct net *net)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 	/* Free the control endpoint.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	inet_ctl_sock_destroy(net->sctp.ctl_sock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) static struct pernet_operations sctp_ctrlsock_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 	.init = sctp_ctrlsock_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	.exit = sctp_ctrlsock_exit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) /* Initialize the universe into something sensible.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) static __init int sctp_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	unsigned long nr_pages = totalram_pages();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 	unsigned long limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 	unsigned long goal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 	int max_entry_order;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 	int num_entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 	int max_share;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 	int order;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	sock_skb_cb_check_size(sizeof(struct sctp_ulpevent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	/* Allocate bind_bucket and chunk caches. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	status = -ENOBUFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 	sctp_bucket_cachep = kmem_cache_create("sctp_bind_bucket",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 					       sizeof(struct sctp_bind_bucket),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 					       0, SLAB_HWCACHE_ALIGN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 					       NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 	if (!sctp_bucket_cachep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 	sctp_chunk_cachep = kmem_cache_create("sctp_chunk",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 					       sizeof(struct sctp_chunk),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 					       0, SLAB_HWCACHE_ALIGN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 					       NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 	if (!sctp_chunk_cachep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 		goto err_chunk_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 	status = percpu_counter_init(&sctp_sockets_allocated, 0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 		goto err_percpu_counter_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) 	/* Implementation specific variables. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 	/* Initialize default stream count setup information. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 	sctp_max_instreams    		= SCTP_DEFAULT_INSTREAMS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 	sctp_max_outstreams   		= SCTP_DEFAULT_OUTSTREAMS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 	/* Initialize handle used for association ids. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 	idr_init(&sctp_assocs_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 	limit = nr_free_buffer_pages() / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) 	limit = max(limit, 128UL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 	sysctl_sctp_mem[0] = limit / 4 * 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 	sysctl_sctp_mem[1] = limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) 	sysctl_sctp_mem[2] = sysctl_sctp_mem[0] * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	/* Set per-socket limits to no more than 1/128 the pressure threshold*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 	limit = (sysctl_sctp_mem[1]) << (PAGE_SHIFT - 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 	max_share = min(4UL*1024*1024, limit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 	sysctl_sctp_rmem[0] = SK_MEM_QUANTUM; /* give each asoc 1 page min */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 	sysctl_sctp_rmem[1] = 1500 * SKB_TRUESIZE(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 	sysctl_sctp_rmem[2] = max(sysctl_sctp_rmem[1], max_share);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 	sysctl_sctp_wmem[0] = SK_MEM_QUANTUM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 	sysctl_sctp_wmem[1] = 16*1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 	sysctl_sctp_wmem[2] = max(64*1024, max_share);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) 	/* Size and allocate the association hash table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 	 * The methodology is similar to that of the tcp hash tables.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 	 * Though not identical.  Start by getting a goal size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 	if (nr_pages >= (128 * 1024))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 		goal = nr_pages >> (22 - PAGE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 		goal = nr_pages >> (24 - PAGE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	/* Then compute the page order for said goal */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 	order = get_order(goal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 	/* Now compute the required page order for the maximum sized table we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 	 * want to create
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 	max_entry_order = get_order(MAX_SCTP_PORT_HASH_ENTRIES *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 				    sizeof(struct sctp_bind_hashbucket));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 	/* Limit the page order by that maximum hash table size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 	order = min(order, max_entry_order);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 	/* Allocate and initialize the endpoint hash table.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 	sctp_ep_hashsize = 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 	sctp_ep_hashtable =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 		kmalloc_array(64, sizeof(struct sctp_hashbucket), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 	if (!sctp_ep_hashtable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 		pr_err("Failed endpoint_hash alloc\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 		status = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 		goto err_ehash_alloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 	for (i = 0; i < sctp_ep_hashsize; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 		rwlock_init(&sctp_ep_hashtable[i].lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 		INIT_HLIST_HEAD(&sctp_ep_hashtable[i].chain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 	/* Allocate and initialize the SCTP port hash table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 	 * Note that order is initalized to start at the max sized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	 * table we want to support.  If we can't get that many pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 	 * reduce the order and try again
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 		sctp_port_hashtable = (struct sctp_bind_hashbucket *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 			__get_free_pages(GFP_KERNEL | __GFP_NOWARN, order);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	} while (!sctp_port_hashtable && --order > 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 	if (!sctp_port_hashtable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 		pr_err("Failed bind hash alloc\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 		status = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 		goto err_bhash_alloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	/* Now compute the number of entries that will fit in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 	 * port hash space we allocated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 	num_entries = (1UL << order) * PAGE_SIZE /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 		      sizeof(struct sctp_bind_hashbucket);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 	/* And finish by rounding it down to the nearest power of two.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	 * This wastes some memory of course, but it's needed because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	 * the hash function operates based on the assumption that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 	 * the number of entries is a power of two.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 	sctp_port_hashsize = rounddown_pow_of_two(num_entries);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 	for (i = 0; i < sctp_port_hashsize; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 		spin_lock_init(&sctp_port_hashtable[i].lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 		INIT_HLIST_HEAD(&sctp_port_hashtable[i].chain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 	status = sctp_transport_hashtable_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 		goto err_thash_alloc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	pr_info("Hash tables configured (bind %d/%d)\n", sctp_port_hashsize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 		num_entries);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	sctp_sysctl_register();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	INIT_LIST_HEAD(&sctp_address_families);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	sctp_v4_pf_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 	sctp_v6_pf_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) 	sctp_sched_ops_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 	status = register_pernet_subsys(&sctp_defaults_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) 		goto err_register_defaults;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 	status = sctp_v4_protosw_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 		goto err_protosw_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 	status = sctp_v6_protosw_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) 		goto err_v6_protosw_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	status = register_pernet_subsys(&sctp_ctrlsock_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 		goto err_register_ctrlsock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	status = sctp_v4_add_protocol();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 		goto err_add_protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) 	/* Register SCTP with inet6 layer.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 	status = sctp_v6_add_protocol();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 	if (status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 		goto err_v6_add_protocol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 	if (sctp_offload_init() < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 		pr_crit("%s: Cannot add SCTP protocol offload\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 	return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) err_v6_add_protocol:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 	sctp_v4_del_protocol();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) err_add_protocol:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 	unregister_pernet_subsys(&sctp_ctrlsock_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) err_register_ctrlsock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 	sctp_v6_protosw_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) err_v6_protosw_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) 	sctp_v4_protosw_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) err_protosw_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) 	unregister_pernet_subsys(&sctp_defaults_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) err_register_defaults:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 	sctp_v4_pf_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 	sctp_v6_pf_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 	sctp_sysctl_unregister();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 	free_pages((unsigned long)sctp_port_hashtable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) 		   get_order(sctp_port_hashsize *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 			     sizeof(struct sctp_bind_hashbucket)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) err_bhash_alloc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 	sctp_transport_hashtable_destroy();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) err_thash_alloc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 	kfree(sctp_ep_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) err_ehash_alloc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 	percpu_counter_destroy(&sctp_sockets_allocated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) err_percpu_counter_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 	kmem_cache_destroy(sctp_chunk_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) err_chunk_cachep:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 	kmem_cache_destroy(sctp_bucket_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 	goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) /* Exit handler for the SCTP protocol.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) static __exit void sctp_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 	/* BUG.  This should probably do something useful like clean
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 	 * up all the remaining associations and all that memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 	/* Unregister with inet6/inet layers. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 	sctp_v6_del_protocol();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 	sctp_v4_del_protocol();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 	unregister_pernet_subsys(&sctp_ctrlsock_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 	/* Free protosw registrations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	sctp_v6_protosw_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	sctp_v4_protosw_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 	unregister_pernet_subsys(&sctp_defaults_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	/* Unregister with socket layer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 	sctp_v6_pf_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	sctp_v4_pf_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 	sctp_sysctl_unregister();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 	free_pages((unsigned long)sctp_port_hashtable,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 		   get_order(sctp_port_hashsize *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 			     sizeof(struct sctp_bind_hashbucket)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 	kfree(sctp_ep_hashtable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 	sctp_transport_hashtable_destroy();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 	percpu_counter_destroy(&sctp_sockets_allocated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 	rcu_barrier(); /* Wait for completion of call_rcu()'s */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 	kmem_cache_destroy(sctp_chunk_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 	kmem_cache_destroy(sctp_bucket_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) module_init(sctp_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) module_exit(sctp_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)  * __stringify doesn't likes enums, so use IPPROTO_SCTP value (132) directly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) MODULE_ALIAS("net-pf-" __stringify(PF_INET) "-proto-132");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) MODULE_ALIAS("net-pf-" __stringify(PF_INET6) "-proto-132");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) MODULE_AUTHOR("Linux Kernel SCTP developers <linux-sctp@vger.kernel.org>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) MODULE_DESCRIPTION("Support for the SCTP protocol (RFC2960)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) module_param_named(no_checksums, sctp_checksum_disable, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) MODULE_PARM_DESC(no_checksums, "Disable checksums computing and verification");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) MODULE_LICENSE("GPL");