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 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_EXCEPTIONS_H
27 #define	_EXCEPTIONS_H
28 
29 
30 
31 #include <hbaapi.h>
32 #include "Handle.h"
33 #include "HBAPort.h"
34 #include "Trace.h"
35 #include <string>
36 
37 /**
38  * @memo	    Superclass for all Exception we'll throw.
39  *
40  * @doc		    To ensure
41  * no uncaught exceptions squeeze through, all exceptions
42  * will map to some HBA_STATUS error code so we can easily
43  * handle them in catch blocks in our external API.
44  */
45 class HBAException {
46 public:
HBAException(HBA_STATUS err)47     HBAException(HBA_STATUS err) : errorCode(err) {
48 	Trace log("HBAException");
49 	log.debug("Error code: %d", err);
50 	log.stackTrace();
51     }
getErrorCode()52     HBA_STATUS getErrorCode() { return errorCode; }
53 private:
54     HBA_STATUS errorCode;
55 };
56 
57 
58 /**
59  * @memo	    Represents HBA API "Not Supported" error
60  */
61 class NotSupportedException : public HBAException {
62 public:
NotSupportedException()63     NotSupportedException() : HBAException(HBA_STATUS_ERROR_NOT_SUPPORTED) { }
64 };
65 
66 /**
67  * @memo	    Represents HBA API "Invalid Handle" error
68  */
69 class InvalidHandleException : public HBAException {
70 public:
InvalidHandleException()71     InvalidHandleException() : HBAException(HBA_STATUS_ERROR_INVALID_HANDLE) { }
72 };
73 
74 /**
75  * @memo	    Represents HBA API "Bad Argument" error
76 
77  */
78 class BadArgumentException : public HBAException {
79 public:
BadArgumentException()80     BadArgumentException() : HBAException(HBA_STATUS_ERROR_ARG) { }
81 };
82 
83 /**
84  * @memo	    Represents HBA API "Illegal WWN" error
85  */
86 class IllegalWWNException : public HBAException {
87 public:
IllegalWWNException()88     IllegalWWNException() : HBAException(HBA_STATUS_ERROR_ILLEGAL_WWN) { }
89 };
90 
91 /**
92  * @memo	    Represents HBA API "Illegal Index" error
93  */
94 class IllegalIndexException : public HBAException {
95 public:
IllegalIndexException()96     IllegalIndexException() : HBAException(HBA_STATUS_ERROR_ILLEGAL_INDEX) { }
97 };
98 
99 /**
100  * @memo	    Represents HBA API "More Data" error
101  */
102 class MoreDataException : public HBAException {
103 public:
MoreDataException()104     MoreDataException() : HBAException(HBA_STATUS_ERROR_MORE_DATA) { }
105 };
106 
107 /**
108  * @memo	    Represents HBA API "Stale Data" error
109  */
110 class StaleDataException : public HBAException {
111 public:
StaleDataException()112     StaleDataException() : HBAException(HBA_STATUS_ERROR_STALE_DATA) { }
113 };
114 
115 /**
116  * @memo	    Represents HBA API "SCSI Check Condition" error
117  */
118 class CheckConditionException : public HBAException {
119 public:
CheckConditionException()120     CheckConditionException() : HBAException(HBA_STATUS_SCSI_CHECK_CONDITION) { }
121 };
122 
123 /**
124  * @memo	    Represents HBA API "Busy" error
125  */
126 class BusyException : public HBAException {
127 public:
BusyException()128     BusyException() : HBAException(HBA_STATUS_ERROR_BUSY) { }
129 };
130 
131 /**
132  * @memo	    Represents HBA API "Try Again" error
133  */
134 class TryAgainException : public HBAException {
135 public:
TryAgainException()136     TryAgainException() : HBAException(HBA_STATUS_ERROR_TRY_AGAIN) { }
137 };
138 
139 /**
140  * @memo	    Represents HBA API "Unavailable" error
141  */
142 class UnavailableException : public HBAException {
143 public:
UnavailableException()144     UnavailableException() : HBAException(HBA_STATUS_ERROR_UNAVAILABLE) { }
145 };
146 
147 /**
148  * @memo	    Represents HBA API "ELS Rejection" error
149  */
150 class ELSRejectException : public HBAException {
151 public:
ELSRejectException()152     ELSRejectException() : HBAException(HBA_STATUS_ERROR_ELS_REJECT) { }
153 };
154 
155 /**
156  * @memo	    Represents HBA API "Invalid Logical Unit Number" error
157  */
158 class InvalidLUNException : public HBAException {
159 public:
InvalidLUNException()160     InvalidLUNException() : HBAException(HBA_STATUS_ERROR_INVALID_LUN) { }
161 };
162 
163 /**
164  * @memo	    Represents HBA API "Incompatible" error
165  */
166 class IncompatibleException : public HBAException {
167 public:
IncompatibleException()168     IncompatibleException() : HBAException(HBA_STATUS_ERROR_INCOMPATIBLE) { }
169 };
170 
171 /**
172  * @memo	    Represents HBA API "Ambiguous WWN" error
173  */
174 class AmbiguousWWNException : public HBAException {
175 public:
AmbiguousWWNException()176     AmbiguousWWNException() : HBAException(HBA_STATUS_ERROR_AMBIGUOUS_WWN) { }
177 };
178 
179 /**
180  * @memo	    Represents HBA API "Not a Target" error
181  */
182 class NotATargetException : public HBAException {
183 public:
NotATargetException()184     NotATargetException() : HBAException(HBA_STATUS_ERROR_NOT_A_TARGET) { }
185 };
186 
187 /**
188  * @memo	    Represents HBA API "Unsupported FC4 type" error
189  */
190 class UnsupportedFC4Exception : public HBAException {
191 public:
UnsupportedFC4Exception()192     UnsupportedFC4Exception() : HBAException(HBA_STATUS_ERROR_UNSUPPORTED_FC4) { }
193 };
194 
195 /**
196  * @memo	    Represents HBA API "Incapable" error
197  */
198 class IncapableException : public HBAException {
199 public:
IncapableException()200     IncapableException() : HBAException(HBA_STATUS_ERROR_INCAPABLE) { }
201 };
202 
203 /**
204  * @memo	    Encapsulate I/O error scenarios.
205  *
206  * @doc		    If logging is enabled, this will
207  * automatically log the failure with as much detail as possible.
208  */
209 class IOError : public HBAException {
210 public:
211     IOError(std::string message);
212     IOError(Handle *handle);
213     IOError(HBAPort *port);
214     IOError(HBAPort *port, uint64_t target);
215     IOError(HBAPort *port, uint64_t target, uint64_t lun);
216 };
217 
218 /**
219  * @memo	    Generic error of unknown type
220  *
221  * @doc
222  * Grab bag for something catastrophic occuring in the internal
223  * logic of the VSL.  Hopefully, this should never ever happen.
224  */
225 class InternalError : public HBAException {
226 public:
227     InternalError();
228     InternalError(std::string message);
229 };
230 
231 #endif /* _EXCEPTIONS_H */
232