use crate::bindings::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QpType {
Rc = ibv_qp_type::IBV_QPT_RC as _,
Uc = ibv_qp_type::IBV_QPT_UC as _,
Ud = ibv_qp_type::IBV_QPT_UD as _,
#[cfg(mlnx4)]
Xrc = ibv_qp_type::IBV_QPT_XRC as _,
RawPacket = ibv_qp_type::IBV_QPT_RAW_PACKET as _,
XrcIni = ibv_qp_type::IBV_QPT_XRC_SEND as _,
XrcTgt = ibv_qp_type::IBV_QPT_XRC_RECV as _,
#[cfg(mlnx4)]
DcIni = ibv_qp_type::IBV_EXP_QPT_DC_INI as _,
#[cfg(mlnx5)]
Driver = ibv_qp_type::IBV_QPT_DRIVER as _,
}
#[cfg(mlnx4)]
impl QpType {
const fn is_reliable_impl(self) -> bool {
matches!(self, Self::Rc | Self::Xrc | Self::XrcIni | Self::XrcTgt)
}
const fn is_target_impl(self) -> bool {
!matches!(self, Self::XrcIni | Self::DcIni)
}
}
#[cfg(mlnx5)]
impl QpType {
const fn is_reliable_impl(self) -> bool {
matches!(self, Self::Rc | Self::XrcIni | Self::XrcTgt)
}
const fn is_target_impl(self) -> bool {
!matches!(self, Self::XrcIni)
}
}
impl QpType {
pub const fn is_reliable(self) -> bool {
self.is_reliable_impl()
}
pub const fn is_connected(self) -> bool {
!matches!(self, Self::Ud | Self::RawPacket)
}
pub const fn is_initiator(self) -> bool {
!matches!(self, Self::XrcTgt)
}
pub const fn is_target(self) -> bool {
self.is_target_impl()
}
pub const fn has_fixed_peer(self) -> bool {
matches!(self, Self::Rc | Self::Uc | Self::XrcIni)
}
}
impl From<QpType> for u32 {
fn from(qp_type: QpType) -> Self {
qp_type as _
}
}
impl From<u32> for QpType {
fn from(qp_type: u32) -> Self {
match qp_type {
ibv_qp_type::IBV_QPT_RC => QpType::Rc,
ibv_qp_type::IBV_QPT_UC => QpType::Uc,
ibv_qp_type::IBV_QPT_UD => QpType::Ud,
#[cfg(mlnx4)]
ibv_qp_type::IBV_QPT_XRC => QpType::Xrc,
ibv_qp_type::IBV_QPT_RAW_PACKET => QpType::RawPacket,
ibv_qp_type::IBV_QPT_XRC_SEND => QpType::XrcIni,
ibv_qp_type::IBV_QPT_XRC_RECV => QpType::XrcTgt,
#[cfg(mlnx4)]
ibv_qp_type::IBV_EXP_QPT_DC_INI => QpType::DcIni,
#[cfg(mlnx5)]
ibv_qp_type::IBV_QPT_DRIVER => QpType::Driver,
_ => panic!("unrecognized QP type: {}", qp_type),
}
}
}