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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_IB_MGT_IBMF_IBMF_MSG_H 28 #define _SYS_IB_MGT_IBMF_IBMF_MSG_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 #define IBMF_MAD_SIZE 0x100 37 38 /* 39 * ibmf_addr definition 40 * This is local address information. 41 * 42 * When used in ibmf_msg_transport, local_lid refers to the (local) sender 43 * and remote_lid/remote_qno refer to the destination (ie., receiver). 44 * When used in async message callback, local_lid is the (local) receiver 45 * and remote_lid/remote_qno refer to the (remote) source; ibmf fills 46 * all fields of the addr_info_t when generating the receive callback. 47 * 48 * Note that the sender and receiver may be on the same node/port. 49 */ 50 typedef struct _ibmf_addr_info { 51 ib_lid_t ia_local_lid; 52 ib_lid_t ia_remote_lid; 53 ib_qpn_t ia_remote_qno; 54 ib_pkey_t ia_p_key; 55 ib_qkey_t ia_q_key; 56 uint8_t ia_service_level:4; 57 } ibmf_addr_info_t; 58 59 /* 60 * ibmf_global_addr_info_t 61 * This has the global address information. This is filled in by the 62 * client when sending the message and will be filled in by IBMF when 63 * a message is received. ip_global_addr_valid is B_TRUE if global 64 * address component of the message is valid (ip_global_addr_valid is 65 * set by the client when sending packets and set by IBMF when packets 66 * are received). 67 */ 68 typedef struct _ibmf_global_addr_info { 69 ib_gid_t ig_sender_gid; /* gid of the sender */ 70 ib_gid_t ig_recver_gid; /* gid of the receiver */ 71 uint32_t ig_flow_label; /* pkt grouping */ 72 uint8_t ig_tclass; /* end-to-end service level */ 73 uint8_t ig_hop_limit; /* inter subnet hops */ 74 } ibmf_global_addr_info_t; 75 76 /* 77 * ibmf_msg_bufs_t 78 * From the client's perspective, the message will consist of three 79 * sections, the MAD header, the Management Class header, and the 80 * data payload. IBMF will either assemble these sections into 81 * a message or disassemble the incoming message into these sections. 82 * 83 * The MAD header buffer is always 24 bytes in length. 84 * It may be set to NULL only when the QP is configured for raw 85 * UD traffic through the flags specified in ibmf_alloc_qp(). 86 * 87 * The class header buffer pointer may point to a buffer containing 88 * the class specific header as defined by the IB Architecture 89 * Specification, rev1.1. Note that the RMPP header should not be 90 * included in the class header for classes that support RMPP. 91 * For example, for the Subnet Administration (SA) class, the class 92 * header starts at byte offset 36 in the MAD and is of length 20 bytes. 93 * 94 * The data is provided in a buffer pointed to by im_bufs_cl_data, 95 * with the data length provided in im_bufs_cl_data_len. 96 * 97 * When sending a MAD message, the client may choose to not provide 98 * a class header buffer in im_msgbufs_send.im_bufs_cl_hdr. 99 * In this case, the im_msgbufs_send.im_bufs_cl_hdr must be NULL, 100 * and IBMF will interpret this to imply that the class header 101 * and data buffer are grouped together in the 102 * im_msgbufs_send.im_bufs_cl_data buffer. 103 * 104 * When sending a RAW UD packet over a non-special QP (i.e. not 105 * IBMF_QP_HANDLE_DEFAULT), the entire packet must be provided 106 * in a buffer pointed to by im_msgbufs_send.im_bufs_cl_data. 107 * The im_msgbufs_send.im_bufs_mad_hdr and 108 * im_msgbufs_send.im_bufs_cl_hdr pointers should be NULL. 109 * 110 * The data contained in these buffers, MAD header, Management Class 111 * header, and data payload buffers, must be in wire format which 112 * is the big-endian format. 113 */ 114 typedef struct _ibmf_msg_bufs { 115 ib_mad_hdr_t *im_bufs_mad_hdr; /* mad hdr (24 bytes) */ 116 void *im_bufs_cl_hdr; /* class hdr buffer ptr */ 117 size_t im_bufs_cl_hdr_len; /* class hdr buffer len ptr */ 118 void *im_bufs_cl_data; /* mad class data buf ptr */ 119 size_t im_bufs_cl_data_len; /* mad class data len ptr */ 120 } ibmf_msg_bufs_t; 121 122 /* 123 * ibmf_msg definition 124 * The IBMF client initializes various members of the msg while sending 125 * the message. IBMF fills in the various members of the msg when a message 126 * is received. 127 * The im_msgbufs_send buffers must always be allocated and freed 128 * by the client of ibmf. Message content passed from client to ibmf 129 * must be through the im_msgbufs_send buffers. 130 * The im_msgbufs_recv buffers must always be allocated and freed 131 * by ibmf. Message content passed from ibmf to client 132 * will always be through the im_msgbufs_recv buffers. 133 * 134 * im_msg_status: contains the IBMF status (defined in ibmf.h) of 135 * the transaction. This is the same as the return value of the 136 * ibmf_msg_transport() call for a blocking transaction. 137 * 138 * im_msg_flags: must be set to IBMF_MSG_FLAGS_GLOBAL_ADDRESS by 139 * the IBMF client if the send buffer contains a valid GRH, and by 140 * IBMF if the receive buffer contains a valid GRH 141 * 142 * Note on Host versus IB Wire format: 143 * Any MAD data passed in the buffers pointed to by im_bufs_mad_hdr, 144 * im_bufs_cl_hdr, and im_bufs_cl_data in im_msgbufs_send and 145 * im_msgbufs_recv should be in IB wire format. 146 * All other data in the ibmf_msg_t structure should be in host format, 147 * including the data in im_local_addr and im_global_addr. 148 */ 149 typedef struct _ibmf_msg { 150 ibmf_addr_info_t im_local_addr; /* local addressing info */ 151 ibmf_global_addr_info_t im_global_addr; /* global addressing info */ 152 int32_t im_msg_status; /* completion status */ 153 uint32_t im_msg_flags; /* flags */ 154 size_t im_msg_sz_limit; /* max. message size */ 155 ibmf_msg_bufs_t im_msgbufs_send; /* input data to ibmf */ 156 ibmf_msg_bufs_t im_msgbufs_recv; /* output data from ibmf */ 157 } ibmf_msg_t; 158 159 #ifdef __cplusplus 160 } 161 #endif 162 163 #endif /* _SYS_IB_MGT_IBMF_IBMF_MSG_H */ 164