Hi Robert,

I am looking for a similar fix and wanted to know if this patch was 
accepted into the linux kernel? 

Thanks,
Nikhil

On Friday, 2 June 2017 19:20:52 UTC-4, Robert LeBlanc wrote:
>
> The error that I was getting was due to the distro version of iscsid 
> running. Once I stopped that and ran iscsid from the patched source, 
> it logged in just fine. 
> ---------------- 
> Robert LeBlanc 
> PGP Fingerprint 79A2 9CA4 6CC4 45DD A904  C70E E654 3BB2 FA62 B9F1 
>
>
> On Fri, Jun 2, 2017 at 2:29 PM, Robert LeBlanc <rob...@leblancnet.us 
> <javascript:>> wrote: 
> > Attaching patches in case they are mangled. 
> > ---------------- 
> > Robert LeBlanc 
> > PGP Fingerprint 79A2 9CA4 6CC4 45DD A904  C70E E654 3BB2 FA62 B9F1 
> > 
> > 
> > On Fri, Jun 2, 2017 at 1:13 PM, Robert LeBlanc <rob...@leblancnet.us 
> <javascript:>> wrote: 
> >> First off, I've never done anything this complicated, please be gentle. 
> >> 
> >> Second, I know this will need to be broken up, but I'm not clear if 
> >> each commit should be able to compile. It seems having a commit for 
> >> each driver would make sense, but it won't compile cleanly without the 
> >> others. How do I go about that? 
> >> 
> >> Third, this required a change to the kernel API(?) and I'm not sure 
> >> the best way to to make that change backwards compatible. 
> >> 
> >> Forth, I'm getting an error on login. I don't think the kernel is even 
> >> trying the login. Maybe I can get a pointer to help me get this 
> >> resolved. 
> >> 
> >> # usr/iscsiadm -m iface -I iser3 
> >> # BEGIN RECORD 2.0-874 
> >> iface.iscsi_ifacename = iser3 
> >> iface.net_ifacename = <empty> 
> >> iface.ipaddress = fd00::14 
> >> ... 
> >> # usr/iscsiadm -m iface -I iser4 
> >> # BEGIN RECORD 2.0-874 
> >> iface.iscsi_ifacename = iser4 
> >> iface.net_ifacename = <empty> 
> >> iface.ipaddress = fd00::114 
> >> ... 
> >> # usr/iscsiadm -m discovery -t st -p fd00::13 -I iser3 -I iser4 
> >> [fd00::13]:3260,1 iqn.2016-12.com.betterservers 
> >> [fd00::13]:3260,1 iqn.2016-12.com.betterservers 
> >> # usr/iscsiadm -m node -T iqn.2016-12.com.betterservers -p 
> [fd00::13]:3260 -l 
> >> Logging in to [iface: iser3, target: iqn.2016-12.com.betterservers, 
> >> portal: fd00::13,3260] (multiple) 
> >> Logging in to [iface: iser4, target: iqn.2016-12.com.betterservers, 
> >> portal: fd00::13,3260] (multiple) 
> >> iscsiadm: Could not login to [iface: iser3, target: 
> >> iqn.2016-12.com.betterservers, portal: fd00::13,3260]. 
> >> iscsiadm: initiator reported error (12 - iSCSI driver not found. 
> >> Please make sure it is loaded, and retry the operation) 
> >> iscsiadm: Could not login to [iface: iser4, target: 
> >> iqn.2016-12.com.betterservers, portal: fd00::13,3260]. 
> >> iscsiadm: initiator reported error (12 - iSCSI driver not found. 
> >> Please make sure it is loaded, and retry the operation) 
> >> iscsiadm: Could not log into all portals 
> >> 
> >> Patch to open-iscsi 
> >> ---------------------------- 
> >> diff --git a/usr/netlink.c b/usr/netlink.c 
> >> index 1a0bf80..c474375 100644 
> >> --- a/usr/netlink.c 
> >> +++ b/usr/netlink.c 
> >> @@ -848,10 +848,13 @@ krecv_pdu_end(struct iscsi_conn *conn) 
> >>  int 
> >>  ktransport_ep_connect(iscsi_conn_t *conn, int non_blocking) 
> >>  { 
> >> -        int rc, addrlen; 
> >> +        int rc, addrlen = sizeof(struct sockaddr_storage); 
> >>          struct iscsi_uevent *ev; 
> >> -        struct sockaddr *dst_addr = (struct sockaddr *)&conn->saddr; 
> >> +        struct sockaddr_storage *dst_addr = (struct sockaddr_storage 
> >> *)&conn->saddr; 
> >>          struct iovec iov[2]; 
> >> +        struct iscsi_session *tmp_session = (struct iscsi_session 
> >> *)conn->session; 
> >> +        node_rec_t *tmp_rec = (node_rec_t *)&tmp_session->nrec; 
> >> +        iface_rec_t *tmp_iface = (iface_rec_t *)&tmp_rec->iface; 
> >> 
> >>          log_debug(7, "in %s", __FUNCTION__); 
> >> 
> >> @@ -868,19 +871,16 @@ ktransport_ep_connect(iscsi_conn_t *conn, int 
> >> non_blocking) 
> >>                  ev->u.ep_connect.non_blocking = non_blocking; 
> >>          } 
> >> 
> >> -        if (dst_addr->sa_family == PF_INET) 
> >> -                addrlen = sizeof(struct sockaddr_in); 
> >> -        else if (dst_addr->sa_family == PF_INET6) 
> >> -                addrlen = sizeof(struct sockaddr_in6); 
> >> -        else { 
> >> +        if (dst_addr->ss_family != AF_INET && dst_addr->ss_family != 
> >> AF_INET6) { 
> >>                  log_error("%s unknown addr family %d", 
> >> -                         __FUNCTION__, dst_addr->sa_family); 
> >> +                         __FUNCTION__, dst_addr->ss_family); 
> >>                  return -EINVAL; 
> >>          } 
> >>          memcpy(setparam_buf + sizeof(*ev), dst_addr, addrlen); 
> >> +        iface_copy(setparam_buf + sizeof(*ev) + addrlen, tmp_iface); 
> >> 
> >>          iov[1].iov_base = ev; 
> >> -        iov[1].iov_len = sizeof(*ev) + addrlen; 
> >> +        iov[1].iov_len = sizeof(*ev) + addrlen + sizeof(iface_rec_t); 
> >>          rc = __kipc_call(iov, 2); 
> >>          if (rc < 0) 
> >>                  return rc; 
> >> 
> >> Patch to kernel 
> >> ---------------------- 
> >> diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c 
> >> b/drivers/infiniband/ulp/iser/iscsi_iser.c 
> >> index 5a887ef..7ba5ed9 100644 
> >> --- a/drivers/infiniband/ulp/iser/iscsi_iser.c 
> >> +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c 
> >> @@ -59,6 +59,7 @@ 
> >>  #include <linux/delay.h> 
> >>  #include <linux/slab.h> 
> >>  #include <linux/module.h> 
> >> +#include <linux/inet.h> 
> >> 
> >>  #include <net/sock.h> 
> >> 
> >> @@ -808,12 +809,16 @@ static int iscsi_iser_get_ep_param(struct 
> >> iscsi_endpoint *ep, 
> >>   *         if fails. 
> >>   */ 
> >>  static struct iscsi_endpoint * 
> >> -iscsi_iser_ep_connect(struct Scsi_Host *shost, struct sockaddr 
> *dst_addr, 
> >> -                      int non_blocking) 
> >> +iscsi_iser_ep_connect(struct Scsi_Host *shost, struct 
> >> sockaddr_storage *dst_addr, 
> >> +                      int non_blocking, struct iface_rec *iface) 
> >>  { 
> >>          int err; 
> >>          struct iser_conn *iser_conn; 
> >>          struct iscsi_endpoint *ep; 
> >> +        struct sockaddr_storage src_addr; 
> >> +        struct sockaddr_in *tmp_addr; 
> >> +        struct sockaddr_in6 *tmp_addr6; 
> >> +        memset(&src_addr, 0, sizeof(src_addr)); 
> >> 
> >>          ep = iscsi_create_endpoint(0); 
> >>          if (!ep) 
> >> @@ -828,8 +833,28 @@ static int iscsi_iser_get_ep_param(struct 
> >> iscsi_endpoint *ep, 
> >>          ep->dd_data = iser_conn; 
> >>          iser_conn->ep = ep; 
> >>          iser_conn_init(iser_conn); 
> >> - 
> >> -        err = iser_connect(iser_conn, NULL, dst_addr, non_blocking); 
> >> +        if (iface && iface->ipaddress[0]) { 
> >> +                if (strchr(iface->ipaddress, ':')) { 
> >> +                        tmp_addr6 = (struct sockaddr_in6 *)&src_addr; 
> >> +                        tmp_addr6->sin6_family = AF_INET6; 
> >> +                        if(!in6_pton(iface->ipaddress, -1, 
> >> +                                 tmp_addr6->sin6_addr.s6_addr, 
> >> +                                 -1, NULL)) { 
> >> +                                err = -EINVAL; 
> >> +                                goto failure; 
> >> +                        } 
> >> +                } else { 
> >> +                        tmp_addr = (struct sockaddr_in *)&src_addr; 
> >> +                        tmp_addr->sin_family = AF_INET; 
> >> +                        if (!in4_pton(iface->ipaddress, -1, 
> >> +                                 (u8 *)&tmp_addr->sin_addr.s_addr, 
> >> +                                 -1, NULL)) { 
> >> +                                err = -EINVAL; 
> >> +                                goto failure; 
> >> +                        } 
> >> +                } 
> >> +        } 
> >> +        err = iser_connect(iser_conn, &src_addr, dst_addr, 
> non_blocking); 
> >>          if (err) 
> >>                  goto failure; 
> >> 
> >> diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h 
> >> b/drivers/infiniband/ulp/iser/iscsi_iser.h 
> >> index c1ae4ae..1eda6ff 100644 
> >> --- a/drivers/infiniband/ulp/iser/iscsi_iser.h 
> >> +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h 
> >> @@ -628,8 +628,8 @@ void iser_unreg_rdma_mem(struct iscsi_iser_task 
> *task, 
> >>                           enum iser_data_dir dir); 
> >> 
> >>  int  iser_connect(struct iser_conn *iser_conn, 
> >> -                  struct sockaddr *src_addr, 
> >> -                  struct sockaddr *dst_addr, 
> >> +                  struct sockaddr_storage *src_addr, 
> >> +                  struct sockaddr_storage *dst_addr, 
> >>                    int non_blocking); 
> >> 
> >>  void iser_unreg_mem_fmr(struct iscsi_iser_task *iser_task, 
> >> diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c 
> >> b/drivers/infiniband/ulp/iser/iser_initiator.c 
> >> index 12ed62c..361d5e4 100644 
> >> --- a/drivers/infiniband/ulp/iser/iser_initiator.c 
> >> +++ b/drivers/infiniband/ulp/iser/iser_initiator.c 
> >> @@ -35,6 +35,7 @@ 
> >>  #include <linux/mm.h> 
> >>  #include <linux/scatterlist.h> 
> >>  #include <linux/kfifo.h> 
> >> +#include <linux/if.h> 
> >>  #include <scsi/scsi_cmnd.h> 
> >>  #include <scsi/scsi_host.h> 
> >> 
> >> diff --git a/drivers/infiniband/ulp/iser/iser_memory.c 
> >> b/drivers/infiniband/ulp/iser/iser_memory.c 
> >> index 9c3e9ab..c9d95b9 100644 
> >> --- a/drivers/infiniband/ulp/iser/iser_memory.c 
> >> +++ b/drivers/infiniband/ulp/iser/iser_memory.c 
> >> @@ -36,6 +36,7 @@ 
> >>  #include <linux/mm.h> 
> >>  #include <linux/highmem.h> 
> >>  #include <linux/scatterlist.h> 
> >> +#include <linux/if.h> 
> >> 
> >>  #include "iscsi_iser.h" 
> >>  static 
> >> diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c 
> >> b/drivers/infiniband/ulp/iser/iser_verbs.c 
> >> index c538a38..0a43009 100644 
> >> --- a/drivers/infiniband/ulp/iser/iser_verbs.c 
> >> +++ b/drivers/infiniband/ulp/iser/iser_verbs.c 
> >> @@ -35,6 +35,7 @@ 
> >>  #include <linux/module.h> 
> >>  #include <linux/slab.h> 
> >>  #include <linux/delay.h> 
> >> +#include <linux/if.h> 
> >> 
> >>  #include "iscsi_iser.h" 
> >> 
> >> @@ -941,8 +942,8 @@ void iser_conn_init(struct iser_conn *iser_conn) 
> >>   * sleeps until the connection is established or rejected 
> >>   */ 
> >>  int iser_connect(struct iser_conn   *iser_conn, 
> >> -                 struct sockaddr    *src_addr, 
> >> -                 struct sockaddr    *dst_addr, 
> >> +                 struct sockaddr_storage *src_addr, 
> >> +                 struct sockaddr_storage *dst_addr, 
> >>                   int                 non_blocking) 
> >>  { 
> >>          struct ib_conn *ib_conn = &iser_conn->ib_conn; 
> >> @@ -968,7 +969,8 @@ int iser_connect(struct iser_conn   *iser_conn, 
> >>                  goto id_failure; 
> >>          } 
> >> 
> >> -        err = rdma_resolve_addr(ib_conn->cma_id, src_addr, dst_addr, 
> 1000); 
> >> +        err = rdma_resolve_addr(ib_conn->cma_id, (struct sockaddr 
> *)src_addr, 
> >> +                                       (struct sockaddr *)dst_addr, 
> 1000); 
> >>          if (err) { 
> >>                  iser_err("rdma_resolve_addr failed: %d\n", err); 
> >>                  goto addr_failure; 
> >> diff --git a/drivers/scsi/be2iscsi/be_cmds.c 
> b/drivers/scsi/be2iscsi/be_cmds.c 
> >> index a79a5e7..6617f2a 100644 
> >> --- a/drivers/scsi/be2iscsi/be_cmds.c 
> >> +++ b/drivers/scsi/be2iscsi/be_cmds.c 
> >> @@ -13,6 +13,7 @@ 
> >>   */ 
> >> 
> >>  #include <scsi/iscsi_proto.h> 
> >> +#include <linux/if.h> 
> >> 
> >>  #include "be_main.h" 
> >>  #include "be.h" 
> >> diff --git a/drivers/scsi/be2iscsi/be_iscsi.c 
> b/drivers/scsi/be2iscsi/be_iscsi.c 
> >> index 97dca46..90adf20 100644 
> >> --- a/drivers/scsi/be2iscsi/be_iscsi.c 
> >> +++ b/drivers/scsi/be2iscsi/be_iscsi.c 
> >> @@ -12,6 +12,7 @@ 
> >>   * 
> >>   */ 
> >> 
> >> +#include <linux/if.h> 
> >>  #include <scsi/libiscsi.h> 
> >>  #include <scsi/scsi_transport_iscsi.h> 
> >>  #include <scsi/scsi_transport.h> 
> >> @@ -1161,8 +1162,8 @@ static int beiscsi_open_conn(struct 
> iscsi_endpoint *ep, 
> >>   * This routines first asks chip to create a connection and then 
> >> allocates an EP 
> >>   */ 
> >>  struct iscsi_endpoint * 
> >> -beiscsi_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr, 
> >> -                   int non_blocking) 
> >> +beiscsi_ep_connect(struct Scsi_Host *shost, struct sockaddr_storage 
> *dst_addr, 
> >> +                   int non_blocking, struct iface_rec *iface) 
> >>  { 
> >>          struct beiscsi_hba *phba; 
> >>          struct beiscsi_endpoint *beiscsi_ep; 
> >> @@ -1198,7 +1199,8 @@ struct iscsi_endpoint * 
> >>          beiscsi_ep = ep->dd_data; 
> >>          beiscsi_ep->phba = phba; 
> >>          beiscsi_ep->openiscsi_ep = ep; 
> >> -        ret = beiscsi_open_conn(ep, NULL, dst_addr, non_blocking); 
> >> +        ret = beiscsi_open_conn(ep, NULL, (struct sockaddr *)dst_addr, 
> >> +                                       non_blocking); 
> >>          if (ret) { 
> >>                  beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG, 
> >>                              "BS_%d : Failed in beiscsi_open_conn\n"); 
> >> diff --git a/drivers/scsi/be2iscsi/be_iscsi.h 
> b/drivers/scsi/be2iscsi/be_iscsi.h 
> >> index b9d459a..68616f8 100644 
> >> --- a/drivers/scsi/be2iscsi/be_iscsi.h 
> >> +++ b/drivers/scsi/be2iscsi/be_iscsi.h 
> >> @@ -68,8 +68,9 @@ int beiscsi_set_param(struct iscsi_cls_conn 
> *cls_conn, 
> >>  int beiscsi_conn_start(struct iscsi_cls_conn *cls_conn); 
> >> 
> >>  struct iscsi_endpoint *beiscsi_ep_connect(struct Scsi_Host *shost, 
> >> -                                          struct sockaddr *dst_addr, 
> >> -                                          int non_blocking); 
> >> +                                          struct sockaddr_storage 
> *dst_addr, 
> >> +                                          int non_blocking, 
> >> +                                          struct iface_rec *iface); 
> >> 
> >>  int beiscsi_ep_poll(struct iscsi_endpoint *ep, int timeout_ms); 
> >> 
> >> diff --git a/drivers/scsi/be2iscsi/be_main.c 
> b/drivers/scsi/be2iscsi/be_main.c 
> >> index f862332..aab7772 100644 
> >> --- a/drivers/scsi/be2iscsi/be_main.c 
> >> +++ b/drivers/scsi/be2iscsi/be_main.c 
> >> @@ -25,6 +25,7 @@ 
> >>  #include <linux/module.h> 
> >>  #include <linux/bsg-lib.h> 
> >>  #include <linux/irq_poll.h> 
> >> +#include <linux/if.h> 
> >> 
> >>  #include <scsi/libiscsi.h> 
> >>  #include <scsi/scsi_bsg_iscsi.h> 
> >> diff --git a/drivers/scsi/be2iscsi/be_mgmt.c 
> b/drivers/scsi/be2iscsi/be_mgmt.c 
> >> index c737753..926afa4 100644 
> >> --- a/drivers/scsi/be2iscsi/be_mgmt.c 
> >> +++ b/drivers/scsi/be2iscsi/be_mgmt.c 
> >> @@ -13,6 +13,7 @@ 
> >>   */ 
> >> 
> >>  #include <linux/bsg-lib.h> 
> >> +#include <linux/if.h> 
> >>  #include <scsi/scsi_transport_iscsi.h> 
> >>  #include <scsi/scsi_bsg_iscsi.h> 
> >>  #include "be_mgmt.h" 
> >> diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c 
> b/drivers/scsi/bnx2i/bnx2i_hwi.c 
> >> index 42921db..ce87ce2 100644 
> >> --- a/drivers/scsi/bnx2i/bnx2i_hwi.c 
> >> +++ b/drivers/scsi/bnx2i/bnx2i_hwi.c 
> >> @@ -15,6 +15,7 @@ 
> >>   */ 
> >> 
> >>  #include <linux/gfp.h> 
> >> +#include <linux/if.h> 
> >>  #include <scsi/scsi_tcq.h> 
> >>  #include <scsi/libiscsi.h> 
> >>  #include "bnx2i.h" 
> >> diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c 
> b/drivers/scsi/bnx2i/bnx2i_iscsi.c 
> >> index f32a66f..5151063 100644 
> >> --- a/drivers/scsi/bnx2i/bnx2i_iscsi.c 
> >> +++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c 
> >> @@ -16,8 +16,10 @@ 
> >>   */ 
> >> 
> >>  #include <linux/slab.h> 
> >> +#include <linux/if.h> 
> >>  #include <scsi/scsi_tcq.h> 
> >>  #include <scsi/libiscsi.h> 
> >> +#include <scsi/scsi_transport_iscsi.h> 
> >>  #include "bnx2i.h" 
> >> 
> >>  struct scsi_transport_template *bnx2i_scsi_xport_template; 
> >> @@ -1771,8 +1773,9 @@ static int bnx2i_tear_down_conn(struct bnx2i_hba 
> *hba, 
> >>   *        sending down option-2 request to complete TCP 3-way 
> handshake 
> >>   */ 
> >>  static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host 
> *shost, 
> >> -                                               struct sockaddr 
> *dst_addr, 
> >> -                                               int non_blocking) 
> >> +                                               struct 
> >> sockaddr_storage *dst_addr, 
> >> +                                               int non_blocking, 
> >> +                                               struct iface_rec 
> *iface) 
> >>  { 
> >>          u32 iscsi_cid = BNX2I_CID_RESERVED; 
> >>          struct sockaddr_in *desti = (struct sockaddr_in *) dst_addr; 
> >> @@ -1792,7 +1795,7 @@ static struct iscsi_endpoint 
> >> *bnx2i_ep_connect(struct Scsi_Host *shost, 
> >>                   * check if the given destination can be reached 
> through 
> >>                   * a iscsi capable NetXtreme2 device 
> >>                   */ 
> >> -                hba = bnx2i_check_route(dst_addr); 
> >> +                hba = bnx2i_check_route((struct sockaddr *)dst_addr); 
> >> 
> >>          if (!hba) { 
> >>                  rc = -EINVAL; 
> >> @@ -1887,11 +1890,11 @@ static struct iscsi_endpoint 
> >> *bnx2i_ep_connect(struct Scsi_Host *shost, 
> >>          clear_bit(SK_TCP_TIMESTAMP, &bnx2i_ep->cm_sk->tcp_flags); 
> >> 
> >>          memset(&saddr, 0, sizeof(saddr)); 
> >> -        if (dst_addr->sa_family == AF_INET) { 
> >> +        if (dst_addr->ss_family == AF_INET) { 
> >>                  desti = (struct sockaddr_in *) dst_addr; 
> >>                  saddr.remote.v4 = *desti; 
> >>                  saddr.local.v4.sin_family = desti->sin_family; 
> >> -        } else if (dst_addr->sa_family == AF_INET6) { 
> >> +        } else if (dst_addr->ss_family == AF_INET6) { 
> >>                  desti6 = (struct sockaddr_in6 *) dst_addr; 
> >>                  saddr.remote.v6 = *desti6; 
> >>                  saddr.local.v6.sin6_family = desti6->sin6_family; 
> >> diff --git a/drivers/scsi/cxgbi/libcxgbi.c 
> b/drivers/scsi/cxgbi/libcxgbi.c 
> >> index bd7d39e..62f6230 100644 
> >> --- a/drivers/scsi/cxgbi/libcxgbi.c 
> >> +++ b/drivers/scsi/cxgbi/libcxgbi.c 
> >> @@ -2499,8 +2499,9 @@ int cxgbi_get_host_param(struct Scsi_Host 
> >> *shost, enum iscsi_host_param param, 
> >>  EXPORT_SYMBOL_GPL(cxgbi_get_host_param); 
> >> 
> >>  struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *shost, 
> >> -                                        struct sockaddr *dst_addr, 
> >> -                                        int non_blocking) 
> >> +                                        struct sockaddr_storage 
> *dst_addr, 
> >> +                                        int non_blocking, 
> >> +                                        struct iface_rec *iface) 
> >>  { 
> >>          struct iscsi_endpoint *ep; 
> >>          struct cxgbi_endpoint *cep; 
> >> @@ -2520,15 +2521,15 @@ struct iscsi_endpoint *cxgbi_ep_connect(struct 
> >> Scsi_Host *shost, 
> >>                  } 
> >>          } 
> >> 
> >> -        if (dst_addr->sa_family == AF_INET) { 
> >> -                csk = cxgbi_check_route(dst_addr); 
> >> +        if (dst_addr->ss_family == AF_INET) { 
> >> +                csk = cxgbi_check_route((struct sockaddr *)dst_addr); 
> >>  #if IS_ENABLED(CONFIG_IPV6) 
> >> -        } else if (dst_addr->sa_family == AF_INET6) { 
> >> -                csk = cxgbi_check_route6(dst_addr); 
> >> +        } else if (dst_addr->ss_family == AF_INET6) { 
> >> +                csk = cxgbi_check_route6((struct sockaddr *)dst_addr); 
> >>  #endif 
> >>          } else { 
> >>                  pr_info("address family 0x%x NOT supported.\n", 
> >> -                        dst_addr->sa_family); 
> >> +                        dst_addr->ss_family); 
> >>                  err = -EAFNOSUPPORT; 
> >>                  return (struct iscsi_endpoint *)ERR_PTR(err); 
> >>          } 
> >> diff --git a/drivers/scsi/cxgbi/libcxgbi.h 
> b/drivers/scsi/cxgbi/libcxgbi.h 
> >> index 18e0ea8..e2e0c4d 100644 
> >> --- a/drivers/scsi/cxgbi/libcxgbi.h 
> >> +++ b/drivers/scsi/cxgbi/libcxgbi.h 
> >> @@ -596,7 +596,7 @@ int cxgbi_set_host_param(struct Scsi_Host *, 
> >>                          enum iscsi_host_param, char *, int); 
> >>  int cxgbi_get_host_param(struct Scsi_Host *, enum iscsi_host_param, 
> char *); 
> >>  struct iscsi_endpoint *cxgbi_ep_connect(struct Scsi_Host *, 
> >> -                        struct sockaddr *, int); 
> >> +                        struct sockaddr_storage *, int, struct 
> iface_rec *); 
> >>  int cxgbi_ep_poll(struct iscsi_endpoint *, int); 
> >>  void cxgbi_ep_disconnect(struct iscsi_endpoint *); 
> >> 
> >> diff --git a/drivers/scsi/qla4xxx/ql4_os.c 
> b/drivers/scsi/qla4xxx/ql4_os.c 
> >> index 64c6fa5..4fccb58 100644 
> >> --- a/drivers/scsi/qla4xxx/ql4_os.c 
> >> +++ b/drivers/scsi/qla4xxx/ql4_os.c 
> >> @@ -119,8 +119,9 @@ static int qla4xxx_get_iface_param(struct 
> >> iscsi_iface *iface, 
> >>                                     int param, char *buf); 
> >>  static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct 
> scsi_cmnd *sc); 
> >>  static struct iscsi_endpoint *qla4xxx_ep_connect(struct Scsi_Host 
> *shost, 
> >> -                                                 struct sockaddr 
> *dst_addr, 
> >> -                                                 int non_blocking); 
> >> +                                                 struct 
> >> sockaddr_storage *dst_addr, 
> >> +                                                 int non_blocking, 
> >> +                                                 struct iface_rec 
> *iface); 
> >>  static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms); 
> >>  static void qla4xxx_ep_disconnect(struct iscsi_endpoint *ep); 
> >>  static int qla4xxx_get_ep_param(struct iscsi_endpoint *ep, 
> >> @@ -1656,8 +1657,8 @@ static int qla4xxx_get_iface_param(struct 
> >> iscsi_iface *iface, 
> >>  } 
> >> 
> >>  static struct iscsi_endpoint * 
> >> -qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr, 
> >> -                   int non_blocking) 
> >> +qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr_storage 
> *dst_addr, 
> >> +                   int non_blocking, struct iface_rec *iface) 
> >>  { 
> >>          int ret; 
> >>          struct iscsi_endpoint *ep; 
> >> @@ -1681,12 +1682,12 @@ static int qla4xxx_get_iface_param(struct 
> >> iscsi_iface *iface, 
> >> 
> >>          qla_ep = ep->dd_data; 
> >>          memset(qla_ep, 0, sizeof(struct qla_endpoint)); 
> >> -        if (dst_addr->sa_family == AF_INET) { 
> >> +        if (dst_addr->ss_family == AF_INET) { 
> >>                  memcpy(&qla_ep->dst_addr, dst_addr, sizeof(struct 
> >> sockaddr_in)); 
> >>                  addr = (struct sockaddr_in *)&qla_ep->dst_addr; 
> >>                  DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI4\n", 
> __func__, 
> >>                                    (char *)&addr->sin_addr)); 
> >> -        } else if (dst_addr->sa_family == AF_INET6) { 
> >> +        } else if (dst_addr->ss_family == AF_INET6) { 
> >>                  memcpy(&qla_ep->dst_addr, dst_addr, 
> >>                         sizeof(struct sockaddr_in6)); 
> >>                  addr6 = (struct sockaddr_in6 *)&qla_ep->dst_addr; 
> >> @@ -6569,7 +6570,7 @@ static struct iscsi_endpoint 
> >> *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha, 
> >>                  addr->sin_port = 
> htons(le16_to_cpu(fw_ddb_entry->port)); 
> >>          } 
> >> 
> >> -        ep = qla4xxx_ep_connect(ha->host, (struct sockaddr *)dst_addr, 
> 0); 
> >> +        ep = qla4xxx_ep_connect(ha->host, dst_addr, 0, NULL); 
> >>          vfree(dst_addr); 
> >>          return ep; 
> >>  } 
> >> diff --git a/drivers/scsi/scsi_transport_iscsi.c 
> >> b/drivers/scsi/scsi_transport_iscsi.c 
> >> index a424eae..64157a1 100644 
> >> --- a/drivers/scsi/scsi_transport_iscsi.c 
> >> +++ b/drivers/scsi/scsi_transport_iscsi.c 
> >> @@ -34,6 +34,7 @@ 
> >>  #include <scsi/iscsi_if.h> 
> >>  #include <scsi/scsi_cmnd.h> 
> >>  #include <scsi/scsi_bsg_iscsi.h> 
> >> +#include <linux/inet.h> 
> >> 
> >>  #define ISCSI_TRANSPORT_VERSION "2.0-870" 
> >> 
> >> @@ -2794,7 +2795,8 @@ static int iscsi_if_ep_connect(struct 
> >> iscsi_transport *transport, 
> >>                                 struct iscsi_uevent *ev, int msg_type) 
> >>  { 
> >>          struct iscsi_endpoint *ep; 
> >> -        struct sockaddr *dst_addr; 
> >> +        struct sockaddr_storage *dst_addr; 
> >> +        struct iface_rec *iface; 
> >>          struct Scsi_Host *shost = NULL; 
> >>          int non_blocking, err = 0; 
> >> 
> >> @@ -2813,8 +2815,9 @@ static int iscsi_if_ep_connect(struct 
> >> iscsi_transport *transport, 
> >>          } else 
> >>                  non_blocking = ev->u.ep_connect.non_blocking; 
> >> 
> >> -        dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev)); 
> >> -        ep = transport->ep_connect(shost, dst_addr, non_blocking); 
> >> +        dst_addr = (struct sockaddr_storage *)((char*)ev + 
> sizeof(*ev)); 
> >> +        iface = (struct iface_rec *)((char*)ev + sizeof(*ev) + 
> >> sizeof(*dst_addr)); 
> >> +        ep = transport->ep_connect(shost, dst_addr, non_blocking, 
> iface); 
> >>          if (IS_ERR(ep)) { 
> >>                  err = PTR_ERR(ep); 
> >>                  goto release_host; 
> >> diff --git a/include/scsi/scsi_transport_iscsi.h 
> >> b/include/scsi/scsi_transport_iscsi.h 
> >> index 6183d20..c146e90 100644 
> >> --- a/include/scsi/scsi_transport_iscsi.h 
> >> +++ b/include/scsi/scsi_transport_iscsi.h 
> >> @@ -37,6 +37,7 @@ 
> >>  struct iscsi_conn; 
> >>  struct iscsi_task; 
> >>  struct sockaddr; 
> >> +struct iface_rec; 
> >>  struct iscsi_iface; 
> >>  struct bsg_job; 
> >>  struct iscsi_bus_flash_session; 
> >> @@ -132,8 +133,9 @@ struct iscsi_transport { 
> >> 
> >>          void (*session_recovery_timedout) (struct iscsi_cls_session 
> *session); 
> >>          struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost, 
> >> -                                              struct sockaddr 
> *dst_addr, 
> >> -                                              int non_blocking); 
> >> +                                              struct sockaddr_storage 
> >> *dst_addr, 
> >> +                                              int non_blocking, 
> >> +                                              struct iface_rec 
> *iface); 
> >>          int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms); 
> >>          void (*ep_disconnect) (struct iscsi_endpoint *ep); 
> >>          int (*tgt_dscvr) (struct Scsi_Host *shost, enum 
> iscsi_tgt_dscvr type, 
> >> @@ -291,6 +293,100 @@ struct iscsi_endpoint { 
> >>          struct iscsi_cls_conn *conn; 
> >>  }; 
> >> 
> >> +/* max len of interface */ 
> >> +#define ISCSI_MAX_IFACE_LEN        65 
> >> +#define NI_MAXHOST 1025 
> >> +#define ISCSI_HWADDRESS_BUF_SIZE 18 
> >> +#define ISCSI_TRANSPORT_NAME_MAXLEN 16 
> >> +#define ISCSI_MAX_STR_LEN 80 
> >> + 
> >> +struct iface_rec { 
> >> +        struct list_head        list; 
> >> +        /* iscsi iface record name */ 
> >> +        char                        name[ISCSI_MAX_IFACE_LEN]; 
> >> +        uint32_t                iface_num; 
> >> +        /* network layer iface name (eth0) */ 
> >> +        char                        netdev[IFNAMSIZ]; 
> >> +        char                        ipaddress[NI_MAXHOST]; 
> >> +        char                        subnet_mask[NI_MAXHOST]; 
> >> +        char                        gateway[NI_MAXHOST]; 
> >> +        char                        bootproto[ISCSI_MAX_STR_LEN]; 
> >> +        char                        ipv6_linklocal[NI_MAXHOST]; 
> >> +        char                        ipv6_router[NI_MAXHOST]; 
> >> +        char                        ipv6_autocfg[NI_MAXHOST]; 
> >> +        char                        linklocal_autocfg[NI_MAXHOST]; 
> >> +        char                        router_autocfg[NI_MAXHOST]; 
> >> +        uint16_t                vlan_id; 
> >> +        uint8_t                        vlan_priority; 
> >> +        char                        vlan_state[ISCSI_MAX_STR_LEN]; 
> >> +        char                        state[ISCSI_MAX_STR_LEN]; /* 0 = 
> disable, 
> >> +                                                           * 1 = 
> enable */ 
> >> +        uint16_t                mtu; 
> >> +        uint16_t                port; 
> >> +        char                        delayed_ack[ISCSI_MAX_STR_LEN]; 
> >> +        char                        nagle[ISCSI_MAX_STR_LEN]; 
> >> +        char                        tcp_wsf_state[ISCSI_MAX_STR_LEN]; 
> >> +        uint8_t                        tcp_wsf; 
> >> +        uint8_t                        tcp_timer_scale; 
> >> +        char                        tcp_timestamp[ISCSI_MAX_STR_LEN]; 
> >> +        char                        dhcp_dns[ISCSI_MAX_STR_LEN]; 
> >> +        char                        dhcp_slp_da[ISCSI_MAX_STR_LEN]; 
> >> +        char                        tos_state[ISCSI_MAX_STR_LEN]; 
> >> +        uint8_t                        tos; 
> >> +        char                        gratuitous_arp[ISCSI_MAX_STR_LEN]; 
> >> +        char 
> >> dhcp_alt_client_id_state[ISCSI_MAX_STR_LEN]; 
> >> +        char                       
>  dhcp_alt_client_id[ISCSI_MAX_STR_LEN]; 
> >> +        char 
> >> dhcp_req_vendor_id_state[ISCSI_MAX_STR_LEN]; 
> >> +        char                       
>  dhcp_vendor_id_state[ISCSI_MAX_STR_LEN]; 
> >> +        char                        dhcp_vendor_id[ISCSI_MAX_STR_LEN]; 
> >> +        char                        dhcp_learn_iqn[ISCSI_MAX_STR_LEN]; 
> >> +        char                        fragmentation[ISCSI_MAX_STR_LEN]; 
> >> +        char                       
>  incoming_forwarding[ISCSI_MAX_STR_LEN]; 
> >> +        uint8_t                        ttl; 
> >> +        char                       
>  gratuitous_neighbor_adv[ISCSI_MAX_STR_LEN]; 
> >> +        char                        redirect[ISCSI_MAX_STR_LEN]; 
> >> +        char                        mld[ISCSI_MAX_STR_LEN]; 
> >> +        uint32_t                flow_label; 
> >> +        uint32_t                traffic_class; 
> >> +        uint8_t                        hop_limit; 
> >> +        uint32_t                nd_reachable_tmo; 
> >> +        uint32_t                nd_rexmit_time; 
> >> +        uint32_t                nd_stale_tmo; 
> >> +        uint8_t                        dup_addr_detect_cnt; 
> >> +        uint32_t                router_adv_link_mtu; 
> >> +        uint16_t                def_task_mgmt_tmo; 
> >> +        char                        header_digest[ISCSI_MAX_STR_LEN]; 
> >> +        char                        data_digest[ISCSI_MAX_STR_LEN]; 
> >> +        char                        immediate_data[ISCSI_MAX_STR_LEN]; 
> >> +        char                        initial_r2t[ISCSI_MAX_STR_LEN]; 
> >> +        char                       
>  data_seq_inorder[ISCSI_MAX_STR_LEN]; 
> >> +        char                       
>  data_pdu_inorder[ISCSI_MAX_STR_LEN]; 
> >> +        uint8_t                        erl; 
> >> +        uint32_t                max_recv_dlength; 
> >> +        uint32_t                first_burst_len; 
> >> +        uint16_t                max_out_r2t; 
> >> +        uint32_t                max_burst_len; 
> >> +        char                        chap_auth[ISCSI_MAX_STR_LEN]; 
> >> +        char                        bidi_chap[ISCSI_MAX_STR_LEN]; 
> >> +        char                       
>  strict_login_comp[ISCSI_MAX_STR_LEN]; 
> >> +        char                        discovery_auth[ISCSI_MAX_STR_LEN]; 
> >> +        char                       
>  discovery_logout[ISCSI_MAX_STR_LEN]; 
> >> +        char                        port_state[ISCSI_MAX_STR_LEN]; 
> >> +        char                        port_speed[ISCSI_MAX_STR_LEN]; 
> >> +        /* 
> >> +         * TODO: we may have to make this bigger and interconnect 
> >> +         * specific for infiniband 
> >> +         */ 
> >> +        char                       
>  hwaddress[ISCSI_HWADDRESS_BUF_SIZE]; 
> >> +        char 
> >> transport_name[ISCSI_TRANSPORT_NAME_MAXLEN]; 
> >> +        /* 
> >> +         * This is only used for boot now, but the iser guys 
> >> +         * can use this for their virtualization idea. 
> >> +         */ 
> >> +        char                        alias[TARGET_NAME_MAXLEN + 1]; 
> >> +        char                        iname[TARGET_NAME_MAXLEN + 1]; 
> >> +}; 
> >> + 
> >>  struct iscsi_iface { 
> >>          struct device dev; 
> >>          struct iscsi_transport *transport; 
> >> 
> >> Thank you, 
> >> 
> >> ---------------- 
> >> Robert LeBlanc 
> >> PGP Fingerprint 79A2 9CA4 6CC4 45DD A904  C70E E654 3BB2 FA62 B9F1 
>

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To post to this group, send email to open-iscsi@googlegroups.com.
Visit this group at https://groups.google.com/group/open-iscsi.
For more options, visit https://groups.google.com/d/optout.

Reply via email to