cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ulpevent.c (33321B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/* SCTP kernel implementation
      3 * (C) Copyright IBM Corp. 2001, 2004
      4 * Copyright (c) 1999-2000 Cisco, Inc.
      5 * Copyright (c) 1999-2001 Motorola, Inc.
      6 * Copyright (c) 2001 Intel Corp.
      7 * Copyright (c) 2001 Nokia, Inc.
      8 * Copyright (c) 2001 La Monte H.P. Yarroll
      9 *
     10 * These functions manipulate an sctp event.   The struct ulpevent is used
     11 * to carry notifications and data to the ULP (sockets).
     12 *
     13 * Please send any bug reports or fixes you make to the
     14 * email address(es):
     15 *    lksctp developers <linux-sctp@vger.kernel.org>
     16 *
     17 * Written or modified by:
     18 *    Jon Grimm             <jgrimm@us.ibm.com>
     19 *    La Monte H.P. Yarroll <piggy@acm.org>
     20 *    Ardelle Fan	    <ardelle.fan@intel.com>
     21 *    Sridhar Samudrala     <sri@us.ibm.com>
     22 */
     23
     24#include <linux/slab.h>
     25#include <linux/types.h>
     26#include <linux/skbuff.h>
     27#include <net/sctp/structs.h>
     28#include <net/sctp/sctp.h>
     29#include <net/sctp/sm.h>
     30
     31static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event,
     32				       struct sctp_association *asoc);
     33static void sctp_ulpevent_release_data(struct sctp_ulpevent *event);
     34static void sctp_ulpevent_release_frag_data(struct sctp_ulpevent *event);
     35
     36
     37/* Initialize an ULP event from an given skb.  */
     38static void sctp_ulpevent_init(struct sctp_ulpevent *event,
     39			       __u16 msg_flags,
     40			       unsigned int len)
     41{
     42	memset(event, 0, sizeof(struct sctp_ulpevent));
     43	event->msg_flags = msg_flags;
     44	event->rmem_len = len;
     45}
     46
     47/* Create a new sctp_ulpevent.  */
     48static struct sctp_ulpevent *sctp_ulpevent_new(int size, __u16 msg_flags,
     49					       gfp_t gfp)
     50{
     51	struct sctp_ulpevent *event;
     52	struct sk_buff *skb;
     53
     54	skb = alloc_skb(size, gfp);
     55	if (!skb)
     56		goto fail;
     57
     58	event = sctp_skb2event(skb);
     59	sctp_ulpevent_init(event, msg_flags, skb->truesize);
     60
     61	return event;
     62
     63fail:
     64	return NULL;
     65}
     66
     67/* Is this a MSG_NOTIFICATION?  */
     68int sctp_ulpevent_is_notification(const struct sctp_ulpevent *event)
     69{
     70	return MSG_NOTIFICATION == (event->msg_flags & MSG_NOTIFICATION);
     71}
     72
     73/* Hold the association in case the msg_name needs read out of
     74 * the association.
     75 */
     76static inline void sctp_ulpevent_set_owner(struct sctp_ulpevent *event,
     77					   const struct sctp_association *asoc)
     78{
     79	struct sctp_chunk *chunk = event->chunk;
     80	struct sk_buff *skb;
     81
     82	/* Cast away the const, as we are just wanting to
     83	 * bump the reference count.
     84	 */
     85	sctp_association_hold((struct sctp_association *)asoc);
     86	skb = sctp_event2skb(event);
     87	event->asoc = (struct sctp_association *)asoc;
     88	atomic_add(event->rmem_len, &event->asoc->rmem_alloc);
     89	sctp_skb_set_owner_r(skb, asoc->base.sk);
     90	if (chunk && chunk->head_skb && !chunk->head_skb->sk)
     91		chunk->head_skb->sk = asoc->base.sk;
     92}
     93
     94/* A simple destructor to give up the reference to the association. */
     95static inline void sctp_ulpevent_release_owner(struct sctp_ulpevent *event)
     96{
     97	struct sctp_association *asoc = event->asoc;
     98
     99	atomic_sub(event->rmem_len, &asoc->rmem_alloc);
    100	sctp_association_put(asoc);
    101}
    102
    103/* Create and initialize an SCTP_ASSOC_CHANGE event.
    104 *
    105 * 5.3.1.1 SCTP_ASSOC_CHANGE
    106 *
    107 * Communication notifications inform the ULP that an SCTP association
    108 * has either begun or ended. The identifier for a new association is
    109 * provided by this notification.
    110 *
    111 * Note: There is no field checking here.  If a field is unused it will be
    112 * zero'd out.
    113 */
    114struct sctp_ulpevent  *sctp_ulpevent_make_assoc_change(
    115	const struct sctp_association *asoc,
    116	__u16 flags, __u16 state, __u16 error, __u16 outbound,
    117	__u16 inbound, struct sctp_chunk *chunk, gfp_t gfp)
    118{
    119	struct sctp_ulpevent *event;
    120	struct sctp_assoc_change *sac;
    121	struct sk_buff *skb;
    122
    123	/* If the lower layer passed in the chunk, it will be
    124	 * an ABORT, so we need to include it in the sac_info.
    125	 */
    126	if (chunk) {
    127		/* Copy the chunk data to a new skb and reserve enough
    128		 * head room to use as notification.
    129		 */
    130		skb = skb_copy_expand(chunk->skb,
    131				      sizeof(struct sctp_assoc_change), 0, gfp);
    132
    133		if (!skb)
    134			goto fail;
    135
    136		/* Embed the event fields inside the cloned skb.  */
    137		event = sctp_skb2event(skb);
    138		sctp_ulpevent_init(event, MSG_NOTIFICATION, skb->truesize);
    139
    140		/* Include the notification structure */
    141		sac = skb_push(skb, sizeof(struct sctp_assoc_change));
    142
    143		/* Trim the buffer to the right length.  */
    144		skb_trim(skb, sizeof(struct sctp_assoc_change) +
    145			 ntohs(chunk->chunk_hdr->length) -
    146			 sizeof(struct sctp_chunkhdr));
    147	} else {
    148		event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change),
    149				  MSG_NOTIFICATION, gfp);
    150		if (!event)
    151			goto fail;
    152
    153		skb = sctp_event2skb(event);
    154		sac = skb_put(skb, sizeof(struct sctp_assoc_change));
    155	}
    156
    157	/* Socket Extensions for SCTP
    158	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    159	 *
    160	 * sac_type:
    161	 * It should be SCTP_ASSOC_CHANGE.
    162	 */
    163	sac->sac_type = SCTP_ASSOC_CHANGE;
    164
    165	/* Socket Extensions for SCTP
    166	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    167	 *
    168	 * sac_state: 32 bits (signed integer)
    169	 * This field holds one of a number of values that communicate the
    170	 * event that happened to the association.
    171	 */
    172	sac->sac_state = state;
    173
    174	/* Socket Extensions for SCTP
    175	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    176	 *
    177	 * sac_flags: 16 bits (unsigned integer)
    178	 * Currently unused.
    179	 */
    180	sac->sac_flags = 0;
    181
    182	/* Socket Extensions for SCTP
    183	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    184	 *
    185	 * sac_length: sizeof (__u32)
    186	 * This field is the total length of the notification data, including
    187	 * the notification header.
    188	 */
    189	sac->sac_length = skb->len;
    190
    191	/* Socket Extensions for SCTP
    192	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    193	 *
    194	 * sac_error:  32 bits (signed integer)
    195	 *
    196	 * If the state was reached due to a error condition (e.g.
    197	 * COMMUNICATION_LOST) any relevant error information is available in
    198	 * this field. This corresponds to the protocol error codes defined in
    199	 * [SCTP].
    200	 */
    201	sac->sac_error = error;
    202
    203	/* Socket Extensions for SCTP
    204	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    205	 *
    206	 * sac_outbound_streams:  16 bits (unsigned integer)
    207	 * sac_inbound_streams:  16 bits (unsigned integer)
    208	 *
    209	 * The maximum number of streams allowed in each direction are
    210	 * available in sac_outbound_streams and sac_inbound streams.
    211	 */
    212	sac->sac_outbound_streams = outbound;
    213	sac->sac_inbound_streams = inbound;
    214
    215	/* Socket Extensions for SCTP
    216	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    217	 *
    218	 * sac_assoc_id: sizeof (sctp_assoc_t)
    219	 *
    220	 * The association id field, holds the identifier for the association.
    221	 * All notifications for a given association have the same association
    222	 * identifier.  For TCP style socket, this field is ignored.
    223	 */
    224	sctp_ulpevent_set_owner(event, asoc);
    225	sac->sac_assoc_id = sctp_assoc2id(asoc);
    226
    227	return event;
    228
    229fail:
    230	return NULL;
    231}
    232
    233/* Create and initialize an SCTP_PEER_ADDR_CHANGE event.
    234 *
    235 * Socket Extensions for SCTP - draft-01
    236 * 5.3.1.2 SCTP_PEER_ADDR_CHANGE
    237 *
    238 * When a destination address on a multi-homed peer encounters a change
    239 * an interface details event is sent.
    240 */
    241static struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change(
    242	const struct sctp_association *asoc,
    243	const struct sockaddr_storage *aaddr,
    244	int flags, int state, int error, gfp_t gfp)
    245{
    246	struct sctp_ulpevent *event;
    247	struct sctp_paddr_change  *spc;
    248	struct sk_buff *skb;
    249
    250	event = sctp_ulpevent_new(sizeof(struct sctp_paddr_change),
    251				  MSG_NOTIFICATION, gfp);
    252	if (!event)
    253		goto fail;
    254
    255	skb = sctp_event2skb(event);
    256	spc = skb_put(skb, sizeof(struct sctp_paddr_change));
    257
    258	/* Sockets API Extensions for SCTP
    259	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
    260	 *
    261	 * spc_type:
    262	 *
    263	 *    It should be SCTP_PEER_ADDR_CHANGE.
    264	 */
    265	spc->spc_type = SCTP_PEER_ADDR_CHANGE;
    266
    267	/* Sockets API Extensions for SCTP
    268	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
    269	 *
    270	 * spc_length: sizeof (__u32)
    271	 *
    272	 * This field is the total length of the notification data, including
    273	 * the notification header.
    274	 */
    275	spc->spc_length = sizeof(struct sctp_paddr_change);
    276
    277	/* Sockets API Extensions for SCTP
    278	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
    279	 *
    280	 * spc_flags: 16 bits (unsigned integer)
    281	 * Currently unused.
    282	 */
    283	spc->spc_flags = 0;
    284
    285	/* Sockets API Extensions for SCTP
    286	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
    287	 *
    288	 * spc_state:  32 bits (signed integer)
    289	 *
    290	 * This field holds one of a number of values that communicate the
    291	 * event that happened to the address.
    292	 */
    293	spc->spc_state = state;
    294
    295	/* Sockets API Extensions for SCTP
    296	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
    297	 *
    298	 * spc_error:  32 bits (signed integer)
    299	 *
    300	 * If the state was reached due to any error condition (e.g.
    301	 * ADDRESS_UNREACHABLE) any relevant error information is available in
    302	 * this field.
    303	 */
    304	spc->spc_error = error;
    305
    306	/* Socket Extensions for SCTP
    307	 * 5.3.1.1 SCTP_ASSOC_CHANGE
    308	 *
    309	 * spc_assoc_id: sizeof (sctp_assoc_t)
    310	 *
    311	 * The association id field, holds the identifier for the association.
    312	 * All notifications for a given association have the same association
    313	 * identifier.  For TCP style socket, this field is ignored.
    314	 */
    315	sctp_ulpevent_set_owner(event, asoc);
    316	spc->spc_assoc_id = sctp_assoc2id(asoc);
    317
    318	/* Sockets API Extensions for SCTP
    319	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
    320	 *
    321	 * spc_aaddr: sizeof (struct sockaddr_storage)
    322	 *
    323	 * The affected address field, holds the remote peer's address that is
    324	 * encountering the change of state.
    325	 */
    326	memcpy(&spc->spc_aaddr, aaddr, sizeof(struct sockaddr_storage));
    327
    328	/* Map ipv4 address into v4-mapped-on-v6 address.  */
    329	sctp_get_pf_specific(asoc->base.sk->sk_family)->addr_to_user(
    330					sctp_sk(asoc->base.sk),
    331					(union sctp_addr *)&spc->spc_aaddr);
    332
    333	return event;
    334
    335fail:
    336	return NULL;
    337}
    338
    339void sctp_ulpevent_notify_peer_addr_change(struct sctp_transport *transport,
    340					   int state, int error)
    341{
    342	struct sctp_association *asoc = transport->asoc;
    343	struct sockaddr_storage addr;
    344	struct sctp_ulpevent *event;
    345
    346	if (asoc->state < SCTP_STATE_ESTABLISHED)
    347		return;
    348
    349	memset(&addr, 0, sizeof(struct sockaddr_storage));
    350	memcpy(&addr, &transport->ipaddr, transport->af_specific->sockaddr_len);
    351
    352	event = sctp_ulpevent_make_peer_addr_change(asoc, &addr, 0, state,
    353						    error, GFP_ATOMIC);
    354	if (event)
    355		asoc->stream.si->enqueue_event(&asoc->ulpq, event);
    356}
    357
    358/* Create and initialize an SCTP_REMOTE_ERROR notification.
    359 *
    360 * Note: This assumes that the chunk->skb->data already points to the
    361 * operation error payload.
    362 *
    363 * Socket Extensions for SCTP - draft-01
    364 * 5.3.1.3 SCTP_REMOTE_ERROR
    365 *
    366 * A remote peer may send an Operational Error message to its peer.
    367 * This message indicates a variety of error conditions on an
    368 * association. The entire error TLV as it appears on the wire is
    369 * included in a SCTP_REMOTE_ERROR event.  Please refer to the SCTP
    370 * specification [SCTP] and any extensions for a list of possible
    371 * error formats.
    372 */
    373struct sctp_ulpevent *
    374sctp_ulpevent_make_remote_error(const struct sctp_association *asoc,
    375				struct sctp_chunk *chunk, __u16 flags,
    376				gfp_t gfp)
    377{
    378	struct sctp_remote_error *sre;
    379	struct sctp_ulpevent *event;
    380	struct sctp_errhdr *ch;
    381	struct sk_buff *skb;
    382	__be16 cause;
    383	int elen;
    384
    385	ch = (struct sctp_errhdr *)(chunk->skb->data);
    386	cause = ch->cause;
    387	elen = SCTP_PAD4(ntohs(ch->length)) - sizeof(*ch);
    388
    389	/* Pull off the ERROR header.  */
    390	skb_pull(chunk->skb, sizeof(*ch));
    391
    392	/* Copy the skb to a new skb with room for us to prepend
    393	 * notification with.
    394	 */
    395	skb = skb_copy_expand(chunk->skb, sizeof(*sre), 0, gfp);
    396
    397	/* Pull off the rest of the cause TLV from the chunk.  */
    398	skb_pull(chunk->skb, elen);
    399	if (!skb)
    400		goto fail;
    401
    402	/* Embed the event fields inside the cloned skb.  */
    403	event = sctp_skb2event(skb);
    404	sctp_ulpevent_init(event, MSG_NOTIFICATION, skb->truesize);
    405
    406	sre = skb_push(skb, sizeof(*sre));
    407
    408	/* Trim the buffer to the right length.  */
    409	skb_trim(skb, sizeof(*sre) + elen);
    410
    411	/* RFC6458, Section 6.1.3. SCTP_REMOTE_ERROR */
    412	memset(sre, 0, sizeof(*sre));
    413	sre->sre_type = SCTP_REMOTE_ERROR;
    414	sre->sre_flags = 0;
    415	sre->sre_length = skb->len;
    416	sre->sre_error = cause;
    417	sctp_ulpevent_set_owner(event, asoc);
    418	sre->sre_assoc_id = sctp_assoc2id(asoc);
    419
    420	return event;
    421fail:
    422	return NULL;
    423}
    424
    425/* Create and initialize a SCTP_SEND_FAILED notification.
    426 *
    427 * Socket Extensions for SCTP - draft-01
    428 * 5.3.1.4 SCTP_SEND_FAILED
    429 */
    430struct sctp_ulpevent *sctp_ulpevent_make_send_failed(
    431	const struct sctp_association *asoc, struct sctp_chunk *chunk,
    432	__u16 flags, __u32 error, gfp_t gfp)
    433{
    434	struct sctp_ulpevent *event;
    435	struct sctp_send_failed *ssf;
    436	struct sk_buff *skb;
    437
    438	/* Pull off any padding. */
    439	int len = ntohs(chunk->chunk_hdr->length);
    440
    441	/* Make skb with more room so we can prepend notification.  */
    442	skb = skb_copy_expand(chunk->skb,
    443			      sizeof(struct sctp_send_failed), /* headroom */
    444			      0,                               /* tailroom */
    445			      gfp);
    446	if (!skb)
    447		goto fail;
    448
    449	/* Pull off the common chunk header and DATA header.  */
    450	skb_pull(skb, sctp_datachk_len(&asoc->stream));
    451	len -= sctp_datachk_len(&asoc->stream);
    452
    453	/* Embed the event fields inside the cloned skb.  */
    454	event = sctp_skb2event(skb);
    455	sctp_ulpevent_init(event, MSG_NOTIFICATION, skb->truesize);
    456
    457	ssf = skb_push(skb, sizeof(struct sctp_send_failed));
    458
    459	/* Socket Extensions for SCTP
    460	 * 5.3.1.4 SCTP_SEND_FAILED
    461	 *
    462	 * ssf_type:
    463	 * It should be SCTP_SEND_FAILED.
    464	 */
    465	ssf->ssf_type = SCTP_SEND_FAILED;
    466
    467	/* Socket Extensions for SCTP
    468	 * 5.3.1.4 SCTP_SEND_FAILED
    469	 *
    470	 * ssf_flags: 16 bits (unsigned integer)
    471	 * The flag value will take one of the following values
    472	 *
    473	 * SCTP_DATA_UNSENT - Indicates that the data was never put on
    474	 *                    the wire.
    475	 *
    476	 * SCTP_DATA_SENT   - Indicates that the data was put on the wire.
    477	 *                    Note that this does not necessarily mean that the
    478	 *                    data was (or was not) successfully delivered.
    479	 */
    480	ssf->ssf_flags = flags;
    481
    482	/* Socket Extensions for SCTP
    483	 * 5.3.1.4 SCTP_SEND_FAILED
    484	 *
    485	 * ssf_length: sizeof (__u32)
    486	 * This field is the total length of the notification data, including
    487	 * the notification header.
    488	 */
    489	ssf->ssf_length = sizeof(struct sctp_send_failed) + len;
    490	skb_trim(skb, ssf->ssf_length);
    491
    492	/* Socket Extensions for SCTP
    493	 * 5.3.1.4 SCTP_SEND_FAILED
    494	 *
    495	 * ssf_error: 16 bits (unsigned integer)
    496	 * This value represents the reason why the send failed, and if set,
    497	 * will be a SCTP protocol error code as defined in [SCTP] section
    498	 * 3.3.10.
    499	 */
    500	ssf->ssf_error = error;
    501
    502	/* Socket Extensions for SCTP
    503	 * 5.3.1.4 SCTP_SEND_FAILED
    504	 *
    505	 * ssf_info: sizeof (struct sctp_sndrcvinfo)
    506	 * The original send information associated with the undelivered
    507	 * message.
    508	 */
    509	memcpy(&ssf->ssf_info, &chunk->sinfo, sizeof(struct sctp_sndrcvinfo));
    510
    511	/* Per TSVWG discussion with Randy. Allow the application to
    512	 * reassemble a fragmented message.
    513	 */
    514	ssf->ssf_info.sinfo_flags = chunk->chunk_hdr->flags;
    515
    516	/* Socket Extensions for SCTP
    517	 * 5.3.1.4 SCTP_SEND_FAILED
    518	 *
    519	 * ssf_assoc_id: sizeof (sctp_assoc_t)
    520	 * The association id field, sf_assoc_id, holds the identifier for the
    521	 * association.  All notifications for a given association have the
    522	 * same association identifier.  For TCP style socket, this field is
    523	 * ignored.
    524	 */
    525	sctp_ulpevent_set_owner(event, asoc);
    526	ssf->ssf_assoc_id = sctp_assoc2id(asoc);
    527	return event;
    528
    529fail:
    530	return NULL;
    531}
    532
    533struct sctp_ulpevent *sctp_ulpevent_make_send_failed_event(
    534	const struct sctp_association *asoc, struct sctp_chunk *chunk,
    535	__u16 flags, __u32 error, gfp_t gfp)
    536{
    537	struct sctp_send_failed_event *ssf;
    538	struct sctp_ulpevent *event;
    539	struct sk_buff *skb;
    540	int len;
    541
    542	skb = skb_copy_expand(chunk->skb, sizeof(*ssf), 0, gfp);
    543	if (!skb)
    544		return NULL;
    545
    546	len = ntohs(chunk->chunk_hdr->length);
    547	len -= sctp_datachk_len(&asoc->stream);
    548
    549	skb_pull(skb, sctp_datachk_len(&asoc->stream));
    550	event = sctp_skb2event(skb);
    551	sctp_ulpevent_init(event, MSG_NOTIFICATION, skb->truesize);
    552
    553	ssf = skb_push(skb, sizeof(*ssf));
    554	ssf->ssf_type = SCTP_SEND_FAILED_EVENT;
    555	ssf->ssf_flags = flags;
    556	ssf->ssf_length = sizeof(*ssf) + len;
    557	skb_trim(skb, ssf->ssf_length);
    558	ssf->ssf_error = error;
    559
    560	ssf->ssfe_info.snd_sid = chunk->sinfo.sinfo_stream;
    561	ssf->ssfe_info.snd_ppid = chunk->sinfo.sinfo_ppid;
    562	ssf->ssfe_info.snd_context = chunk->sinfo.sinfo_context;
    563	ssf->ssfe_info.snd_assoc_id = chunk->sinfo.sinfo_assoc_id;
    564	ssf->ssfe_info.snd_flags = chunk->chunk_hdr->flags;
    565
    566	sctp_ulpevent_set_owner(event, asoc);
    567	ssf->ssf_assoc_id = sctp_assoc2id(asoc);
    568
    569	return event;
    570}
    571
    572/* Create and initialize a SCTP_SHUTDOWN_EVENT notification.
    573 *
    574 * Socket Extensions for SCTP - draft-01
    575 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
    576 */
    577struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event(
    578	const struct sctp_association *asoc,
    579	__u16 flags, gfp_t gfp)
    580{
    581	struct sctp_ulpevent *event;
    582	struct sctp_shutdown_event *sse;
    583	struct sk_buff *skb;
    584
    585	event = sctp_ulpevent_new(sizeof(struct sctp_shutdown_event),
    586				  MSG_NOTIFICATION, gfp);
    587	if (!event)
    588		goto fail;
    589
    590	skb = sctp_event2skb(event);
    591	sse = skb_put(skb, sizeof(struct sctp_shutdown_event));
    592
    593	/* Socket Extensions for SCTP
    594	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
    595	 *
    596	 * sse_type
    597	 * It should be SCTP_SHUTDOWN_EVENT
    598	 */
    599	sse->sse_type = SCTP_SHUTDOWN_EVENT;
    600
    601	/* Socket Extensions for SCTP
    602	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
    603	 *
    604	 * sse_flags: 16 bits (unsigned integer)
    605	 * Currently unused.
    606	 */
    607	sse->sse_flags = 0;
    608
    609	/* Socket Extensions for SCTP
    610	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
    611	 *
    612	 * sse_length: sizeof (__u32)
    613	 * This field is the total length of the notification data, including
    614	 * the notification header.
    615	 */
    616	sse->sse_length = sizeof(struct sctp_shutdown_event);
    617
    618	/* Socket Extensions for SCTP
    619	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
    620	 *
    621	 * sse_assoc_id: sizeof (sctp_assoc_t)
    622	 * The association id field, holds the identifier for the association.
    623	 * All notifications for a given association have the same association
    624	 * identifier.  For TCP style socket, this field is ignored.
    625	 */
    626	sctp_ulpevent_set_owner(event, asoc);
    627	sse->sse_assoc_id = sctp_assoc2id(asoc);
    628
    629	return event;
    630
    631fail:
    632	return NULL;
    633}
    634
    635/* Create and initialize a SCTP_ADAPTATION_INDICATION notification.
    636 *
    637 * Socket Extensions for SCTP
    638 * 5.3.1.6 SCTP_ADAPTATION_INDICATION
    639 */
    640struct sctp_ulpevent *sctp_ulpevent_make_adaptation_indication(
    641	const struct sctp_association *asoc, gfp_t gfp)
    642{
    643	struct sctp_ulpevent *event;
    644	struct sctp_adaptation_event *sai;
    645	struct sk_buff *skb;
    646
    647	event = sctp_ulpevent_new(sizeof(struct sctp_adaptation_event),
    648				  MSG_NOTIFICATION, gfp);
    649	if (!event)
    650		goto fail;
    651
    652	skb = sctp_event2skb(event);
    653	sai = skb_put(skb, sizeof(struct sctp_adaptation_event));
    654
    655	sai->sai_type = SCTP_ADAPTATION_INDICATION;
    656	sai->sai_flags = 0;
    657	sai->sai_length = sizeof(struct sctp_adaptation_event);
    658	sai->sai_adaptation_ind = asoc->peer.adaptation_ind;
    659	sctp_ulpevent_set_owner(event, asoc);
    660	sai->sai_assoc_id = sctp_assoc2id(asoc);
    661
    662	return event;
    663
    664fail:
    665	return NULL;
    666}
    667
    668/* A message has been received.  Package this message as a notification
    669 * to pass it to the upper layers.  Go ahead and calculate the sndrcvinfo
    670 * even if filtered out later.
    671 *
    672 * Socket Extensions for SCTP
    673 * 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
    674 */
    675struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
    676						struct sctp_chunk *chunk,
    677						gfp_t gfp)
    678{
    679	struct sctp_ulpevent *event = NULL;
    680	struct sk_buff *skb = chunk->skb;
    681	struct sock *sk = asoc->base.sk;
    682	size_t padding, datalen;
    683	int rx_count;
    684
    685	/*
    686	 * check to see if we need to make space for this
    687	 * new skb, expand the rcvbuffer if needed, or drop
    688	 * the frame
    689	 */
    690	if (asoc->ep->rcvbuf_policy)
    691		rx_count = atomic_read(&asoc->rmem_alloc);
    692	else
    693		rx_count = atomic_read(&sk->sk_rmem_alloc);
    694
    695	datalen = ntohs(chunk->chunk_hdr->length);
    696
    697	if (rx_count >= sk->sk_rcvbuf || !sk_rmem_schedule(sk, skb, datalen))
    698		goto fail;
    699
    700	/* Clone the original skb, sharing the data.  */
    701	skb = skb_clone(chunk->skb, gfp);
    702	if (!skb)
    703		goto fail;
    704
    705	/* Now that all memory allocations for this chunk succeeded, we
    706	 * can mark it as received so the tsn_map is updated correctly.
    707	 */
    708	if (sctp_tsnmap_mark(&asoc->peer.tsn_map,
    709			     ntohl(chunk->subh.data_hdr->tsn),
    710			     chunk->transport))
    711		goto fail_mark;
    712
    713	/* First calculate the padding, so we don't inadvertently
    714	 * pass up the wrong length to the user.
    715	 *
    716	 * RFC 2960 - Section 3.2  Chunk Field Descriptions
    717	 *
    718	 * The total length of a chunk(including Type, Length and Value fields)
    719	 * MUST be a multiple of 4 bytes.  If the length of the chunk is not a
    720	 * multiple of 4 bytes, the sender MUST pad the chunk with all zero
    721	 * bytes and this padding is not included in the chunk length field.
    722	 * The sender should never pad with more than 3 bytes.  The receiver
    723	 * MUST ignore the padding bytes.
    724	 */
    725	padding = SCTP_PAD4(datalen) - datalen;
    726
    727	/* Fixup cloned skb with just this chunks data.  */
    728	skb_trim(skb, chunk->chunk_end - padding - skb->data);
    729
    730	/* Embed the event fields inside the cloned skb.  */
    731	event = sctp_skb2event(skb);
    732
    733	/* Initialize event with flags 0  and correct length
    734	 * Since this is a clone of the original skb, only account for
    735	 * the data of this chunk as other chunks will be accounted separately.
    736	 */
    737	sctp_ulpevent_init(event, 0, skb->len + sizeof(struct sk_buff));
    738
    739	/* And hold the chunk as we need it for getting the IP headers
    740	 * later in recvmsg
    741	 */
    742	sctp_chunk_hold(chunk);
    743	event->chunk = chunk;
    744
    745	sctp_ulpevent_receive_data(event, asoc);
    746
    747	event->stream = ntohs(chunk->subh.data_hdr->stream);
    748	if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
    749		event->flags |= SCTP_UNORDERED;
    750		event->cumtsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
    751	}
    752	event->tsn = ntohl(chunk->subh.data_hdr->tsn);
    753	event->msg_flags |= chunk->chunk_hdr->flags;
    754
    755	return event;
    756
    757fail_mark:
    758	kfree_skb(skb);
    759fail:
    760	return NULL;
    761}
    762
    763/* Create a partial delivery related event.
    764 *
    765 * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT
    766 *
    767 *   When a receiver is engaged in a partial delivery of a
    768 *   message this notification will be used to indicate
    769 *   various events.
    770 */
    771struct sctp_ulpevent *sctp_ulpevent_make_pdapi(
    772					const struct sctp_association *asoc,
    773					__u32 indication, __u32 sid, __u32 seq,
    774					__u32 flags, gfp_t gfp)
    775{
    776	struct sctp_ulpevent *event;
    777	struct sctp_pdapi_event *pd;
    778	struct sk_buff *skb;
    779
    780	event = sctp_ulpevent_new(sizeof(struct sctp_pdapi_event),
    781				  MSG_NOTIFICATION, gfp);
    782	if (!event)
    783		goto fail;
    784
    785	skb = sctp_event2skb(event);
    786	pd = skb_put(skb, sizeof(struct sctp_pdapi_event));
    787
    788	/* pdapi_type
    789	 *   It should be SCTP_PARTIAL_DELIVERY_EVENT
    790	 *
    791	 * pdapi_flags: 16 bits (unsigned integer)
    792	 *   Currently unused.
    793	 */
    794	pd->pdapi_type = SCTP_PARTIAL_DELIVERY_EVENT;
    795	pd->pdapi_flags = flags;
    796	pd->pdapi_stream = sid;
    797	pd->pdapi_seq = seq;
    798
    799	/* pdapi_length: 32 bits (unsigned integer)
    800	 *
    801	 * This field is the total length of the notification data, including
    802	 * the notification header.  It will generally be sizeof (struct
    803	 * sctp_pdapi_event).
    804	 */
    805	pd->pdapi_length = sizeof(struct sctp_pdapi_event);
    806
    807	/*  pdapi_indication: 32 bits (unsigned integer)
    808	 *
    809	 * This field holds the indication being sent to the application.
    810	 */
    811	pd->pdapi_indication = indication;
    812
    813	/*  pdapi_assoc_id: sizeof (sctp_assoc_t)
    814	 *
    815	 * The association id field, holds the identifier for the association.
    816	 */
    817	sctp_ulpevent_set_owner(event, asoc);
    818	pd->pdapi_assoc_id = sctp_assoc2id(asoc);
    819
    820	return event;
    821fail:
    822	return NULL;
    823}
    824
    825struct sctp_ulpevent *sctp_ulpevent_make_authkey(
    826	const struct sctp_association *asoc, __u16 key_id,
    827	__u32 indication, gfp_t gfp)
    828{
    829	struct sctp_ulpevent *event;
    830	struct sctp_authkey_event *ak;
    831	struct sk_buff *skb;
    832
    833	event = sctp_ulpevent_new(sizeof(struct sctp_authkey_event),
    834				  MSG_NOTIFICATION, gfp);
    835	if (!event)
    836		goto fail;
    837
    838	skb = sctp_event2skb(event);
    839	ak = skb_put(skb, sizeof(struct sctp_authkey_event));
    840
    841	ak->auth_type = SCTP_AUTHENTICATION_EVENT;
    842	ak->auth_flags = 0;
    843	ak->auth_length = sizeof(struct sctp_authkey_event);
    844
    845	ak->auth_keynumber = key_id;
    846	ak->auth_altkeynumber = 0;
    847	ak->auth_indication = indication;
    848
    849	/*
    850	 * The association id field, holds the identifier for the association.
    851	 */
    852	sctp_ulpevent_set_owner(event, asoc);
    853	ak->auth_assoc_id = sctp_assoc2id(asoc);
    854
    855	return event;
    856fail:
    857	return NULL;
    858}
    859
    860/*
    861 * Socket Extensions for SCTP
    862 * 6.3.10. SCTP_SENDER_DRY_EVENT
    863 */
    864struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(
    865	const struct sctp_association *asoc, gfp_t gfp)
    866{
    867	struct sctp_ulpevent *event;
    868	struct sctp_sender_dry_event *sdry;
    869	struct sk_buff *skb;
    870
    871	event = sctp_ulpevent_new(sizeof(struct sctp_sender_dry_event),
    872				  MSG_NOTIFICATION, gfp);
    873	if (!event)
    874		return NULL;
    875
    876	skb = sctp_event2skb(event);
    877	sdry = skb_put(skb, sizeof(struct sctp_sender_dry_event));
    878
    879	sdry->sender_dry_type = SCTP_SENDER_DRY_EVENT;
    880	sdry->sender_dry_flags = 0;
    881	sdry->sender_dry_length = sizeof(struct sctp_sender_dry_event);
    882	sctp_ulpevent_set_owner(event, asoc);
    883	sdry->sender_dry_assoc_id = sctp_assoc2id(asoc);
    884
    885	return event;
    886}
    887
    888struct sctp_ulpevent *sctp_ulpevent_make_stream_reset_event(
    889	const struct sctp_association *asoc, __u16 flags, __u16 stream_num,
    890	__be16 *stream_list, gfp_t gfp)
    891{
    892	struct sctp_stream_reset_event *sreset;
    893	struct sctp_ulpevent *event;
    894	struct sk_buff *skb;
    895	int length, i;
    896
    897	length = sizeof(struct sctp_stream_reset_event) + 2 * stream_num;
    898	event = sctp_ulpevent_new(length, MSG_NOTIFICATION, gfp);
    899	if (!event)
    900		return NULL;
    901
    902	skb = sctp_event2skb(event);
    903	sreset = skb_put(skb, length);
    904
    905	sreset->strreset_type = SCTP_STREAM_RESET_EVENT;
    906	sreset->strreset_flags = flags;
    907	sreset->strreset_length = length;
    908	sctp_ulpevent_set_owner(event, asoc);
    909	sreset->strreset_assoc_id = sctp_assoc2id(asoc);
    910
    911	for (i = 0; i < stream_num; i++)
    912		sreset->strreset_stream_list[i] = ntohs(stream_list[i]);
    913
    914	return event;
    915}
    916
    917struct sctp_ulpevent *sctp_ulpevent_make_assoc_reset_event(
    918	const struct sctp_association *asoc, __u16 flags, __u32 local_tsn,
    919	__u32 remote_tsn, gfp_t gfp)
    920{
    921	struct sctp_assoc_reset_event *areset;
    922	struct sctp_ulpevent *event;
    923	struct sk_buff *skb;
    924
    925	event = sctp_ulpevent_new(sizeof(struct sctp_assoc_reset_event),
    926				  MSG_NOTIFICATION, gfp);
    927	if (!event)
    928		return NULL;
    929
    930	skb = sctp_event2skb(event);
    931	areset = skb_put(skb, sizeof(struct sctp_assoc_reset_event));
    932
    933	areset->assocreset_type = SCTP_ASSOC_RESET_EVENT;
    934	areset->assocreset_flags = flags;
    935	areset->assocreset_length = sizeof(struct sctp_assoc_reset_event);
    936	sctp_ulpevent_set_owner(event, asoc);
    937	areset->assocreset_assoc_id = sctp_assoc2id(asoc);
    938	areset->assocreset_local_tsn = local_tsn;
    939	areset->assocreset_remote_tsn = remote_tsn;
    940
    941	return event;
    942}
    943
    944struct sctp_ulpevent *sctp_ulpevent_make_stream_change_event(
    945	const struct sctp_association *asoc, __u16 flags,
    946	__u32 strchange_instrms, __u32 strchange_outstrms, gfp_t gfp)
    947{
    948	struct sctp_stream_change_event *schange;
    949	struct sctp_ulpevent *event;
    950	struct sk_buff *skb;
    951
    952	event = sctp_ulpevent_new(sizeof(struct sctp_stream_change_event),
    953				  MSG_NOTIFICATION, gfp);
    954	if (!event)
    955		return NULL;
    956
    957	skb = sctp_event2skb(event);
    958	schange = skb_put(skb, sizeof(struct sctp_stream_change_event));
    959
    960	schange->strchange_type = SCTP_STREAM_CHANGE_EVENT;
    961	schange->strchange_flags = flags;
    962	schange->strchange_length = sizeof(struct sctp_stream_change_event);
    963	sctp_ulpevent_set_owner(event, asoc);
    964	schange->strchange_assoc_id = sctp_assoc2id(asoc);
    965	schange->strchange_instrms = strchange_instrms;
    966	schange->strchange_outstrms = strchange_outstrms;
    967
    968	return event;
    969}
    970
    971/* Return the notification type, assuming this is a notification
    972 * event.
    973 */
    974__u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event)
    975{
    976	union sctp_notification *notification;
    977	struct sk_buff *skb;
    978
    979	skb = sctp_event2skb(event);
    980	notification = (union sctp_notification *) skb->data;
    981	return notification->sn_header.sn_type;
    982}
    983
    984/* RFC6458, Section 5.3.2. SCTP Header Information Structure
    985 * (SCTP_SNDRCV, DEPRECATED)
    986 */
    987void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
    988				   struct msghdr *msghdr)
    989{
    990	struct sctp_sndrcvinfo sinfo;
    991
    992	if (sctp_ulpevent_is_notification(event))
    993		return;
    994
    995	memset(&sinfo, 0, sizeof(sinfo));
    996	sinfo.sinfo_stream = event->stream;
    997	sinfo.sinfo_ssn = event->ssn;
    998	sinfo.sinfo_ppid = event->ppid;
    999	sinfo.sinfo_flags = event->flags;
   1000	sinfo.sinfo_tsn = event->tsn;
   1001	sinfo.sinfo_cumtsn = event->cumtsn;
   1002	sinfo.sinfo_assoc_id = sctp_assoc2id(event->asoc);
   1003	/* Context value that is set via SCTP_CONTEXT socket option. */
   1004	sinfo.sinfo_context = event->asoc->default_rcv_context;
   1005	/* These fields are not used while receiving. */
   1006	sinfo.sinfo_timetolive = 0;
   1007
   1008	put_cmsg(msghdr, IPPROTO_SCTP, SCTP_SNDRCV,
   1009		 sizeof(sinfo), &sinfo);
   1010}
   1011
   1012/* RFC6458, Section 5.3.5 SCTP Receive Information Structure
   1013 * (SCTP_SNDRCV)
   1014 */
   1015void sctp_ulpevent_read_rcvinfo(const struct sctp_ulpevent *event,
   1016				struct msghdr *msghdr)
   1017{
   1018	struct sctp_rcvinfo rinfo;
   1019
   1020	if (sctp_ulpevent_is_notification(event))
   1021		return;
   1022
   1023	memset(&rinfo, 0, sizeof(struct sctp_rcvinfo));
   1024	rinfo.rcv_sid = event->stream;
   1025	rinfo.rcv_ssn = event->ssn;
   1026	rinfo.rcv_ppid = event->ppid;
   1027	rinfo.rcv_flags = event->flags;
   1028	rinfo.rcv_tsn = event->tsn;
   1029	rinfo.rcv_cumtsn = event->cumtsn;
   1030	rinfo.rcv_assoc_id = sctp_assoc2id(event->asoc);
   1031	rinfo.rcv_context = event->asoc->default_rcv_context;
   1032
   1033	put_cmsg(msghdr, IPPROTO_SCTP, SCTP_RCVINFO,
   1034		 sizeof(rinfo), &rinfo);
   1035}
   1036
   1037/* RFC6458, Section 5.3.6. SCTP Next Receive Information Structure
   1038 * (SCTP_NXTINFO)
   1039 */
   1040static void __sctp_ulpevent_read_nxtinfo(const struct sctp_ulpevent *event,
   1041					 struct msghdr *msghdr,
   1042					 const struct sk_buff *skb)
   1043{
   1044	struct sctp_nxtinfo nxtinfo;
   1045
   1046	memset(&nxtinfo, 0, sizeof(nxtinfo));
   1047	nxtinfo.nxt_sid = event->stream;
   1048	nxtinfo.nxt_ppid = event->ppid;
   1049	nxtinfo.nxt_flags = event->flags;
   1050	if (sctp_ulpevent_is_notification(event))
   1051		nxtinfo.nxt_flags |= SCTP_NOTIFICATION;
   1052	nxtinfo.nxt_length = skb->len;
   1053	nxtinfo.nxt_assoc_id = sctp_assoc2id(event->asoc);
   1054
   1055	put_cmsg(msghdr, IPPROTO_SCTP, SCTP_NXTINFO,
   1056		 sizeof(nxtinfo), &nxtinfo);
   1057}
   1058
   1059void sctp_ulpevent_read_nxtinfo(const struct sctp_ulpevent *event,
   1060				struct msghdr *msghdr,
   1061				struct sock *sk)
   1062{
   1063	struct sk_buff *skb;
   1064	int err;
   1065
   1066	skb = sctp_skb_recv_datagram(sk, MSG_PEEK | MSG_DONTWAIT, &err);
   1067	if (skb != NULL) {
   1068		__sctp_ulpevent_read_nxtinfo(sctp_skb2event(skb),
   1069					     msghdr, skb);
   1070		/* Just release refcount here. */
   1071		kfree_skb(skb);
   1072	}
   1073}
   1074
   1075/* Do accounting for bytes received and hold a reference to the association
   1076 * for each skb.
   1077 */
   1078static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event,
   1079				       struct sctp_association *asoc)
   1080{
   1081	struct sk_buff *skb, *frag;
   1082
   1083	skb = sctp_event2skb(event);
   1084	/* Set the owner and charge rwnd for bytes received.  */
   1085	sctp_ulpevent_set_owner(event, asoc);
   1086	sctp_assoc_rwnd_decrease(asoc, skb_headlen(skb));
   1087
   1088	if (!skb->data_len)
   1089		return;
   1090
   1091	/* Note:  Not clearing the entire event struct as this is just a
   1092	 * fragment of the real event.  However, we still need to do rwnd
   1093	 * accounting.
   1094	 * In general, the skb passed from IP can have only 1 level of
   1095	 * fragments. But we allow multiple levels of fragments.
   1096	 */
   1097	skb_walk_frags(skb, frag)
   1098		sctp_ulpevent_receive_data(sctp_skb2event(frag), asoc);
   1099}
   1100
   1101/* Do accounting for bytes just read by user and release the references to
   1102 * the association.
   1103 */
   1104static void sctp_ulpevent_release_data(struct sctp_ulpevent *event)
   1105{
   1106	struct sk_buff *skb, *frag;
   1107	unsigned int	len;
   1108
   1109	/* Current stack structures assume that the rcv buffer is
   1110	 * per socket.   For UDP style sockets this is not true as
   1111	 * multiple associations may be on a single UDP-style socket.
   1112	 * Use the local private area of the skb to track the owning
   1113	 * association.
   1114	 */
   1115
   1116	skb = sctp_event2skb(event);
   1117	len = skb->len;
   1118
   1119	if (!skb->data_len)
   1120		goto done;
   1121
   1122	/* Don't forget the fragments. */
   1123	skb_walk_frags(skb, frag) {
   1124		/* NOTE:  skb_shinfos are recursive. Although IP returns
   1125		 * skb's with only 1 level of fragments, SCTP reassembly can
   1126		 * increase the levels.
   1127		 */
   1128		sctp_ulpevent_release_frag_data(sctp_skb2event(frag));
   1129	}
   1130
   1131done:
   1132	sctp_assoc_rwnd_increase(event->asoc, len);
   1133	sctp_chunk_put(event->chunk);
   1134	sctp_ulpevent_release_owner(event);
   1135}
   1136
   1137static void sctp_ulpevent_release_frag_data(struct sctp_ulpevent *event)
   1138{
   1139	struct sk_buff *skb, *frag;
   1140
   1141	skb = sctp_event2skb(event);
   1142
   1143	if (!skb->data_len)
   1144		goto done;
   1145
   1146	/* Don't forget the fragments. */
   1147	skb_walk_frags(skb, frag) {
   1148		/* NOTE:  skb_shinfos are recursive. Although IP returns
   1149		 * skb's with only 1 level of fragments, SCTP reassembly can
   1150		 * increase the levels.
   1151		 */
   1152		sctp_ulpevent_release_frag_data(sctp_skb2event(frag));
   1153	}
   1154
   1155done:
   1156	sctp_chunk_put(event->chunk);
   1157	sctp_ulpevent_release_owner(event);
   1158}
   1159
   1160/* Free a ulpevent that has an owner.  It includes releasing the reference
   1161 * to the owner, updating the rwnd in case of a DATA event and freeing the
   1162 * skb.
   1163 */
   1164void sctp_ulpevent_free(struct sctp_ulpevent *event)
   1165{
   1166	if (sctp_ulpevent_is_notification(event))
   1167		sctp_ulpevent_release_owner(event);
   1168	else
   1169		sctp_ulpevent_release_data(event);
   1170
   1171	kfree_skb(sctp_event2skb(event));
   1172}
   1173
   1174/* Purge the skb lists holding ulpevents. */
   1175unsigned int sctp_queue_purge_ulpevents(struct sk_buff_head *list)
   1176{
   1177	struct sk_buff *skb;
   1178	unsigned int data_unread = 0;
   1179
   1180	while ((skb = skb_dequeue(list)) != NULL) {
   1181		struct sctp_ulpevent *event = sctp_skb2event(skb);
   1182
   1183		if (!sctp_ulpevent_is_notification(event))
   1184			data_unread += skb->len;
   1185
   1186		sctp_ulpevent_free(event);
   1187	}
   1188
   1189	return data_unread;
   1190}