xref: /linux/include/net/sctp/ulpevent.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
147505b8bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
260c778b2SVlad Yasevich /* SCTP kernel implementation
31da177e4SLinus Torvalds  * (C) Copyright IBM Corp. 2001, 2004
41da177e4SLinus Torvalds  * Copyright (c) 1999-2000 Cisco, Inc.
51da177e4SLinus Torvalds  * Copyright (c) 1999-2001 Motorola, Inc.
61da177e4SLinus Torvalds  * Copyright (c) 2001 Intel Corp.
71da177e4SLinus Torvalds  * Copyright (c) 2001 Nokia, Inc.
81da177e4SLinus Torvalds  * Copyright (c) 2001 La Monte H.P. Yarroll
91da177e4SLinus Torvalds  *
101da177e4SLinus Torvalds  * These are the definitions needed for the sctp_ulpevent type.  The
111da177e4SLinus Torvalds  * sctp_ulpevent type is used to carry information from the state machine
121da177e4SLinus Torvalds  * upwards to the ULP.
131da177e4SLinus Torvalds  *
1460c778b2SVlad Yasevich  * This file is part of the SCTP kernel implementation
151da177e4SLinus Torvalds  *
161da177e4SLinus Torvalds  * Please send any bug reports or fixes you make to the
171da177e4SLinus Torvalds  * email address(es):
1891705c61SDaniel Borkmann  *    lksctp developers <linux-sctp@vger.kernel.org>
191da177e4SLinus Torvalds  *
201da177e4SLinus Torvalds  * Written or modified by:
211da177e4SLinus Torvalds  *   Jon Grimm             <jgrimm@us.ibm.com>
221da177e4SLinus Torvalds  *   La Monte H.P. Yarroll <piggy@acm.org>
231da177e4SLinus Torvalds  *   Karl Knutson          <karl@athena.chicago.il.us>
241da177e4SLinus Torvalds  *   Sridhar Samudrala     <sri@us.ibm.com>
251da177e4SLinus Torvalds  */
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds #ifndef __sctp_ulpevent_h__
281da177e4SLinus Torvalds #define __sctp_ulpevent_h__
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds /* A structure to carry information to the ULP (e.g. Sockets API) */
311da177e4SLinus Torvalds /* Warning: This sits inside an skb.cb[] area.  Be very careful of
321da177e4SLinus Torvalds  * growing this structure as it is at the maximum limit now.
33bd4d627dSXin Long  *
34bd4d627dSXin Long  * sctp_ulpevent is saved in sk->cb(48 bytes), whose last 4 bytes
35bd4d627dSXin Long  * have been taken by sock_skb_cb, So here it has to use 'packed'
36bd4d627dSXin Long  * to make sctp_ulpevent fit into the rest 44 bytes.
371da177e4SLinus Torvalds  */
381da177e4SLinus Torvalds struct sctp_ulpevent {
391da177e4SLinus Torvalds 	struct sctp_association *asoc;
401f45f78fSMarcelo Ricardo Leitner 	struct sctp_chunk *chunk;
41f5d258e6SMarcelo Ricardo Leitner 	unsigned int rmem_len;
42bd4d627dSXin Long 	union {
43bd4d627dSXin Long 		__u32 mid;
44bd4d627dSXin Long 		__u16 ssn;
45bd4d627dSXin Long 	};
46bd4d627dSXin Long 	union {
471da177e4SLinus Torvalds 		__u32 ppid;
48bd4d627dSXin Long 		__u32 fsn;
49bd4d627dSXin Long 	};
501da177e4SLinus Torvalds 	__u32 tsn;
511da177e4SLinus Torvalds 	__u32 cumtsn;
52f5d258e6SMarcelo Ricardo Leitner 	__u16 stream;
53f5d258e6SMarcelo Ricardo Leitner 	__u16 flags;
54f5d258e6SMarcelo Ricardo Leitner 	__u16 msg_flags;
55bd4d627dSXin Long } __packed;
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds /* Retrieve the skb this event sits inside of. */
sctp_event2skb(const struct sctp_ulpevent * ev)58ab38fb04SVlad Yasevich static inline struct sk_buff *sctp_event2skb(const struct sctp_ulpevent *ev)
591da177e4SLinus Torvalds {
601da177e4SLinus Torvalds 	return container_of((void *)ev, struct sk_buff, cb);
611da177e4SLinus Torvalds }
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds /* Retrieve & cast the event sitting inside the skb. */
sctp_skb2event(struct sk_buff * skb)641da177e4SLinus Torvalds static inline struct sctp_ulpevent *sctp_skb2event(struct sk_buff *skb)
651da177e4SLinus Torvalds {
661da177e4SLinus Torvalds 	return (struct sctp_ulpevent *)skb->cb;
671da177e4SLinus Torvalds }
681da177e4SLinus Torvalds 
691da177e4SLinus Torvalds void sctp_ulpevent_free(struct sctp_ulpevent *);
701da177e4SLinus Torvalds int sctp_ulpevent_is_notification(const struct sctp_ulpevent *);
71cd4fcc70SThomas Graf unsigned int sctp_queue_purge_ulpevents(struct sk_buff_head *list);
721da177e4SLinus Torvalds 
731da177e4SLinus Torvalds struct sctp_ulpevent *sctp_ulpevent_make_assoc_change(
741da177e4SLinus Torvalds 	const struct sctp_association *asoc,
751da177e4SLinus Torvalds 	__u16 flags,
761da177e4SLinus Torvalds 	__u16 state,
771da177e4SLinus Torvalds 	__u16 error,
781da177e4SLinus Torvalds 	__u16 outbound,
791da177e4SLinus Torvalds 	__u16 inbound,
80a5a35e76SVlad Yasevich 	struct sctp_chunk *chunk,
81dd0fc66fSAl Viro 	gfp_t gfp);
821da177e4SLinus Torvalds 
83*50ce4c09SJonas Falkevik void sctp_ulpevent_notify_peer_addr_change(struct sctp_transport *transport,
844b774032SXin Long 					   int state, int error);
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds struct sctp_ulpevent *sctp_ulpevent_make_remote_error(
871da177e4SLinus Torvalds 	const struct sctp_association *asoc,
881da177e4SLinus Torvalds 	struct sctp_chunk *chunk,
891da177e4SLinus Torvalds 	__u16 flags,
90dd0fc66fSAl Viro 	gfp_t gfp);
911da177e4SLinus Torvalds struct sctp_ulpevent *sctp_ulpevent_make_send_failed(
921da177e4SLinus Torvalds 	const struct sctp_association *asoc,
931da177e4SLinus Torvalds 	struct sctp_chunk *chunk,
941da177e4SLinus Torvalds 	__u16 flags,
951da177e4SLinus Torvalds 	__u32 error,
96dd0fc66fSAl Viro 	gfp_t gfp);
971da177e4SLinus Torvalds 
98b6e6b5f1SXin Long struct sctp_ulpevent *sctp_ulpevent_make_send_failed_event(
99b6e6b5f1SXin Long 	const struct sctp_association *asoc,
100b6e6b5f1SXin Long 	struct sctp_chunk *chunk,
101b6e6b5f1SXin Long 	__u16 flags,
102b6e6b5f1SXin Long 	__u32 error,
103b6e6b5f1SXin Long 	gfp_t gfp);
104b6e6b5f1SXin Long 
1051da177e4SLinus Torvalds struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event(
1061da177e4SLinus Torvalds 	const struct sctp_association *asoc,
1071da177e4SLinus Torvalds 	__u16 flags,
108dd0fc66fSAl Viro 	gfp_t gfp);
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds struct sctp_ulpevent *sctp_ulpevent_make_pdapi(
1111da177e4SLinus Torvalds 	const struct sctp_association *asoc,
11265f5e357SXin Long 	__u32 indication, __u32 sid, __u32 seq,
11365f5e357SXin Long 	__u32 flags, gfp_t gfp);
1141da177e4SLinus Torvalds 
1150f3fffd8SIvan Skytte Jorgensen struct sctp_ulpevent *sctp_ulpevent_make_adaptation_indication(
116dd0fc66fSAl Viro 	const struct sctp_association *asoc, gfp_t gfp);
1171da177e4SLinus Torvalds 
1181da177e4SLinus Torvalds struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
1191da177e4SLinus Torvalds 	struct sctp_chunk *chunk,
120dd0fc66fSAl Viro 	gfp_t gfp);
1211da177e4SLinus Torvalds 
12265b07e5dSVlad Yasevich struct sctp_ulpevent *sctp_ulpevent_make_authkey(
12365b07e5dSVlad Yasevich 	const struct sctp_association *asoc, __u16 key_id,
12465b07e5dSVlad Yasevich 	__u32 indication, gfp_t gfp);
12565b07e5dSVlad Yasevich 
126e1cdd553SWei Yongjun struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(
127e1cdd553SWei Yongjun 	const struct sctp_association *asoc, gfp_t gfp);
128e1cdd553SWei Yongjun 
12935ea82d6SXin Long struct sctp_ulpevent *sctp_ulpevent_make_stream_reset_event(
13035ea82d6SXin Long 	const struct sctp_association *asoc, __u16 flags,
1311da4fc97SXin Long 	__u16 stream_num, __be16 *stream_list, gfp_t gfp);
13235ea82d6SXin Long 
133c95129d1SXin Long struct sctp_ulpevent *sctp_ulpevent_make_assoc_reset_event(
134c95129d1SXin Long 	const struct sctp_association *asoc, __u16 flags,
135c95129d1SXin Long 	 __u32 local_tsn, __u32 remote_tsn, gfp_t gfp);
136c95129d1SXin Long 
137b444153fSXin Long struct sctp_ulpevent *sctp_ulpevent_make_stream_change_event(
138b444153fSXin Long 	const struct sctp_association *asoc, __u16 flags,
139b444153fSXin Long 	__u32 strchange_instrms, __u32 strchange_outstrms, gfp_t gfp);
140b444153fSXin Long 
141bd4d627dSXin Long struct sctp_ulpevent *sctp_make_reassembled_event(
142bd4d627dSXin Long 	struct net *net, struct sk_buff_head *queue,
143bd4d627dSXin Long 	struct sk_buff *f_frag, struct sk_buff *l_frag);
144bd4d627dSXin Long 
1451da177e4SLinus Torvalds void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
1461da177e4SLinus Torvalds 				   struct msghdr *);
1470d3a421dSGeir Ola Vaagland void sctp_ulpevent_read_rcvinfo(const struct sctp_ulpevent *event,
1480d3a421dSGeir Ola Vaagland 				struct msghdr *);
1492347c80fSGeir Ola Vaagland void sctp_ulpevent_read_nxtinfo(const struct sctp_ulpevent *event,
1502347c80fSGeir Ola Vaagland 				struct msghdr *, struct sock *sk);
1510d3a421dSGeir Ola Vaagland 
1521da177e4SLinus Torvalds __u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event);
1531da177e4SLinus Torvalds 
sctp_ulpevent_type_set(__u16 * subscribe,__u16 sn_type,__u8 on)1542cc0eeb6SXin Long static inline void sctp_ulpevent_type_set(__u16 *subscribe,
1552cc0eeb6SXin Long 					  __u16 sn_type, __u8 on)
1561da177e4SLinus Torvalds {
1572cc0eeb6SXin Long 	if (sn_type > SCTP_SN_TYPE_MAX)
1582cc0eeb6SXin Long 		return;
159fa5f7b51SDan Carpenter 
1602cc0eeb6SXin Long 	if (on)
1612cc0eeb6SXin Long 		*subscribe |=  (1 << (sn_type - SCTP_SN_TYPE_BASE));
1622cc0eeb6SXin Long 	else
1632cc0eeb6SXin Long 		*subscribe &= ~(1 << (sn_type - SCTP_SN_TYPE_BASE));
1642cc0eeb6SXin Long }
1652cc0eeb6SXin Long 
1662cc0eeb6SXin Long /* Is this event type enabled? */
sctp_ulpevent_type_enabled(__u16 subscribe,__u16 sn_type)1672cc0eeb6SXin Long static inline bool sctp_ulpevent_type_enabled(__u16 subscribe, __u16 sn_type)
1682cc0eeb6SXin Long {
1692cc0eeb6SXin Long 	if (sn_type > SCTP_SN_TYPE_MAX)
1702cc0eeb6SXin Long 		return false;
1712cc0eeb6SXin Long 
1722cc0eeb6SXin Long 	return subscribe & (1 << (sn_type - SCTP_SN_TYPE_BASE));
1731da177e4SLinus Torvalds }
1741da177e4SLinus Torvalds 
1751da177e4SLinus Torvalds /* Given an event subscription, is this event enabled? */
sctp_ulpevent_is_enabled(const struct sctp_ulpevent * event,__u16 subscribe)1762cc0eeb6SXin Long static inline bool sctp_ulpevent_is_enabled(const struct sctp_ulpevent *event,
1772cc0eeb6SXin Long 					    __u16 subscribe)
1781da177e4SLinus Torvalds {
1791da177e4SLinus Torvalds 	__u16 sn_type;
1801da177e4SLinus Torvalds 
1812cc0eeb6SXin Long 	if (!sctp_ulpevent_is_notification(event))
1822cc0eeb6SXin Long 		return true;
1832cc0eeb6SXin Long 
1841da177e4SLinus Torvalds 	sn_type = sctp_ulpevent_get_notification_type(event);
1852cc0eeb6SXin Long 
1862cc0eeb6SXin Long 	return sctp_ulpevent_type_enabled(subscribe, sn_type);
1871da177e4SLinus Torvalds }
1881da177e4SLinus Torvalds 
1891da177e4SLinus Torvalds #endif /* __sctp_ulpevent_h__ */
190