在rdma-post_send这篇文章当中关于这个opcode是IBV_WR_RDMA_WRITE_WITH_IMM的描述是这样的:
IBV_WR_RDMA_WRITE_WITH_IMM -
Same as IBV_WR_RDMA_WRITE, but Receive Request will be consumed from the head of remote QP’s Receive Queue and immediate data will be sent in the message. This value will be available in the Work Completion that will be generated for the consumed Receive Request in the remote QP。
主要区别点有两个,这个是对于接收端而言。
(1)需要下发post_recv,但是下发是post_recv当中的sge的地址可以是空,sge个数可以是0。
wr.sg_list = NULL;
wr.num_sge = 0;
(2)可以带即时数据,
wr.imm_data = htonl(len);
并且poll_cq时,有返回,在这篇文章当中对于poll_cq时,
对于IBV_WC_RECV_RDMA_WITH_IMM的描述是这样的,也就是说并不需要sge,所以下发的sge,可以是NULL,个数可以是0。
rdma-poll_cq
IBV_WC_RECV_RDMA_WITH_IMM - RDMA with immediate for a WR that was posted to a Receive Queue (of a QP or to an SRQ). For this opcode, only a Receive Request was consumed and the sg_list of this RR wasn’t used
代码,验证。伪代码,实际的rkey和addr已经通过socket交换。
client
void chat()
{
memcpy(ib_res.buf, MSG_WRITE, sizeof(MSG_WRITE));
printf("client: %ld, %d\n", remote_key.remote_addr, remote_key.rkey);
post_send_write_imm(remote_key, BUFFER_SIZE);
wait_completions(READ_WRID); //IBV_WC_RDMA_WRITE
}
server
void chat()
{
post_recv(BUFFER_SIZE);
wait_completions(RECV_WRID);//IBV_WC_RECV_RDMA_WITH_IMM
printf("%s\n", (char*)ib_res.buf);
}
报文格式: