There are two types of buffer passed to write(2) destined for the 'sol_ucma' driver, they are a) commands with no response, and b) commands with a response. The format of each is: Command with response: --------------------- uint32_t "cmd" uint16_t in uint16_t out struct "cmd struct" struct "response struct" Where "cmd" is one of: RDMA_USER_CM_CMD_CREATE_ID RDMA_USER_CM_CMD_DESTROY_ID RDMA_USER_CM_CMD_QUERY_ROUTE RDMA_USER_CM_CMD_INIT_QP_ATTR RDMA_USER_CM_CMD_JOIN_MCAST RDMA_USER_CM_CMD_LEAVE_MCAST RDMA_USER_CM_CMD_GET_EVENT "cmd struct" is one of: 'rdma_ucm_create_id' /* RDMA_USER_CM_CMD_CREATE_ID */ uint64_t uid uint64_t response /* address of "response struct" */ int16_t ps uiint8_t reserved[6] 'rdma_ucm_destroy_id' /* RDMA_USER_CM_CMD_DESTROY_ID | RDMA_USER_CM_CMD_LEAVE_MCAST */ uint64_t response /* address of "response struct" */ uint32_t id uint32_t reserved 'rdma_ucm_query_route' /* RDMA_USER_CM_CMD_QUERY_ROUTE */ uint64_t response /* address of "response struct" */ uint32_t id uint32_t reserved 'rdma_ucm_init_qp_attr' /* RDMA_USER_CM_CMD_INIT_QP_ATTR */ uint64_t response /* address of "response struct" */ uint32_t id uint32_t qp_state 'rdma_ucm_join_mcast' /* RDMA_USER_CM_CMD_JOIN_MCAST */ uint64_t response /* address of "response struct" */ uint64_t uid sockaddr_t addr uint32_t id uint32_t reserved 'rdma_ucm_get_event' /* RDMA_USER_CM_CMD_GET_EVENT */ uint64_t response /* address of "response struct" */ "response struct" is one of: 'rdma_ucm_create_id_resp' /* RDMA_USER_CM_CMD_CREATE_ID | UCMA_CMD_JOIN_MCAST */ uint32_t id 'rdma_ucm_destroy_id_resp' /* UCMA_CMD_DESTROY_ID | UCMA_CMD_LEAVE_MCAST */ uint32_t events_reported 'rdma_ucm_query_route_resp' /* UCMA_CMD_QUERY_ROUTE */ uint64_t node_guid struct ib_user_path_rec ib_route[2] sockaddr_t src_addr sockaddr_t dst_addr uint32_t num_paths uint8_t port_num uint8_t reserved[3] Where ib_user_path_rec is: uint8_t dgid[16]; uint8_t sgid[16]; uint16_t dlid; uint16_t slid; uint32_t raw_traffic; uint32_t flow_label; uint32_t reversible; uint32_t mtu; uint16_t pkey; uint8_t hop_limit; uint8_t traffic_class; uint8_t numb_path; uint8_t sl; uint8_t mtu_selector; uint8_t rate_selector; uint8_t rate; uint8_t packet_life_time_selector; uint8_t packet_life_time; uint8_t preference; 'ib_uverbs_qp_attr' /* UCMA_CMD_INIT_QP_ATTR */ uint32_t qp_attr_mask; uint32_t qp_state; uint32_t cur_qp_state; uint32_t path_mtu; uint32_t path_mig_state; uint32_t qkey; uint32_t rq_psn; uint32_t sq_psn; uint32_t dest_qp_num; uint32_t qp_access_flags; struct ib_uverbs_ah_attr ah_attr; struct ib_uverbs_ah_attr alt_ah_attr; uint32_t max_send_wr; uint32_t max_recv_wr; uint32_t max_send_sge; uint32_t max_recv_sge; uint32_t max_inline_data; uint16_t pkey_index; uint16_t alt_pkey_index; uint8_t en_sqd_async_notify; uint8_t sq_draining; uint8_t max_rd_atomic; uint8_t max_dest_rd_atomic; uint8_t min_rnr_timer; uint8_t port_num; uint8_t timeout; uint8_t retry_cnt; uint8_t rnr_retry; uint8_t alt_port_num; uint8_t alt_timeout; uint8_t reserved[5]; Where ib_uverbs_ah_attr is: struct ib_uverbs_global_route grh; uint16_t dlid; uint8_t sl; uint8_t src_path_bits; uint8_t static_rate; uint8_t is_global; uint8_t port_num; uint8_t reserved; And ib_uverbs_global_route is: uint8_t dgid[16]; uint32_t flow_label; uint8_t sgid_index; uint8_t hop_limit; uint8_t traffic_class; uint8_t reserved; rdma_ucm_event_resp /* UCMA_CMD_GET_EVENT */ uint64_t uid uint32_t id uint32_t event uint32_t status union { struct rdma_ucm_conn_param conn; struct rdma_ucm_ud_param ud; } param; Where rdma_ucm_conn_param is: uint32_t qp_num; uint32_t reserved; uint8_t private_data[RDMA_MAX_PRIVATE_DATA]; uint8_t private_data_len; uint8_t srq; uint8_t responder_resources; uint8_t initiator_depth; uint8_t flow_control; uint8_t retry_count; uint8_t rnr_retry_count; uint8_t valid; And rdma_ucm_ud_param is: uint32_t qp_num; uint32_t qkey; struct ib_uverbs_ah_attr ah_attr; uint8_t private_data[RDMA_MAX_PRIVATE_DATA]; uint8_t private_data_len; uint8_t reserved[7]; uint8_t reserved2[4]; Command with no response: ------------------------- uint32_t "cmd" uint16_t in uint16_t out struct "cmd struct" Where "cmd" is one of: RDMA_USER_CM_CMD_BIND_ADDR RDMA_USER_CM_CMD_RESOLVE_ADDR RDMA_USER_CM_CMD_RESOLVE_ROUTE RDMA_USER_CM_CMD_CONNECT RDMA_USER_CM_CMD_LISTEN RDMA_USER_CM_CMD_ACCEPT RDMA_USER_CM_CMD_REJECT RDMA_USER_CM_CMD_NOTIFY RDMA_USER_CM_CMD_DISCONNECT RDMA_USER_CM_CMD_SET_OPTION "cmd struct" is one of: 'rdma_ucm_bind_addr' /* RDMA_USER_CM_CMD_BIND_ADDR*/ uint64_t response sockaddr_t addr uint32_t reserved 'rdma_ucm_resolve_addr' /* RDMA_USER_CM_CMD_RESOLVE_ADDR */ sockaddr_t src_addr; sockaddr_t dst_addr; uint32_t id; uint32_t timeout_ms; 'rdma_ucm_resolve_route' /* RDMA_USER_CM_CMD_RESOLVE_ROUTE */ uint32_t id; uint32_t timeout_ms; 'rdma_ucm_connect' /* RDMA_USER_CM_CMD_CONNECT */ struct rdma_ucm_conn_param conn_param; uint32_t id; uint32_t reserved; Where rdma_ucm_conn_param is: uint32_t qp_num; uint32_t reserved; uint8_t private_data[RDMA_MAX_PRIVATE_DATA]; uint8_t private_data_len; uint8_t srq; uint8_t responder_resources; uint8_t initiator_depth; uint8_t flow_control; uint8_t retry_count; uint8_t rnr_retry_count; uint8_t valid; 'rdma_ucm_listen' /* RDMA_USER_CM_CMD_LISTEN */ uint32_t id; uint32_t backlog; 'rdma_ucm_accept' /* RDMA_USER_CM_CMD_ACCEPT */ uint64_t uid; struct rdma_ucm_conn_param conn_param uint32_t id; uint32_t reserved; 'rdma_ucm_reject' /* RDMA_USER_CM_CMD_REJECT */ uint32_t id; uint8_t private_data_len; uint8_t reserved[3]; uint8_t private_data[RDMA_MAX_PRIVATE_DATA]; 'rdma_ucm_notify' /* RDMA_USER_CM_CMD_NOTIFY */ uint32_t id; uint32_t event; 'rdma_ucm_disconnect' /* RDMA_USER_CM_CMD_DISCONNECT */ uint32_t id; 'rdma_ucm_set_option' /* RDMA_USER_CM_CMD_SET_OPTION */ uint64_t optval; uint32_t id; uint32_t level; uint32_t optname; uint32_t optlen;