2019-05-23 11:14:41 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2008-01-11 09:57:09 -05:00
/* SCTP kernel implementation
2005-04-16 15:20:36 -07:00
* ( C ) Copyright IBM Corp . 2001 , 2004
* Copyright ( c ) 1999 - 2000 Cisco , Inc .
* Copyright ( c ) 1999 - 2001 Motorola , Inc .
* Copyright ( c ) 2001 Intel Corp .
* Copyright ( c ) 2001 Nokia , Inc .
* Copyright ( c ) 2001 La Monte H . P . Yarroll
*
* These are the definitions needed for the sctp_ulpevent type . The
* sctp_ulpevent type is used to carry information from the state machine
* upwards to the ULP .
*
2008-01-11 09:57:09 -05:00
* This file is part of the SCTP kernel implementation
2005-04-16 15:20:36 -07:00
*
* Please send any bug reports or fixes you make to the
* email address ( es ) :
2013-07-23 14:51:47 +02:00
* lksctp developers < linux - sctp @ vger . kernel . org >
2005-04-16 15:20:36 -07:00
*
* Written or modified by :
* Jon Grimm < jgrimm @ us . ibm . com >
* La Monte H . P . Yarroll < piggy @ acm . org >
* Karl Knutson < karl @ athena . chicago . il . us >
* Sridhar Samudrala < sri @ us . ibm . com >
*/
# ifndef __sctp_ulpevent_h__
# define __sctp_ulpevent_h__
/* A structure to carry information to the ULP (e.g. Sockets API) */
/* Warning: This sits inside an skb.cb[] area. Be very careful of
* growing this structure as it is at the maximum limit now .
2017-12-08 21:04:04 +08:00
*
* sctp_ulpevent is saved in sk - > cb ( 48 bytes ) , whose last 4 bytes
* have been taken by sock_skb_cb , So here it has to use ' packed '
* to make sctp_ulpevent fit into the rest 44 bytes .
2005-04-16 15:20:36 -07:00
*/
struct sctp_ulpevent {
struct sctp_association * asoc ;
2016-07-13 15:08:57 -03:00
struct sctp_chunk * chunk ;
2016-07-13 15:08:56 -03:00
unsigned int rmem_len ;
2017-12-08 21:04:04 +08:00
union {
__u32 mid ;
__u16 ssn ;
} ;
union {
__u32 ppid ;
__u32 fsn ;
} ;
2005-04-16 15:20:36 -07:00
__u32 tsn ;
__u32 cumtsn ;
2016-07-13 15:08:56 -03:00
__u16 stream ;
__u16 flags ;
__u16 msg_flags ;
2017-12-08 21:04:04 +08:00
} __packed ;
2005-04-16 15:20:36 -07:00
/* Retrieve the skb this event sits inside of. */
2008-04-12 18:40:06 -07:00
static inline struct sk_buff * sctp_event2skb ( const struct sctp_ulpevent * ev )
2005-04-16 15:20:36 -07:00
{
return container_of ( ( void * ) ev , struct sk_buff , cb ) ;
}
/* Retrieve & cast the event sitting inside the skb. */
static inline struct sctp_ulpevent * sctp_skb2event ( struct sk_buff * skb )
{
return ( struct sctp_ulpevent * ) skb - > cb ;
}
void sctp_ulpevent_free ( struct sctp_ulpevent * ) ;
int sctp_ulpevent_is_notification ( const struct sctp_ulpevent * ) ;
2011-07-08 04:37:46 +00:00
unsigned int sctp_queue_purge_ulpevents ( struct sk_buff_head * list ) ;
2005-04-16 15:20:36 -07:00
struct sctp_ulpevent * sctp_ulpevent_make_assoc_change (
const struct sctp_association * asoc ,
__u16 flags ,
__u16 state ,
__u16 error ,
__u16 outbound ,
__u16 inbound ,
2007-03-23 11:34:08 -07:00
struct sctp_chunk * chunk ,
2005-10-07 07:46:04 +01:00
gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
2020-05-27 11:59:43 +02:00
void sctp_ulpevent_notify_peer_addr_change ( struct sctp_transport * transport ,
2019-10-08 19:27:33 +08:00
int state , int error ) ;
2005-04-16 15:20:36 -07:00
struct sctp_ulpevent * sctp_ulpevent_make_remote_error (
const struct sctp_association * asoc ,
struct sctp_chunk * chunk ,
__u16 flags ,
2005-10-07 07:46:04 +01:00
gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
struct sctp_ulpevent * sctp_ulpevent_make_send_failed (
const struct sctp_association * asoc ,
struct sctp_chunk * chunk ,
__u16 flags ,
__u32 error ,
2005-10-07 07:46:04 +01:00
gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
2019-10-08 19:27:36 +08:00
struct sctp_ulpevent * sctp_ulpevent_make_send_failed_event (
const struct sctp_association * asoc ,
struct sctp_chunk * chunk ,
__u16 flags ,
__u32 error ,
gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
struct sctp_ulpevent * sctp_ulpevent_make_shutdown_event (
const struct sctp_association * asoc ,
__u16 flags ,
2005-10-07 07:46:04 +01:00
gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
struct sctp_ulpevent * sctp_ulpevent_make_pdapi (
const struct sctp_association * asoc ,
2017-12-08 21:04:08 +08:00
__u32 indication , __u32 sid , __u32 seq ,
__u32 flags , gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
2006-12-20 16:07:04 -08:00
struct sctp_ulpevent * sctp_ulpevent_make_adaptation_indication (
2005-10-07 07:46:04 +01:00
const struct sctp_association * asoc , gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
struct sctp_ulpevent * sctp_ulpevent_make_rcvmsg ( struct sctp_association * asoc ,
struct sctp_chunk * chunk ,
2005-10-07 07:46:04 +01:00
gfp_t gfp ) ;
2005-04-16 15:20:36 -07:00
2007-09-16 19:34:00 -07:00
struct sctp_ulpevent * sctp_ulpevent_make_authkey (
const struct sctp_association * asoc , __u16 key_id ,
__u32 indication , gfp_t gfp ) ;
2011-04-17 17:29:03 +00:00
struct sctp_ulpevent * sctp_ulpevent_make_sender_dry_event (
const struct sctp_association * asoc , gfp_t gfp ) ;
2017-02-17 12:45:38 +08:00
struct sctp_ulpevent * sctp_ulpevent_make_stream_reset_event (
const struct sctp_association * asoc , __u16 flags ,
2017-10-28 19:43:54 +08:00
__u16 stream_num , __be16 * stream_list , gfp_t gfp ) ;
2017-03-10 12:11:06 +08:00
struct sctp_ulpevent * sctp_ulpevent_make_assoc_reset_event (
const struct sctp_association * asoc , __u16 flags ,
__u32 local_tsn , __u32 remote_tsn , gfp_t gfp ) ;
2017-03-10 12:11:08 +08:00
struct sctp_ulpevent * sctp_ulpevent_make_stream_change_event (
const struct sctp_association * asoc , __u16 flags ,
__u32 strchange_instrms , __u32 strchange_outstrms , gfp_t gfp ) ;
2011-04-17 17:29:03 +00:00
2017-12-08 21:04:04 +08:00
struct sctp_ulpevent * sctp_make_reassembled_event (
struct net * net , struct sk_buff_head * queue ,
struct sk_buff * f_frag , struct sk_buff * l_frag ) ;
2005-04-16 15:20:36 -07:00
void sctp_ulpevent_read_sndrcvinfo ( const struct sctp_ulpevent * event ,
2014-07-12 20:30:37 +02:00
struct msghdr * ) ;
void sctp_ulpevent_read_rcvinfo ( const struct sctp_ulpevent * event ,
struct msghdr * ) ;
2014-07-12 20:30:38 +02:00
void sctp_ulpevent_read_nxtinfo ( const struct sctp_ulpevent * event ,
struct msghdr * , struct sock * sk ) ;
2014-07-12 20:30:37 +02:00
2005-04-16 15:20:36 -07:00
__u16 sctp_ulpevent_get_notification_type ( const struct sctp_ulpevent * event ) ;
2018-11-18 16:08:51 +08:00
static inline void sctp_ulpevent_type_set ( __u16 * subscribe ,
__u16 sn_type , __u8 on )
{
if ( sn_type > SCTP_SN_TYPE_MAX )
return ;
if ( on )
* subscribe | = ( 1 < < ( sn_type - SCTP_SN_TYPE_BASE ) ) ;
else
* subscribe & = ~ ( 1 < < ( sn_type - SCTP_SN_TYPE_BASE ) ) ;
}
2005-04-16 15:20:36 -07:00
/* Is this event type enabled? */
2018-11-18 16:08:51 +08:00
static inline bool sctp_ulpevent_type_enabled ( __u16 subscribe , __u16 sn_type )
2005-04-16 15:20:36 -07:00
{
2018-11-18 16:08:51 +08:00
if ( sn_type > SCTP_SN_TYPE_MAX )
return false ;
2017-09-14 02:00:54 +03:00
2018-11-18 16:08:51 +08:00
return subscribe & ( 1 < < ( sn_type - SCTP_SN_TYPE_BASE ) ) ;
2005-04-16 15:20:36 -07:00
}
/* Given an event subscription, is this event enabled? */
2018-11-18 16:08:51 +08:00
static inline bool sctp_ulpevent_is_enabled ( const struct sctp_ulpevent * event ,
__u16 subscribe )
2005-04-16 15:20:36 -07:00
{
__u16 sn_type ;
2018-11-18 16:08:51 +08:00
if ( ! sctp_ulpevent_is_notification ( event ) )
return true ;
sn_type = sctp_ulpevent_get_notification_type ( event ) ;
return sctp_ulpevent_type_enabled ( subscribe , sn_type ) ;
2005-04-16 15:20:36 -07:00
}
# endif /* __sctp_ulpevent_h__ */