1 /*
2 * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2002-2012 Mellanox Technologies LTD. All rights reserved.
4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5 * Copyright (c) 2009 HNR Consulting. 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_mad_wrapper_t.
40 * This object represents the context wrapper for OpenSM MAD processing.
41 * This object is part of the OpenSM family of objects.
42 */
43
44 #ifndef _OSM_MADW_H_
45 #define _OSM_MADW_H_
46
47 #include <string.h>
48 #include <iba/ib_types.h>
49 #include <complib/cl_qlist.h>
50 #include <complib/cl_dispatcher.h>
51 #include <opensm/osm_base.h>
52 #include <vendor/osm_vendor.h>
53
54 #ifdef __cplusplus
55 # define BEGIN_C_DECLS extern "C" {
56 # define END_C_DECLS }
57 #else /* !__cplusplus */
58 # define BEGIN_C_DECLS
59 # define END_C_DECLS
60 #endif /* __cplusplus */
61
62 BEGIN_C_DECLS
63 /****s* OpenSM: MAD Wrapper/osm_bind_info_t
64 * NAME
65 * osm_bind_info_t
66 *
67 * DESCRIPTION
68 *
69 * SYNOPSIS
70 */
71 typedef struct osm_bind_info {
72 ib_net64_t port_guid;
73 uint8_t mad_class;
74 uint8_t class_version;
75 boolean_t is_responder;
76 boolean_t is_trap_processor;
77 boolean_t is_report_processor;
78 uint32_t send_q_size;
79 uint32_t recv_q_size;
80 uint32_t timeout;
81 uint32_t retries;
82 } osm_bind_info_t;
83 /*
84 * FIELDS
85 * portguid
86 * PortGuid of local port
87 *
88 * mad_class
89 * Mgmt Class ID
90 *
91 * class_version
92 * Mgmt Class version
93 *
94 * is_responder
95 * True if this is a GSI Agent
96 *
97 * is_trap_processor
98 * True if GSI Trap msgs are handled
99 *
100 * is_report_processor
101 * True if GSI Report msgs are handled
102 *
103 * send_q_size
104 * SendQueueSize
105 *
106 * recv_q_size
107 * Receive Queue Size
108 *
109 * timeout
110 * Transaction timeout
111 *
112 * retries
113 * Number of retries for transaction
114 *
115 * SEE ALSO
116 *********/
117
118 /****h* OpenSM/MAD Wrapper
119 * NAME
120 * MAD Wrapper
121 *
122 * DESCRIPTION
123 * The MAD Wrapper object encapsulates the information needed by the
124 * OpenSM to manage individual MADs. The OpenSM allocates one MAD Wrapper
125 * per MAD.
126 *
127 * The MAD Wrapper is not thread safe, thus callers must provide
128 * serialization.
129 *
130 * This object should be treated as opaque and should be
131 * manipulated only through the provided functions.
132 *
133 * AUTHOR
134 * Steve King, Intel
135 *
136 *********/
137
138 /****s* OpenSM: MAD Wrapper/osm_ni_context_t
139 * NAME
140 * osm_ni_context_t
141 *
142 * DESCRIPTION
143 * Context needed by recipient of NodeInfo attribute.
144 *
145 * SYNOPSIS
146 */
147 typedef struct osm_ni_context {
148 ib_net64_t node_guid;
149 uint8_t port_num;
150 ib_net64_t dup_node_guid;
151 uint8_t dup_port_num;
152 unsigned dup_count;
153 } osm_ni_context_t;
154 /*
155 * FIELDS
156 * p_node
157 * Pointer to the node thru which we got to this node.
158 *
159 * p_sw
160 * Pointer to the switch object (if any) of the switch
161 * thru which we got to this node.
162 *
163 * port_num
164 * Port number on the node or switch thru which we got
165 * to this node.
166 *
167 * SEE ALSO
168 *********/
169
170 /****s* OpenSM: MAD Wrapper/osm_pi_context_t
171 * NAME
172 * osm_pi_context_t
173 *
174 * DESCRIPTION
175 * Context needed by recipient of PortInfo attribute.
176 *
177 * SYNOPSIS
178 */
179 typedef struct osm_pi_context {
180 ib_net64_t node_guid;
181 ib_net64_t port_guid;
182 boolean_t set_method;
183 boolean_t light_sweep;
184 boolean_t active_transition;
185 boolean_t client_rereg;
186 } osm_pi_context_t;
187 /*********/
188
189 /****s* OpenSM: MAD Wrapper/osm_gi_context_t
190 * NAME
191 * osm_gi_context_t
192 *
193 * DESCRIPTION
194 * Context needed by recipient of GUIDInfo attribute.
195 *
196 * SYNOPSIS
197 */
198 typedef struct osm_gi_context {
199 ib_net64_t node_guid;
200 ib_net64_t port_guid;
201 boolean_t set_method;
202 uint8_t port_num;
203 } osm_gi_context_t;
204 /*********/
205
206 /****s* OpenSM: MAD Wrapper/osm_nd_context_t
207 * NAME
208 * osm_nd_context_t
209 *
210 * DESCRIPTION
211 * Context needed by recipient of NodeDescription attribute.
212 *
213 * SYNOPSIS
214 */
215 typedef struct osm_nd_context {
216 ib_net64_t node_guid;
217 } osm_nd_context_t;
218 /*********/
219
220 /****s* OpenSM: MAD Wrapper/osm_si_context_t
221 * NAME
222 * osm_si_context_t
223 *
224 * DESCRIPTION
225 * Context needed by recipient of SwitchInfo attribute.
226 *
227 * SYNOPSIS
228 */
229 typedef struct osm_si_context {
230 ib_net64_t node_guid;
231 boolean_t set_method;
232 boolean_t light_sweep;
233 boolean_t lft_top_change;
234 } osm_si_context_t;
235 /*********/
236
237 /****s* OpenSM: MAD Wrapper/osm_lft_context_t
238 * NAME
239 * osm_lft_context_t
240 *
241 * DESCRIPTION
242 * Context needed by recipient of LinearForwardingTable attribute.
243 *
244 * SYNOPSIS
245 */
246 typedef struct osm_lft_context {
247 ib_net64_t node_guid;
248 boolean_t set_method;
249 } osm_lft_context_t;
250 /*********/
251
252 /****s* OpenSM: MAD Wrapper/osm_mft_context_t
253 * NAME
254 * osm_mft_context_t
255 *
256 * DESCRIPTION
257 * Context needed by recipient of MulticastForwardingTable attribute.
258 *
259 * SYNOPSIS
260 */
261 typedef struct osm_mft_context {
262 ib_net64_t node_guid;
263 boolean_t set_method;
264 } osm_mft_context_t;
265 /*********/
266
267 /****s* OpenSM: MAD Wrapper/osm_smi_context_t
268 * NAME
269 * osm_smi_context_t
270 *
271 * DESCRIPTION
272 * Context needed by recipient of SMInfo attribute.
273 *
274 * SYNOPSIS
275 */
276 typedef struct osm_smi_context {
277 ib_net64_t port_guid;
278 boolean_t set_method;
279 boolean_t light_sweep;
280 } osm_smi_context_t;
281 /*********/
282
283 /****s* OpenSM: MAD Wrapper/osm_pkey_context_t
284 * NAME
285 * osm_pkey_context_t
286 *
287 * DESCRIPTION
288 * Context needed by recipient of P_Key attribute.
289 *
290 * SYNOPSIS
291 */
292 typedef struct osm_pkey_context {
293 ib_net64_t node_guid;
294 ib_net64_t port_guid;
295 boolean_t set_method;
296 } osm_pkey_context_t;
297 /*********/
298
299 /****s* OpenSM: MAD Wrapper/osm_slvl_context_t
300 * NAME
301 * osm_slvl_context_t
302 *
303 * DESCRIPTION
304 * Context needed by recipient of PortInfo attribute.
305 *
306 * SYNOPSIS
307 */
308 typedef struct osm_slvl_context {
309 ib_net64_t node_guid;
310 ib_net64_t port_guid;
311 boolean_t set_method;
312 } osm_slvl_context_t;
313 /*********/
314
315 /****s* OpenSM: MAD Wrapper/osm_vla_context_t
316 * NAME
317 * osm_vla_context_t
318 *
319 * DESCRIPTION
320 * Context needed by recipient of VL Arb attribute.
321 *
322 * SYNOPSIS
323 */
324 typedef struct osm_vla_context {
325 ib_net64_t node_guid;
326 ib_net64_t port_guid;
327 boolean_t set_method;
328 } osm_vla_context_t;
329 /*********/
330
331 /****s* OpenSM: MAD Wrapper/osm_perfmgr_context_t
332 * DESCRIPTION
333 * Context for Performance manager queries
334 */
335 typedef struct osm_perfmgr_context {
336 uint64_t node_guid;
337 uint16_t port;
338 uint8_t mad_method; /* was this a get or a set */
339 ib_net16_t mad_attr_id;
340 #ifdef ENABLE_OSM_PERF_MGR_PROFILE
341 struct timeval query_start;
342 #endif
343 } osm_perfmgr_context_t;
344 /*********/
345
346 /****s* OpenSM: MAD Wrapper/osm_cc_context_t
347 * DESCRIPTION
348 * Context for Congestion Control MADs
349 */
350 typedef struct osm_cc_context {
351 ib_net64_t node_guid;
352 ib_net64_t port_guid;
353 uint8_t port;
354 uint8_t mad_method; /* was this a get or a set */
355 ib_net32_t attr_mod;
356 } osm_cc_context_t;
357 /*********/
358
359 #ifndef OSM_VENDOR_INTF_OPENIB
360 /****s* OpenSM: MAD Wrapper/osm_arbitrary_context_t
361 * NAME
362 * osm_arbitrary_context_t
363 *
364 * DESCRIPTION
365 * Context needed by arbitrary recipient.
366 *
367 * SYNOPSIS
368 */
369 typedef struct osm_arbitrary_context {
370 void *context1;
371 void *context2;
372 } osm_arbitrary_context_t;
373 /*********/
374 #endif
375
376 /****s* OpenSM: MAD Wrapper/osm_madw_context_t
377 * NAME
378 * osm_madw_context_t
379 *
380 * DESCRIPTION
381 * Context needed by recipients of MAD responses.
382 *
383 * SYNOPSIS
384 */
385 typedef union _osm_madw_context {
386 osm_ni_context_t ni_context;
387 osm_pi_context_t pi_context;
388 osm_gi_context_t gi_context;
389 osm_nd_context_t nd_context;
390 osm_si_context_t si_context;
391 osm_lft_context_t lft_context;
392 osm_mft_context_t mft_context;
393 osm_smi_context_t smi_context;
394 osm_slvl_context_t slvl_context;
395 osm_pkey_context_t pkey_context;
396 osm_vla_context_t vla_context;
397 osm_perfmgr_context_t perfmgr_context;
398 osm_cc_context_t cc_context;
399 #ifndef OSM_VENDOR_INTF_OPENIB
400 osm_arbitrary_context_t arb_context;
401 #endif
402 } osm_madw_context_t;
403 /*********/
404
405 /****s* OpenSM: MAD Wrapper/osm_mad_addr_t
406 * NAME
407 * osm_mad_addr_t
408 *
409 * DESCRIPTION
410 *
411 * SYNOPSIS
412 */
413 typedef struct osm_mad_addr {
414 ib_net16_t dest_lid;
415 uint8_t path_bits;
416 uint8_t static_rate;
417 union addr_type {
418 struct _smi {
419 ib_net16_t source_lid;
420 uint8_t port_num;
421 } smi;
422
423 struct _gsi {
424 ib_net32_t remote_qp;
425 ib_net32_t remote_qkey;
426 uint16_t pkey_ix;
427 uint8_t service_level;
428 boolean_t global_route;
429 ib_grh_t grh_info;
430 } gsi;
431 } addr_type;
432 } osm_mad_addr_t;
433 /*
434 * FIELDS
435 *
436 * SEE ALSO
437 *********/
438
439 /****s* OpenSM: MAD Wrapper/osm_madw_t
440 * NAME
441 * osm_madw_t
442 *
443 * DESCRIPTION
444 * Context needed for processing individual MADs
445 *
446 * SYNOPSIS
447 */
448 typedef struct osm_madw {
449 cl_list_item_t list_item;
450 osm_bind_handle_t h_bind;
451 osm_vend_wrap_t vend_wrap;
452 osm_mad_addr_t mad_addr;
453 osm_bind_info_t bind_info;
454 osm_madw_context_t context;
455 uint32_t mad_size;
456 ib_api_status_t status;
457 cl_disp_msgid_t fail_msg;
458 boolean_t resp_expected;
459 const ib_mad_t *p_mad;
460 } osm_madw_t;
461 /*
462 * FIELDS
463 * list_item
464 * List linkage for lists. MUST BE FIRST MEMBER!
465 *
466 * h_bind
467 * Bind handle for the port on which this MAD will be sent
468 * or was received.
469 *
470 * vend_wrap
471 * Transport vendor specific context. This structure is not
472 * used outside MAD transport vendor specific code.
473 *
474 * context
475 * Union of controller specific contexts needed for this MAD.
476 * This structure allows controllers to indirectly communicate
477 * with each other through the dispatcher.
478 *
479 * mad_size
480 * Size of this MAD in bytes.
481 *
482 * status
483 * Status of completed operation on the MAD.
484 * CL_SUCCESS if the operation was successful.
485 *
486 * fail_msg
487 * Dispatcher message with which to post this MAD on failure.
488 * This value is set by the originator of the MAD.
489 * If an operation on this MAD fails, for example due to a timeout,
490 * then the transport layer will dispose of the MAD by sending
491 * it through the Dispatcher with this message type. Presumably,
492 * there is a controller listening for the failure message that can
493 * properly clean up.
494 *
495 * resp_expected
496 * TRUE if a response is expected to this MAD.
497 * FALSE otherwise.
498 *
499 * p_mad
500 * Pointer to the wire MAD. The MAD itself cannot be part of the
501 * wrapper, since wire MADs typically reside in special memory
502 * registered with the local HCA.
503 *
504 * SEE ALSO
505 *********/
506
507 /****f* OpenSM: MAD Wrapper/osm_madw_init
508 * NAME
509 * osm_madw_init
510 *
511 * DESCRIPTION
512 * Initializes a MAD Wrapper object for use.
513 *
514 * SYNOPSIS
515 */
osm_madw_init(IN osm_madw_t * p_madw,IN osm_bind_handle_t h_bind,IN uint32_t mad_size,IN const osm_mad_addr_t * p_mad_addr)516 static inline void osm_madw_init(IN osm_madw_t * p_madw,
517 IN osm_bind_handle_t h_bind,
518 IN uint32_t mad_size,
519 IN const osm_mad_addr_t * p_mad_addr)
520 {
521 memset(p_madw, 0, sizeof(*p_madw));
522 p_madw->h_bind = h_bind;
523 p_madw->fail_msg = CL_DISP_MSGID_NONE;
524 p_madw->mad_size = mad_size;
525 if (p_mad_addr)
526 p_madw->mad_addr = *p_mad_addr;
527 p_madw->resp_expected = FALSE;
528 }
529
530 /*
531 * PARAMETERS
532 * p_madw
533 * [in] Pointer to an osm_madw_t object to initialize.
534 *
535 * h_bind
536 * [in] Pointer to the wire MAD.
537 *
538 * p_mad_addr
539 * [in] Pointer to the MAD address structure. This parameter may
540 * be NULL for directed route MADs.
541 *
542 * RETURN VALUES
543 * None.
544 *
545 * NOTES
546 *
547 * SEE ALSO
548 *********/
549
550 /****f* OpenSM: MAD Wrapper/osm_madw_get_smp_ptr
551 * NAME
552 * osm_madw_get_smp_ptr
553 *
554 * DESCRIPTION
555 * Gets a pointer to the SMP in this MAD.
556 *
557 * SYNOPSIS
558 */
osm_madw_get_smp_ptr(IN const osm_madw_t * p_madw)559 static inline ib_smp_t *osm_madw_get_smp_ptr(IN const osm_madw_t * p_madw)
560 {
561 return ((ib_smp_t *) p_madw->p_mad);
562 }
563
564 /*
565 * PARAMETERS
566 * p_madw
567 * [in] Pointer to an osm_madw_t object to initialize.
568 *
569 * RETURN VALUES
570 * Pointer to the start of the SMP MAD.
571 *
572 * NOTES
573 *
574 * SEE ALSO
575 * MAD Wrapper object
576 *********/
577
578 /****f* OpenSM: MAD Wrapper/osm_madw_get_sa_mad_ptr
579 * NAME
580 * osm_madw_get_sa_mad_ptr
581 *
582 * DESCRIPTION
583 * Gets a pointer to the SA MAD in this MAD wrapper.
584 *
585 * SYNOPSIS
586 */
osm_madw_get_sa_mad_ptr(IN const osm_madw_t * p_madw)587 static inline ib_sa_mad_t *osm_madw_get_sa_mad_ptr(IN const osm_madw_t * p_madw)
588 {
589 return ((ib_sa_mad_t *) p_madw->p_mad);
590 }
591
592 /*
593 * PARAMETERS
594 * p_madw
595 * [in] Pointer to an osm_madw_t object.
596 *
597 * RETURN VALUES
598 * Pointer to the start of the SA MAD.
599 *
600 * NOTES
601 *
602 * SEE ALSO
603 * MAD Wrapper object
604 *********/
605
606 /****f* OpenSM: MAD Wrapper/osm_madw_get_perfmgt_mad_ptr
607 * DESCRIPTION
608 * Gets a pointer to the PerfMgt MAD in this MAD wrapper.
609 *
610 * SYNOPSIS
611 */
osm_madw_get_perfmgt_mad_ptr(IN const osm_madw_t * p_madw)612 static inline ib_perfmgt_mad_t *osm_madw_get_perfmgt_mad_ptr(IN const osm_madw_t
613 * p_madw)
614 {
615 return ((ib_perfmgt_mad_t *) p_madw->p_mad);
616 }
617
618 /*
619 * PARAMETERS
620 * p_madw
621 * [in] Pointer to an osm_madw_t object.
622 *
623 * RETURN VALUES
624 * Pointer to the start of the PerfMgt MAD.
625 *
626 * NOTES
627 *
628 * SEE ALSO
629 * MAD Wrapper object
630 *********/
631
632 /****f* OpenSM: MAD Wrapper/osm_madw_get_cc_mad_ptr
633 * DESCRIPTION
634 * Gets a pointer to the Congestion Control MAD in this MAD wrapper.
635 *
636 * SYNOPSIS
637 */
osm_madw_get_cc_mad_ptr(IN const osm_madw_t * p_madw)638 static inline ib_cc_mad_t *osm_madw_get_cc_mad_ptr(IN const osm_madw_t
639 * p_madw)
640 {
641 return ((ib_cc_mad_t *) p_madw->p_mad);
642 }
643
644 /*
645 * PARAMETERS
646 * p_madw
647 * [in] Pointer to an osm_madw_t object.
648 *
649 * RETURN VALUES
650 * Pointer to the start of the Congestion Control MAD.
651 *
652 * NOTES
653 *
654 * SEE ALSO
655 * MAD Wrapper object
656 *********/
657
658 /****f* OpenSM: MAD Wrapper/osm_madw_get_ni_context_ptr
659 * NAME
660 * osm_madw_get_ni_context_ptr
661 *
662 * DESCRIPTION
663 * Gets a pointer to the NodeInfo context in this MAD.
664 *
665 * SYNOPSIS
666 */
osm_madw_get_ni_context_ptr(IN const osm_madw_t * p_madw)667 static inline osm_ni_context_t *osm_madw_get_ni_context_ptr(IN const osm_madw_t
668 * p_madw)
669 {
670 return ((osm_ni_context_t *) & p_madw->context);
671 }
672
673 /*
674 * PARAMETERS
675 * p_madw
676 * [in] Pointer to an osm_madw_t object.
677 *
678 * RETURN VALUES
679 * Pointer to the start of the context structure.
680 *
681 * NOTES
682 *
683 * SEE ALSO
684 *********/
685
686 /****f* OpenSM: MAD Wrapper/osm_madw_get_pi_context_ptr
687 * NAME
688 * osm_madw_get_pi_context_ptr
689 *
690 * DESCRIPTION
691 * Gets a pointer to the PortInfo context in this MAD.
692 *
693 * SYNOPSIS
694 */
osm_madw_get_pi_context_ptr(IN const osm_madw_t * p_madw)695 static inline osm_pi_context_t *osm_madw_get_pi_context_ptr(IN const osm_madw_t
696 * p_madw)
697 {
698 return ((osm_pi_context_t *) & p_madw->context);
699 }
700
701 /*
702 * PARAMETERS
703 * p_madw
704 * [in] Pointer to an osm_madw_t object.
705 *
706 * RETURN VALUES
707 * Pointer to the start of the context structure.
708 *
709 * NOTES
710 *
711 * SEE ALSO
712 *********/
713
714 /****f* OpenSM: MAD Wrapper/osm_madw_get_gi_context_ptr
715 * NAME
716 * osm_madw_get_gi_context_ptr
717 *
718 * DESCRIPTION
719 * Gets a pointer to the GUIDInfo context in this MAD.
720 *
721 * SYNOPSIS
722 */
osm_madw_get_gi_context_ptr(IN const osm_madw_t * p_madw)723 static inline osm_gi_context_t *osm_madw_get_gi_context_ptr(IN const osm_madw_t
724 * p_madw)
725 {
726 return ((osm_gi_context_t *) & p_madw->context);
727 }
728
729 /*
730 * PARAMETERS
731 * p_madw
732 * [in] Pointer to an osm_madw_t object.
733 *
734 * RETURN VALUES
735 * Pointer to the start of the context structure.
736 *
737 * NOTES
738 *
739 * SEE ALSO
740 *********/
741
742 /****f* OpenSM: MAD Wrapper/osm_madw_get_nd_context_ptr
743 * NAME
744 * osm_madw_get_nd_context_ptr
745 *
746 * DESCRIPTION
747 * Gets a pointer to the NodeDescription context in this MAD.
748 *
749 * SYNOPSIS
750 */
osm_madw_get_nd_context_ptr(IN const osm_madw_t * p_madw)751 static inline osm_nd_context_t *osm_madw_get_nd_context_ptr(IN const osm_madw_t
752 * p_madw)
753 {
754 return ((osm_nd_context_t *) & p_madw->context);
755 }
756
757 /*
758 * PARAMETERS
759 * p_madw
760 * [in] Pointer to an osm_madw_t object.
761 *
762 * RETURN VALUES
763 * Pointer to the start of the context structure.
764 *
765 * NOTES
766 *
767 * SEE ALSO
768 *********/
769
770 /****f* OpenSM: MAD Wrapper/osm_madw_get_lft_context_ptr
771 * NAME
772 * osm_madw_get_lft_context_ptr
773 *
774 * DESCRIPTION
775 * Gets a pointer to the LFT context in this MAD.
776 *
777 * SYNOPSIS
778 */
osm_madw_get_lft_context_ptr(IN const osm_madw_t * p_madw)779 static inline osm_lft_context_t *osm_madw_get_lft_context_ptr(IN const
780 osm_madw_t *
781 p_madw)
782 {
783 return ((osm_lft_context_t *) & p_madw->context);
784 }
785
786 /*
787 * PARAMETERS
788 * p_madw
789 * [in] Pointer to an osm_madw_t object.
790 *
791 * RETURN VALUES
792 * Pointer to the start of the context structure.
793 *
794 * NOTES
795 *
796 * SEE ALSO
797 *********/
798
799 /****f* OpenSM: MAD Wrapper/osm_madw_get_mft_context_ptr
800 * NAME
801 * osm_madw_get_mft_context_ptr
802 *
803 * DESCRIPTION
804 * Gets a pointer to the MFT context in this MAD.
805 *
806 * SYNOPSIS
807 */
osm_madw_get_mft_context_ptr(IN const osm_madw_t * p_madw)808 static inline osm_mft_context_t *osm_madw_get_mft_context_ptr(IN const
809 osm_madw_t *
810 p_madw)
811 {
812 return ((osm_mft_context_t *) & p_madw->context);
813 }
814
815 /*
816 * PARAMETERS
817 * p_madw
818 * [in] Pointer to an osm_madw_t object.
819 *
820 * RETURN VALUES
821 * Pointer to the start of the context structure.
822 *
823 * NOTES
824 *
825 * SEE ALSO
826 *********/
827
828 /****f* OpenSM: MAD Wrapper/osm_madw_get_si_context_ptr
829 * NAME
830 * osm_madw_get_si_context_ptr
831 *
832 * DESCRIPTION
833 * Gets a pointer to the SwitchInfo context in this MAD.
834 *
835 * SYNOPSIS
836 */
osm_madw_get_si_context_ptr(IN const osm_madw_t * p_madw)837 static inline osm_si_context_t *osm_madw_get_si_context_ptr(IN const osm_madw_t
838 * p_madw)
839 {
840 return ((osm_si_context_t *) & p_madw->context);
841 }
842
843 /*
844 * PARAMETERS
845 * p_madw
846 * [in] Pointer to an osm_madw_t object.
847 *
848 * RETURN VALUES
849 * Pointer to the start of the context structure.
850 *
851 * NOTES
852 *
853 * SEE ALSO
854 *********/
855
856 /****f* OpenSM: MAD Wrapper/osm_madw_get_smi_context_ptr
857 * NAME
858 * osm_madw_get_smi_context_ptr
859 *
860 * DESCRIPTION
861 * Gets a pointer to the SMInfo context in this MAD.
862 *
863 * SYNOPSIS
864 */
osm_madw_get_smi_context_ptr(IN const osm_madw_t * p_madw)865 static inline osm_smi_context_t *osm_madw_get_smi_context_ptr(IN const
866 osm_madw_t *
867 p_madw)
868 {
869 return ((osm_smi_context_t *) & p_madw->context);
870 }
871
872 /*
873 * PARAMETERS
874 * p_madw
875 * [in] Pointer to an osm_madw_t object.
876 *
877 * RETURN VALUES
878 * Pointer to the start of the context structure.
879 *
880 * NOTES
881 *
882 * SEE ALSO
883 *********/
884
885 /****f* OpenSM: MAD Wrapper/osm_madw_get_pkey_context_ptr
886 * NAME
887 * osm_madw_get_pkey_context_ptr
888 *
889 * DESCRIPTION
890 * Gets a pointer to the P_Key context in this MAD.
891 *
892 * SYNOPSIS
893 */
osm_madw_get_pkey_context_ptr(IN const osm_madw_t * p_madw)894 static inline osm_pkey_context_t *osm_madw_get_pkey_context_ptr(IN const
895 osm_madw_t *
896 p_madw)
897 {
898 return ((osm_pkey_context_t *) & p_madw->context);
899 }
900
901 /*
902 * PARAMETERS
903 * p_madw
904 * [in] Pointer to an osm_madw_t object.
905 *
906 * RETURN VALUES
907 * Pointer to the start of the context structure.
908 *
909 * NOTES
910 *
911 * SEE ALSO
912 *********/
913
914 /****f* OpenSM: MAD Wrapper/osm_madw_get_slvl_context_ptr
915 * NAME
916 * osm_madw_get_slvl_context_ptr
917 *
918 * DESCRIPTION
919 * Gets a pointer to the PortInfo context in this MAD.
920 *
921 * SYNOPSIS
922 */
osm_madw_get_slvl_context_ptr(IN const osm_madw_t * p_madw)923 static inline osm_slvl_context_t *osm_madw_get_slvl_context_ptr(IN const
924 osm_madw_t *
925 p_madw)
926 {
927 return ((osm_slvl_context_t *) & p_madw->context);
928 }
929
930 /*
931 * PARAMETERS
932 * p_madw
933 * [in] Pointer to an osm_madw_t object.
934 *
935 * RETURN VALUES
936 * Pointer to the start of the context structure.
937 *
938 * NOTES
939 *
940 * SEE ALSO
941 *********/
942
943 /****f* OpenSM: MAD Wrapper/osm_madw_get_vla_context_ptr
944 * NAME
945 * osm_madw_get_vla_context_ptr
946 *
947 * DESCRIPTION
948 * Gets a pointer to the Vl Arb context in this MAD.
949 *
950 * SYNOPSIS
951 */
osm_madw_get_vla_context_ptr(IN const osm_madw_t * p_madw)952 static inline osm_vla_context_t *osm_madw_get_vla_context_ptr(IN const
953 osm_madw_t *
954 p_madw)
955 {
956 return ((osm_vla_context_t *) & p_madw->context);
957 }
958
959 /*
960 * PARAMETERS
961 * p_madw
962 * [in] Pointer to an osm_madw_t object.
963 *
964 * RETURN VALUES
965 * Pointer to the start of the context structure.
966 *
967 * NOTES
968 *
969 * SEE ALSO
970 *********/
971
972 #ifndef OSM_VENDOR_INTF_OPENIB
973 /****f* OpenSM: MAD Wrapper/osm_madw_get_arbitrary_context_ptr
974 * NAME
975 * osm_madw_get_arbitrary_context_ptr
976 *
977 * DESCRIPTION
978 * Gets a pointer to the arbitrary context in this MAD.
979 *
980 * SYNOPSIS
981 */
osm_madw_get_arbitrary_context_ptr(IN const osm_madw_t * const p_madw)982 static inline osm_arbitrary_context_t *osm_madw_get_arbitrary_context_ptr(IN
983 const
984 osm_madw_t
985 *
986 const
987 p_madw)
988 {
989 return ((osm_arbitrary_context_t *) & p_madw->context);
990 }
991
992 /*
993 * PARAMETERS
994 * p_madw
995 * [in] Pointer to an osm_madw_t object.
996 *
997 * RETURN VALUES
998 * Pointer to the start of the context structure.
999 *
1000 * NOTES
1001 *
1002 * SEE ALSO
1003 *********/
1004 #endif
1005
1006 /****f* OpenSM: MAD Wrapper/osm_madw_get_vend_ptr
1007 * NAME
1008 * osm_madw_get_vend_ptr
1009 *
1010 * DESCRIPTION
1011 * Gets a pointer to the vendor specific MAD wrapper component.
1012 *
1013 * SYNOPSIS
1014 */
osm_madw_get_vend_ptr(IN const osm_madw_t * p_madw)1015 static inline osm_vend_wrap_t *osm_madw_get_vend_ptr(IN const osm_madw_t *
1016 p_madw)
1017 {
1018 return ((osm_vend_wrap_t *) & p_madw->vend_wrap);
1019 }
1020
1021 /*
1022 * PARAMETERS
1023 * p_madw
1024 * [in] Pointer to an osm_madw_t object.
1025 *
1026 * RETURN VALUES
1027 * Gets a pointer to the vendor specific MAD wrapper component.
1028 *
1029 * NOTES
1030 *
1031 * SEE ALSO
1032 *********/
1033
1034 /****f* OpenSM: MAD Wrapper/osm_madw_get_bind_handle
1035 * NAME
1036 * osm_madw_get_bind_handle
1037 *
1038 * DESCRIPTION
1039 * Returns the bind handle associated with this MAD.
1040 *
1041 * SYNOPSIS
1042 */
1043 static inline osm_bind_handle_t
osm_madw_get_bind_handle(IN const osm_madw_t * p_madw)1044 osm_madw_get_bind_handle(IN const osm_madw_t * p_madw)
1045 {
1046 return ((osm_bind_handle_t) p_madw->h_bind);
1047 }
1048
1049 /*
1050 * PARAMETERS
1051 * p_madw
1052 * [in] Pointer to an osm_madw_t object.
1053 *
1054 * RETURN VALUES
1055 * Returns the bind handle associated with this MAD.
1056 *
1057 * NOTES
1058 *
1059 * SEE ALSO
1060 *********/
1061
1062 /****f* OpenSM: MAD Wrapper/osm_madw_get_mad_addr_ptr
1063 * NAME
1064 * osm_madw_get_mad_addr_ptr
1065 *
1066 * DESCRIPTION
1067 * Returns the mad address structure associated with this MAD.
1068 *
1069 * SYNOPSIS
1070 */
osm_madw_get_mad_addr_ptr(IN const osm_madw_t * p_madw)1071 static inline osm_mad_addr_t *osm_madw_get_mad_addr_ptr(IN const osm_madw_t *
1072 p_madw)
1073 {
1074 return ((osm_mad_addr_t *) & p_madw->mad_addr);
1075 }
1076
1077 /*
1078 * PARAMETERS
1079 * p_madw
1080 * [in] Pointer to an osm_madw_t object.
1081 *
1082 * RETURN VALUES
1083 * Returns the mad address structure associated with this MAD.
1084 *
1085 * NOTES
1086 *
1087 * SEE ALSO
1088 *********/
1089
1090 /****f* OpenSM: MAD Wrapper/osm_madw_get_mad_ptr
1091 * NAME
1092 * osm_madw_get_mad_ptr
1093 *
1094 * DESCRIPTION
1095 * Returns the mad address structure associated with this MAD.
1096 *
1097 * SYNOPSIS
1098 */
osm_madw_get_mad_ptr(IN const osm_madw_t * p_madw)1099 static inline ib_mad_t *osm_madw_get_mad_ptr(IN const osm_madw_t * p_madw)
1100 {
1101 return ((ib_mad_t *) p_madw->p_mad);
1102 }
1103
1104 /*
1105 * PARAMETERS
1106 * p_madw
1107 * [in] Pointer to an osm_madw_t object.
1108 *
1109 * RETURN VALUES
1110 * Returns the mad address structure associated with this MAD.
1111 *
1112 * NOTES
1113 *
1114 * SEE ALSO
1115 *********/
1116
1117 /****f* OpenSM: MAD Wrapper/osm_madw_get_err_msg
1118 * NAME
1119 * osm_madw_get_err_msg
1120 *
1121 * DESCRIPTION
1122 * Returns the message with which to post this mad wrapper if
1123 * an error occurs during processing the mad.
1124 *
1125 * SYNOPSIS
1126 */
osm_madw_get_err_msg(IN const osm_madw_t * p_madw)1127 static inline cl_disp_msgid_t osm_madw_get_err_msg(IN const osm_madw_t * p_madw)
1128 {
1129 return ((cl_disp_msgid_t) p_madw->fail_msg);
1130 }
1131
1132 /*
1133 * PARAMETERS
1134 * p_madw
1135 * [in] Pointer to an osm_madw_t object.
1136 *
1137 * RETURN VALUES
1138 * Returns the message with which to post this mad wrapper if
1139 * an error occurs during processing the mad.
1140 *
1141 * NOTES
1142 *
1143 * SEE ALSO
1144 *********/
1145
1146 /****f* OpenSM: MAD Wrapper/osm_madw_set_mad
1147 * NAME
1148 * osm_madw_set_mad
1149 *
1150 * DESCRIPTION
1151 * Associates a wire MAD with this MAD Wrapper object.
1152 *
1153 * SYNOPSIS
1154 */
osm_madw_set_mad(IN osm_madw_t * p_madw,IN const ib_mad_t * p_mad)1155 static inline void osm_madw_set_mad(IN osm_madw_t * p_madw,
1156 IN const ib_mad_t * p_mad)
1157 {
1158 p_madw->p_mad = p_mad;
1159 }
1160
1161 /*
1162 * PARAMETERS
1163 * p_madw
1164 * [in] Pointer to an osm_madw_t object.
1165 *
1166 * p_mad
1167 * [in] Pointer to the wire MAD to attach to this wrapper.
1168 *
1169 * RETURN VALUES
1170 * None.
1171 *
1172 * NOTES
1173 *
1174 * SEE ALSO
1175 *********/
1176
1177 /****f* OpenSM: MAD Wrapper/osm_madw_copy_context
1178 * NAME
1179 * osm_madw_copy_context
1180 *
1181 * DESCRIPTION
1182 * Copies the controller context from one MAD Wrapper to another.
1183 *
1184 * SYNOPSIS
1185 */
osm_madw_copy_context(IN osm_madw_t * p_dest,IN const osm_madw_t * p_src)1186 static inline void osm_madw_copy_context(IN osm_madw_t * p_dest,
1187 IN const osm_madw_t * p_src)
1188 {
1189 p_dest->context = p_src->context;
1190 }
1191
1192 /*
1193 * PARAMETERS
1194 * p_dest
1195 * [in] Pointer to the destination osm_madw_t object.
1196 *
1197 * p_src
1198 * [in] Pointer to the source osm_madw_t object.
1199 *
1200 * RETURN VALUES
1201 * None.
1202 *
1203 * NOTES
1204 *
1205 * SEE ALSO
1206 *********/
1207
1208 END_C_DECLS
1209 #endif /* _OSM_MADW_H_ */
1210