RDMA data packets are not padded up to 4 byte boundaries, unlike TCP.
Reasons for this can be found in doc/README.iser.  Add a transport
field to specify the padding amount, using 1 for RDMA to effectively
disable rounding.

Signed-off-by: Pete Wyckoff <[EMAIL PROTECTED]>
---
 usr/iscsi/iscsi_tcp.c |    1 +
 usr/iscsi/iscsid.c    |   28 ++++++++++++++++------------
 usr/iscsi/transport.h |    1 +
 3 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/usr/iscsi/iscsi_tcp.c b/usr/iscsi/iscsi_tcp.c
index 99db99d..68ec7c8 100644
--- a/usr/iscsi/iscsi_tcp.c
+++ b/usr/iscsi/iscsi_tcp.c
@@ -339,6 +339,7 @@ struct iscsi_transport iscsi_tcp = {
        .name                   = "iscsi",
        .rdma                   = 0,
        .task_trans_len         = 0,
+       .data_padding           = PAD_WORD_LEN,
        .ep_init                = iscsi_tcp_init,
        .ep_login_complete      = iscsi_tcp_conn_login_complete,
        .ep_task_init           = iscsi_tcp_task_init,
diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index 3cb804e..defe3a7 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -1184,7 +1184,8 @@ static int iscsi_target_cmd_queue(struct iscsi_task *task)
                                uint32_t len;
                                void *buf;
 
-                               len = roundup(in_length, 4);
+                               len = roundup(in_length,
+                                             conn->tp->data_padding);
                                buf = conn->tp->alloc_data_buf(conn, len);
                                if (!buf)
                                        return -ENOMEM;
@@ -1442,9 +1443,9 @@ static int iscsi_scsi_cmd_rx_start(struct 
iscsi_connection *conn)
        struct iscsi_task *task;
        int ahs_len, imm_len, data_len, ext_len;
 
-       ahs_len = roundup(req->hlength * 4, 4);
-       imm_len = roundup(ntoh24(req->dlength), 4);
-       data_len = roundup(ntohl(req->data_length), 4);
+       ahs_len = req->hlength * 4;
+       imm_len = roundup(ntoh24(req->dlength), conn->tp->data_padding);
+       data_len = roundup(ntohl(req->data_length), conn->tp->data_padding);
 
        dprintf("%u %x %d %d %d %x %x\n", conn->session->tsih,
                req->cdb[0], ahs_len, imm_len, data_len,
@@ -1835,11 +1836,11 @@ again:
                        conn->rx_buffer = conn->req_buffer;
                        conn->req.ahs = conn->rx_buffer;
                        conn->req.data = conn->rx_buffer
-                               + roundup(conn->req.bhs.hlength * 4, 4);
+                               + conn->req.bhs.hlength * 4;
                }
                conn->req.ahssize = conn->req.bhs.hlength * 4;
                conn->req.datasize = ntoh24(conn->req.bhs.dlength);
-               conn->rx_size = roundup(conn->req.ahssize, 4);
+               conn->rx_size = conn->req.ahssize;
                if (conn->rx_size) {
                        conn->rx_buffer = conn->req.ahs;
                        conn->rx_iostate = IOSTATE_RX_AHS;
@@ -1878,8 +1879,7 @@ again:
                crc = ~0;
                crc = crc32c(crc, &conn->req.bhs, BHS_SIZE);
                if (conn->req.ahssize)
-                       crc = crc32c(crc, conn->req.ahs,
-                                    roundup(conn->req.ahssize, 4));
+                       crc = crc32c(crc, conn->req.ahs, conn->req.ahssize);
                crc = ~crc;
                if (*((uint32_t *)conn->rx_digest) != crc) {
                        eprintf("rx hdr digest error 0x%x calc 0x%x\n",
@@ -1888,7 +1888,8 @@ again:
                }
                conn->rx_iostate = IOSTATE_RX_INIT_DATA;
        case IOSTATE_RX_INIT_DATA:
-               conn->rx_size = roundup(conn->req.datasize, 4);
+               conn->rx_size = roundup(conn->req.datasize,
+                                       conn->tp->data_padding);
                if (conn->rx_size) {
                        conn->rx_iostate = IOSTATE_RX_DATA;
                        conn->rx_buffer = conn->req.data;
@@ -1911,7 +1912,9 @@ again:
                        break;
        case IOSTATE_RX_CHECK_DDIGEST:
                crc = ~0;
-               crc = crc32c(crc, conn->req.data, roundup(conn->req.datasize, 
4));
+               crc = crc32c(crc, conn->req.data,
+                            roundup(conn->req.datasize,
+                                    conn->tp->data_padding));
                crc = ~crc;
                conn->rx_iostate = IOSTATE_RX_END;
                if (*((uint32_t *)conn->rx_digest) != crc) {
@@ -2033,7 +2036,7 @@ void iscsi_tx_handler(struct iscsi_connection *conn)
                        conn->tx_iostate = IOSTATE_TX_DATA;
                        conn->tx_buffer = conn->rsp.data;
                        conn->tx_size = conn->rsp.datasize;
-                       pad = conn->tx_size & (PAD_WORD_LEN - 1);
+                       pad = conn->tx_size & (conn->tp->data_padding - 1);
                        if (pad) {
                                pad = PAD_WORD_LEN - pad;
                                memset(conn->tx_buffer + conn->tx_size, 0, pad);
@@ -2053,7 +2056,8 @@ void iscsi_tx_handler(struct iscsi_connection *conn)
        case IOSTATE_TX_INIT_DDIGEST:
                crc = ~0;
                crc = crc32c(crc, conn->rsp.data,
-                            roundup(conn->rsp.datasize, 4));
+                            roundup(conn->rsp.datasize,
+                                    conn->tp->data_padding));
                *(uint32_t *)conn->tx_digest = ~crc;
                conn->tx_iostate = IOSTATE_TX_DDIGEST;
                conn->tx_buffer = conn->tx_digest;
diff --git a/usr/iscsi/transport.h b/usr/iscsi/transport.h
index 38e28ae..58bb992 100644
--- a/usr/iscsi/transport.h
+++ b/usr/iscsi/transport.h
@@ -10,6 +10,7 @@ struct iscsi_transport {
        const char *name;
        int rdma;
        int task_trans_len;
+       int data_padding;
 
        int (*ep_init) (void);
        int (*ep_login_complete)(struct iscsi_connection *conn);
-- 
1.5.3.4

_______________________________________________
Stgt-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/stgt-devel

Reply via email to