From fff87d1c3e19c0a24a3b0d4cff3e9a8f6f140e34 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Thu, 14 Nov 2019 15:18:32 +0100 Subject: added check for rid and discovery now takes bigger test block --- src/kernel/net-txrx.c | 84 ++++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 41 deletions(-) (limited to 'src/kernel/net-txrx.c') 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; -- cgit v1.2.3-55-g7522