如下:
struct ibv_qp_attr {//...uint8_t timeout;uint8_t retry_cnt;uint8_t rnr_retry;//...
};
一:timeout字段
timeout表示等待ACK或NACK的无限时间。
这意味着如果消息中的任何包丢失,并且没有发送ACK或NACK,则不会发生重试,
QP将停止发送数据。
将该字段设置为0时,如果对端没有回复ack或者是nack,那么就不会重新发送了。
验证:
在rxe里,在接收端将这个函数进行注释,则不会回复ack,
此时,无论retry_cnt和rnr_retry无论设置为多少是没有意义的,
没有收到ack,此时由于将接收端的发送函数注释了,所以不会收到ack包,由于此时将timeout设置为0,所以不会将数据进行重新发送。
二:retry_cnt字段
含义:远端没有应答而报告错误之前,QP将尝试重发数据包的总次数。
意思就是对端没有回ack,发送端重新发送数据包的个数,此时注意timeout不要设置为0。
验证:
同样先把接收端的发送函数进行注释。
然后设置该字段的值为5。
qp_attr.retry_cnt = 5;
由于发完第一个包,在指定的时间没有回复ack以后,后面又重新发了5次。
驱动底下是用一个3bit的值表示的,所以最大的值可以给7,给7的意思是重新发送无限次。
三:rnr_retry字段
含义:远程QP在报告错误之前发送RNR NACK时,QP将尝试重发数据包的总次数7为特殊值,表示在RNR情况下重试无限次
这个值是对端给你回复nack包时,你要重新发送数据包的次数,那我们可以模拟一下对端回复nack的情况。
发送端下发write_imm操作,接收端如果没有下发post_recv,那么接收端就会回复nack。
验证:
设置rnr_retry的值。
qp_attr.rnr_retry = 3;
由于对端回复的是nack包,所以在发完第一次以后,后面又重新发了3次。