xref: /openbmc/linux/net/sctp/ulpevent.c (revision 87c2ce3b)
1 /* SCTP kernel reference Implementation
2  * (C) Copyright IBM Corp. 2001, 2004
3  * Copyright (c) 1999-2000 Cisco, Inc.
4  * Copyright (c) 1999-2001 Motorola, Inc.
5  * Copyright (c) 2001 Intel Corp.
6  * Copyright (c) 2001 Nokia, Inc.
7  * Copyright (c) 2001 La Monte H.P. Yarroll
8  *
9  * These functions manipulate an sctp event.   The struct ulpevent is used
10  * to carry notifications and data to the ULP (sockets).
11  * The SCTP reference implementation is free software;
12  * you can redistribute it and/or modify it under the terms of
13  * the GNU General Public License as published by
14  * the Free Software Foundation; either version 2, or (at your option)
15  * any later version.
16  *
17  * The SCTP reference implementation is distributed in the hope that it
18  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
19  *                 ************************
20  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21  * See the GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with GNU CC; see the file COPYING.  If not, write to
25  * the Free Software Foundation, 59 Temple Place - Suite 330,
26  * Boston, MA 02111-1307, USA.
27  *
28  * Please send any bug reports or fixes you make to the
29  * email address(es):
30  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
31  *
32  * Or submit a bug report through the following website:
33  *    http://www.sf.net/projects/lksctp
34  *
35  * Written or modified by:
36  *    Jon Grimm             <jgrimm@us.ibm.com>
37  *    La Monte H.P. Yarroll <piggy@acm.org>
38  *    Ardelle Fan	    <ardelle.fan@intel.com>
39  *    Sridhar Samudrala     <sri@us.ibm.com>
40  *
41  * Any bugs reported given to us we will try to fix... any fixes shared will
42  * be incorporated into the next SCTP release.
43  */
44 
45 #include <linux/types.h>
46 #include <linux/skbuff.h>
47 #include <net/sctp/structs.h>
48 #include <net/sctp/sctp.h>
49 #include <net/sctp/sm.h>
50 
51 static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event,
52 				       struct sctp_association *asoc);
53 static void sctp_ulpevent_release_data(struct sctp_ulpevent *event);
54 
55 /* Initialize an ULP event from an given skb.  */
56 SCTP_STATIC void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags)
57 {
58 	memset(event, 0, sizeof(struct sctp_ulpevent));
59 	event->msg_flags = msg_flags;
60 }
61 
62 /* Create a new sctp_ulpevent.  */
63 SCTP_STATIC struct sctp_ulpevent *sctp_ulpevent_new(int size, int msg_flags,
64 						    gfp_t gfp)
65 {
66 	struct sctp_ulpevent *event;
67 	struct sk_buff *skb;
68 
69 	skb = alloc_skb(size, gfp);
70 	if (!skb)
71 		goto fail;
72 
73 	event = sctp_skb2event(skb);
74 	sctp_ulpevent_init(event, msg_flags);
75 
76 	return event;
77 
78 fail:
79 	return NULL;
80 }
81 
82 /* Is this a MSG_NOTIFICATION?  */
83 int sctp_ulpevent_is_notification(const struct sctp_ulpevent *event)
84 {
85 	return MSG_NOTIFICATION == (event->msg_flags & MSG_NOTIFICATION);
86 }
87 
88 /* Hold the association in case the msg_name needs read out of
89  * the association.
90  */
91 static inline void sctp_ulpevent_set_owner(struct sctp_ulpevent *event,
92 					   const struct sctp_association *asoc)
93 {
94 	struct sk_buff *skb;
95 
96 	/* Cast away the const, as we are just wanting to
97 	 * bump the reference count.
98 	 */
99 	sctp_association_hold((struct sctp_association *)asoc);
100 	skb = sctp_event2skb(event);
101 	event->asoc = (struct sctp_association *)asoc;
102 	atomic_add(skb->truesize, &event->asoc->rmem_alloc);
103 	skb_set_owner_r(skb, asoc->base.sk);
104 }
105 
106 /* A simple destructor to give up the reference to the association. */
107 static inline void sctp_ulpevent_release_owner(struct sctp_ulpevent *event)
108 {
109 	struct sctp_association *asoc = event->asoc;
110 	struct sk_buff *skb = sctp_event2skb(event);
111 
112 	atomic_sub(skb->truesize, &asoc->rmem_alloc);
113 	sctp_association_put(asoc);
114 }
115 
116 /* Create and initialize an SCTP_ASSOC_CHANGE event.
117  *
118  * 5.3.1.1 SCTP_ASSOC_CHANGE
119  *
120  * Communication notifications inform the ULP that an SCTP association
121  * has either begun or ended. The identifier for a new association is
122  * provided by this notification.
123  *
124  * Note: There is no field checking here.  If a field is unused it will be
125  * zero'd out.
126  */
127 struct sctp_ulpevent  *sctp_ulpevent_make_assoc_change(
128 	const struct sctp_association *asoc,
129 	__u16 flags, __u16 state, __u16 error, __u16 outbound,
130 	__u16 inbound, gfp_t gfp)
131 {
132 	struct sctp_ulpevent *event;
133 	struct sctp_assoc_change *sac;
134 	struct sk_buff *skb;
135 
136 	event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change),
137 				  MSG_NOTIFICATION, gfp);
138 	if (!event)
139 		goto fail;
140 	skb = sctp_event2skb(event);
141 	sac = (struct sctp_assoc_change *)
142 		skb_put(skb, sizeof(struct sctp_assoc_change));
143 
144 	/* Socket Extensions for SCTP
145 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
146 	 *
147 	 * sac_type:
148 	 * It should be SCTP_ASSOC_CHANGE.
149 	 */
150 	sac->sac_type = SCTP_ASSOC_CHANGE;
151 
152 	/* Socket Extensions for SCTP
153 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
154 	 *
155 	 * sac_state: 32 bits (signed integer)
156 	 * This field holds one of a number of values that communicate the
157 	 * event that happened to the association.
158 	 */
159 	sac->sac_state = state;
160 
161 	/* Socket Extensions for SCTP
162 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
163 	 *
164 	 * sac_flags: 16 bits (unsigned integer)
165 	 * Currently unused.
166 	 */
167 	sac->sac_flags = 0;
168 
169 	/* Socket Extensions for SCTP
170 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
171 	 *
172 	 * sac_length: sizeof (__u32)
173 	 * This field is the total length of the notification data, including
174 	 * the notification header.
175 	 */
176 	sac->sac_length = sizeof(struct sctp_assoc_change);
177 
178 	/* Socket Extensions for SCTP
179 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
180 	 *
181 	 * sac_error:  32 bits (signed integer)
182 	 *
183 	 * If the state was reached due to a error condition (e.g.
184 	 * COMMUNICATION_LOST) any relevant error information is available in
185 	 * this field. This corresponds to the protocol error codes defined in
186 	 * [SCTP].
187 	 */
188 	sac->sac_error = error;
189 
190 	/* Socket Extensions for SCTP
191 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
192 	 *
193 	 * sac_outbound_streams:  16 bits (unsigned integer)
194 	 * sac_inbound_streams:  16 bits (unsigned integer)
195 	 *
196 	 * The maximum number of streams allowed in each direction are
197 	 * available in sac_outbound_streams and sac_inbound streams.
198 	 */
199 	sac->sac_outbound_streams = outbound;
200 	sac->sac_inbound_streams = inbound;
201 
202 	/* Socket Extensions for SCTP
203 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
204 	 *
205 	 * sac_assoc_id: sizeof (sctp_assoc_t)
206 	 *
207 	 * The association id field, holds the identifier for the association.
208 	 * All notifications for a given association have the same association
209 	 * identifier.  For TCP style socket, this field is ignored.
210 	 */
211 	sctp_ulpevent_set_owner(event, asoc);
212 	sac->sac_assoc_id = sctp_assoc2id(asoc);
213 
214 	return event;
215 
216 fail:
217 	return NULL;
218 }
219 
220 /* Create and initialize an SCTP_PEER_ADDR_CHANGE event.
221  *
222  * Socket Extensions for SCTP - draft-01
223  * 5.3.1.2 SCTP_PEER_ADDR_CHANGE
224  *
225  * When a destination address on a multi-homed peer encounters a change
226  * an interface details event is sent.
227  */
228 struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change(
229 	const struct sctp_association *asoc,
230 	const struct sockaddr_storage *aaddr,
231 	int flags, int state, int error, gfp_t gfp)
232 {
233 	struct sctp_ulpevent *event;
234 	struct sctp_paddr_change  *spc;
235 	struct sk_buff *skb;
236 
237 	event = sctp_ulpevent_new(sizeof(struct sctp_paddr_change),
238 				  MSG_NOTIFICATION, gfp);
239 	if (!event)
240 		goto fail;
241 
242 	skb = sctp_event2skb(event);
243 	spc = (struct sctp_paddr_change *)
244 		skb_put(skb, sizeof(struct sctp_paddr_change));
245 
246 	/* Sockets API Extensions for SCTP
247 	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
248 	 *
249 	 * spc_type:
250 	 *
251 	 *    It should be SCTP_PEER_ADDR_CHANGE.
252 	 */
253 	spc->spc_type = SCTP_PEER_ADDR_CHANGE;
254 
255 	/* Sockets API Extensions for SCTP
256 	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
257 	 *
258 	 * spc_length: sizeof (__u32)
259 	 *
260 	 * This field is the total length of the notification data, including
261 	 * the notification header.
262 	 */
263 	spc->spc_length = sizeof(struct sctp_paddr_change);
264 
265 	/* Sockets API Extensions for SCTP
266 	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
267 	 *
268 	 * spc_flags: 16 bits (unsigned integer)
269 	 * Currently unused.
270 	 */
271 	spc->spc_flags = 0;
272 
273 	/* Sockets API Extensions for SCTP
274 	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
275 	 *
276 	 * spc_state:  32 bits (signed integer)
277 	 *
278 	 * This field holds one of a number of values that communicate the
279 	 * event that happened to the address.
280 	 */
281 	spc->spc_state = state;
282 
283 	/* Sockets API Extensions for SCTP
284 	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
285 	 *
286 	 * spc_error:  32 bits (signed integer)
287 	 *
288 	 * If the state was reached due to any error condition (e.g.
289 	 * ADDRESS_UNREACHABLE) any relevant error information is available in
290 	 * this field.
291 	 */
292 	spc->spc_error = error;
293 
294 	/* Socket Extensions for SCTP
295 	 * 5.3.1.1 SCTP_ASSOC_CHANGE
296 	 *
297 	 * spc_assoc_id: sizeof (sctp_assoc_t)
298 	 *
299 	 * The association id field, holds the identifier for the association.
300 	 * All notifications for a given association have the same association
301 	 * identifier.  For TCP style socket, this field is ignored.
302 	 */
303 	sctp_ulpevent_set_owner(event, asoc);
304 	spc->spc_assoc_id = sctp_assoc2id(asoc);
305 
306 	/* Sockets API Extensions for SCTP
307 	 * Section 5.3.1.2 SCTP_PEER_ADDR_CHANGE
308 	 *
309 	 * spc_aaddr: sizeof (struct sockaddr_storage)
310 	 *
311 	 * The affected address field, holds the remote peer's address that is
312 	 * encountering the change of state.
313 	 */
314 	memcpy(&spc->spc_aaddr, aaddr, sizeof(struct sockaddr_storage));
315 
316 	/* Map ipv4 address into v4-mapped-on-v6 address.  */
317 	sctp_get_pf_specific(asoc->base.sk->sk_family)->addr_v4map(
318 					sctp_sk(asoc->base.sk),
319 					(union sctp_addr *)&spc->spc_aaddr);
320 
321 	return event;
322 
323 fail:
324 	return NULL;
325 }
326 
327 /* Create and initialize an SCTP_REMOTE_ERROR notification.
328  *
329  * Note: This assumes that the chunk->skb->data already points to the
330  * operation error payload.
331  *
332  * Socket Extensions for SCTP - draft-01
333  * 5.3.1.3 SCTP_REMOTE_ERROR
334  *
335  * A remote peer may send an Operational Error message to its peer.
336  * This message indicates a variety of error conditions on an
337  * association. The entire error TLV as it appears on the wire is
338  * included in a SCTP_REMOTE_ERROR event.  Please refer to the SCTP
339  * specification [SCTP] and any extensions for a list of possible
340  * error formats.
341  */
342 struct sctp_ulpevent *sctp_ulpevent_make_remote_error(
343 	const struct sctp_association *asoc, struct sctp_chunk *chunk,
344 	__u16 flags, gfp_t gfp)
345 {
346 	struct sctp_ulpevent *event;
347 	struct sctp_remote_error *sre;
348 	struct sk_buff *skb;
349 	sctp_errhdr_t *ch;
350 	__u16 cause;
351 	int elen;
352 
353 	ch = (sctp_errhdr_t *)(chunk->skb->data);
354 	cause = ch->cause;
355 	elen = WORD_ROUND(ntohs(ch->length)) - sizeof(sctp_errhdr_t);
356 
357 	/* Pull off the ERROR header.  */
358 	skb_pull(chunk->skb, sizeof(sctp_errhdr_t));
359 
360 	/* Copy the skb to a new skb with room for us to prepend
361 	 * notification with.
362 	 */
363 	skb = skb_copy_expand(chunk->skb, sizeof(struct sctp_remote_error),
364 			      0, gfp);
365 
366 	/* Pull off the rest of the cause TLV from the chunk.  */
367 	skb_pull(chunk->skb, elen);
368 	if (!skb)
369 		goto fail;
370 
371 	/* Embed the event fields inside the cloned skb.  */
372 	event = sctp_skb2event(skb);
373 	sctp_ulpevent_init(event, MSG_NOTIFICATION);
374 
375 	sre = (struct sctp_remote_error *)
376 		skb_push(skb, sizeof(struct sctp_remote_error));
377 
378 	/* Trim the buffer to the right length.  */
379 	skb_trim(skb, sizeof(struct sctp_remote_error) + elen);
380 
381 	/* Socket Extensions for SCTP
382 	 * 5.3.1.3 SCTP_REMOTE_ERROR
383 	 *
384 	 * sre_type:
385 	 *   It should be SCTP_REMOTE_ERROR.
386 	 */
387 	sre->sre_type = SCTP_REMOTE_ERROR;
388 
389 	/*
390 	 * Socket Extensions for SCTP
391 	 * 5.3.1.3 SCTP_REMOTE_ERROR
392 	 *
393 	 * sre_flags: 16 bits (unsigned integer)
394 	 *   Currently unused.
395 	 */
396 	sre->sre_flags = 0;
397 
398 	/* Socket Extensions for SCTP
399 	 * 5.3.1.3 SCTP_REMOTE_ERROR
400 	 *
401 	 * sre_length: sizeof (__u32)
402 	 *
403 	 * This field is the total length of the notification data,
404 	 * including the notification header.
405 	 */
406 	sre->sre_length = skb->len;
407 
408 	/* Socket Extensions for SCTP
409 	 * 5.3.1.3 SCTP_REMOTE_ERROR
410 	 *
411 	 * sre_error: 16 bits (unsigned integer)
412 	 * This value represents one of the Operational Error causes defined in
413 	 * the SCTP specification, in network byte order.
414 	 */
415 	sre->sre_error = cause;
416 
417 	/* Socket Extensions for SCTP
418 	 * 5.3.1.3 SCTP_REMOTE_ERROR
419 	 *
420 	 * sre_assoc_id: sizeof (sctp_assoc_t)
421 	 *
422 	 * The association id field, holds the identifier for the association.
423 	 * All notifications for a given association have the same association
424 	 * identifier.  For TCP style socket, this field is ignored.
425 	 */
426 	sctp_ulpevent_set_owner(event, asoc);
427 	sre->sre_assoc_id = sctp_assoc2id(asoc);
428 
429 	return event;
430 
431 fail:
432 	return NULL;
433 }
434 
435 /* Create and initialize a SCTP_SEND_FAILED notification.
436  *
437  * Socket Extensions for SCTP - draft-01
438  * 5.3.1.4 SCTP_SEND_FAILED
439  */
440 struct sctp_ulpevent *sctp_ulpevent_make_send_failed(
441 	const struct sctp_association *asoc, struct sctp_chunk *chunk,
442 	__u16 flags, __u32 error, gfp_t gfp)
443 {
444 	struct sctp_ulpevent *event;
445 	struct sctp_send_failed *ssf;
446 	struct sk_buff *skb;
447 
448 	/* Pull off any padding. */
449 	int len = ntohs(chunk->chunk_hdr->length);
450 
451 	/* Make skb with more room so we can prepend notification.  */
452 	skb = skb_copy_expand(chunk->skb,
453 			      sizeof(struct sctp_send_failed), /* headroom */
454 			      0,                               /* tailroom */
455 			      gfp);
456 	if (!skb)
457 		goto fail;
458 
459 	/* Pull off the common chunk header and DATA header.  */
460 	skb_pull(skb, sizeof(struct sctp_data_chunk));
461 	len -= sizeof(struct sctp_data_chunk);
462 
463 	/* Embed the event fields inside the cloned skb.  */
464 	event = sctp_skb2event(skb);
465 	sctp_ulpevent_init(event, MSG_NOTIFICATION);
466 
467 	ssf = (struct sctp_send_failed *)
468 		skb_push(skb, sizeof(struct sctp_send_failed));
469 
470 	/* Socket Extensions for SCTP
471 	 * 5.3.1.4 SCTP_SEND_FAILED
472 	 *
473 	 * ssf_type:
474 	 * It should be SCTP_SEND_FAILED.
475 	 */
476 	ssf->ssf_type = SCTP_SEND_FAILED;
477 
478 	/* Socket Extensions for SCTP
479 	 * 5.3.1.4 SCTP_SEND_FAILED
480 	 *
481 	 * ssf_flags: 16 bits (unsigned integer)
482 	 * The flag value will take one of the following values
483 	 *
484 	 * SCTP_DATA_UNSENT - Indicates that the data was never put on
485 	 *                    the wire.
486 	 *
487 	 * SCTP_DATA_SENT   - Indicates that the data was put on the wire.
488 	 *                    Note that this does not necessarily mean that the
489 	 *                    data was (or was not) successfully delivered.
490 	 */
491 	ssf->ssf_flags = flags;
492 
493 	/* Socket Extensions for SCTP
494 	 * 5.3.1.4 SCTP_SEND_FAILED
495 	 *
496 	 * ssf_length: sizeof (__u32)
497 	 * This field is the total length of the notification data, including
498 	 * the notification header.
499 	 */
500 	ssf->ssf_length = sizeof(struct sctp_send_failed) + len;
501 	skb_trim(skb, ssf->ssf_length);
502 
503 	/* Socket Extensions for SCTP
504 	 * 5.3.1.4 SCTP_SEND_FAILED
505 	 *
506 	 * ssf_error: 16 bits (unsigned integer)
507 	 * This value represents the reason why the send failed, and if set,
508 	 * will be a SCTP protocol error code as defined in [SCTP] section
509 	 * 3.3.10.
510 	 */
511 	ssf->ssf_error = error;
512 
513 	/* Socket Extensions for SCTP
514 	 * 5.3.1.4 SCTP_SEND_FAILED
515 	 *
516 	 * ssf_info: sizeof (struct sctp_sndrcvinfo)
517 	 * The original send information associated with the undelivered
518 	 * message.
519 	 */
520 	memcpy(&ssf->ssf_info, &chunk->sinfo, sizeof(struct sctp_sndrcvinfo));
521 
522 	/* Per TSVWG discussion with Randy. Allow the application to
523 	 * ressemble a fragmented message.
524 	 */
525 	ssf->ssf_info.sinfo_flags = chunk->chunk_hdr->flags;
526 
527 	/* Socket Extensions for SCTP
528 	 * 5.3.1.4 SCTP_SEND_FAILED
529 	 *
530 	 * ssf_assoc_id: sizeof (sctp_assoc_t)
531 	 * The association id field, sf_assoc_id, holds the identifier for the
532 	 * association.  All notifications for a given association have the
533 	 * same association identifier.  For TCP style socket, this field is
534 	 * ignored.
535 	 */
536 	sctp_ulpevent_set_owner(event, asoc);
537 	ssf->ssf_assoc_id = sctp_assoc2id(asoc);
538 	return event;
539 
540 fail:
541 	return NULL;
542 }
543 
544 /* Create and initialize a SCTP_SHUTDOWN_EVENT notification.
545  *
546  * Socket Extensions for SCTP - draft-01
547  * 5.3.1.5 SCTP_SHUTDOWN_EVENT
548  */
549 struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event(
550 	const struct sctp_association *asoc,
551 	__u16 flags, gfp_t gfp)
552 {
553 	struct sctp_ulpevent *event;
554 	struct sctp_shutdown_event *sse;
555 	struct sk_buff *skb;
556 
557 	event = sctp_ulpevent_new(sizeof(struct sctp_shutdown_event),
558 				  MSG_NOTIFICATION, gfp);
559 	if (!event)
560 		goto fail;
561 
562 	skb = sctp_event2skb(event);
563 	sse = (struct sctp_shutdown_event *)
564 		skb_put(skb, sizeof(struct sctp_shutdown_event));
565 
566 	/* Socket Extensions for SCTP
567 	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
568 	 *
569 	 * sse_type
570 	 * It should be SCTP_SHUTDOWN_EVENT
571 	 */
572 	sse->sse_type = SCTP_SHUTDOWN_EVENT;
573 
574 	/* Socket Extensions for SCTP
575 	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
576 	 *
577 	 * sse_flags: 16 bits (unsigned integer)
578 	 * Currently unused.
579 	 */
580 	sse->sse_flags = 0;
581 
582 	/* Socket Extensions for SCTP
583 	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
584 	 *
585 	 * sse_length: sizeof (__u32)
586 	 * This field is the total length of the notification data, including
587 	 * the notification header.
588 	 */
589 	sse->sse_length = sizeof(struct sctp_shutdown_event);
590 
591 	/* Socket Extensions for SCTP
592 	 * 5.3.1.5 SCTP_SHUTDOWN_EVENT
593 	 *
594 	 * sse_assoc_id: sizeof (sctp_assoc_t)
595 	 * The association id field, holds the identifier for the association.
596 	 * All notifications for a given association have the same association
597 	 * identifier.  For TCP style socket, this field is ignored.
598 	 */
599 	sctp_ulpevent_set_owner(event, asoc);
600 	sse->sse_assoc_id = sctp_assoc2id(asoc);
601 
602 	return event;
603 
604 fail:
605 	return NULL;
606 }
607 
608 /* Create and initialize a SCTP_ADAPTION_INDICATION notification.
609  *
610  * Socket Extensions for SCTP
611  * 5.3.1.6 SCTP_ADAPTION_INDICATION
612  */
613 struct sctp_ulpevent *sctp_ulpevent_make_adaption_indication(
614 	const struct sctp_association *asoc, gfp_t gfp)
615 {
616 	struct sctp_ulpevent *event;
617 	struct sctp_adaption_event *sai;
618 	struct sk_buff *skb;
619 
620 	event = sctp_ulpevent_new(sizeof(struct sctp_adaption_event),
621 				  MSG_NOTIFICATION, gfp);
622 	if (!event)
623 		goto fail;
624 
625 	skb = sctp_event2skb(event);
626 	sai = (struct sctp_adaption_event *)
627 		skb_put(skb, sizeof(struct sctp_adaption_event));
628 
629 	sai->sai_type = SCTP_ADAPTION_INDICATION;
630 	sai->sai_flags = 0;
631 	sai->sai_length = sizeof(struct sctp_adaption_event);
632 	sai->sai_adaption_ind = asoc->peer.adaption_ind;
633 	sctp_ulpevent_set_owner(event, asoc);
634 	sai->sai_assoc_id = sctp_assoc2id(asoc);
635 
636 	return event;
637 
638 fail:
639 	return NULL;
640 }
641 
642 /* A message has been received.  Package this message as a notification
643  * to pass it to the upper layers.  Go ahead and calculate the sndrcvinfo
644  * even if filtered out later.
645  *
646  * Socket Extensions for SCTP
647  * 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
648  */
649 struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
650 						struct sctp_chunk *chunk,
651 						gfp_t gfp)
652 {
653 	struct sctp_ulpevent *event = NULL;
654 	struct sk_buff *skb;
655 	size_t padding, len;
656 
657 	/* Clone the original skb, sharing the data.  */
658 	skb = skb_clone(chunk->skb, gfp);
659 	if (!skb)
660 		goto fail;
661 
662 	/* First calculate the padding, so we don't inadvertently
663 	 * pass up the wrong length to the user.
664 	 *
665 	 * RFC 2960 - Section 3.2  Chunk Field Descriptions
666 	 *
667 	 * The total length of a chunk(including Type, Length and Value fields)
668 	 * MUST be a multiple of 4 bytes.  If the length of the chunk is not a
669 	 * multiple of 4 bytes, the sender MUST pad the chunk with all zero
670 	 * bytes and this padding is not included in the chunk length field.
671 	 * The sender should never pad with more than 3 bytes.  The receiver
672 	 * MUST ignore the padding bytes.
673 	 */
674 	len = ntohs(chunk->chunk_hdr->length);
675 	padding = WORD_ROUND(len) - len;
676 
677 	/* Fixup cloned skb with just this chunks data.  */
678 	skb_trim(skb, chunk->chunk_end - padding - skb->data);
679 
680 	/* Embed the event fields inside the cloned skb.  */
681 	event = sctp_skb2event(skb);
682 
683 	/* Initialize event with flags 0.  */
684 	sctp_ulpevent_init(event, 0);
685 
686 	sctp_ulpevent_receive_data(event, asoc);
687 
688 	event->stream = ntohs(chunk->subh.data_hdr->stream);
689 	event->ssn = ntohs(chunk->subh.data_hdr->ssn);
690 	event->ppid = chunk->subh.data_hdr->ppid;
691 	if (chunk->chunk_hdr->flags & SCTP_DATA_UNORDERED) {
692 		event->flags |= SCTP_UNORDERED;
693 		event->cumtsn = sctp_tsnmap_get_ctsn(&asoc->peer.tsn_map);
694 	}
695 	event->tsn = ntohl(chunk->subh.data_hdr->tsn);
696 	event->msg_flags |= chunk->chunk_hdr->flags;
697 	event->iif = sctp_chunk_iif(chunk);
698 
699 fail:
700 	return event;
701 }
702 
703 /* Create a partial delivery related event.
704  *
705  * 5.3.1.7 SCTP_PARTIAL_DELIVERY_EVENT
706  *
707  *   When a receiver is engaged in a partial delivery of a
708  *   message this notification will be used to indicate
709  *   various events.
710  */
711 struct sctp_ulpevent *sctp_ulpevent_make_pdapi(
712 	const struct sctp_association *asoc, __u32 indication,
713 	gfp_t gfp)
714 {
715 	struct sctp_ulpevent *event;
716 	struct sctp_pdapi_event *pd;
717 	struct sk_buff *skb;
718 
719 	event = sctp_ulpevent_new(sizeof(struct sctp_pdapi_event),
720 				  MSG_NOTIFICATION, gfp);
721 	if (!event)
722 		goto fail;
723 
724 	skb = sctp_event2skb(event);
725 	pd = (struct sctp_pdapi_event *)
726 		skb_put(skb, sizeof(struct sctp_pdapi_event));
727 
728 	/* pdapi_type
729 	 *   It should be SCTP_PARTIAL_DELIVERY_EVENT
730 	 *
731 	 * pdapi_flags: 16 bits (unsigned integer)
732 	 *   Currently unused.
733 	 */
734 	pd->pdapi_type = SCTP_PARTIAL_DELIVERY_EVENT;
735 	pd->pdapi_flags = 0;
736 
737 	/* pdapi_length: 32 bits (unsigned integer)
738 	 *
739 	 * This field is the total length of the notification data, including
740 	 * the notification header.  It will generally be sizeof (struct
741 	 * sctp_pdapi_event).
742 	 */
743 	pd->pdapi_length = sizeof(struct sctp_pdapi_event);
744 
745         /*  pdapi_indication: 32 bits (unsigned integer)
746 	 *
747 	 * This field holds the indication being sent to the application.
748 	 */
749 	pd->pdapi_indication = indication;
750 
751 	/*  pdapi_assoc_id: sizeof (sctp_assoc_t)
752 	 *
753 	 * The association id field, holds the identifier for the association.
754 	 */
755 	sctp_ulpevent_set_owner(event, asoc);
756 	pd->pdapi_assoc_id = sctp_assoc2id(asoc);
757 
758 	return event;
759 fail:
760 	return NULL;
761 }
762 
763 /* Return the notification type, assuming this is a notification
764  * event.
765  */
766 __u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event)
767 {
768 	union sctp_notification *notification;
769 	struct sk_buff *skb;
770 
771 	skb = sctp_event2skb((struct sctp_ulpevent *)event);
772 	notification = (union sctp_notification *) skb->data;
773 	return notification->sn_header.sn_type;
774 }
775 
776 /* Copy out the sndrcvinfo into a msghdr.  */
777 void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
778 				   struct msghdr *msghdr)
779 {
780 	struct sctp_sndrcvinfo sinfo;
781 
782 	if (sctp_ulpevent_is_notification(event))
783 		return;
784 
785 	/* Sockets API Extensions for SCTP
786  	 * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
787  	 *
788  	 * sinfo_stream: 16 bits (unsigned integer)
789  	 *
790  	 * For recvmsg() the SCTP stack places the message's stream number in
791  	 * this value.
792  	*/
793 	sinfo.sinfo_stream = event->stream;
794 	/* sinfo_ssn: 16 bits (unsigned integer)
795 	 *
796 	 * For recvmsg() this value contains the stream sequence number that
797 	 * the remote endpoint placed in the DATA chunk.  For fragmented
798 	 * messages this is the same number for all deliveries of the message
799 	 * (if more than one recvmsg() is needed to read the message).
800 	 */
801 	sinfo.sinfo_ssn = event->ssn;
802 	/* sinfo_ppid: 32 bits (unsigned integer)
803 	 *
804 	 * In recvmsg() this value is
805 	 * the same information that was passed by the upper layer in the peer
806 	 * application.  Please note that byte order issues are NOT accounted
807 	 * for and this information is passed opaquely by the SCTP stack from
808 	 * one end to the other.
809 	 */
810 	sinfo.sinfo_ppid = event->ppid;
811 	/* sinfo_flags: 16 bits (unsigned integer)
812 	 *
813 	 * This field may contain any of the following flags and is composed of
814 	 * a bitwise OR of these values.
815 	 *
816 	 * recvmsg() flags:
817 	 *
818 	 * SCTP_UNORDERED - This flag is present when the message was sent
819 	 *                 non-ordered.
820 	 */
821 	sinfo.sinfo_flags = event->flags;
822 	/* sinfo_tsn: 32 bit (unsigned integer)
823 	 *
824 	 * For the receiving side, this field holds a TSN that was
825 	 * assigned to one of the SCTP Data Chunks.
826 	 */
827 	sinfo.sinfo_tsn = event->tsn;
828 	/* sinfo_cumtsn: 32 bit (unsigned integer)
829 	 *
830 	 * This field will hold the current cumulative TSN as
831 	 * known by the underlying SCTP layer.  Note this field is
832 	 * ignored when sending and only valid for a receive
833 	 * operation when sinfo_flags are set to SCTP_UNORDERED.
834 	 */
835 	sinfo.sinfo_cumtsn = event->cumtsn;
836 	/* sinfo_assoc_id: sizeof (sctp_assoc_t)
837 	 *
838 	 * The association handle field, sinfo_assoc_id, holds the identifier
839 	 * for the association announced in the COMMUNICATION_UP notification.
840 	 * All notifications for a given association have the same identifier.
841 	 * Ignored for one-to-one style sockets.
842 	 */
843 	sinfo.sinfo_assoc_id = sctp_assoc2id(event->asoc);
844 
845 	/* These fields are not used while receiving. */
846 	sinfo.sinfo_context = 0;
847 	sinfo.sinfo_timetolive = 0;
848 
849 	put_cmsg(msghdr, IPPROTO_SCTP, SCTP_SNDRCV,
850 		 sizeof(struct sctp_sndrcvinfo), (void *)&sinfo);
851 }
852 
853 /* Do accounting for bytes received and hold a reference to the association
854  * for each skb.
855  */
856 static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event,
857 				       struct sctp_association *asoc)
858 {
859 	struct sk_buff *skb, *frag;
860 
861 	skb = sctp_event2skb(event);
862 	/* Set the owner and charge rwnd for bytes received.  */
863 	sctp_ulpevent_set_owner(event, asoc);
864 	sctp_assoc_rwnd_decrease(asoc, skb_headlen(skb));
865 
866 	if (!skb->data_len)
867 		return;
868 
869 	/* Note:  Not clearing the entire event struct as this is just a
870 	 * fragment of the real event.  However, we still need to do rwnd
871 	 * accounting.
872 	 * In general, the skb passed from IP can have only 1 level of
873 	 * fragments. But we allow multiple levels of fragments.
874 	 */
875 	for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) {
876 		sctp_ulpevent_receive_data(sctp_skb2event(frag), asoc);
877 	}
878 }
879 
880 /* Do accounting for bytes just read by user and release the references to
881  * the association.
882  */
883 static void sctp_ulpevent_release_data(struct sctp_ulpevent *event)
884 {
885 	struct sk_buff *skb, *frag;
886 
887 	/* Current stack structures assume that the rcv buffer is
888 	 * per socket.   For UDP style sockets this is not true as
889 	 * multiple associations may be on a single UDP-style socket.
890 	 * Use the local private area of the skb to track the owning
891 	 * association.
892 	 */
893 
894 	skb = sctp_event2skb(event);
895 	sctp_assoc_rwnd_increase(event->asoc, skb_headlen(skb));
896 
897 	if (!skb->data_len)
898 		goto done;
899 
900 	/* Don't forget the fragments. */
901 	for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) {
902 		/* NOTE:  skb_shinfos are recursive. Although IP returns
903 		 * skb's with only 1 level of fragments, SCTP reassembly can
904 		 * increase the levels.
905 		 */
906 		sctp_ulpevent_release_data(sctp_skb2event(frag));
907 	}
908 
909 done:
910 	sctp_ulpevent_release_owner(event);
911 }
912 
913 /* Free a ulpevent that has an owner.  It includes releasing the reference
914  * to the owner, updating the rwnd in case of a DATA event and freeing the
915  * skb.
916  */
917 void sctp_ulpevent_free(struct sctp_ulpevent *event)
918 {
919 	if (sctp_ulpevent_is_notification(event))
920 		sctp_ulpevent_release_owner(event);
921 	else
922 		sctp_ulpevent_release_data(event);
923 
924 	kfree_skb(sctp_event2skb(event));
925 }
926 
927 /* Purge the skb lists holding ulpevents. */
928 void sctp_queue_purge_ulpevents(struct sk_buff_head *list)
929 {
930 	struct sk_buff *skb;
931 	while ((skb = skb_dequeue(list)) != NULL)
932 		sctp_ulpevent_free(sctp_skb2event(skb));
933 }
934