1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2002-2004, Network Appliance, Inc. All rights reserved.
23  */
24 
25 /*
26  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
27  * Use is subject to license terms.
28  */
29 
30 #ifndef _DAT_ERROR_H_
31 #define	_DAT_ERROR_H_
32 
33 /*
34  *
35  * HEADER: dat_error.h
36  *
37  * PURPOSE: DAT return codes
38  *
39  * Description: Header file for "uDAPL: User Direct Access Programming
40  *		Library, Version: 1.2"
41  *
42  * Mapping rules:
43  *		Error types are compound types, as mapped out below.
44  *
45  *
46  */
47 
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
51 
52 /*
53  *
54  * All return codes are actually a 3-way tuple:
55  *
56  * type: DAT_RETURN_CLASS DAT_RETURN_TYPE DAT_RETURN_SUBTYPE
57  * bits: 31-30 29-16           15-0
58  *
59  * +----------------------------------------------------------------------+
60  * |3130 | 29282726252423222120191817 | 1615141312111009080706054003020100|
61  * |CLAS | DAT_TYPE_STATUS            | SUBTYPE_STATUS                    |
62  * +----------------------------------------------------------------------+
63  */
64 
65 /*
66  * Class Bits
67  */
68 #define	DAT_CLASS_ERROR   0x80000000
69 #define	DAT_CLASS_WARNING 0x40000000
70 #define	DAT_CLASS_SUCCESS 0x00000000
71 
72 /*
73  * DAT Error bits
74  */
75 #define	DAT_TYPE_MASK    0x3fff0000   /* mask for DAT_TYPE_STATUS bits    */
76 #define	DAT_SUBTYPE_MASK 0x0000FFFF   /* mask for DAT_SUBTYPE_STATUS bits */
77 
78 /*
79  * Determining the success of an operation is best done with a macro;
80  * each of these returns a boolean value.
81  */
82 #define	DAT_IS_WARNING(status)  ((DAT_UINT32)(status) & DAT_CLASS_WARNING)
83 
84 #define	DAT_GET_TYPE(status)    ((DAT_UINT32)(status) & DAT_TYPE_MASK)
85 #define	DAT_GET_SUBTYPE(status) ((DAT_UINT32)(status) & DAT_SUBTYPE_MASK)
86 
87 /*
88  * DAT return types. The ERROR bit is enabled for these definitions
89  */
90 typedef enum dat_return_type
91 {
92 	/* The operation was successful.				*/
93 	DAT_SUCCESS					= 0x000000,
94 
95 	/*
96 	 * The operation was aborted because IA was closed or EVD was
97 	 * destroyed.
98 	 */
99 	DAT_ABORT					= 0x00010000,
100 
101 	/* The specified Connection Qualifier was in use.		*/
102 	DAT_CONN_QUAL_IN_USE				= 0x00020000,
103 
104 	/* The operation failed due to resource limitations.		*/
105 	DAT_INSUFFICIENT_RESOURCES			= 0x00030000,
106 
107 	/*
108 	 * Provider internal error. This error can be returned by any
109 	 * operation when the Provider have detected an internal error.
110 	 * This error does no mask any error causes by Consumer.
111 	 */
112 	DAT_INTERNAL_ERROR				= 0x00040000,
113 
114 	/* One of the DAT handles was invalid.				*/
115 	DAT_INVALID_HANDLE				= 0x00050000,
116 
117 	/* One of the parameters was invalid.				*/
118 	DAT_INVALID_PARAMETER				= 0x00060000,
119 
120 	/*
121 	 * One of the parameters was invalid for this operation. There
122 	 * are Event Streams associated with the Event Dispatcher feeding
123 	 * it.
124 	 */
125 	DAT_INVALID_STATE				= 0x00070000,
126 
127 	/*
128 	 * The size of the receiving buffer is too small for sending
129 	 * buffer data.  The size of the local buffer is too small for
130 	 * the data of the remote buffer.
131 	 */
132 	DAT_LENGTH_ERROR				= 0x00080000,
133 
134 	/* The requested Model was not supported by the Provider.	*/
135 	DAT_MODEL_NOT_SUPPORTED				= 0x00090000,
136 
137 	/*
138 	 * The provider name or specified attributes are not found in
139 	 * the registry.
140 	 */
141 
142 	DAT_PROVIDER_NOT_FOUND				= 0x000A0000,
143 
144 	/*
145 	 * Protection violation for local or remote memory
146 	 * access. Protection Zone mismatch between an LMR of one of the
147 	 * local_iov segments and the local Endpoint.
148 	 */
149 	DAT_PRIVILEGES_VIOLATION			= 0x000B0000,
150 
151 	/*
152 	 * Privileges violation for local or re-mote memory access. One
153 	 * of the LMRs used in local_iov was either invalid or did not
154 	 * have the local read privileges.
155 	 */
156 	DAT_PROTECTION_VIOLATION			= 0x000C0000,
157 
158 	/* The operation timed out without a notification.		*/
159 	DAT_QUEUE_EMPTY					= 0x000D0000,
160 
161 	/* The Event Dispatcher queue is full.				*/
162 	DAT_QUEUE_FULL					= 0x000E0000,
163 
164 	/* The operation timed out. UDAPL ONLY				*/
165 	DAT_TIMEOUT_EXPIRED				= 0x000F0000,
166 
167 	/* The provider name was already registered			*/
168 	DAT_PROVIDER_ALREADY_REGISTERED			= 0x00100000,
169 
170 	/* The provider is "in-use" and cannot be closed at this time	*/
171 	DAT_PROVIDER_IN_USE				= 0x00110000,
172 
173 	/* The requested remote address is not valid or not reachable	*/
174 	DAT_INVALID_ADDRESS				= 0x00120000,
175 
176 	/* [Unix only] dat_evd_wait or dat_cno_wait has been interrupted. */
177 	DAT_INTERRUPTED_CALL				= 0x00130000,
178 
179 	/* No Connection Qualifiers are available 			*/
180 	DAT_CONN_QUAL_UNAVAILABLE			= 0x00140000,
181 
182 	/* Provider does not support the operation yet.			*/
183 	DAT_NOT_IMPLEMENTED				= 0x0FFF0000
184 
185 } DAT_RETURN_TYPE;
186 
187 typedef	DAT_UINT32 DAT_RETURN;
188 
189 /* Backwared compatibility with DAT 1.0					*/
190 #define	DAT_NAME_NOT_FOUND DAT_PROVIDER_NOT_FOUND
191 
192 /*
193  * DAT_RETURN_SUBTYPE listing
194  */
195 
196 typedef enum dat_return_subtype
197 {
198 	/* First element is no subtype */
199 	DAT_NO_SUBTYPE,
200 	/* ABORT sub types						*/
201 	/* call was interrupted by a signal, or otherwise		*/
202 	DAT_SUB_INTERRUPTED,
203 
204 	/* DAT_CONN_QUAL_IN_USE has no subtypes				*/
205 
206 	/* INSUFFICIENT_RESOURCES subtypes				*/
207 	DAT_RESOURCE_MEMORY,
208 	DAT_RESOURCE_DEVICE,
209 	DAT_RESOURCE_TEP, /* transport endpoint, e.g. QP */
210 	DAT_RESOURCE_TEVD, /* transport EVD, e.g. CQ */
211 	DAT_RESOURCE_PROTECTION_DOMAIN,
212 	DAT_RESOURCE_MEMORY_REGION, /* HCA memory for LMR or RMR */
213 	DAT_RESOURCE_ERROR_HANDLER,
214 	DAT_RESOURCE_CREDITS, /* e.g outstanding RDMA Read credit as target */
215 	DAT_RESOURCE_SRQ,
216 
217 	/* DAT_INTERNAL_ERROR has no subtypes				*/
218 
219 	/* INVALID_HANDLE subtypes					*/
220 	DAT_INVALID_HANDLE_IA,
221 	DAT_INVALID_HANDLE_EP,
222 	DAT_INVALID_HANDLE_LMR,
223 	DAT_INVALID_HANDLE_RMR,
224 	DAT_INVALID_HANDLE_PZ,
225 	DAT_INVALID_HANDLE_PSP,
226 	DAT_INVALID_HANDLE_RSP,
227 	DAT_INVALID_HANDLE_CR,
228 	DAT_INVALID_HANDLE_CNO,
229 	DAT_INVALID_HANDLE_EVD_CR,
230 	DAT_INVALID_HANDLE_EVD_REQUEST,
231 	DAT_INVALID_HANDLE_EVD_RECV,
232 	DAT_INVALID_HANDLE_EVD_CONN,
233 	DAT_INVALID_HANDLE_EVD_ASYNC,
234 	DAT_INVALID_HANDLE_SRQ,
235 	DAT_INVALID_HANDLE1,
236 	DAT_INVALID_HANDLE2,
237 	DAT_INVALID_HANDLE3,
238 	DAT_INVALID_HANDLE4,
239 	DAT_INVALID_HANDLE5,
240 	DAT_INVALID_HANDLE6,
241 	DAT_INVALID_HANDLE7,
242 	DAT_INVALID_HANDLE8,
243 	DAT_INVALID_HANDLE9,
244 	DAT_INVALID_HANDLE10,
245 
246 	/* DAT_INVALID_PARAMETER subtypes				*/
247 	DAT_INVALID_ARG1,
248 	DAT_INVALID_ARG2,
249 	DAT_INVALID_ARG3,
250 	DAT_INVALID_ARG4,
251 	DAT_INVALID_ARG5,
252 	DAT_INVALID_ARG6,
253 	DAT_INVALID_ARG7,
254 	DAT_INVALID_ARG8,
255 	DAT_INVALID_ARG9,
256 	DAT_INVALID_ARG10,
257 
258 	/* DAT_INVALID_EP_STATE subtypes */
259 	DAT_INVALID_STATE_EP_UNCONNECTED,
260 	DAT_INVALID_STATE_EP_ACTCONNPENDING,
261 	DAT_INVALID_STATE_EP_PASSCONNPENDING,
262 	DAT_INVALID_STATE_EP_TENTCONNPENDING,
263 	DAT_INVALID_STATE_EP_CONNECTED,
264 	DAT_INVALID_STATE_EP_DISCONNECTED,
265 	DAT_INVALID_STATE_EP_RESERVED,
266 	DAT_INVALID_STATE_EP_COMPLPENDING,
267 	DAT_INVALID_STATE_EP_DISCPENDING,
268 	DAT_INVALID_STATE_EP_PROVIDERCONTROL,
269 	DAT_INVALID_STATE_EP_NOTREADY,
270 	DAT_INVALID_STATE_EP_RECV_WATERMARK,
271 	DAT_INVALID_STATE_EP_PZ,
272 	DAT_INVALID_STATE_EP_EVD_REQUEST,
273 	DAT_INVALID_STATE_EP_EVD_RECV,
274 	DAT_INVALID_STATE_EP_EVD_CONNECT,
275 	DAT_INVALID_STATE_EP_UNCONFIGURED,
276 	DAT_INVALID_STATE_EP_UNCONFRESERVED,
277 	DAT_INVALID_STATE_EP_UNCONFPASSIVE,
278 	DAT_INVALID_STATE_EP_UNCONFTENTATIVE,
279 
280 	DAT_INVALID_STATE_CNO_IN_USE,
281 	DAT_INVALID_STATE_CNO_DEAD,
282 
283 	/*
284 	 * EVD states. Enabled/Disabled, Waitable/Unwaitable,
285 	 * and Notify/Solicited/Threshold are 3 orthogonal
286 	 * bands of EVD state.The Threshold one is uDAPL specific.
287 	 */
288 	DAT_INVALID_STATE_EVD_OPEN,
289 	/*
290 	 * EVD can be either in enabled or disabled but not both
291 	 * or neither at the same time
292 	 */
293 	DAT_INVALID_STATE_EVD_ENABLED,
294 	DAT_INVALID_STATE_EVD_DISABLED,
295 	/*
296 	 * EVD can be either in waitable or unwaitable but not
297 	 * both or neither at the same time
298 	 */
299 	DAT_INVALID_STATE_EVD_WAITABLE,
300 	DAT_INVALID_STATE_EVD_UNWAITABLE,
301 	/* Do not release an EVD if it is in use			*/
302 	DAT_INVALID_STATE_EVD_IN_USE,
303 
304 	/*
305 	 * EVD can be either in notify or solicited or threshold
306 	 * but not any pair, or all, or none at the same time.
307 	 * The threshold one is for uDAPL only
308 	 */
309 	DAT_INVALID_STATE_EVD_CONFIG_NOTIFY,
310 	DAT_INVALID_STATE_EVD_CONFIG_SOLICITED,
311 	DAT_INVALID_STATE_EVD_CONFIG_THRESHOLD,
312 	DAT_INVALID_STATE_EVD_WAITER,
313 	DAT_INVALID_STATE_EVD_ASYNC, /* Async EVD required */
314 	DAT_INVALID_STATE_IA_IN_USE,
315 	DAT_INVALID_STATE_LMR_IN_USE,
316 	DAT_INVALID_STATE_LMR_FREE,
317 	DAT_INVALID_STATE_PZ_IN_USE,
318 	DAT_INVALID_STATE_PZ_FREE,
319 
320 	/* DAT_INVALID_STATE_SRQ subtypes */
321 	DAT_INVALID_STATE_SRQ_OPERATIONAL,
322 	DAT_INVALID_STATE_SRQ_ERROR,
323 	DAT_INVALID_STATE_SRQ_IN_USE,
324 
325 	/* DAT_LENGTH_ERROR has no subtypes				*/
326 	/* DAT_MODEL_NOT_SUPPORTED has no subtypes			*/
327 
328 	/* DAT_PRIVILEGES_VIOLATION subtypes				*/
329 	DAT_PRIVILEGES_READ,
330 	DAT_PRIVILEGES_WRITE,
331 	DAT_PRIVILEGES_RDMA_READ,
332 	DAT_PRIVILEGES_RDMA_WRITE,
333 
334 	/* DAT_PROTECTION_VIOLATION subtypes				*/
335 	DAT_PROTECTION_READ,
336 	DAT_PROTECTION_WRITE,
337 	DAT_PROTECTION_RDMA_READ,
338 	DAT_PROTECTION_RDMA_WRITE,
339 
340 	/* DAT_QUEUE_EMPTY has no subtypes				*/
341 	/* DAT_QUEUE_FULL has no subtypes				*/
342 	/* DAT_TIMEOUT_EXPIRED has no subtypes				*/
343 	/* DAT_PROVIDER_ALREADY_REGISTERED has no subtypes		*/
344 	/* DAT_PROVIDER_IN_USE has no subtypes				*/
345 
346 	/* DAT_INVALID_ADDRESS subtypes					*/
347 	/*
348 	 * Unsupported addresses - those that are not Malformed,
349 	 * but are incorrect for use in DAT (regardless of local
350 	 * routing capabilities): IPv6 Multicast Addresses (ff/8)
351 	 * IPv4 Broadcast/Multicast Addresses
352 	 */
353 	DAT_INVALID_ADDRESS_UNSUPPORTED,
354 	/*
355 	 * Unreachable addresses - A Provider may know that certain
356 	 * addresses are unreachable immediately. One examples would
357 	 * be an IPv6 addresses on an IPv4-only system. This may also
358 	 * be returned if it is known that there is no route to the
359 	 * host. A Provider is not obligated to check for this
360 	 * condition.
361 	 */
362 	DAT_INVALID_ADDRESS_UNREACHABLE,
363 	/*
364 	 * Malformed addresses -- these cannot be valid in any context.
365 	 * Those listed in RFC1884 section 2.3 as "Reserved" or
366 	 * "Unassigned".
367 	 */
368 	DAT_INVALID_ADDRESS_MALFORMED,
369 
370 	/* DAT_INTERRUPTED_CALL has no subtypes				*/
371 	/* DAT_CONN_QUAL_UNAVAILABLE has no subtypes			*/
372 
373 	/* DAT_PROVIDER_NOT_FOUND subtypes. Erratta to the 1.1 spec	*/
374 	DAT_NAME_NOT_REGISTERED,
375 	DAT_MAJOR_NOT_FOUND,
376 	DAT_MINOR_NOT_FOUND,
377 	DAT_THREAD_SAFETY_NOT_FOUND,
378 
379 	/* DAT_INVALID_PARAMETER Sun specific */
380 	DAT_INVALID_RO_COOKIE
381 
382 } DAT_RETURN_SUBTYPE;
383 
384 #ifdef __cplusplus
385 }
386 #endif
387 
388 #endif /* _DAT_ERROR_H_ */
389