diff options
Diffstat (limited to 'drivers/scsi/iscsi_tcp.c')
-rw-r--r-- | drivers/scsi/iscsi_tcp.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 6ecb4baa37e2..6e510f3cfbf6 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -3536,7 +3536,7 @@ iscsi_session_get_param(struct iscsi_cls_session *cls_session, | |||
3536 | *value = session->ofmarker_en; | 3536 | *value = session->ofmarker_en; |
3537 | break; | 3537 | break; |
3538 | default: | 3538 | default: |
3539 | return ISCSI_ERR_PARAM_NOT_FOUND; | 3539 | return -EINVAL; |
3540 | } | 3540 | } |
3541 | 3541 | ||
3542 | return 0; | 3542 | return 0; |
@@ -3547,6 +3547,7 @@ iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, | |||
3547 | enum iscsi_param param, uint32_t *value) | 3547 | enum iscsi_param param, uint32_t *value) |
3548 | { | 3548 | { |
3549 | struct iscsi_conn *conn = cls_conn->dd_data; | 3549 | struct iscsi_conn *conn = cls_conn->dd_data; |
3550 | struct inet_sock *inet; | ||
3550 | 3551 | ||
3551 | switch(param) { | 3552 | switch(param) { |
3552 | case ISCSI_PARAM_MAX_RECV_DLENGTH: | 3553 | case ISCSI_PARAM_MAX_RECV_DLENGTH: |
@@ -3561,13 +3562,61 @@ iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, | |||
3561 | case ISCSI_PARAM_DATADGST_EN: | 3562 | case ISCSI_PARAM_DATADGST_EN: |
3562 | *value = conn->datadgst_en; | 3563 | *value = conn->datadgst_en; |
3563 | break; | 3564 | break; |
3565 | case ISCSI_PARAM_CONN_PORT: | ||
3566 | mutex_lock(&conn->xmitmutex); | ||
3567 | if (!conn->sock) { | ||
3568 | mutex_unlock(&conn->xmitmutex); | ||
3569 | return -EINVAL; | ||
3570 | } | ||
3571 | |||
3572 | inet = inet_sk(conn->sock->sk); | ||
3573 | *value = be16_to_cpu(inet->dport); | ||
3574 | mutex_unlock(&conn->xmitmutex); | ||
3564 | default: | 3575 | default: |
3565 | return ISCSI_ERR_PARAM_NOT_FOUND; | 3576 | return -EINVAL; |
3566 | } | 3577 | } |
3567 | 3578 | ||
3568 | return 0; | 3579 | return 0; |
3569 | } | 3580 | } |
3570 | 3581 | ||
3582 | static int | ||
3583 | iscsi_conn_get_str_param(struct iscsi_cls_conn *cls_conn, | ||
3584 | enum iscsi_param param, char *buf) | ||
3585 | { | ||
3586 | struct iscsi_conn *conn = cls_conn->dd_data; | ||
3587 | struct sock *sk; | ||
3588 | struct inet_sock *inet; | ||
3589 | struct ipv6_pinfo *np; | ||
3590 | int len = 0; | ||
3591 | |||
3592 | switch (param) { | ||
3593 | case ISCSI_PARAM_CONN_ADDRESS: | ||
3594 | mutex_lock(&conn->xmitmutex); | ||
3595 | if (!conn->sock) { | ||
3596 | mutex_unlock(&conn->xmitmutex); | ||
3597 | return -EINVAL; | ||
3598 | } | ||
3599 | |||
3600 | sk = conn->sock->sk; | ||
3601 | if (sk->sk_family == PF_INET) { | ||
3602 | inet = inet_sk(sk); | ||
3603 | len = sprintf(buf, "%u.%u.%u.%u\n", | ||
3604 | NIPQUAD(inet->daddr)); | ||
3605 | } else { | ||
3606 | np = inet6_sk(sk); | ||
3607 | len = sprintf(buf, | ||
3608 | "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n", | ||
3609 | NIP6(np->daddr)); | ||
3610 | } | ||
3611 | mutex_unlock(&conn->xmitmutex); | ||
3612 | break; | ||
3613 | default: | ||
3614 | return -EINVAL; | ||
3615 | } | ||
3616 | |||
3617 | return len; | ||
3618 | } | ||
3619 | |||
3571 | static void | 3620 | static void |
3572 | iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats) | 3621 | iscsi_conn_get_stats(struct iscsi_cls_conn *cls_conn, struct iscsi_stats *stats) |
3573 | { | 3622 | { |
@@ -3610,6 +3659,20 @@ static struct iscsi_transport iscsi_tcp_transport = { | |||
3610 | .name = "tcp", | 3659 | .name = "tcp", |
3611 | .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST | 3660 | .caps = CAP_RECOVERY_L0 | CAP_MULTI_R2T | CAP_HDRDGST |
3612 | | CAP_DATADGST, | 3661 | | CAP_DATADGST, |
3662 | .param_mask = ISCSI_MAX_RECV_DLENGTH | | ||
3663 | ISCSI_MAX_XMIT_DLENGTH | | ||
3664 | ISCSI_HDRDGST_EN | | ||
3665 | ISCSI_DATADGST_EN | | ||
3666 | ISCSI_INITIAL_R2T_EN | | ||
3667 | ISCSI_MAX_R2T | | ||
3668 | ISCSI_IMM_DATA_EN | | ||
3669 | ISCSI_FIRST_BURST | | ||
3670 | ISCSI_MAX_BURST | | ||
3671 | ISCSI_PDU_INORDER_EN | | ||
3672 | ISCSI_DATASEQ_INORDER_EN | | ||
3673 | ISCSI_ERL | | ||
3674 | ISCSI_CONN_PORT | | ||
3675 | ISCSI_CONN_ADDRESS, | ||
3613 | .host_template = &iscsi_sht, | 3676 | .host_template = &iscsi_sht, |
3614 | .hostdata_size = sizeof(struct iscsi_session), | 3677 | .hostdata_size = sizeof(struct iscsi_session), |
3615 | .conndata_size = sizeof(struct iscsi_conn), | 3678 | .conndata_size = sizeof(struct iscsi_conn), |
@@ -3622,6 +3685,7 @@ static struct iscsi_transport iscsi_tcp_transport = { | |||
3622 | .destroy_conn = iscsi_conn_destroy, | 3685 | .destroy_conn = iscsi_conn_destroy, |
3623 | .set_param = iscsi_conn_set_param, | 3686 | .set_param = iscsi_conn_set_param, |
3624 | .get_conn_param = iscsi_conn_get_param, | 3687 | .get_conn_param = iscsi_conn_get_param, |
3688 | .get_conn_str_param = iscsi_conn_get_str_param, | ||
3625 | .get_session_param = iscsi_session_get_param, | 3689 | .get_session_param = iscsi_session_get_param, |
3626 | .start_conn = iscsi_conn_start, | 3690 | .start_conn = iscsi_conn_start, |
3627 | .stop_conn = iscsi_conn_stop, | 3691 | .stop_conn = iscsi_conn_stop, |