aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2015-08-24 13:26:04 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-08-27 02:27:16 -0400
commit69d755747d31c07a416064f251c2f408938fb67a (patch)
treea3a4e17c1d5ddb6c2e9b5ef62a3ffeb505921058
parent76c28f1fcfeb42b47f798fe498351ee1d60086ae (diff)
target/iscsi: Keep local_ip as the actual sockaddr
This is a more natural format that lets us format it with the appropriate printk specifier as needed. This also lets us handle v4-mapped ipv6 addresses a little more nicely, by storing the addr as an actual v4 sockaddr in conn->local_sockaddr. Finally, we no longer need to maintain variables for port, since this is contained in sockaddr. Remove iscsi_np.np_port and iscsi_conn.local_port. Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c8
-rw-r--r--drivers/target/iscsi/iscsi_target.c46
-rw-r--r--drivers/target/iscsi/iscsi_target_configfs.c4
-rw-r--r--drivers/target/iscsi/iscsi_target_login.c43
-rw-r--r--drivers/target/iscsi/iscsi_target_tpg.c8
-rw-r--r--include/target/iscsi/iscsi_target_core.h4
6 files changed, 48 insertions, 65 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index 771700963127..9e7094c244ea 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -3218,9 +3218,7 @@ isert_set_conn_info(struct iscsi_np *np, struct iscsi_conn *conn,
3218 conn->login_port = ntohs(sock_in6->sin6_port); 3218 conn->login_port = ntohs(sock_in6->sin6_port);
3219 3219
3220 sock_in6 = (struct sockaddr_in6 *)&cm_route->addr.src_addr; 3220 sock_in6 = (struct sockaddr_in6 *)&cm_route->addr.src_addr;
3221 snprintf(conn->local_ip, sizeof(conn->local_ip), "%pI6c", 3221 memcpy(&conn->local_sockaddr , &sock_in6, sizeof(sock_in6));
3222 &sock_in6->sin6_addr.in6_u);
3223 conn->local_port = ntohs(sock_in6->sin6_port);
3224 } else { 3222 } else {
3225 sock_in = (struct sockaddr_in *)&cm_route->addr.dst_addr; 3223 sock_in = (struct sockaddr_in *)&cm_route->addr.dst_addr;
3226 sprintf(conn->login_ip, "%pI4", 3224 sprintf(conn->login_ip, "%pI4",
@@ -3228,9 +3226,7 @@ isert_set_conn_info(struct iscsi_np *np, struct iscsi_conn *conn,
3228 conn->login_port = ntohs(sock_in->sin_port); 3226 conn->login_port = ntohs(sock_in->sin_port);
3229 3227
3230 sock_in = (struct sockaddr_in *)&cm_route->addr.src_addr; 3228 sock_in = (struct sockaddr_in *)&cm_route->addr.src_addr;
3231 sprintf(conn->local_ip, "%pI4", 3229 memcpy(&conn->local_sockaddr , &sock_in, sizeof(sock_in));
3232 &sock_in->sin_addr.s_addr);
3233 conn->local_port = ntohs(sock_in->sin_port);
3234 } 3230 }
3235} 3231}
3236 3232
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index d75eeb5ce13a..f752235a1615 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -276,7 +276,7 @@ bool iscsit_check_np_match(
276 struct sockaddr_in *sock_in, *sock_in_e; 276 struct sockaddr_in *sock_in, *sock_in_e;
277 struct sockaddr_in6 *sock_in6, *sock_in6_e; 277 struct sockaddr_in6 *sock_in6, *sock_in6_e;
278 bool ip_match = false; 278 bool ip_match = false;
279 u16 port; 279 u16 port, port_e;
280 280
281 if (sockaddr->ss_family == AF_INET6) { 281 if (sockaddr->ss_family == AF_INET6) {
282 sock_in6 = (struct sockaddr_in6 *)sockaddr; 282 sock_in6 = (struct sockaddr_in6 *)sockaddr;
@@ -288,6 +288,7 @@ bool iscsit_check_np_match(
288 ip_match = true; 288 ip_match = true;
289 289
290 port = ntohs(sock_in6->sin6_port); 290 port = ntohs(sock_in6->sin6_port);
291 port_e = ntohs(sock_in6_e->sin6_port);
291 } else { 292 } else {
292 sock_in = (struct sockaddr_in *)sockaddr; 293 sock_in = (struct sockaddr_in *)sockaddr;
293 sock_in_e = (struct sockaddr_in *)&np->np_sockaddr; 294 sock_in_e = (struct sockaddr_in *)&np->np_sockaddr;
@@ -296,9 +297,10 @@ bool iscsit_check_np_match(
296 ip_match = true; 297 ip_match = true;
297 298
298 port = ntohs(sock_in->sin_port); 299 port = ntohs(sock_in->sin_port);
300 port_e = ntohs(sock_in_e->sin_port);
299 } 301 }
300 302
301 if (ip_match && (np->np_port == port) && 303 if (ip_match && (port_e == port) &&
302 (np->np_network_transport == network_transport)) 304 (np->np_network_transport == network_transport))
303 return true; 305 return true;
304 306
@@ -343,8 +345,6 @@ struct iscsi_np *iscsit_add_np(
343 struct __kernel_sockaddr_storage *sockaddr, 345 struct __kernel_sockaddr_storage *sockaddr,
344 int network_transport) 346 int network_transport)
345{ 347{
346 struct sockaddr_in *sock_in;
347 struct sockaddr_in6 *sock_in6;
348 struct iscsi_np *np; 348 struct iscsi_np *np;
349 int ret; 349 int ret;
350 350
@@ -367,14 +367,6 @@ struct iscsi_np *iscsit_add_np(
367 } 367 }
368 368
369 np->np_flags |= NPF_IP_NETWORK; 369 np->np_flags |= NPF_IP_NETWORK;
370 if (sockaddr->ss_family == AF_INET6) {
371 sock_in6 = (struct sockaddr_in6 *)sockaddr;
372 np->np_port = ntohs(sock_in6->sin6_port);
373 } else {
374 sock_in = (struct sockaddr_in *)sockaddr;
375 np->np_port = ntohs(sock_in->sin_port);
376 }
377
378 np->np_network_transport = network_transport; 370 np->np_network_transport = network_transport;
379 spin_lock_init(&np->np_thread_lock); 371 spin_lock_init(&np->np_thread_lock);
380 init_completion(&np->np_restart_comp); 372 init_completion(&np->np_restart_comp);
@@ -408,8 +400,8 @@ struct iscsi_np *iscsit_add_np(
408 list_add_tail(&np->np_list, &g_np_list); 400 list_add_tail(&np->np_list, &g_np_list);
409 mutex_unlock(&np_lock); 401 mutex_unlock(&np_lock);
410 402
411 pr_debug("CORE[0] - Added Network Portal: %pISc:%hu on %s\n", 403 pr_debug("CORE[0] - Added Network Portal: %pISpc on %s\n",
412 &np->np_sockaddr, np->np_port, np->np_transport->name); 404 &np->np_sockaddr, np->np_transport->name);
413 405
414 return np; 406 return np;
415} 407}
@@ -478,8 +470,8 @@ int iscsit_del_np(struct iscsi_np *np)
478 list_del(&np->np_list); 470 list_del(&np->np_list);
479 mutex_unlock(&np_lock); 471 mutex_unlock(&np_lock);
480 472
481 pr_debug("CORE[0] - Removed Network Portal: %pISc:%hu on %s\n", 473 pr_debug("CORE[0] - Removed Network Portal: %pISpc on %s\n",
482 &np->np_sockaddr, np->np_port, np->np_transport->name); 474 &np->np_sockaddr, np->np_transport->name);
483 475
484 iscsit_put_transport(np->np_transport); 476 iscsit_put_transport(np->np_transport);
485 kfree(np); 477 kfree(np);
@@ -3460,6 +3452,7 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
3460 tpg_np_list) { 3452 tpg_np_list) {
3461 struct iscsi_np *np = tpg_np->tpg_np; 3453 struct iscsi_np *np = tpg_np->tpg_np;
3462 bool inaddr_any = iscsit_check_inaddr_any(np); 3454 bool inaddr_any = iscsit_check_inaddr_any(np);
3455 struct __kernel_sockaddr_storage *sockaddr;
3463 3456
3464 if (np->np_network_transport != network_transport) 3457 if (np->np_network_transport != network_transport)
3465 continue; 3458 continue;
@@ -3487,18 +3480,15 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
3487 } 3480 }
3488 } 3481 }
3489 3482
3490 if (inaddr_any) { 3483 if (inaddr_any)
3491 len = sprintf(buf, "TargetAddress=" 3484 sockaddr = &conn->local_sockaddr;
3492 "%s:%hu,%hu", 3485 else
3493 conn->local_ip, 3486 sockaddr = &np->np_sockaddr;
3494 np->np_port, 3487
3495 tpg->tpgt); 3488 len = sprintf(buf, "TargetAddress="
3496 } else { 3489 "%pISpc,%hu",
3497 len = sprintf(buf, "TargetAddress=" 3490 sockaddr,
3498 "%pISpc,%hu", 3491 tpg->tpgt);
3499 &np->np_sockaddr,
3500 tpg->tpgt);
3501 }
3502 len += 1; 3492 len += 1;
3503 3493
3504 if ((len + payload_len) > buffer_len) { 3494 if ((len + payload_len) > buffer_len) {
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
index ad6a889dadc0..8d69c4132221 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -344,8 +344,8 @@ static void lio_target_call_delnpfromtpg(
344 344
345 se_tpg = &tpg->tpg_se_tpg; 345 se_tpg = &tpg->tpg_se_tpg;
346 pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s TPGT: %hu" 346 pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s TPGT: %hu"
347 " PORTAL: %pISc:%hu\n", config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item), 347 " PORTAL: %pISpc\n", config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item),
348 tpg->tpgt, &tpg_np->tpg_np->np_sockaddr, tpg_np->tpg_np->np_port); 348 tpg->tpgt, &tpg_np->tpg_np->np_sockaddr);
349 349
350 ret = iscsit_tpg_del_network_portal(tpg, tpg_np); 350 ret = iscsit_tpg_del_network_portal(tpg, tpg_np);
351 if (ret < 0) 351 if (ret < 0)
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c
index 88e0b97e8ea6..007299acefbd 100644
--- a/drivers/target/iscsi/iscsi_target_login.c
+++ b/drivers/target/iscsi/iscsi_target_login.c
@@ -729,8 +729,8 @@ int iscsi_post_login_handler(
729 } 729 }
730 730
731 pr_debug("iSCSI Login successful on CID: %hu from %s to" 731 pr_debug("iSCSI Login successful on CID: %hu from %s to"
732 " %s:%hu,%hu\n", conn->cid, conn->login_ip, 732 " %pISpc,%hu\n", conn->cid, conn->login_ip,
733 conn->local_ip, conn->local_port, tpg->tpgt); 733 &conn->local_sockaddr, tpg->tpgt);
734 734
735 list_add_tail(&conn->conn_list, &sess->sess_conn_list); 735 list_add_tail(&conn->conn_list, &sess->sess_conn_list);
736 atomic_inc(&sess->nconn); 736 atomic_inc(&sess->nconn);
@@ -774,8 +774,8 @@ int iscsi_post_login_handler(
774 pr_debug("Moving to TARG_SESS_STATE_LOGGED_IN.\n"); 774 pr_debug("Moving to TARG_SESS_STATE_LOGGED_IN.\n");
775 sess->session_state = TARG_SESS_STATE_LOGGED_IN; 775 sess->session_state = TARG_SESS_STATE_LOGGED_IN;
776 776
777 pr_debug("iSCSI Login successful on CID: %hu from %s to %s:%hu,%hu\n", 777 pr_debug("iSCSI Login successful on CID: %hu from %s to %pISpc,%hu\n",
778 conn->cid, conn->login_ip, conn->local_ip, conn->local_port, 778 conn->cid, conn->login_ip, &conn->local_sockaddr,
779 tpg->tpgt); 779 tpg->tpgt);
780 780
781 spin_lock_bh(&sess->conn_lock); 781 spin_lock_bh(&sess->conn_lock);
@@ -823,8 +823,8 @@ static void iscsi_handle_login_thread_timeout(unsigned long data)
823 struct iscsi_np *np = (struct iscsi_np *) data; 823 struct iscsi_np *np = (struct iscsi_np *) data;
824 824
825 spin_lock_bh(&np->np_thread_lock); 825 spin_lock_bh(&np->np_thread_lock);
826 pr_err("iSCSI Login timeout on Network Portal %pISc:%hu\n", 826 pr_err("iSCSI Login timeout on Network Portal %pISpc\n",
827 &np->np_sockaddr, np->np_port); 827 &np->np_sockaddr);
828 828
829 if (np->np_login_timer_flags & ISCSI_TF_STOP) { 829 if (np->np_login_timer_flags & ISCSI_TF_STOP) {
830 spin_unlock_bh(&np->np_thread_lock); 830 spin_unlock_bh(&np->np_thread_lock);
@@ -1027,13 +1027,15 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
1027 rc = conn->sock->ops->getname(conn->sock, 1027 rc = conn->sock->ops->getname(conn->sock,
1028 (struct sockaddr *)&sock_in6, &err, 0); 1028 (struct sockaddr *)&sock_in6, &err, 0);
1029 if (!rc) { 1029 if (!rc) {
1030 if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) 1030 if (!ipv6_addr_v4mapped(&sock_in6.sin6_addr)) {
1031 snprintf(conn->local_ip, sizeof(conn->local_ip), "[%pI6c]", 1031 memcpy(&conn->local_sockaddr, &sock_in6, sizeof(sock_in6));
1032 &sock_in6.sin6_addr.in6_u); 1032 } else {
1033 else 1033 /* Pretend to be an ipv4 socket */
1034 snprintf(conn->local_ip, sizeof(conn->local_ip), "%pI4", 1034 sock_in.sin_family = AF_INET;
1035 &sock_in6.sin6_addr.s6_addr32[3]); 1035 sock_in.sin_port = sock_in6.sin6_port;
1036 conn->local_port = ntohs(sock_in6.sin6_port); 1036 memcpy(&sock_in.sin_addr, &sock_in6.sin6_addr.s6_addr32[3], 4);
1037 memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
1038 }
1037 } 1039 }
1038 } else { 1040 } else {
1039 memset(&sock_in, 0, sizeof(struct sockaddr_in)); 1041 memset(&sock_in, 0, sizeof(struct sockaddr_in));
@@ -1048,11 +1050,8 @@ int iscsit_accept_np(struct iscsi_np *np, struct iscsi_conn *conn)
1048 1050
1049 rc = conn->sock->ops->getname(conn->sock, 1051 rc = conn->sock->ops->getname(conn->sock,
1050 (struct sockaddr *)&sock_in, &err, 0); 1052 (struct sockaddr *)&sock_in, &err, 0);
1051 if (!rc) { 1053 if (!rc)
1052 sprintf(conn->local_ip, "%pI4", 1054 memcpy(&conn->local_sockaddr, &sock_in, sizeof(sock_in));
1053 &sock_in.sin_addr.s_addr);
1054 conn->local_port = ntohs(sock_in.sin_port);
1055 }
1056 } 1055 }
1057 1056
1058 return 0; 1057 return 0;
@@ -1302,8 +1301,8 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
1302 spin_lock_bh(&np->np_thread_lock); 1301 spin_lock_bh(&np->np_thread_lock);
1303 if (np->np_thread_state != ISCSI_NP_THREAD_ACTIVE) { 1302 if (np->np_thread_state != ISCSI_NP_THREAD_ACTIVE) {
1304 spin_unlock_bh(&np->np_thread_lock); 1303 spin_unlock_bh(&np->np_thread_lock);
1305 pr_err("iSCSI Network Portal on %pISc:%hu currently not" 1304 pr_err("iSCSI Network Portal on %pISpc currently not"
1306 " active.\n", &np->np_sockaddr, np->np_port); 1305 " active.\n", &np->np_sockaddr);
1307 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, 1306 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
1308 ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE); 1307 ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE);
1309 goto new_sess_out; 1308 goto new_sess_out;
@@ -1313,8 +1312,8 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
1313 conn->network_transport = np->np_network_transport; 1312 conn->network_transport = np->np_network_transport;
1314 1313
1315 pr_debug("Received iSCSI login request from %s on %s Network" 1314 pr_debug("Received iSCSI login request from %s on %s Network"
1316 " Portal %s:%hu\n", conn->login_ip, np->np_transport->name, 1315 " Portal %pISpc\n", conn->login_ip, np->np_transport->name,
1317 conn->local_ip, conn->local_port); 1316 &conn->local_sockaddr);
1318 1317
1319 pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n"); 1318 pr_debug("Moving to TARG_CONN_STATE_IN_LOGIN.\n");
1320 conn->conn_state = TARG_CONN_STATE_IN_LOGIN; 1319 conn->conn_state = TARG_CONN_STATE_IN_LOGIN;
diff --git a/drivers/target/iscsi/iscsi_target_tpg.c b/drivers/target/iscsi/iscsi_target_tpg.c
index 31007cb4c877..d61ae5167c42 100644
--- a/drivers/target/iscsi/iscsi_target_tpg.c
+++ b/drivers/target/iscsi/iscsi_target_tpg.c
@@ -514,8 +514,8 @@ struct iscsi_tpg_np *iscsit_tpg_add_network_portal(
514 spin_unlock(&tpg_np_parent->tpg_np_parent_lock); 514 spin_unlock(&tpg_np_parent->tpg_np_parent_lock);
515 } 515 }
516 516
517 pr_debug("CORE[%s] - Added Network Portal: %pISc:%hu,%hu on %s\n", 517 pr_debug("CORE[%s] - Added Network Portal: %pISpc,%hu on %s\n",
518 tpg->tpg_tiqn->tiqn, &np->np_sockaddr, np->np_port, tpg->tpgt, 518 tpg->tpg_tiqn->tiqn, &np->np_sockaddr, tpg->tpgt,
519 np->np_transport->name); 519 np->np_transport->name);
520 520
521 return tpg_np; 521 return tpg_np;
@@ -528,8 +528,8 @@ static int iscsit_tpg_release_np(
528{ 528{
529 iscsit_clear_tpg_np_login_thread(tpg_np, tpg, true); 529 iscsit_clear_tpg_np_login_thread(tpg_np, tpg, true);
530 530
531 pr_debug("CORE[%s] - Removed Network Portal: %pISc:%hu,%hu on %s\n", 531 pr_debug("CORE[%s] - Removed Network Portal: %pISpc,%hu on %s\n",
532 tpg->tpg_tiqn->tiqn, &np->np_sockaddr, np->np_port, tpg->tpgt, 532 tpg->tpg_tiqn->tiqn, &np->np_sockaddr, tpg->tpgt,
533 np->np_transport->name); 533 np->np_transport->name);
534 534
535 tpg_np->tpg_np = NULL; 535 tpg_np->tpg_np = NULL;
diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h
index 1051d0c40ddd..b9434117785f 100644
--- a/include/target/iscsi/iscsi_target_core.h
+++ b/include/target/iscsi/iscsi_target_core.h
@@ -519,7 +519,6 @@ struct iscsi_conn {
519 u16 cid; 519 u16 cid;
520 /* Remote TCP Port */ 520 /* Remote TCP Port */
521 u16 login_port; 521 u16 login_port;
522 u16 local_port;
523 int net_size; 522 int net_size;
524 int login_family; 523 int login_family;
525 u32 auth_id; 524 u32 auth_id;
@@ -531,7 +530,7 @@ struct iscsi_conn {
531 u32 stat_sn; 530 u32 stat_sn;
532#define IPV6_ADDRESS_SPACE 48 531#define IPV6_ADDRESS_SPACE 48
533 unsigned char login_ip[IPV6_ADDRESS_SPACE]; 532 unsigned char login_ip[IPV6_ADDRESS_SPACE];
534 unsigned char local_ip[IPV6_ADDRESS_SPACE]; 533 struct __kernel_sockaddr_storage local_sockaddr;
535 int conn_usage_count; 534 int conn_usage_count;
536 int conn_waiting_on_uc; 535 int conn_waiting_on_uc;
537 atomic_t check_immediate_queue; 536 atomic_t check_immediate_queue;
@@ -778,7 +777,6 @@ struct iscsi_np {
778 enum iscsi_timer_flags_table np_login_timer_flags; 777 enum iscsi_timer_flags_table np_login_timer_flags;
779 u32 np_exports; 778 u32 np_exports;
780 enum np_flags_table np_flags; 779 enum np_flags_table np_flags;
781 u16 np_port;
782 spinlock_t np_thread_lock; 780 spinlock_t np_thread_lock;
783 struct completion np_restart_comp; 781 struct completion np_restart_comp;
784 struct socket *np_socket; 782 struct socket *np_socket;