^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 La Monte H.P. Yarroll
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * This file is part of the SCTP kernel implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * This module provides the abstraction for an SCTP association.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Please send any bug reports or fixes you make to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * email address(es):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * lksctp developers <linux-sctp@vger.kernel.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Written or modified by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * La Monte H.P. Yarroll <piggy@acm.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * Karl Knutson <karl@athena.chicago.il.us>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * Jon Grimm <jgrimm@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * Xingang Guo <xingang.guo@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * Hui Huang <hui.huang@nokia.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * Sridhar Samudrala <sri@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * Daisy Chang <daisyc@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * Ryan Layer <rmlayer@us.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * Kevin Gao <kevin.gao@intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <linux/fcntl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/in.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <net/ipv6.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <net/sctp/sctp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <net/sctp/sm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* Forward declarations for internal functions. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static void sctp_select_active_and_retran_path(struct sctp_association *asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) static void sctp_assoc_bh_rcv(struct work_struct *work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static void sctp_assoc_free_asconf_acks(struct sctp_association *asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static void sctp_assoc_free_asconf_queue(struct sctp_association *asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* 1st Level Abstractions. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* Initialize a new association from provided memory. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) static struct sctp_association *sctp_association_init(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) const struct sctp_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) const struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) enum sctp_scope scope, gfp_t gfp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct sctp_sock *sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct sctp_paramhdr *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* Retrieve the SCTP per socket area. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) sp = sctp_sk((struct sock *)sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /* Discarding const is appropriate here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) asoc->ep = (struct sctp_endpoint *)ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) asoc->base.sk = (struct sock *)sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) asoc->base.net = sock_net(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) sctp_endpoint_hold(asoc->ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) sock_hold(asoc->base.sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Initialize the common base substructure. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) asoc->base.type = SCTP_EP_TYPE_ASSOCIATION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /* Initialize the object handling fields. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) refcount_set(&asoc->base.refcnt, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* Initialize the bind addr area. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) sctp_bind_addr_init(&asoc->base.bind_addr, ep->base.bind_addr.port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) asoc->state = SCTP_STATE_CLOSED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) asoc->cookie_life = ms_to_ktime(sp->assocparams.sasoc_cookie_life);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) asoc->user_frag = sp->user_frag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* Set the association max_retrans and RTO values from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * socket values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) asoc->pf_retrans = sp->pf_retrans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) asoc->ps_retrans = sp->ps_retrans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) asoc->pf_expose = sp->pf_expose;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) asoc->rto_initial = msecs_to_jiffies(sp->rtoinfo.srto_initial);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) asoc->rto_max = msecs_to_jiffies(sp->rtoinfo.srto_max);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) asoc->rto_min = msecs_to_jiffies(sp->rtoinfo.srto_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* Initialize the association's heartbeat interval based on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * sock configured value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) asoc->hbinterval = msecs_to_jiffies(sp->hbinterval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* Initialize path max retrans value. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) asoc->pathmaxrxt = sp->pathmaxrxt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) asoc->flowlabel = sp->flowlabel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) asoc->dscp = sp->dscp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /* Set association default SACK delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) asoc->sackdelay = msecs_to_jiffies(sp->sackdelay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) asoc->sackfreq = sp->sackfreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /* Set the association default flags controlling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * Heartbeat, SACK delay, and Path MTU Discovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) asoc->param_flags = sp->param_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) /* Initialize the maximum number of new data packets that can be sent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * in a burst.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) asoc->max_burst = sp->max_burst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) asoc->subscribe = sp->subscribe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /* initialize association timers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_COOKIE] = asoc->rto_initial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) asoc->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = asoc->rto_initial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) asoc->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = asoc->rto_initial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* sctpimpguide Section 2.12.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * If the 'T5-shutdown-guard' timer is used, it SHOULD be set to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * recommended value of 5 times 'RTO.Max'.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) asoc->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) = 5 * asoc->rto_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = sp->autoclose * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /* Initializes the timers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) timer_setup(&asoc->timers[i], sctp_timer_events[i], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* Pull default initialization values from the sock options.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * Note: This assumes that the values have already been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) * validated in the sock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) asoc->c.sinit_max_instreams = sp->initmsg.sinit_max_instreams;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) asoc->c.sinit_num_ostreams = sp->initmsg.sinit_num_ostreams;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) asoc->max_init_attempts = sp->initmsg.sinit_max_attempts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) asoc->max_init_timeo =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) msecs_to_jiffies(sp->initmsg.sinit_max_init_timeo);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /* Set the local window size for receive.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) * This is also the rcvbuf space per association.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * RFC 6 - A SCTP receiver MUST be able to receive a minimum of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * 1500 bytes in one SCTP packet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if ((sk->sk_rcvbuf/2) < SCTP_DEFAULT_MINWINDOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) asoc->rwnd = SCTP_DEFAULT_MINWINDOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) asoc->rwnd = sk->sk_rcvbuf/2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) asoc->a_rwnd = asoc->rwnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) /* Use my own max window until I learn something better. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) asoc->peer.rwnd = SCTP_DEFAULT_MAXWINDOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) /* Initialize the receive memory counter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) atomic_set(&asoc->rmem_alloc, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) init_waitqueue_head(&asoc->wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) asoc->c.my_vtag = sctp_generate_tag(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) asoc->c.my_port = ep->base.bind_addr.port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) asoc->c.initial_tsn = sctp_generate_tsn(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) asoc->next_tsn = asoc->c.initial_tsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) asoc->ctsn_ack_point = asoc->next_tsn - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) asoc->adv_peer_ack_point = asoc->ctsn_ack_point;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) asoc->highest_sacked = asoc->ctsn_ack_point;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) asoc->last_cwr_tsn = asoc->ctsn_ack_point;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) /* ADDIP Section 4.1 Asconf Chunk Procedures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * When an endpoint has an ASCONF signaled change to be sent to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) * remote endpoint it should do the following:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) * ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) * A2) a serial number should be assigned to the chunk. The serial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * number SHOULD be a monotonically increasing number. The serial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * numbers SHOULD be initialized at the start of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * association to the same value as the initial TSN.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) asoc->addip_serial = asoc->c.initial_tsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) asoc->strreset_outseq = asoc->c.initial_tsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) INIT_LIST_HEAD(&asoc->addip_chunk_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) INIT_LIST_HEAD(&asoc->asconf_ack_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) /* Make an empty list of remote transport addresses. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) INIT_LIST_HEAD(&asoc->peer.transport_addr_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /* RFC 2960 5.1 Normal Establishment of an Association
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) * After the reception of the first data chunk in an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) * association the endpoint must immediately respond with a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) * sack to acknowledge the data chunk. Subsequent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * acknowledgements should be done as described in Section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * 6.2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) * [We implement this by telling a new association that it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) * already received one packet.]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) asoc->peer.sack_needed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) asoc->peer.sack_generation = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /* Create an input queue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) sctp_inq_init(&asoc->base.inqueue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) sctp_inq_set_th_handler(&asoc->base.inqueue, sctp_assoc_bh_rcv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) /* Create an output queue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) sctp_outq_init(asoc, &asoc->outqueue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (!sctp_ulpq_init(&asoc->ulpq, asoc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) goto fail_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) if (sctp_stream_init(&asoc->stream, asoc->c.sinit_num_ostreams,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 0, gfp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) goto fail_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) /* Initialize default path MTU. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) asoc->pathmtu = sp->pathmtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) sctp_assoc_update_frag_point(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /* Assume that peer would support both address types unless we are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * told otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) asoc->peer.ipv4_address = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) if (asoc->base.sk->sk_family == PF_INET6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) asoc->peer.ipv6_address = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) INIT_LIST_HEAD(&asoc->asocs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) asoc->default_stream = sp->default_stream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) asoc->default_ppid = sp->default_ppid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) asoc->default_flags = sp->default_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) asoc->default_context = sp->default_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) asoc->default_timetolive = sp->default_timetolive;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) asoc->default_rcv_context = sp->default_rcv_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* AUTH related initializations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) INIT_LIST_HEAD(&asoc->endpoint_shared_keys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (sctp_auth_asoc_copy_shkeys(ep, asoc, gfp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) goto stream_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) asoc->active_key_id = ep->active_key_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) asoc->strreset_enable = ep->strreset_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) /* Save the hmacs and chunks list into this association */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if (ep->auth_hmacs_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) memcpy(asoc->c.auth_hmacs, ep->auth_hmacs_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) ntohs(ep->auth_hmacs_list->param_hdr.length));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (ep->auth_chunk_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) memcpy(asoc->c.auth_chunks, ep->auth_chunk_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) ntohs(ep->auth_chunk_list->param_hdr.length));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /* Get the AUTH random number for this association */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) p = (struct sctp_paramhdr *)asoc->c.auth_random;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) p->type = SCTP_PARAM_RANDOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) p->length = htons(sizeof(*p) + SCTP_AUTH_RANDOM_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) get_random_bytes(p+1, SCTP_AUTH_RANDOM_LENGTH);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) return asoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) stream_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) sctp_stream_free(&asoc->stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) fail_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) sock_put(asoc->base.sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) sctp_endpoint_put(asoc->ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) /* Allocate and initialize a new association */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) struct sctp_association *sctp_association_new(const struct sctp_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) const struct sock *sk,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) enum sctp_scope scope, gfp_t gfp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct sctp_association *asoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) asoc = kzalloc(sizeof(*asoc), gfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (!asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (!sctp_association_init(asoc, ep, sk, scope, gfp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) goto fail_init;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) SCTP_DBG_OBJCNT_INC(assoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) pr_debug("Created asoc %p\n", asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) return asoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) fail_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) kfree(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) return NULL;
^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) /* Free this association if possible. There may still be users, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) * the actual deallocation may be delayed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) void sctp_association_free(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) struct sock *sk = asoc->base.sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct sctp_transport *transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) struct list_head *pos, *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* Only real associations count against the endpoint, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) * don't bother for if this is a temporary association.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) if (!list_empty(&asoc->asocs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) list_del(&asoc->asocs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) /* Decrement the backlog value for a TCP-style listening
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) * socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) sk_acceptq_removed(sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /* Mark as dead, so other users can know this structure is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * going away.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) asoc->base.dead = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) /* Dispose of any data lying around in the outqueue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) sctp_outq_free(&asoc->outqueue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /* Dispose of any pending messages for the upper layer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) sctp_ulpq_free(&asoc->ulpq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) /* Dispose of any pending chunks on the inqueue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) sctp_inq_free(&asoc->base.inqueue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) sctp_tsnmap_free(&asoc->peer.tsn_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) /* Free stream information. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) sctp_stream_free(&asoc->stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (asoc->strreset_chunk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) sctp_chunk_free(asoc->strreset_chunk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) /* Clean up the bound address list. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) sctp_bind_addr_free(&asoc->base.bind_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /* Do we need to go through all of our timers and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) * delete them? To be safe we will try to delete all, but we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * should be able to go through and make a guess based
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * on our state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) if (del_timer(&asoc->timers[i]))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) sctp_association_put(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* Free peer's cached cookie. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) kfree(asoc->peer.cookie);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) kfree(asoc->peer.peer_random);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) kfree(asoc->peer.peer_chunks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) kfree(asoc->peer.peer_hmacs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) /* Release the transport structures. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) transport = list_entry(pos, struct sctp_transport, transports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) list_del_rcu(pos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) sctp_unhash_transport(transport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) sctp_transport_free(transport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) asoc->peer.transport_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) sctp_asconf_queue_teardown(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) /* Free pending address space being deleted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) kfree(asoc->asconf_addr_del_pending);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) /* AUTH - Free the endpoint shared keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) sctp_auth_destroy_keys(&asoc->endpoint_shared_keys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) /* AUTH - Free the association shared key */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) sctp_auth_key_put(asoc->asoc_shared_key);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) sctp_association_put(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) /* Cleanup and free up an association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) static void sctp_association_destroy(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) if (unlikely(!asoc->base.dead)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) WARN(1, "Attempt to destroy undead association %p!\n", asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) sctp_endpoint_put(asoc->ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) sock_put(asoc->base.sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) if (asoc->assoc_id != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) spin_lock_bh(&sctp_assocs_id_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) idr_remove(&sctp_assocs_id, asoc->assoc_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) spin_unlock_bh(&sctp_assocs_id_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) WARN_ON(atomic_read(&asoc->rmem_alloc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) kfree_rcu(asoc, rcu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) SCTP_DBG_OBJCNT_DEC(assoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) /* Change the primary destination address for the peer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) void sctp_assoc_set_primary(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) struct sctp_transport *transport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) int changeover = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) /* it's a changeover only if we already have a primary path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) * that we are changing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) if (asoc->peer.primary_path != NULL &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) asoc->peer.primary_path != transport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) changeover = 1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) asoc->peer.primary_path = transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) sctp_ulpevent_notify_peer_addr_change(transport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) SCTP_ADDR_MADE_PRIM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /* Set a default msg_name for events. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) memcpy(&asoc->peer.primary_addr, &transport->ipaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) sizeof(union sctp_addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /* If the primary path is changing, assume that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) * user wants to use this new path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) if ((transport->state == SCTP_ACTIVE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) (transport->state == SCTP_UNKNOWN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) asoc->peer.active_path = transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) * SFR-CACC algorithm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) * Upon the receipt of a request to change the primary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) * destination address, on the data structure for the new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) * primary destination, the sender MUST do the following:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * 1) If CHANGEOVER_ACTIVE is set, then there was a switch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * to this destination address earlier. The sender MUST set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * CYCLING_CHANGEOVER to indicate that this switch is a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) * double switch to the same destination address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) * Really, only bother is we have data queued or outstanding on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) * the association.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) if (!asoc->outqueue.outstanding_bytes && !asoc->outqueue.out_qlen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (transport->cacc.changeover_active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) transport->cacc.cycling_changeover = changeover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) /* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) * a changeover has occurred.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) transport->cacc.changeover_active = changeover;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) /* 3) The sender MUST store the next TSN to be sent in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) * next_tsn_at_change.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) transport->cacc.next_tsn_at_change = asoc->next_tsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* Remove a transport from an association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) void sctp_assoc_rm_peer(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) struct sctp_transport *peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) struct sctp_transport *transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) struct list_head *pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) struct sctp_chunk *ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) pr_debug("%s: association:%p addr:%pISpc\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) __func__, asoc, &peer->ipaddr.sa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) /* If we are to remove the current retran_path, update it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) * to the next peer before removing this peer from the list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (asoc->peer.retran_path == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) sctp_assoc_update_retran_path(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) /* Remove this peer from the list. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) list_del_rcu(&peer->transports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) /* Remove this peer from the transport hashtable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) sctp_unhash_transport(peer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) /* Get the first transport of asoc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) pos = asoc->peer.transport_addr_list.next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) transport = list_entry(pos, struct sctp_transport, transports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) /* Update any entries that match the peer to be deleted. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (asoc->peer.primary_path == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) sctp_assoc_set_primary(asoc, transport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) if (asoc->peer.active_path == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) asoc->peer.active_path = transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) if (asoc->peer.retran_path == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) asoc->peer.retran_path = transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) if (asoc->peer.last_data_from == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) asoc->peer.last_data_from = transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) if (asoc->strreset_chunk &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) asoc->strreset_chunk->transport == peer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) asoc->strreset_chunk->transport = transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) sctp_transport_reset_reconf_timer(transport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) /* If we remove the transport an INIT was last sent to, set it to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * NULL. Combined with the update of the retran path above, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) * will cause the next INIT to be sent to the next available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) * transport, maintaining the cycle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (asoc->init_last_sent_to == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) asoc->init_last_sent_to = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) /* If we remove the transport an SHUTDOWN was last sent to, set it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) * to NULL. Combined with the update of the retran path above, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) * will cause the next SHUTDOWN to be sent to the next available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) * transport, maintaining the cycle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) if (asoc->shutdown_last_sent_to == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) asoc->shutdown_last_sent_to = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) /* If we remove the transport an ASCONF was last sent to, set it to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) * NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) if (asoc->addip_last_asconf &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) asoc->addip_last_asconf->transport == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) asoc->addip_last_asconf->transport = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) /* If we have something on the transmitted list, we have to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) * save it off. The best place is the active path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) if (!list_empty(&peer->transmitted)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) struct sctp_transport *active = asoc->peer.active_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* Reset the transport of each chunk on this list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) list_for_each_entry(ch, &peer->transmitted,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) transmitted_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) ch->transport = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) ch->rtt_in_progress = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) list_splice_tail_init(&peer->transmitted,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) &active->transmitted);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) /* Start a T3 timer here in case it wasn't running so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * that these migrated packets have a chance to get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * retransmitted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) if (!timer_pending(&active->T3_rtx_timer))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) if (!mod_timer(&active->T3_rtx_timer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) jiffies + active->rto))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) sctp_transport_hold(active);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) list_for_each_entry(ch, &asoc->outqueue.out_chunk_list, list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) if (ch->transport == peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) ch->transport = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) asoc->peer.transport_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) sctp_ulpevent_notify_peer_addr_change(peer, SCTP_ADDR_REMOVED, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) sctp_transport_free(peer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) /* Add a transport address to an association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) const union sctp_addr *addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) const gfp_t gfp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) const int peer_state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) struct sctp_transport *peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) struct sctp_sock *sp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) unsigned short port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) sp = sctp_sk(asoc->base.sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) /* AF_INET and AF_INET6 share common port field. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) port = ntohs(addr->v4.sin_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) pr_debug("%s: association:%p addr:%pISpc state:%d\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) asoc, &addr->sa, peer_state);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) /* Set the port if it has not been set yet. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) if (0 == asoc->peer.port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) asoc->peer.port = port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) /* Check to see if this is a duplicate. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) peer = sctp_assoc_lookup_paddr(asoc, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) if (peer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) /* An UNKNOWN state is only set on transports added by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) * user in sctp_connectx() call. Such transports should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) * considered CONFIRMED per RFC 4960, Section 5.4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) if (peer->state == SCTP_UNKNOWN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) peer->state = SCTP_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) return peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) peer = sctp_transport_new(asoc->base.net, addr, gfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) if (!peer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) sctp_transport_set_owner(peer, asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) /* Initialize the peer's heartbeat interval based on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) * association configured value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) peer->hbinterval = asoc->hbinterval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) /* Set the path max_retrans. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) peer->pathmaxrxt = asoc->pathmaxrxt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) /* And the partial failure retrans threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) peer->pf_retrans = asoc->pf_retrans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) /* And the primary path switchover retrans threshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) peer->ps_retrans = asoc->ps_retrans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) /* Initialize the peer's SACK delay timeout based on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) * association configured value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) peer->sackdelay = asoc->sackdelay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) peer->sackfreq = asoc->sackfreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (addr->sa.sa_family == AF_INET6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) __be32 info = addr->v6.sin6_flowinfo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) if (info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) peer->flowlabel = ntohl(info & IPV6_FLOWLABEL_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) peer->flowlabel |= SCTP_FLOWLABEL_SET_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) peer->flowlabel = asoc->flowlabel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) peer->dscp = asoc->dscp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) /* Enable/disable heartbeat, SACK delay, and path MTU discovery
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) * based on association setting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) peer->param_flags = asoc->param_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) /* Initialize the pmtu of the transport. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) sctp_transport_route(peer, NULL, sp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) /* If this is the first transport addr on this association,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) * initialize the association PMTU to the peer's PMTU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) * If not and the current association PMTU is higher than the new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) * peer's PMTU, reset the association PMTU to the new peer's PMTU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) sctp_assoc_set_pmtu(asoc, asoc->pathmtu ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) min_t(int, peer->pathmtu, asoc->pathmtu) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) peer->pathmtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) peer->pmtu_pending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) /* The asoc->peer.port might not be meaningful yet, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) * initialize the packet structure anyway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) sctp_packet_init(&peer->packet, peer, asoc->base.bind_addr.port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) asoc->peer.port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) /* 7.2.1 Slow-Start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) * o The initial cwnd before DATA transmission or after a sufficiently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) * long idle period MUST be set to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) * min(4*MTU, max(2*MTU, 4380 bytes))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) * o The initial value of ssthresh MAY be arbitrarily high
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) * (for example, implementations MAY use the size of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) * receiver advertised window).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) peer->cwnd = min(4*asoc->pathmtu, max_t(__u32, 2*asoc->pathmtu, 4380));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) /* At this point, we may not have the receiver's advertised window,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) * so initialize ssthresh to the default value and it will be set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) * later when we process the INIT.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) peer->ssthresh = SCTP_DEFAULT_MAXWINDOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) peer->partial_bytes_acked = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) peer->flight_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) peer->burst_limited = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) /* Set the transport's RTO.initial value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) peer->rto = asoc->rto_initial;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) sctp_max_rto(asoc, peer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) /* Set the peer's active state. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) peer->state = peer_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) /* Add this peer into the transport hashtable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (sctp_hash_transport(peer)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) sctp_transport_free(peer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) /* Attach the remote transport to our asoc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) list_add_tail_rcu(&peer->transports, &asoc->peer.transport_addr_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) asoc->peer.transport_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) sctp_ulpevent_notify_peer_addr_change(peer, SCTP_ADDR_ADDED, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) /* If we do not yet have a primary path, set one. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) if (!asoc->peer.primary_path) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) sctp_assoc_set_primary(asoc, peer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) asoc->peer.retran_path = peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) if (asoc->peer.active_path == asoc->peer.retran_path &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) peer->state != SCTP_UNCONFIRMED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) asoc->peer.retran_path = peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) return peer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) /* Delete a transport address from an association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) void sctp_assoc_del_peer(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) const union sctp_addr *addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) struct list_head *pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) struct list_head *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) struct sctp_transport *transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) transport = list_entry(pos, struct sctp_transport, transports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) if (sctp_cmp_addr_exact(addr, &transport->ipaddr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) /* Do book keeping for removing the peer and free it. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) sctp_assoc_rm_peer(asoc, transport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) }
^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)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) /* Lookup a transport by address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) struct sctp_transport *sctp_assoc_lookup_paddr(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) const struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) const union sctp_addr *address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) struct sctp_transport *t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) /* Cycle through all transports searching for a peer address. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) list_for_each_entry(t, &asoc->peer.transport_addr_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) transports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) if (sctp_cmp_addr_exact(address, &t->ipaddr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) return t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) /* Remove all transports except a give one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) void sctp_assoc_del_nonprimary_peers(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) struct sctp_transport *primary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) struct sctp_transport *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) struct sctp_transport *t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) list_for_each_entry_safe(t, temp, &asoc->peer.transport_addr_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) transports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) /* if the current transport is not the primary one, delete it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) if (t != primary)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) sctp_assoc_rm_peer(asoc, t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) /* Engage in transport control operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) * Mark the transport up or down and send a notification to the user.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) * Select and update the new active and retran paths.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) void sctp_assoc_control_transport(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) struct sctp_transport *transport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) enum sctp_transport_cmd command,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) sctp_sn_error_t error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) int spc_state = SCTP_ADDR_AVAILABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) bool ulp_notify = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) /* Record the transition on the transport. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) switch (command) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) case SCTP_TRANSPORT_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) /* If we are moving from UNCONFIRMED state due
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) * to heartbeat success, report the SCTP_ADDR_CONFIRMED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) * state to the user, otherwise report SCTP_ADDR_AVAILABLE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) if (transport->state == SCTP_PF &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) asoc->pf_expose != SCTP_PF_EXPOSE_ENABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) ulp_notify = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) else if (transport->state == SCTP_UNCONFIRMED &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) error == SCTP_HEARTBEAT_SUCCESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) spc_state = SCTP_ADDR_CONFIRMED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) transport->state = SCTP_ACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) case SCTP_TRANSPORT_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) /* If the transport was never confirmed, do not transition it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) * to inactive state. Also, release the cached route since
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) * there may be a better route next time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) if (transport->state != SCTP_UNCONFIRMED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) transport->state = SCTP_INACTIVE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) spc_state = SCTP_ADDR_UNREACHABLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) sctp_transport_dst_release(transport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) ulp_notify = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) case SCTP_TRANSPORT_PF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) transport->state = SCTP_PF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (asoc->pf_expose != SCTP_PF_EXPOSE_ENABLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) ulp_notify = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) spc_state = SCTP_ADDR_POTENTIALLY_FAILED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) /* Generate and send a SCTP_PEER_ADDR_CHANGE notification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) * to the user.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) if (ulp_notify)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) sctp_ulpevent_notify_peer_addr_change(transport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) spc_state, error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) /* Select new active and retran paths. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) sctp_select_active_and_retran_path(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) /* Hold a reference to an association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) void sctp_association_hold(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) refcount_inc(&asoc->base.refcnt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) /* Release a reference to an association and cleanup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) * if there are no more references.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) void sctp_association_put(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) if (refcount_dec_and_test(&asoc->base.refcnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) sctp_association_destroy(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) /* Allocate the next TSN, Transmission Sequence Number, for the given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) * association.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) __u32 sctp_association_get_next_tsn(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) /* From Section 1.6 Serial Number Arithmetic:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * Transmission Sequence Numbers wrap around when they reach
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) * 2**32 - 1. That is, the next TSN a DATA chunk MUST use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * after transmitting TSN = 2*32 - 1 is TSN = 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) __u32 retval = asoc->next_tsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) asoc->next_tsn++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) asoc->unack_data++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) /* Compare two addresses to see if they match. Wildcard addresses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) * only match themselves.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) int sctp_cmp_addr_exact(const union sctp_addr *ss1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) const union sctp_addr *ss2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) struct sctp_af *af;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) af = sctp_get_af_specific(ss1->sa.sa_family);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) if (unlikely(!af))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) return af->cmp_addr(ss1, ss2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) /* Return an ecne chunk to get prepended to a packet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) * Note: We are sly and return a shared, prealloced chunk. FIXME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) * No we don't, but we could/should.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) struct sctp_chunk *sctp_get_ecne_prepend(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (!asoc->need_ecne)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) /* Send ECNE if needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) * Not being able to allocate a chunk here is not deadly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) return sctp_make_ecne(asoc, asoc->last_ecne_tsn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) * Find which transport this TSN was sent on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) struct sctp_transport *sctp_assoc_lookup_tsn(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) __u32 tsn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) struct sctp_transport *active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) struct sctp_transport *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) struct sctp_transport *transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) struct sctp_chunk *chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) __be32 key = htonl(tsn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) match = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) * FIXME: In general, find a more efficient data structure for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) * searching.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * The general strategy is to search each transport's transmitted
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) * list. Return which transport this TSN lives on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) * Let's be hopeful and check the active_path first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) * Another optimization would be to know if there is only one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) * outbound path and not have to look for the TSN at all.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) active = asoc->peer.active_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) list_for_each_entry(chunk, &active->transmitted,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) transmitted_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) if (key == chunk->subh.data_hdr->tsn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) match = active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) /* If not found, go search all the other transports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) list_for_each_entry(transport, &asoc->peer.transport_addr_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) transports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) if (transport == active)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) list_for_each_entry(chunk, &transport->transmitted,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) transmitted_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) if (key == chunk->subh.data_hdr->tsn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) match = transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) return match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) /* Do delayed input processing. This is scheduled by sctp_rcv(). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) static void sctp_assoc_bh_rcv(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) struct sctp_association *asoc =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) container_of(work, struct sctp_association,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) base.inqueue.immediate);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) struct net *net = asoc->base.net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) union sctp_subtype subtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) struct sctp_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) struct sctp_chunk *chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) struct sctp_inq *inqueue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) int first_time = 1; /* is this the first time through the loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) int error = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) int state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) /* The association should be held so we should be safe. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) ep = asoc->ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) inqueue = &asoc->base.inqueue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) sctp_association_hold(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) while (NULL != (chunk = sctp_inq_pop(inqueue))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) state = asoc->state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) subtype = SCTP_ST_CHUNK(chunk->chunk_hdr->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) /* If the first chunk in the packet is AUTH, do special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) * processing specified in Section 6.3 of SCTP-AUTH spec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) if (first_time && subtype.chunk == SCTP_CID_AUTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) struct sctp_chunkhdr *next_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) next_hdr = sctp_inq_peek(inqueue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) if (!next_hdr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) goto normal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) /* If the next chunk is COOKIE-ECHO, skip the AUTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) * chunk while saving a pointer to it so we can do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) * Authentication later (during cookie-echo
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) * processing).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) if (next_hdr->type == SCTP_CID_COOKIE_ECHO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) chunk->auth_chunk = skb_clone(chunk->skb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) chunk->auth = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) normal:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) /* SCTP-AUTH, Section 6.3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) * The receiver has a list of chunk types which it expects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) * to be received only after an AUTH-chunk. This list has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) * been sent to the peer during the association setup. It
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) * MUST silently discard these chunks if they are not placed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) * after an AUTH chunk in the packet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) if (sctp_auth_recv_cid(subtype.chunk, asoc) && !chunk->auth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) /* Remember where the last DATA chunk came from so we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) * know where to send the SACK.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (sctp_chunk_is_data(chunk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) asoc->peer.last_data_from = chunk->transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) SCTP_INC_STATS(net, SCTP_MIB_INCTRLCHUNKS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) asoc->stats.ictrlchunks++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) if (chunk->chunk_hdr->type == SCTP_CID_SACK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) asoc->stats.isacks++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) if (chunk->transport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) chunk->transport->last_time_heard = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) /* Run through the state machine. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) error = sctp_do_sm(net, SCTP_EVENT_T_CHUNK, subtype,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) state, ep, asoc, chunk, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) /* Check to see if the association is freed in response to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) * the incoming chunk. If so, get out of the while loop.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) if (asoc->base.dead)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) /* If there is an error on chunk, discard this packet. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) if (error && chunk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) chunk->pdiscard = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (first_time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) first_time = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) sctp_association_put(asoc);
^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) /* This routine moves an association from its old sk to a new sk. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) void sctp_assoc_migrate(struct sctp_association *assoc, struct sock *newsk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) struct sctp_sock *newsp = sctp_sk(newsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) struct sock *oldsk = assoc->base.sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) /* Delete the association from the old endpoint's list of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) * associations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) list_del_init(&assoc->asocs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) /* Decrement the backlog value for a TCP-style socket. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) if (sctp_style(oldsk, TCP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) sk_acceptq_removed(oldsk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) /* Release references to the old endpoint and the sock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) sctp_endpoint_put(assoc->ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) sock_put(assoc->base.sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) /* Get a reference to the new endpoint. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) assoc->ep = newsp->ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) sctp_endpoint_hold(assoc->ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) /* Get a reference to the new sock. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) assoc->base.sk = newsk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) sock_hold(assoc->base.sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) /* Add the association to the new endpoint's list of associations. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) sctp_endpoint_add_asoc(newsp->ep, assoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) /* Update an association (possibly from unexpected COOKIE-ECHO processing). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) int sctp_assoc_update(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) struct sctp_association *new)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) struct sctp_transport *trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) struct list_head *pos, *temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) /* Copy in new parameters of peer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) asoc->c = new->c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) asoc->peer.rwnd = new->peer.rwnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) asoc->peer.sack_needed = new->peer.sack_needed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) asoc->peer.auth_capable = new->peer.auth_capable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) asoc->peer.i = new->peer.i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) if (!sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_INITIAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) asoc->peer.i.initial_tsn, GFP_ATOMIC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) /* Remove any peer addresses not present in the new association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) trans = list_entry(pos, struct sctp_transport, transports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) sctp_assoc_rm_peer(asoc, trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) if (asoc->state >= SCTP_STATE_ESTABLISHED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) sctp_transport_reset(trans);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) /* If the case is A (association restart), use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) * initial_tsn as next_tsn. If the case is B, use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) * current next_tsn in case data sent to peer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) * has been discarded and needs retransmission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) if (asoc->state >= SCTP_STATE_ESTABLISHED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) asoc->next_tsn = new->next_tsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) asoc->ctsn_ack_point = new->ctsn_ack_point;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) asoc->adv_peer_ack_point = new->adv_peer_ack_point;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) /* Reinitialize SSN for both local streams
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) * and peer's streams.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) sctp_stream_clear(&asoc->stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) /* Flush the ULP reassembly and ordered queue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) * Any data there will now be stale and will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) * cause problems.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) sctp_ulpq_flush(&asoc->ulpq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) /* reset the overall association error count so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) * that the restarted association doesn't get torn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) * down on the next retransmission timer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) asoc->overall_error_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) /* Add any peer addresses from the new association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) list_for_each_entry(trans, &new->peer.transport_addr_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) transports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) !sctp_assoc_add_peer(asoc, &trans->ipaddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) GFP_ATOMIC, trans->state))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) asoc->ctsn_ack_point = asoc->next_tsn - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) asoc->adv_peer_ack_point = asoc->ctsn_ack_point;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) if (sctp_state(asoc, COOKIE_WAIT))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) sctp_stream_update(&asoc->stream, &new->stream);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) /* get a new assoc id if we don't have one yet. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) if (sctp_assoc_set_id(asoc, GFP_ATOMIC))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) /* SCTP-AUTH: Save the peer parameters from the new associations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) * and also move the association shared keys over
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) kfree(asoc->peer.peer_random);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) asoc->peer.peer_random = new->peer.peer_random;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) new->peer.peer_random = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) kfree(asoc->peer.peer_chunks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) asoc->peer.peer_chunks = new->peer.peer_chunks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) new->peer.peer_chunks = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) kfree(asoc->peer.peer_hmacs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) asoc->peer.peer_hmacs = new->peer.peer_hmacs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) new->peer.peer_hmacs = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) return sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) /* Update the retran path for sending a retransmitted packet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) * See also RFC4960, 6.4. Multi-Homed SCTP Endpoints:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) * When there is outbound data to send and the primary path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) * becomes inactive (e.g., due to failures), or where the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) * SCTP user explicitly requests to send data to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) * inactive destination transport address, before reporting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) * an error to its ULP, the SCTP endpoint should try to send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) * the data to an alternate active destination transport
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) * address if one exists.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) * When retransmitting data that timed out, if the endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) * is multihomed, it should consider each source-destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) * address pair in its retransmission selection policy.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) * When retransmitting timed-out data, the endpoint should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) * attempt to pick the most divergent source-destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) * pair from the original source-destination pair to which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) * the packet was transmitted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) * Note: Rules for picking the most divergent source-destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * pair are an implementation decision and are not specified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) * within this document.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) * Our basic strategy is to round-robin transports in priorities
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) * according to sctp_trans_score() e.g., if no such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) * transport with state SCTP_ACTIVE exists, round-robin through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) * SCTP_UNKNOWN, etc. You get the picture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) static u8 sctp_trans_score(const struct sctp_transport *trans)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) switch (trans->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) case SCTP_ACTIVE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) return 3; /* best case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) case SCTP_UNKNOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) return 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) case SCTP_PF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) default: /* case SCTP_INACTIVE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) return 0; /* worst case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) static struct sctp_transport *sctp_trans_elect_tie(struct sctp_transport *trans1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) struct sctp_transport *trans2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) if (trans1->error_count > trans2->error_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) return trans2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) } else if (trans1->error_count == trans2->error_count &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) ktime_after(trans2->last_time_heard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) trans1->last_time_heard)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) return trans2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) return trans1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) static struct sctp_transport *sctp_trans_elect_best(struct sctp_transport *curr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) struct sctp_transport *best)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) u8 score_curr, score_best;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) if (best == NULL || curr == best)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) return curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) score_curr = sctp_trans_score(curr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) score_best = sctp_trans_score(best);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) /* First, try a score-based selection if both transport states
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) * differ. If we're in a tie, lets try to make a more clever
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) * decision here based on error counts and last time heard.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) if (score_curr > score_best)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) return curr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) else if (score_curr == score_best)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) return sctp_trans_elect_tie(best, curr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) return best;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) void sctp_assoc_update_retran_path(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) struct sctp_transport *trans = asoc->peer.retran_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) struct sctp_transport *trans_next = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) /* We're done as we only have the one and only path. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) if (asoc->peer.transport_count == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) /* If active_path and retran_path are the same and active,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) * then this is the only active path. Use it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) if (asoc->peer.active_path == asoc->peer.retran_path &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) asoc->peer.active_path->state == SCTP_ACTIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) /* Iterate from retran_path's successor back to retran_path. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) for (trans = list_next_entry(trans, transports); 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) trans = list_next_entry(trans, transports)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) /* Manually skip the head element. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) if (&trans->transports == &asoc->peer.transport_addr_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) if (trans->state == SCTP_UNCONFIRMED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) trans_next = sctp_trans_elect_best(trans, trans_next);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) /* Active is good enough for immediate return. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) if (trans_next->state == SCTP_ACTIVE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) /* We've reached the end, time to update path. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) if (trans == asoc->peer.retran_path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) asoc->peer.retran_path = trans_next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) pr_debug("%s: association:%p updated new path to addr:%pISpc\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) __func__, asoc, &asoc->peer.retran_path->ipaddr.sa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) static void sctp_select_active_and_retran_path(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) struct sctp_transport *trans, *trans_pri = NULL, *trans_sec = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) struct sctp_transport *trans_pf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) /* Look for the two most recently used active transports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) list_for_each_entry(trans, &asoc->peer.transport_addr_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) transports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) /* Skip uninteresting transports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) if (trans->state == SCTP_INACTIVE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) trans->state == SCTP_UNCONFIRMED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) /* Keep track of the best PF transport from our
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) * list in case we don't find an active one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) if (trans->state == SCTP_PF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) trans_pf = sctp_trans_elect_best(trans, trans_pf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) /* For active transports, pick the most recent ones. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) if (trans_pri == NULL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) ktime_after(trans->last_time_heard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) trans_pri->last_time_heard)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) trans_sec = trans_pri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) trans_pri = trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) } else if (trans_sec == NULL ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) ktime_after(trans->last_time_heard,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) trans_sec->last_time_heard)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) trans_sec = trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) /* RFC 2960 6.4 Multi-Homed SCTP Endpoints
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) * By default, an endpoint should always transmit to the primary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) * path, unless the SCTP user explicitly specifies the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) * destination transport address (and possibly source transport
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) * address) to use. [If the primary is active but not most recent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) * bump the most recently used transport.]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) if ((asoc->peer.primary_path->state == SCTP_ACTIVE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) asoc->peer.primary_path->state == SCTP_UNKNOWN) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) asoc->peer.primary_path != trans_pri) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) trans_sec = trans_pri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) trans_pri = asoc->peer.primary_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) /* We did not find anything useful for a possible retransmission
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) * path; either primary path that we found is the same as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) * the current one, or we didn't generally find an active one.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) if (trans_sec == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) trans_sec = trans_pri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) /* If we failed to find a usable transport, just camp on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) * active or pick a PF iff it's the better choice.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) if (trans_pri == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) trans_pri = sctp_trans_elect_best(asoc->peer.active_path, trans_pf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) trans_sec = trans_pri;
^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) /* Set the active and retran transports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) asoc->peer.active_path = trans_pri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) asoc->peer.retran_path = trans_sec;
^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) struct sctp_transport *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) sctp_assoc_choose_alter_transport(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) struct sctp_transport *last_sent_to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) /* If this is the first time packet is sent, use the active path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) * else use the retran path. If the last packet was sent over the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * retran path, update the retran path and use it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) if (last_sent_to == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) return asoc->peer.active_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) if (last_sent_to == asoc->peer.retran_path)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) sctp_assoc_update_retran_path(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) return asoc->peer.retran_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) void sctp_assoc_update_frag_point(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) int frag = sctp_mtu_payload(sctp_sk(asoc->base.sk), asoc->pathmtu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) sctp_datachk_len(&asoc->stream));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) if (asoc->user_frag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) frag = min_t(int, frag, asoc->user_frag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) frag = min_t(int, frag, SCTP_MAX_CHUNK_LEN -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) sctp_datachk_len(&asoc->stream));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) asoc->frag_point = SCTP_TRUNC4(frag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) void sctp_assoc_set_pmtu(struct sctp_association *asoc, __u32 pmtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) if (asoc->pathmtu != pmtu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) asoc->pathmtu = pmtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) sctp_assoc_update_frag_point(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) pr_debug("%s: asoc:%p, pmtu:%d, frag_point:%d\n", __func__, asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) asoc->pathmtu, asoc->frag_point);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) /* Update the association's pmtu and frag_point by going through all the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) * transports. This routine is called when a transport's PMTU has changed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) void sctp_assoc_sync_pmtu(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) struct sctp_transport *t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) __u32 pmtu = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) if (!asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) /* Get the lowest pmtu of all the transports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) list_for_each_entry(t, &asoc->peer.transport_addr_list, transports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) if (t->pmtu_pending && t->dst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) sctp_transport_update_pmtu(t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) atomic_read(&t->mtu_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) t->pmtu_pending = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (!pmtu || (t->pathmtu < pmtu))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) pmtu = t->pathmtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) sctp_assoc_set_pmtu(asoc, pmtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) /* Should we send a SACK to update our peer? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) static inline bool sctp_peer_needs_update(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) struct net *net = asoc->base.net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) switch (asoc->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) case SCTP_STATE_ESTABLISHED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) case SCTP_STATE_SHUTDOWN_PENDING:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) case SCTP_STATE_SHUTDOWN_RECEIVED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) case SCTP_STATE_SHUTDOWN_SENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) if ((asoc->rwnd > asoc->a_rwnd) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) ((asoc->rwnd - asoc->a_rwnd) >= max_t(__u32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) (asoc->base.sk->sk_rcvbuf >> net->sctp.rwnd_upd_shift),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) asoc->pathmtu)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) /* Increase asoc's rwnd by len and send any window update SACK if needed. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) void sctp_assoc_rwnd_increase(struct sctp_association *asoc, unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) struct sctp_chunk *sack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) struct timer_list *timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) if (asoc->rwnd_over) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) if (asoc->rwnd_over >= len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) asoc->rwnd_over -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) asoc->rwnd += (len - asoc->rwnd_over);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) asoc->rwnd_over = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) asoc->rwnd += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) /* If we had window pressure, start recovering it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) * once our rwnd had reached the accumulated pressure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) * threshold. The idea is to recover slowly, but up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) * to the initial advertised window.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) if (asoc->rwnd_press) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) int change = min(asoc->pathmtu, asoc->rwnd_press);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) asoc->rwnd += change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) asoc->rwnd_press -= change;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) pr_debug("%s: asoc:%p rwnd increased by %d to (%u, %u) - %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) __func__, asoc, len, asoc->rwnd, asoc->rwnd_over,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) asoc->a_rwnd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) /* Send a window update SACK if the rwnd has increased by at least the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) * minimum of the association's PMTU and half of the receive buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) * The algorithm used is similar to the one described in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) * Section 4.2.3.3 of RFC 1122.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) if (sctp_peer_needs_update(asoc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) asoc->a_rwnd = asoc->rwnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) pr_debug("%s: sending window update SACK- asoc:%p rwnd:%u "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) "a_rwnd:%u\n", __func__, asoc, asoc->rwnd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) asoc->a_rwnd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) sack = sctp_make_sack(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) if (!sack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) asoc->peer.sack_needed = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) sctp_outq_tail(&asoc->outqueue, sack, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) /* Stop the SACK timer. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) timer = &asoc->timers[SCTP_EVENT_TIMEOUT_SACK];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) if (del_timer(timer))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) sctp_association_put(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) /* Decrease asoc's rwnd by len. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) void sctp_assoc_rwnd_decrease(struct sctp_association *asoc, unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) int rx_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) int over = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) if (unlikely(!asoc->rwnd || asoc->rwnd_over))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) pr_debug("%s: association:%p has asoc->rwnd:%u, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) "asoc->rwnd_over:%u!\n", __func__, asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) asoc->rwnd, asoc->rwnd_over);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) if (asoc->ep->rcvbuf_policy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) rx_count = atomic_read(&asoc->rmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) rx_count = atomic_read(&asoc->base.sk->sk_rmem_alloc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) /* If we've reached or overflowed our receive buffer, announce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) * a 0 rwnd if rwnd would still be positive. Store the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) * potential pressure overflow so that the window can be restored
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) * back to original value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) if (rx_count >= asoc->base.sk->sk_rcvbuf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) over = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) if (asoc->rwnd >= len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) asoc->rwnd -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) if (over) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) asoc->rwnd_press += asoc->rwnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) asoc->rwnd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) asoc->rwnd_over += len - asoc->rwnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) asoc->rwnd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) pr_debug("%s: asoc:%p rwnd decreased by %d to (%u, %u, %u)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) __func__, asoc, len, asoc->rwnd, asoc->rwnd_over,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) asoc->rwnd_press);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) /* Build the bind address list for the association based on info from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) * local endpoint and the remote peer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) int sctp_assoc_set_bind_addr_from_ep(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) enum sctp_scope scope, gfp_t gfp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) struct sock *sk = asoc->base.sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) /* Use scoping rules to determine the subset of addresses from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) * the endpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) flags = (PF_INET6 == sk->sk_family) ? SCTP_ADDR6_ALLOWED : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) if (!inet_v6_ipv6only(sk))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) flags |= SCTP_ADDR4_ALLOWED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) if (asoc->peer.ipv4_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) flags |= SCTP_ADDR4_PEERSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) if (asoc->peer.ipv6_address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) flags |= SCTP_ADDR6_PEERSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) return sctp_bind_addr_copy(asoc->base.net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) &asoc->base.bind_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) &asoc->ep->base.bind_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) scope, gfp, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) /* Build the association's bind address list from the cookie. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) struct sctp_cookie *cookie,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) gfp_t gfp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) int var_size2 = ntohs(cookie->peer_init->chunk_hdr.length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) int var_size3 = cookie->raw_addr_list_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) __u8 *raw = (__u8 *)cookie->peer_init + var_size2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) return sctp_raw_to_bind_addrs(&asoc->base.bind_addr, raw, var_size3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) asoc->ep->base.bind_addr.port, gfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) /* Lookup laddr in the bind address list of an association. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) const union sctp_addr *laddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) int found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) if ((asoc->base.bind_addr.port == ntohs(laddr->v4.sin_port)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) sctp_bind_addr_match(&asoc->base.bind_addr, laddr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) sctp_sk(asoc->base.sk)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) found = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) return found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) /* Set an association id for a given association */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) int sctp_assoc_set_id(struct sctp_association *asoc, gfp_t gfp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) bool preload = gfpflags_allow_blocking(gfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) /* If the id is already assigned, keep it. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (asoc->assoc_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) if (preload)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) idr_preload(gfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) spin_lock_bh(&sctp_assocs_id_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) /* 0, 1, 2 are used as SCTP_FUTURE_ASSOC, SCTP_CURRENT_ASSOC and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) * SCTP_ALL_ASSOC, so an available id must be > SCTP_ALL_ASSOC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) ret = idr_alloc_cyclic(&sctp_assocs_id, asoc, SCTP_ALL_ASSOC + 1, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) GFP_NOWAIT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) spin_unlock_bh(&sctp_assocs_id_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) if (preload)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) idr_preload_end();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) asoc->assoc_id = (sctp_assoc_t)ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) /* Free the ASCONF queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) static void sctp_assoc_free_asconf_queue(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) struct sctp_chunk *asconf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) struct sctp_chunk *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) list_for_each_entry_safe(asconf, tmp, &asoc->addip_chunk_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) list_del_init(&asconf->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) sctp_chunk_free(asconf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) /* Free asconf_ack cache */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) static void sctp_assoc_free_asconf_acks(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) struct sctp_chunk *ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) struct sctp_chunk *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) list_for_each_entry_safe(ack, tmp, &asoc->asconf_ack_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) transmitted_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) list_del_init(&ack->transmitted_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) sctp_chunk_free(ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) /* Clean up the ASCONF_ACK queue */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) void sctp_assoc_clean_asconf_ack_cache(const struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) struct sctp_chunk *ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) struct sctp_chunk *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) /* We can remove all the entries from the queue up to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) * the "Peer-Sequence-Number".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) list_for_each_entry_safe(ack, tmp, &asoc->asconf_ack_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) transmitted_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) if (ack->subh.addip_hdr->serial ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) htonl(asoc->peer.addip_serial))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) list_del_init(&ack->transmitted_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) sctp_chunk_free(ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) /* Find the ASCONF_ACK whose serial number matches ASCONF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) struct sctp_chunk *sctp_assoc_lookup_asconf_ack(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) const struct sctp_association *asoc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) __be32 serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) struct sctp_chunk *ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) /* Walk through the list of cached ASCONF-ACKs and find the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) * ack chunk whose serial number matches that of the request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) list_for_each_entry(ack, &asoc->asconf_ack_list, transmitted_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) if (sctp_chunk_pending(ack))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) if (ack->subh.addip_hdr->serial == serial) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) sctp_chunk_hold(ack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) return ack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) void sctp_asconf_queue_teardown(struct sctp_association *asoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) /* Free any cached ASCONF_ACK chunk. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) sctp_assoc_free_asconf_acks(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) /* Free the ASCONF queue. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) sctp_assoc_free_asconf_queue(asoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) /* Free any cached ASCONF chunk. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) if (asoc->addip_last_asconf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) sctp_chunk_free(asoc->addip_last_asconf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) }