Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[linux-drm-fsl-dcu.git] / include / net / sctp / ulpevent.h
1 /* SCTP kernel 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 are the definitions needed for the sctp_ulpevent type.  The
10  * sctp_ulpevent type is used to carry information from the state machine
11  * upwards to the ULP.
12  *
13  * This file is part of the SCTP kernel implementation
14  *
15  * This SCTP implementation is free software;
16  * you can redistribute it and/or modify it under the terms of
17  * the GNU General Public License as published by
18  * the Free Software Foundation; either version 2, or (at your option)
19  * any later version.
20  *
21  * This SCTP implementation is distributed in the hope that it
22  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
23  *                 ************************
24  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
25  * See the GNU General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with GNU CC; see the file COPYING.  If not, see
29  * <http://www.gnu.org/licenses/>.
30  *
31  * Please send any bug reports or fixes you make to the
32  * email address(es):
33  *    lksctp developers <linux-sctp@vger.kernel.org>
34  *
35  * Written or modified by:
36  *   Jon Grimm             <jgrimm@us.ibm.com>
37  *   La Monte H.P. Yarroll <piggy@acm.org>
38  *   Karl Knutson          <karl@athena.chicago.il.us>
39  *   Sridhar Samudrala     <sri@us.ibm.com>
40  */
41
42 #ifndef __sctp_ulpevent_h__
43 #define __sctp_ulpevent_h__
44
45 /* A structure to carry information to the ULP (e.g. Sockets API) */
46 /* Warning: This sits inside an skb.cb[] area.  Be very careful of
47  * growing this structure as it is at the maximum limit now.
48  */
49 struct sctp_ulpevent {
50         struct sctp_association *asoc;
51         __u16 stream;
52         __u16 ssn;
53         __u16 flags;
54         __u32 ppid;
55         __u32 tsn;
56         __u32 cumtsn;
57         int msg_flags;
58         int iif;
59         unsigned int rmem_len;
60 };
61
62 /* Retrieve the skb this event sits inside of. */
63 static inline struct sk_buff *sctp_event2skb(const struct sctp_ulpevent *ev)
64 {
65         return container_of((void *)ev, struct sk_buff, cb);
66 }
67
68 /* Retrieve & cast the event sitting inside the skb. */
69 static inline struct sctp_ulpevent *sctp_skb2event(struct sk_buff *skb)
70 {
71         return (struct sctp_ulpevent *)skb->cb;
72 }
73
74 void sctp_ulpevent_free(struct sctp_ulpevent *);
75 int sctp_ulpevent_is_notification(const struct sctp_ulpevent *);
76 unsigned int sctp_queue_purge_ulpevents(struct sk_buff_head *list);
77
78 struct sctp_ulpevent *sctp_ulpevent_make_assoc_change(
79         const struct sctp_association *asoc,
80         __u16 flags,
81         __u16 state,
82         __u16 error,
83         __u16 outbound,
84         __u16 inbound,
85         struct sctp_chunk *chunk,
86         gfp_t gfp);
87
88 struct sctp_ulpevent *sctp_ulpevent_make_peer_addr_change(
89         const struct sctp_association *asoc,
90         const struct sockaddr_storage *aaddr,
91         int flags,
92         int state,
93         int error,
94         gfp_t gfp);
95
96 struct sctp_ulpevent *sctp_ulpevent_make_remote_error(
97         const struct sctp_association *asoc,
98         struct sctp_chunk *chunk,
99         __u16 flags,
100         gfp_t gfp);
101 struct sctp_ulpevent *sctp_ulpevent_make_send_failed(
102         const struct sctp_association *asoc,
103         struct sctp_chunk *chunk,
104         __u16 flags,
105         __u32 error,
106         gfp_t gfp);
107
108 struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event(
109         const struct sctp_association *asoc,
110         __u16 flags,
111         gfp_t gfp);
112
113 struct sctp_ulpevent *sctp_ulpevent_make_pdapi(
114         const struct sctp_association *asoc,
115         __u32 indication, gfp_t gfp);
116
117 struct sctp_ulpevent *sctp_ulpevent_make_adaptation_indication(
118         const struct sctp_association *asoc, gfp_t gfp);
119
120 struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
121         struct sctp_chunk *chunk,
122         gfp_t gfp);
123
124 struct sctp_ulpevent *sctp_ulpevent_make_authkey(
125         const struct sctp_association *asoc, __u16 key_id,
126         __u32 indication, gfp_t gfp);
127
128 struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(
129         const struct sctp_association *asoc, gfp_t gfp);
130
131 void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
132         struct msghdr *);
133 __u16 sctp_ulpevent_get_notification_type(const struct sctp_ulpevent *event);
134
135 /* Is this event type enabled? */
136 static inline int sctp_ulpevent_type_enabled(__u16 sn_type,
137                                              struct sctp_event_subscribe *mask)
138 {
139         char *amask = (char *) mask;
140         return amask[sn_type - SCTP_SN_TYPE_BASE];
141 }
142
143 /* Given an event subscription, is this event enabled? */
144 static inline int sctp_ulpevent_is_enabled(const struct sctp_ulpevent *event,
145                                            struct sctp_event_subscribe *mask)
146 {
147         __u16 sn_type;
148         int enabled = 1;
149
150         if (sctp_ulpevent_is_notification(event)) {
151                 sn_type = sctp_ulpevent_get_notification_type(event);
152                 enabled = sctp_ulpevent_type_enabled(sn_type, mask);
153         }
154         return enabled;
155 }
156
157 #endif /* __sctp_ulpevent_h__ */
158
159
160
161
162
163
164