1 /*
2  * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
6  *
7  * This software is available to you under a choice of one of two
8  * licenses.  You may choose to be licensed under the terms of the GNU
9  * General Public License (GPL) Version 2, available from the file
10  * COPYING in the main directory of this source tree, or the
11  * OpenIB.org BSD license below:
12  *
13  *     Redistribution and use in source and binary forms, with or
14  *     without modification, are permitted provided that the following
15  *     conditions are met:
16  *
17  *      - Redistributions of source code must retain the above
18  *        copyright notice, this list of conditions and the following
19  *        disclaimer.
20  *
21  *      - Redistributions in binary form must reproduce the above
22  *        copyright notice, this list of conditions and the following
23  *        disclaimer in the documentation and/or other materials
24  *        provided with the distribution.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33  * SOFTWARE.
34  *
35  */
36 
37 /*
38  * Abstract:
39  * 	Declaration of osm_inform_rec_t.
40  *	This object represents an IBA Inform Record.
41  *	This object is part of the OpenSM family of objects.
42  *
43  * Author:
44  *    Eitan Zahavi, Mellanox
45  */
46 
47 #ifndef _OSM_INFR_H_
48 #define _OSM_INFR_H_
49 
50 #include <iba/ib_types.h>
51 #include <complib/cl_qmap.h>
52 #include <complib/cl_spinlock.h>
53 #include <opensm/osm_subnet.h>
54 #include <opensm/osm_madw.h>
55 #include <opensm/osm_log.h>
56 #include <opensm/osm_sa.h>
57 
58 #ifdef __cplusplus
59 #  define BEGIN_C_DECLS extern "C" {
60 #  define END_C_DECLS   }
61 #else				/* !__cplusplus */
62 #  define BEGIN_C_DECLS
63 #  define END_C_DECLS
64 #endif				/* __cplusplus */
65 
66 BEGIN_C_DECLS
67 /****h* OpenSM/Inform Record
68 * NAME
69 *	Inform Record
70 *
71 * DESCRIPTION
72 *	The Inform record encapsulates the information needed by the
73 *	SA to manage InformInfo registrations and sending Reports(Notice)
74 *	when SM receives Traps for registered LIDs.
75 *
76 *	The inform records is not thread safe, thus callers must provide
77 *	serialization.
78 *
79 *	This object should be treated as opaque and should be
80 *	manipulated only through the provided functions.
81 *
82 * AUTHOR
83 *    Eitan Zahavi, Mellanox
84 *
85 *********/
86 /****s* OpenSM: Inform Record/osm_infr_t
87 * NAME
88 *	osm_infr_t
89 *
90 * DESCRIPTION
91 *	Inform Record structure.
92 *
93 *	The osm_infr_t object should be treated as opaque and should
94 *	be manipulated only through the provided functions.
95 *
96 * SYNOPSIS
97 */
98 typedef struct osm_infr {
99 	cl_list_item_t list_item;
100 	osm_bind_handle_t h_bind;
101 	osm_sa_t *sa;
102 	osm_mad_addr_t report_addr;
103 	ib_inform_info_record_t inform_record;
104 } osm_infr_t;
105 /*
106 * FIELDS
107 *	list_item
108 *		List Item for qlist linkage.  Must be first element!!
109 *
110 *	h_bind
111 *		A handle of lower level mad srvc
112 *
113 *	sa
114 *		A pointer to osm_sa object
115 *
116 *	report_addr
117 *		Report address
118 *
119 *	inform_record
120 *		The Inform Info Record
121 *
122 * SEE ALSO
123 *********/
124 
125 /****f* OpenSM: Inform Record/osm_infr_new
126 * NAME
127 *	osm_infr_new
128 *
129 * DESCRIPTION
130 *	Allocates and initializes a Inform Record for use.
131 *
132 * SYNOPSIS
133 */
134 osm_infr_t *osm_infr_new(IN const osm_infr_t * p_infr_rec);
135 /*
136 * PARAMETERS
137 *	p_inf_rec
138 *		[in] Pointer to IB Inform Record
139 *
140 * RETURN VALUES
141 *	pointer to osm_infr_t structure.
142 *
143 * NOTES
144 *	Allows calling other inform record methods.
145 *
146 * SEE ALSO
147 *	Inform Record, osm_infr_delete
148 *********/
149 
150 /****f* OpenSM: Inform Record/osm_infr_delete
151 * NAME
152 *	osm_infr_delete
153 *
154 * DESCRIPTION
155 *	Destroys and deallocates the osm_infr_t structure.
156 *
157 * SYNOPSIS
158 */
159 void osm_infr_delete(IN osm_infr_t * p_infr);
160 /*
161 * PARAMETERS
162 *	p_infr
163 *		[in] Pointer to osm_infr_t structure
164 *
165 * SEE ALSO
166 *	Inform Record, osm_infr_new
167 *********/
168 
169 /****f* OpenSM: Inform Record/osm_infr_get_by_rec
170 * NAME
171 *	osm_infr_get_by_rec
172 *
173 * DESCRIPTION
174 *	Find a matching osm_infr_t in the subnet DB by inform_info_record
175 *
176 * SYNOPSIS
177 */
178 osm_infr_t *osm_infr_get_by_rec(IN osm_subn_t const *p_subn,
179 				IN osm_log_t * p_log,
180 				IN osm_infr_t * p_infr_rec);
181 /*
182 * PARAMETERS
183 *	p_subn
184 *		[in] Pointer to the subnet object
185 *
186 *	p_log
187 *		[in] Pointer to the log object
188 *
189 *	p_inf_rec
190 *		[in] Pointer to an inform_info record
191 *
192 * RETURN
193 *	The matching osm_infr_t
194 * SEE ALSO
195 *	Inform Record, osm_infr_new, osm_infr_delete
196 *********/
197 
198 void osm_infr_insert_to_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log,
199 			   IN osm_infr_t * p_infr);
200 
201 void osm_infr_remove_from_db(IN osm_subn_t * p_subn, IN osm_log_t * p_log,
202 			     IN osm_infr_t * p_infr);
203 
204 /****f* OpenSM: Inform Record/osm_infr_remove_subscriptions
205 * NAME
206 *	osm_infr_remove_subscriptions
207 *
208 * DESCRIPTION
209 *	Remove all event subscriptions of a port
210 *
211 * SYNOPSIS
212 */
213 ib_api_status_t
214 osm_infr_remove_subscriptions(IN osm_subn_t * p_subn, IN osm_log_t * p_log,
215 			      IN ib_net64_t port_guid);
216 /*
217 * PARAMETERS
218 *	p_subn
219 *		[in] Pointer to the subnet object
220 *
221 *	p_log
222 *		[in] Pointer to the log object
223 *
224 *	port_guid
225 *		[in] PortGUID of the subscriber that should be removed
226 *
227 * RETURN
228 *	CL_SUCCESS if port_guid had any subscriptions being removed
229 *	CL_NOT_FOUND if port_guid did not have any active subscriptions
230 * SEE ALSO
231 *********/
232 
233 /****f* OpenSM: Inform Record/osm_report_notice
234 * NAME
235 *	osm_report_notice
236 *
237 * DESCRIPTION
238 * Once a Trap was received by the osm_trap_rcv, or a Trap sourced in
239 * the SM was sent (Traps 64-67) this routine is called with a copy of
240 * the notice data.
241 * Given a notice attribute - compare and see if it matches the InformInfo
242 * Element and if it does - call the Report(Notice) for the
243 * target QP registered by the address stored in the InformInfo element
244 *
245 * SYNOPSIS
246 */
247 ib_api_status_t osm_report_notice(IN osm_log_t * p_log, IN osm_subn_t * p_subn,
248 				  IN ib_mad_notice_attr_t * p_ntc);
249 /*
250 * PARAMETERS
251 *	p_rcv
252 *		[in] Pointer to the trap receiver
253 *
254 *	p_ntc
255 *		[in] Pointer to a copy of the incoming trap notice attribute.
256 *
257 * RETURN
258 *	IB_SUCCESS on good completion
259 *
260 * SEE ALSO
261 *	Inform Record, osm_trap_rcv
262 *********/
263 
264 END_C_DECLS
265 #endif				/* _OSM_INFR_H_ */
266