summaryrefslogtreecommitdiffstats
path: root/src/kernel/net-txrx.c
diff options
context:
space:
mode:
authorFrederic Robra2019-11-14 15:18:32 +0100
committerFrederic Robra2019-11-14 15:18:32 +0100
commitfff87d1c3e19c0a24a3b0d4cff3e9a8f6f140e34 (patch)
tree54de680b694fb5a8b7ea02821f95d1fe8e530127 /src/kernel/net-txrx.c
parentbug when sending and release at the same time (diff)
downloaddnbd3-ng-fff87d1c3e19c0a24a3b0d4cff3e9a8f6f140e34.tar.gz
dnbd3-ng-fff87d1c3e19c0a24a3b0d4cff3e9a8f6f140e34.tar.xz
dnbd3-ng-fff87d1c3e19c0a24a3b0d4cff3e9a8f6f140e34.zip
added check for rid and discovery now takes bigger test block
Diffstat (limited to 'src/kernel/net-txrx.c')
-rw-r--r--src/kernel/net-txrx.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/src/kernel/net-txrx.c b/src/kernel/net-txrx.c
index 3a9b057..82f7408 100644
--- a/src/kernel/net-txrx.c
+++ b/src/kernel/net-txrx.c
@@ -45,7 +45,7 @@
#define dnbd3_test_block_to_req(req) \
do { \
(req)->cmd_flags = REQ_OP_READ; \
- (req)->__data_len = RTT_BLOCK_SIZE; \
+ (req)->__data_len = RTT_TEST_BLOCK_SIZE; \
(req)->__sector = 0; \
} while (0)
@@ -270,38 +270,38 @@ int dnbd3_receive_cmd(struct dnbd3_sock *sock, dnbd3_reply_t *reply)
return result;
}
-static int dnbd3_clear_socket(struct dnbd3_sock *sock, dnbd3_reply_t *reply,
- int remaining)
-{
- int result = 0;
- char *buf;
- struct kvec iov;
- struct msghdr msg;
- dnbd3_init_msghdr(msg);
- warn_sock(sock, "clearing socket %d bytes", remaining);
- buf = kmalloc(RTT_BLOCK_SIZE, GFP_KERNEL);
- if (!buf) {
- error_sock(sock, "kmalloc failed");
- return -EIO;
- }
- iov.iov_base = buf;
- iov.iov_len = RTT_BLOCK_SIZE;
- while (remaining > 0) {
- result = kernel_recvmsg(sock->sock, &msg, &iov, 1, iov.iov_len,
- msg.msg_flags);
- if (result <= 0) {
- goto error;
- }
- remaining -= result;
- }
-
- debug_sock(sock, "cleared socket");
-error:
- if (buf) {
- kfree(buf);
- }
- return result;
-}
+//static int dnbd3_clear_socket(struct dnbd3_sock *sock, dnbd3_reply_t *reply,
+// int remaining)
+//{
+// int result = 0;
+// char *buf;
+// struct kvec iov;
+// struct msghdr msg;
+// dnbd3_init_msghdr(msg);
+// warn_sock(sock, "clearing socket %d bytes", remaining);
+// buf = kmalloc(RTT_BLOCK_SIZE, GFP_KERNEL);
+// if (!buf) {
+// error_sock(sock, "kmalloc failed");
+// return -EIO;
+// }
+// iov.iov_base = buf;
+// iov.iov_len = RTT_BLOCK_SIZE;
+// while (remaining > 0) {
+// result = kernel_recvmsg(sock->sock, &msg, &iov, 1, iov.iov_len,
+// msg.msg_flags);
+// if (result <= 0) {
+// goto error;
+// }
+// remaining -= result;
+// }
+//
+// debug_sock(sock, "cleared socket");
+//error:
+// if (buf) {
+// kfree(buf);
+// }
+// return result;
+//}
/**
* dnbd3_receive_cmd_get_block_mq - receive a block for mq
@@ -351,7 +351,7 @@ int dnbd3_receive_cmd_get_block_mq(struct dnbd3_sock *sock,
dnbd3_requeue_cmd(cmd);
mutex_unlock(&cmd->lock);
}
- dnbd3_clear_socket(sock, reply, remaining);
+// dnbd3_clear_socket(sock, reply, remaining);
return -EIO;
}
cmd = blk_mq_rq_to_pdu(req);
@@ -361,7 +361,7 @@ int dnbd3_receive_cmd_get_block_mq(struct dnbd3_sock *sock,
error_sock(sock, "double reply on req %p, cookie %u, handle cookie %u",
req, cmd->cookie, cookie);
mutex_unlock(&cmd->lock);
- dnbd3_clear_socket(sock, reply, remaining);
+// dnbd3_clear_socket(sock, reply, remaining);
return -EIO;
}
@@ -382,7 +382,7 @@ int dnbd3_receive_cmd_get_block_mq(struct dnbd3_sock *sock,
dnbd3_requeue_cmd(cmd);
mutex_unlock(&cmd->lock);
if (result >= 0) {
- dnbd3_clear_socket(sock, reply, remaining);
+// dnbd3_clear_socket(sock, reply, remaining);
return -EIO;
} else {
return result;
@@ -425,7 +425,7 @@ int dnbd3_receive_cmd_get_block_test(struct dnbd3_sock *sock,
iov.iov_len = reply->size;
result = kernel_recvmsg(sock->sock, &msg, &iov, 1, reply->size,
msg.msg_flags);
- if (result != RTT_BLOCK_SIZE) {
+ if (result != RTT_TEST_BLOCK_SIZE) {
error_sock(sock, "receive test block failed");
goto error;
}
@@ -589,18 +589,20 @@ int dnbd3_receive_cmd_select_image(struct dnbd3_sock *sock,
return -EIO;
}
- //TODO compare RID
-
name = serializer_get_string(&payload_buffer);
rid = serializer_get_uint16(&payload_buffer);
- if (dev->rid != rid && strcmp(name, dev->imgname) != 0) {
+ if (dev->rid == 0) {
+ dev->rid = rid;
+ }
+
+ if (dev->rid != rid || strcmp(name, dev->imgname) != 0) {
error_sock(sock, "server offers image '%s', requested '%s'",
name, dev->imgname);
return -EIO;
}
reported_size = serializer_get_uint64(&payload_buffer);
- if (!dev->reported_size) {
+ if (dev->reported_size == 0) {
if (reported_size < 4096) {
error_sock(sock, "reported size by server is < 4096");
return -EIO;