add support for reporting the current portal (address/port) used
by a connection, which is needed when doing iscsi redirection.

Signed-off-by: Or Gerlitz <ogerl...@voltaire.com>
---

I followed the related flow in iscsi tcp, to support these
two params, feedback is wellcome

 drivers/infiniband/ulp/iser/iscsi_iser.c |   32 ++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

Index: b/drivers/infiniband/ulp/iser/iscsi_iser.c
===================================================================
--- a/drivers/infiniband/ulp/iser/iscsi_iser.c
+++ b/drivers/infiniband/ulp/iser/iscsi_iser.c
@@ -339,6 +339,7 @@ iscsi_iser_conn_bind(struct iscsi_cls_se
        struct iser_conn *ib_conn;
        struct iscsi_endpoint *ep;
        int error;
+       struct sockaddr_in *dst_in;

        error = iscsi_conn_bind(cls_session, cls_conn, is_leading);
        if (error)
@@ -362,6 +363,9 @@ iscsi_iser_conn_bind(struct iscsi_cls_se
        iser_conn = conn->dd_data;
        ib_conn->iser_conn = iser_conn;
        iser_conn->ib_conn  = ib_conn;
+       dst_in = (struct sockaddr_in *)&ib_conn->cma_id->route.addr.dst_addr;
+       sprintf(conn->portal_address, "%pI4", &dst_in->sin_addr.s_addr);
+       conn->portal_port = ntohs(dst_in->sin_port);
        iser_conn_get(ib_conn); /* ref iscsi/ib conn binding */
        return 0;
 }
@@ -507,6 +511,30 @@ iscsi_iser_set_param(struct iscsi_cls_co
        return 0;
 }

+static int iscsi_iser_conn_get_param(struct iscsi_cls_conn *cls_conn,
+                                      enum iscsi_param param, char *buf)
+{
+       struct iscsi_conn *conn = cls_conn->dd_data;
+       int len;
+
+       switch (param) {
+       case ISCSI_PARAM_CONN_PORT:
+               spin_lock_bh(&conn->session->lock);
+               len = sprintf(buf, "%hu\n", conn->portal_port);
+               spin_unlock_bh(&conn->session->lock);
+               break;
+       case ISCSI_PARAM_CONN_ADDRESS:
+               spin_lock_bh(&conn->session->lock);
+               len = sprintf(buf, "%s\n", conn->portal_address);
+               spin_unlock_bh(&conn->session->lock);
+               break;
+       default:
+               return iscsi_conn_get_param(cls_conn, param, buf);
+       }
+
+       return len;
+}
+
 static void
 iscsi_iser_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats 
*stats)
 {
@@ -637,6 +665,8 @@ static struct iscsi_transport iscsi_iser
                                  ISCSI_MAX_BURST |
                                  ISCSI_PDU_INORDER_EN |
                                  ISCSI_DATASEQ_INORDER_EN |
+                                 ISCSI_CONN_PORT |
+                                 ISCSI_CONN_ADDRESS |
                                  ISCSI_EXP_STATSN |
                                  ISCSI_PERSISTENT_PORT |
                                  ISCSI_PERSISTENT_ADDRESS |
@@ -658,7 +688,7 @@ static struct iscsi_transport iscsi_iser
        .bind_conn              = iscsi_iser_conn_bind,
        .destroy_conn           = iscsi_iser_conn_destroy,
        .set_param              = iscsi_iser_set_param,
-       .get_conn_param         = iscsi_conn_get_param,
+       .get_conn_param         = iscsi_iser_conn_get_param,
        .get_session_param      = iscsi_session_get_param,
        .start_conn             = iscsi_iser_conn_start,
        .stop_conn              = iscsi_iser_conn_stop,

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-is...@googlegroups.com.
To unsubscribe from this group, send email to 
open-iscsi+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/open-iscsi?hl=en.

Reply via email to