Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 766fdbb5 authored by Jeff Layton's avatar Jeff Layton Committed by Steve French
Browse files

cifs: add ability to send an echo request

parent a6827c18
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@
#define SMB_COM_SETATTR               0x09 /* trivial response */
#define SMB_COM_LOCKING_ANDX          0x24 /* trivial response */
#define SMB_COM_COPY                  0x29 /* trivial rsp, fail filename ignrd*/
#define SMB_COM_ECHO                  0x2B /* echo request */
#define SMB_COM_OPEN_ANDX             0x2D /* Legacy open for old servers */
#define SMB_COM_READ_ANDX             0x2E
#define SMB_COM_WRITE_ANDX            0x2F
@@ -760,6 +761,20 @@ typedef struct smb_com_tconx_rsp_ext {
 *
 */

typedef struct smb_com_echo_req {
	struct	smb_hdr hdr;
	__le16	EchoCount;
	__le16	ByteCount;
	char	Data[1];
} __attribute__((packed)) ECHO_REQ;

typedef struct smb_com_echo_rsp {
	struct	smb_hdr hdr;
	__le16	SequenceNumber;
	__le16	ByteCount;
	char	Data[1];
} __attribute__((packed)) ECHO_RSP;

typedef struct smb_com_logoff_andx_req {
	struct smb_hdr hdr;	/* wct = 2 */
	__u8 AndXCommand;
+2 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ extern char *cifs_compose_mount_options(const char *sb_mountdata,
/* extern void renew_parental_timestamps(struct dentry *direntry);*/
extern struct mid_q_entry *AllocMidQEntry(const struct smb_hdr *smb_buffer,
					struct TCP_Server_Info *server);
extern void DeleteMidQEntry(struct mid_q_entry *midEntry);
extern int cifs_call_async(struct TCP_Server_Info *server,
			   struct smb_hdr *in_buf, mid_callback_t *callback,
			   void *cbdata);
@@ -358,6 +359,7 @@ extern int CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
			const __u64 len, struct file_lock *,
			const __u16 lock_type, const bool waitFlag);
extern int CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon);
extern int CIFSSMBEcho(struct TCP_Server_Info *server);
extern int CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses);

extern struct cifsSesInfo *sesInfoAlloc(void);
+47 −0
Original line number Diff line number Diff line
@@ -706,6 +706,53 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
	return rc;
}

/*
 * This is a no-op for now. We're not really interested in the reply, but
 * rather in the fact that the server sent one and that server->lstrp
 * gets updated.
 *
 * FIXME: maybe we should consider checking that the reply matches request?
 */
static void
cifs_echo_callback(struct mid_q_entry *mid)
{
	struct TCP_Server_Info *server = mid->callback_data;

	DeleteMidQEntry(mid);
	atomic_dec(&server->inFlight);
	wake_up(&server->request_q);
}

int
CIFSSMBEcho(struct TCP_Server_Info *server)
{
	ECHO_REQ *smb;
	int rc = 0;

	cFYI(1, "In echo request");

	rc = small_smb_init(SMB_COM_ECHO, 0, NULL, (void **)&smb);
	if (rc)
		return rc;

	/* set up echo request */
	smb->hdr.Tid = cpu_to_le16(0xffff);
	smb->hdr.WordCount = cpu_to_le16(1);
	smb->EchoCount = cpu_to_le16(1);
	smb->ByteCount = cpu_to_le16(1);
	smb->Data[0] = 'a';
	smb->hdr.smb_buf_length += 3;

	rc = cifs_call_async(server, (struct smb_hdr *)smb,
				cifs_echo_callback, server);
	if (rc)
		cFYI(1, "Echo request failed: %d", rc);

	cifs_small_buf_release(smb);

	return rc;
}

int
CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
{
+1 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ AllocMidQEntry(const struct smb_hdr *smb_buffer, struct TCP_Server_Info *server)
	return temp;
}

static void
void
DeleteMidQEntry(struct mid_q_entry *midEntry)
{
#ifdef CONFIG_CIFS_STATS2