^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");