ulpevent.h 4.7 KB
Newer Older
1
/* SCTP kernel implementation
L
Linus Torvalds 已提交
2 3 4 5 6 7 8 9 10 11 12
 * (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.
 *
13
 * This file is part of the SCTP kernel implementation
L
Linus Torvalds 已提交
14
 *
15
 * This SCTP implementation is free software;
L
Linus Torvalds 已提交
16 17 18 19 20
 * 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.
 *
21
 * This SCTP implementation is distributed in the hope that it
L
Linus Torvalds 已提交
22 23 24 25 26 27
 * 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
28 29
 * along with GNU CC; see the file COPYING.  If not, see
 * <http://www.gnu.org/licenses/>.
L
Linus Torvalds 已提交
30 31 32
 *
 * Please send any bug reports or fixes you make to the
 * email address(es):
33
 *    lksctp developers <linux-sctp@vger.kernel.org>
L
Linus Torvalds 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
 *
 * 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;
	__u16 stream;
	__u16 ssn;
	__u16 flags;
	__u32 ppid;
	__u32 tsn;
	__u32 cumtsn;
	int msg_flags;
	int iif;
59
	unsigned int rmem_len;
L
Linus Torvalds 已提交
60 61 62
};

/* Retrieve the skb this event sits inside of. */
63
static inline struct sk_buff *sctp_event2skb(const struct sctp_ulpevent *ev)
L
Linus Torvalds 已提交
64 65 66 67 68 69 70 71 72 73 74 75
{
	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 *);
76
unsigned int sctp_queue_purge_ulpevents(struct sk_buff_head *list);
L
Linus Torvalds 已提交
77 78 79 80 81 82 83 84

struct sctp_ulpevent *sctp_ulpevent_make_assoc_change(
	const struct sctp_association *asoc,
	__u16 flags,
	__u16 state,
	__u16 error,
	__u16 outbound,
	__u16 inbound,
85
	struct sctp_chunk *chunk,
A
Al Viro 已提交
86
	gfp_t gfp);
L
Linus Torvalds 已提交
87 88 89 90 91 92 93

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,
A
Al Viro 已提交
94
	gfp_t gfp);
L
Linus Torvalds 已提交
95 96 97 98 99

struct sctp_ulpevent *sctp_ulpevent_make_remote_error(
	const struct sctp_association *asoc,
	struct sctp_chunk *chunk,
	__u16 flags,
A
Al Viro 已提交
100
	gfp_t gfp);
L
Linus Torvalds 已提交
101 102 103 104 105
struct sctp_ulpevent *sctp_ulpevent_make_send_failed(
	const struct sctp_association *asoc,
	struct sctp_chunk *chunk,
	__u16 flags,
	__u32 error,
A
Al Viro 已提交
106
	gfp_t gfp);
L
Linus Torvalds 已提交
107 108 109 110

struct sctp_ulpevent *sctp_ulpevent_make_shutdown_event(
	const struct sctp_association *asoc,
	__u16 flags,
A
Al Viro 已提交
111
	gfp_t gfp);
L
Linus Torvalds 已提交
112 113 114

struct sctp_ulpevent *sctp_ulpevent_make_pdapi(
	const struct sctp_association *asoc,
A
Al Viro 已提交
115
	__u32 indication, gfp_t gfp);
L
Linus Torvalds 已提交
116

117
struct sctp_ulpevent *sctp_ulpevent_make_adaptation_indication(
A
Al Viro 已提交
118
	const struct sctp_association *asoc, gfp_t gfp);
L
Linus Torvalds 已提交
119 120 121

struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,
	struct sctp_chunk *chunk,
A
Al Viro 已提交
122
	gfp_t gfp);
L
Linus Torvalds 已提交
123

124 125 126 127
struct sctp_ulpevent *sctp_ulpevent_make_authkey(
	const struct sctp_association *asoc, __u16 key_id,
	__u32 indication, gfp_t gfp);

128 129 130
struct sctp_ulpevent *sctp_ulpevent_make_sender_dry_event(
	const struct sctp_association *asoc, gfp_t gfp);

L
Linus Torvalds 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
	struct msghdr *);
__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__ */