mod handle;
mod sslot;
use std::array;
use std::collections::VecDeque;
use std::net::SocketAddr;
use rrddmma::rdma::qp::{Qp, QpPeer};
pub use self::handle::*;
pub(crate) use self::sslot::*;
use crate::msgbuf::MsgBuf;
use crate::pkthdr::PacketHeader;
use crate::rpc::RpcInterior;
use crate::type_alias::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum SessionRole {
Client,
Server,
}
pub(crate) struct PendingRequest {
pub pkthdr: PacketHeader,
pub req: MsgBuf,
pub resp: MsgBuf,
pub expected_req_idx: ReqIdx,
pub aborted: bool,
}
pub(crate) const ACTIVE_REQ_WINDOW: usize = 8;
pub(crate) struct Session {
role: SessionRole,
pub connected: Option<bool>,
pub peer_uri: SocketAddr,
pub peer_rpc_id: RpcId,
pub peer_sess_id: SessId,
pub peer: Option<QpPeer>,
pub rc_qp: Qp,
pub slots: Box<[SSlot; ACTIVE_REQ_WINDOW]>,
pub avail_slots: VecDeque<usize>,
pub req_backlog: [VecDeque<PendingRequest>; ACTIVE_REQ_WINDOW],
}
impl Session {
pub fn new(state: &mut RpcInterior, role: SessionRole, rc_qp: Qp) -> Self {
let initial_psn_base = match role {
SessionRole::Client => ACTIVE_REQ_WINDOW,
SessionRole::Server => 0,
};
let slots = array::from_fn(|i| SSlot::new(state, role, (i + initial_psn_base) as _));
Self {
role,
connected: Some(false),
peer_uri: SocketAddr::from(([0, 0, 0, 0], 0)),
peer_rpc_id: 0,
peer_sess_id: 0,
peer: None,
rc_qp,
slots: Box::new(slots),
avail_slots: (0..ACTIVE_REQ_WINDOW).collect(),
req_backlog: array::from_fn(|_| VecDeque::new()),
}
}
#[inline(always)]
pub fn is_client(&self) -> bool {
self.role == SessionRole::Client
}
#[inline(always)]
pub fn is_connected(&self) -> bool {
self.connected.unwrap_or(false)
}
}