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
*
2008-01-11 09:57:09 -05:00
* This SCTP implementation is free software ;
2005-04-16 15:20:36 -07:00
* you can redistribute it and / or modify it under the terms of
* the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
2008-01-11 09:57:09 -05:00
* This SCTP implementation is distributed in the hope that it
2005-04-16 15:20:36 -07:00
* will be useful , but WITHOUT ANY WARRANTY ; without even the implied
* * * * * * * * * * * * * * * * * * * * * * * * *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
* See the GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2013-12-06 06:28:48 -08:00
* along with GNU CC ; see the file COPYING . If not , see
* < http : //www.gnu.org/licenses/>.
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 .
*/
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 ;
2005-04-16 15:20:36 -07:00
__u32 ppid ;
__u32 tsn ;
__u32 cumtsn ;
2016-07-13 15:08:56 -03:00
__u16 stream ;
__u16 ssn ;
__u16 flags ;
__u16 msg_flags ;
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
struct sctp_ulpevent * sctp_ulpevent_make_peer_addr_change (
const struct sctp_association * asoc ,
const struct sockaddr_storage * aaddr ,
int flags ,
int state ,
int error ,
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_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
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 ,
2005-10-07 07:46:04 +01:00
__u32 indication , 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 ,
__u16 stream_num , __u16 * stream_list , gfp_t gfp ) ;
2011-04-17 17:29:03 +00:00
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 ) ;
/* Is this event type enabled? */
static inline int sctp_ulpevent_type_enabled ( __u16 sn_type ,
struct sctp_event_subscribe * mask )
{
char * amask = ( char * ) mask ;
return amask [ sn_type - SCTP_SN_TYPE_BASE ] ;
}
/* Given an event subscription, is this event enabled? */
static inline int sctp_ulpevent_is_enabled ( const struct sctp_ulpevent * event ,
struct sctp_event_subscribe * mask )
{
__u16 sn_type ;
int enabled = 1 ;
if ( sctp_ulpevent_is_notification ( event ) ) {
sn_type = sctp_ulpevent_get_notification_type ( event ) ;
enabled = sctp_ulpevent_type_enabled ( sn_type , mask ) ;
}
return enabled ;
}
# endif /* __sctp_ulpevent_h__ */