#define KSMBD_TRANS(t) ((struct ksmbd_transport *)&((t)->transport))
#define SMBD_TRANS(t) ((struct smb_direct_transport *)container_of(t, \
struct smb_direct_transport, transport))
-enum {
- SMB_DIRECT_MSG_NEGOTIATE_REQ = 0,
- SMB_DIRECT_MSG_DATA_TRANSFER
-};
static const struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops;
struct smb_direct_recvmsg {
struct smb_direct_transport *transport;
struct list_head list;
- int type;
struct ib_sge sge;
struct ib_cqe cqe;
bool first_segment;
static int smb_direct_check_recvmsg(struct smb_direct_recvmsg *recvmsg)
{
- switch (recvmsg->type) {
- case SMB_DIRECT_MSG_DATA_TRANSFER: {
+ struct smbdirect_socket *sc = &recvmsg->transport->socket;
+
+ switch (sc->recv_io.expected) {
+ case SMBDIRECT_EXPECT_DATA_TRANSFER: {
struct smbdirect_data_transfer *req =
(struct smbdirect_data_transfer *)recvmsg->packet;
struct smb2_hdr *hdr = (struct smb2_hdr *)(recvmsg->packet
le16_to_cpu(req->credits_requested),
req->data_length, req->remaining_data_length,
hdr->ProtocolId, hdr->Command);
- break;
+ return 0;
}
- case SMB_DIRECT_MSG_NEGOTIATE_REQ: {
+ case SMBDIRECT_EXPECT_NEGOTIATE_REQ: {
struct smbdirect_negotiate_req *req =
(struct smbdirect_negotiate_req *)recvmsg->packet;
ksmbd_debug(RDMA,
128 * 1024)
return -ECONNABORTED;
- break;
+ return 0;
}
- default:
- return -EINVAL;
+ case SMBDIRECT_EXPECT_NEGOTIATE_REP:
+ /* client only */
+ break;
}
- return 0;
+
+ /* This is an internal error */
+ return -EINVAL;
}
static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
ib_dma_sync_single_for_cpu(wc->qp->device, recvmsg->sge.addr,
recvmsg->sge.length, DMA_FROM_DEVICE);
- switch (recvmsg->type) {
- case SMB_DIRECT_MSG_NEGOTIATE_REQ:
+ switch (sc->recv_io.expected) {
+ case SMBDIRECT_EXPECT_NEGOTIATE_REQ:
if (wc->byte_len < sizeof(struct smbdirect_negotiate_req)) {
put_recvmsg(t, recvmsg);
smb_direct_disconnect_rdma_connection(t);
enqueue_reassembly(t, recvmsg, 0);
wake_up_interruptible(&t->wait_status);
return;
- case SMB_DIRECT_MSG_DATA_TRANSFER: {
+ case SMBDIRECT_EXPECT_DATA_TRANSFER: {
struct smbdirect_data_transfer *data_transfer =
(struct smbdirect_data_transfer *)recvmsg->packet;
u32 remaining_data_length, data_offset, data_length;
return;
}
+ case SMBDIRECT_EXPECT_NEGOTIATE_REP:
+ /* client only */
+ break;
}
/*
* This is an internal error!
*/
- WARN_ON_ONCE(recvmsg->type != SMB_DIRECT_MSG_DATA_TRANSFER);
+ WARN_ON_ONCE(sc->recv_io.expected != SMBDIRECT_EXPECT_DATA_TRANSFER);
put_recvmsg(t, recvmsg);
smb_direct_disconnect_rdma_connection(t);
}
if (!recvmsg)
break;
- recvmsg->type = SMB_DIRECT_MSG_DATA_TRANSFER;
recvmsg->first_segment = false;
ret = smb_direct_post_recv(t, recvmsg);
resp->max_receive_size = cpu_to_le32(sp->max_recv_size);
resp->max_fragmented_size =
cpu_to_le32(sp->max_fragmented_recv_size);
+
+ sc->recv_io.expected = SMBDIRECT_EXPECT_DATA_TRANSFER;
}
sendmsg->sge[0].addr = ib_dma_map_single(sc->ib.dev,
static int smb_direct_prepare_negotiation(struct smb_direct_transport *t)
{
+ struct smbdirect_socket *sc = &t->socket;
int ret;
struct smb_direct_recvmsg *recvmsg;
+ sc->recv_io.expected = SMBDIRECT_EXPECT_NEGOTIATE_REQ;
+
recvmsg = get_free_recvmsg(t);
if (!recvmsg)
return -ENOMEM;
- recvmsg->type = SMB_DIRECT_MSG_NEGOTIATE_REQ;
ret = smb_direct_post_recv(t, recvmsg);
if (ret) {