Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 287361
b: refs/heads/master
c: 2f9bc89
h: refs/heads/master
i:
  287359: a5f9cfd
v: v3
  • Loading branch information
Nicholas Bellinger committed Jan 18, 2012
1 parent 5043335 commit 8ad7f64
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4949314c7283ea4f9ade182ca599583b89f7edd6
refs/heads/master: 2f9bc894c67dbacae5a6a9875818d2a18a918d18
37 changes: 33 additions & 4 deletions trunk/drivers/target/iscsi/iscsi_target.c
Original file line number Diff line number Diff line change
Expand Up @@ -3164,6 +3164,30 @@ static int iscsit_send_task_mgt_rsp(
return 0;
}

static bool iscsit_check_inaddr_any(struct iscsi_np *np)
{
bool ret = false;

if (np->np_sockaddr.ss_family == AF_INET6) {
const struct sockaddr_in6 sin6 = {
.sin6_addr = IN6ADDR_ANY_INIT };
struct sockaddr_in6 *sock_in6 =
(struct sockaddr_in6 *)&np->np_sockaddr;

if (!memcmp(sock_in6->sin6_addr.s6_addr,
sin6.sin6_addr.s6_addr, 16))
ret = true;
} else {
struct sockaddr_in * sock_in =
(struct sockaddr_in *)&np->np_sockaddr;

if (sock_in->sin_addr.s_addr == INADDR_ANY)
ret = true;
}

return ret;
}

static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
{
char *payload = NULL;
Expand Down Expand Up @@ -3213,12 +3237,17 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
spin_lock(&tpg->tpg_np_lock);
list_for_each_entry(tpg_np, &tpg->tpg_gnp_list,
tpg_np_list) {
struct iscsi_np *np = tpg_np->tpg_np;
bool inaddr_any = iscsit_check_inaddr_any(np);

len = sprintf(buf, "TargetAddress="
"%s%s%s:%hu,%hu",
(tpg_np->tpg_np->np_sockaddr.ss_family == AF_INET6) ?
"[" : "", tpg_np->tpg_np->np_ip,
(tpg_np->tpg_np->np_sockaddr.ss_family == AF_INET6) ?
"]" : "", tpg_np->tpg_np->np_port,
(np->np_sockaddr.ss_family == AF_INET6) ?
"[" : "", (inaddr_any == false) ?
np->np_ip : conn->local_ip,
(np->np_sockaddr.ss_family == AF_INET6) ?
"]" : "", (inaddr_any == false) ?
np->np_port : conn->local_port,
tpg->tpgt);
len += 1;

Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/target/iscsi/iscsi_target_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,7 @@ struct iscsi_conn {
u16 cid;
/* Remote TCP Port */
u16 login_port;
u16 local_port;
int net_size;
u32 auth_id;
#define CONNFLAG_SCTP_STRUCT_FILE 0x01
Expand All @@ -527,6 +528,7 @@ struct iscsi_conn {
unsigned char bad_hdr[ISCSI_HDR_LEN];
#define IPV6_ADDRESS_SPACE 48
unsigned char login_ip[IPV6_ADDRESS_SPACE];
unsigned char local_ip[IPV6_ADDRESS_SPACE];
int conn_usage_count;
int conn_waiting_on_uc;
atomic_t check_immediate_queue;
Expand Down
31 changes: 27 additions & 4 deletions trunk/drivers/target/iscsi/iscsi_target_login.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,8 +615,8 @@ static int iscsi_post_login_handler(
}

pr_debug("iSCSI Login successful on CID: %hu from %s to"
" %s:%hu,%hu\n", conn->cid, conn->login_ip, np->np_ip,
np->np_port, tpg->tpgt);
" %s:%hu,%hu\n", conn->cid, conn->login_ip,
conn->local_ip, conn->local_port, tpg->tpgt);

list_add_tail(&conn->conn_list, &sess->sess_conn_list);
atomic_inc(&sess->nconn);
Expand Down Expand Up @@ -658,7 +658,8 @@ static int iscsi_post_login_handler(
sess->session_state = TARG_SESS_STATE_LOGGED_IN;

pr_debug("iSCSI Login successful on CID: %hu from %s to %s:%hu,%hu\n",
conn->cid, conn->login_ip, np->np_ip, np->np_port, tpg->tpgt);
conn->cid, conn->login_ip, conn->local_ip, conn->local_port,
tpg->tpgt);

spin_lock_bh(&sess->conn_lock);
list_add_tail(&conn->conn_list, &sess->sess_conn_list);
Expand Down Expand Up @@ -1020,6 +1021,18 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
snprintf(conn->login_ip, sizeof(conn->login_ip), "%pI6c",
&sock_in6.sin6_addr.in6_u);
conn->login_port = ntohs(sock_in6.sin6_port);

if (conn->sock->ops->getname(conn->sock,
(struct sockaddr *)&sock_in6, &err, 0) < 0) {
pr_err("sock_ops->getname() failed.\n");
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
ISCSI_LOGIN_STATUS_TARGET_ERROR);
goto new_sess_out;
}
snprintf(conn->local_ip, sizeof(conn->local_ip), "%pI6c",
&sock_in6.sin6_addr.in6_u);
conn->local_port = ntohs(sock_in6.sin6_port);

} else {
memset(&sock_in, 0, sizeof(struct sockaddr_in));

Expand All @@ -1032,14 +1045,24 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
}
sprintf(conn->login_ip, "%pI4", &sock_in.sin_addr.s_addr);
conn->login_port = ntohs(sock_in.sin_port);

if (conn->sock->ops->getname(conn->sock,
(struct sockaddr *)&sock_in, &err, 0) < 0) {
pr_err("sock_ops->getname() failed.\n");
iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
ISCSI_LOGIN_STATUS_TARGET_ERROR);
goto new_sess_out;
}
sprintf(conn->local_ip, "%pI4", &sock_in.sin_addr.s_addr);
conn->local_port = ntohs(sock_in.sin_port);
}

conn->network_transport = np->np_network_transport;

pr_debug("Received iSCSI login request from %s on %s Network"
" Portal %s:%hu\n", conn->login_ip,
(conn->network_transport == ISCSI_TCP) ? "TCP" : "SCTP",
np->np_ip, np->np_port);
conn->local_ip, conn->local_port);

pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n");
conn->conn_state = TARG_CONN_STATE_IN_LOGIN;
Expand Down

0 comments on commit 8ad7f64

Please sign in to comment.