0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #ifndef RDMA_USER_CM_H
0035 #define RDMA_USER_CM_H
0036
0037 #include <linux/types.h>
0038 #include <linux/socket.h>
0039 #include <linux/in6.h>
0040 #include <rdma/ib_user_verbs.h>
0041 #include <rdma/ib_user_sa.h>
0042
0043 #define RDMA_USER_CM_ABI_VERSION 4
0044
0045 #define RDMA_MAX_PRIVATE_DATA 256
0046
0047 enum {
0048 RDMA_USER_CM_CMD_CREATE_ID,
0049 RDMA_USER_CM_CMD_DESTROY_ID,
0050 RDMA_USER_CM_CMD_BIND_IP,
0051 RDMA_USER_CM_CMD_RESOLVE_IP,
0052 RDMA_USER_CM_CMD_RESOLVE_ROUTE,
0053 RDMA_USER_CM_CMD_QUERY_ROUTE,
0054 RDMA_USER_CM_CMD_CONNECT,
0055 RDMA_USER_CM_CMD_LISTEN,
0056 RDMA_USER_CM_CMD_ACCEPT,
0057 RDMA_USER_CM_CMD_REJECT,
0058 RDMA_USER_CM_CMD_DISCONNECT,
0059 RDMA_USER_CM_CMD_INIT_QP_ATTR,
0060 RDMA_USER_CM_CMD_GET_EVENT,
0061 RDMA_USER_CM_CMD_GET_OPTION,
0062 RDMA_USER_CM_CMD_SET_OPTION,
0063 RDMA_USER_CM_CMD_NOTIFY,
0064 RDMA_USER_CM_CMD_JOIN_IP_MCAST,
0065 RDMA_USER_CM_CMD_LEAVE_MCAST,
0066 RDMA_USER_CM_CMD_MIGRATE_ID,
0067 RDMA_USER_CM_CMD_QUERY,
0068 RDMA_USER_CM_CMD_BIND,
0069 RDMA_USER_CM_CMD_RESOLVE_ADDR,
0070 RDMA_USER_CM_CMD_JOIN_MCAST
0071 };
0072
0073
0074 enum rdma_ucm_port_space {
0075 RDMA_PS_IPOIB = 0x0002,
0076 RDMA_PS_IB = 0x013F,
0077 RDMA_PS_TCP = 0x0106,
0078 RDMA_PS_UDP = 0x0111,
0079 };
0080
0081
0082
0083
0084 struct rdma_ucm_cmd_hdr {
0085 __u32 cmd;
0086 __u16 in;
0087 __u16 out;
0088 };
0089
0090 struct rdma_ucm_create_id {
0091 __aligned_u64 uid;
0092 __aligned_u64 response;
0093 __u16 ps;
0094 __u8 qp_type;
0095 __u8 reserved[5];
0096 };
0097
0098 struct rdma_ucm_create_id_resp {
0099 __u32 id;
0100 };
0101
0102 struct rdma_ucm_destroy_id {
0103 __aligned_u64 response;
0104 __u32 id;
0105 __u32 reserved;
0106 };
0107
0108 struct rdma_ucm_destroy_id_resp {
0109 __u32 events_reported;
0110 };
0111
0112 struct rdma_ucm_bind_ip {
0113 __aligned_u64 response;
0114 struct sockaddr_in6 addr;
0115 __u32 id;
0116 };
0117
0118 struct rdma_ucm_bind {
0119 __u32 id;
0120 __u16 addr_size;
0121 __u16 reserved;
0122 struct __kernel_sockaddr_storage addr;
0123 };
0124
0125 struct rdma_ucm_resolve_ip {
0126 struct sockaddr_in6 src_addr;
0127 struct sockaddr_in6 dst_addr;
0128 __u32 id;
0129 __u32 timeout_ms;
0130 };
0131
0132 struct rdma_ucm_resolve_addr {
0133 __u32 id;
0134 __u32 timeout_ms;
0135 __u16 src_size;
0136 __u16 dst_size;
0137 __u32 reserved;
0138 struct __kernel_sockaddr_storage src_addr;
0139 struct __kernel_sockaddr_storage dst_addr;
0140 };
0141
0142 struct rdma_ucm_resolve_route {
0143 __u32 id;
0144 __u32 timeout_ms;
0145 };
0146
0147 enum {
0148 RDMA_USER_CM_QUERY_ADDR,
0149 RDMA_USER_CM_QUERY_PATH,
0150 RDMA_USER_CM_QUERY_GID
0151 };
0152
0153 struct rdma_ucm_query {
0154 __aligned_u64 response;
0155 __u32 id;
0156 __u32 option;
0157 };
0158
0159 struct rdma_ucm_query_route_resp {
0160 __aligned_u64 node_guid;
0161 struct ib_user_path_rec ib_route[2];
0162 struct sockaddr_in6 src_addr;
0163 struct sockaddr_in6 dst_addr;
0164 __u32 num_paths;
0165 __u8 port_num;
0166 __u8 reserved[3];
0167 __u32 ibdev_index;
0168 __u32 reserved1;
0169 };
0170
0171 struct rdma_ucm_query_addr_resp {
0172 __aligned_u64 node_guid;
0173 __u8 port_num;
0174 __u8 reserved;
0175 __u16 pkey;
0176 __u16 src_size;
0177 __u16 dst_size;
0178 struct __kernel_sockaddr_storage src_addr;
0179 struct __kernel_sockaddr_storage dst_addr;
0180 __u32 ibdev_index;
0181 __u32 reserved1;
0182 };
0183
0184 struct rdma_ucm_query_path_resp {
0185 __u32 num_paths;
0186 __u32 reserved;
0187 struct ib_path_rec_data path_data[];
0188 };
0189
0190 struct rdma_ucm_conn_param {
0191 __u32 qp_num;
0192 __u32 qkey;
0193 __u8 private_data[RDMA_MAX_PRIVATE_DATA];
0194 __u8 private_data_len;
0195 __u8 srq;
0196 __u8 responder_resources;
0197 __u8 initiator_depth;
0198 __u8 flow_control;
0199 __u8 retry_count;
0200 __u8 rnr_retry_count;
0201 __u8 valid;
0202 };
0203
0204 struct rdma_ucm_ud_param {
0205 __u32 qp_num;
0206 __u32 qkey;
0207 struct ib_uverbs_ah_attr ah_attr;
0208 __u8 private_data[RDMA_MAX_PRIVATE_DATA];
0209 __u8 private_data_len;
0210 __u8 reserved[7];
0211 };
0212
0213 struct rdma_ucm_ece {
0214 __u32 vendor_id;
0215 __u32 attr_mod;
0216 };
0217
0218 struct rdma_ucm_connect {
0219 struct rdma_ucm_conn_param conn_param;
0220 __u32 id;
0221 __u32 reserved;
0222 struct rdma_ucm_ece ece;
0223 };
0224
0225 struct rdma_ucm_listen {
0226 __u32 id;
0227 __u32 backlog;
0228 };
0229
0230 struct rdma_ucm_accept {
0231 __aligned_u64 uid;
0232 struct rdma_ucm_conn_param conn_param;
0233 __u32 id;
0234 __u32 reserved;
0235 struct rdma_ucm_ece ece;
0236 };
0237
0238 struct rdma_ucm_reject {
0239 __u32 id;
0240 __u8 private_data_len;
0241 __u8 reason;
0242 __u8 reserved[2];
0243 __u8 private_data[RDMA_MAX_PRIVATE_DATA];
0244 };
0245
0246 struct rdma_ucm_disconnect {
0247 __u32 id;
0248 };
0249
0250 struct rdma_ucm_init_qp_attr {
0251 __aligned_u64 response;
0252 __u32 id;
0253 __u32 qp_state;
0254 };
0255
0256 struct rdma_ucm_notify {
0257 __u32 id;
0258 __u32 event;
0259 };
0260
0261 struct rdma_ucm_join_ip_mcast {
0262 __aligned_u64 response;
0263 __aligned_u64 uid;
0264 struct sockaddr_in6 addr;
0265 __u32 id;
0266 };
0267
0268
0269 enum {
0270 RDMA_MC_JOIN_FLAG_FULLMEMBER,
0271 RDMA_MC_JOIN_FLAG_SENDONLY_FULLMEMBER,
0272 RDMA_MC_JOIN_FLAG_RESERVED,
0273 };
0274
0275 struct rdma_ucm_join_mcast {
0276 __aligned_u64 response;
0277 __aligned_u64 uid;
0278 __u32 id;
0279 __u16 addr_size;
0280 __u16 join_flags;
0281 struct __kernel_sockaddr_storage addr;
0282 };
0283
0284 struct rdma_ucm_get_event {
0285 __aligned_u64 response;
0286 };
0287
0288 struct rdma_ucm_event_resp {
0289 __aligned_u64 uid;
0290 __u32 id;
0291 __u32 event;
0292 __u32 status;
0293
0294
0295
0296
0297 union {
0298 struct rdma_ucm_conn_param conn;
0299 struct rdma_ucm_ud_param ud;
0300 } param;
0301 __u32 reserved;
0302 struct rdma_ucm_ece ece;
0303 };
0304
0305
0306 enum {
0307 RDMA_OPTION_ID = 0,
0308 RDMA_OPTION_IB = 1
0309 };
0310
0311
0312 enum {
0313 RDMA_OPTION_ID_TOS = 0,
0314 RDMA_OPTION_ID_REUSEADDR = 1,
0315 RDMA_OPTION_ID_AFONLY = 2,
0316 RDMA_OPTION_ID_ACK_TIMEOUT = 3
0317 };
0318
0319 enum {
0320 RDMA_OPTION_IB_PATH = 1
0321 };
0322
0323 struct rdma_ucm_set_option {
0324 __aligned_u64 optval;
0325 __u32 id;
0326 __u32 level;
0327 __u32 optname;
0328 __u32 optlen;
0329 };
0330
0331 struct rdma_ucm_migrate_id {
0332 __aligned_u64 response;
0333 __u32 id;
0334 __u32 fd;
0335 };
0336
0337 struct rdma_ucm_migrate_resp {
0338 __u32 events_reported;
0339 };
0340
0341 #endif