📄 iscsi_common.c
字号:
/* common/iscsi_common.c * * Contains functions common for both iscsi initiator and iscsi target * * vi: set autoindent tabstop=8 shiftwidth=4 : * * This file contains auxilliary functions for iscsi initiator * code that are responsible for dealing with error recovery. * * Copyright (C) 2001-2003 InterOperability Lab (IOL) * University of New Hampshier (UNH) * Durham, NH 03824 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * The name of IOL and/or UNH may not be used to endorse or promote * products derived from this software without specific prior * written permission.*/#include <linux/kernel.h>#include <linux/types.h>#include <linux/net.h>#include <linux/in.h>#include <linux/inet.h>#include <scsi/scsi.h>#include "iscsi_common.h"#include "debug.h"#ifdef __KERNEL__/* routine to convert a 64-bit value in network byte order into a printable string*/char *string_llx(__u64 x, char *str){ int i; static char convert[] = "0123456789abcdef"; char *ptr; __u32 c; union { __u64 x; __u8 c[8]; } tmp; tmp.x = x; ptr = str; *ptr++ = '0'; *ptr++ = 'x'; for (i = 0; i < 8; i++) { c = tmp.c[i]; *ptr++ = convert[c >> 4]; *ptr++ = convert[c & 0xf]; } *ptr = '\0'; return str;}static voidprint_rsvd_u8(int n, __u8 rsvd){ if (rsvd != 0) printk(" rsvd%d: 0x%.2x\n", n, rsvd);}static voidprint_rsvd_u16(int n, __u16 rsvd){ if (rsvd != 0) printk(" rsvd%d: 0x%.4x\n", n, rsvd);}static voidprint_rsvd_u32(int n, __u32 rsvd){ if (rsvd != 0) printk(" rsvd%d: 0x%.8x\n", n, rsvd);}static voidprint_rsvd_u64(int n, __u64 rsvd){ char string[8]; if (rsvd != 0ll) printk(" rsvd%d: %s\n", n, string_llx(rsvd, string));}static voidprint_opcode(__u8 opcode){ printk(" Opcode: 0x%.2x, I: %d\n", opcode & ISCSI_OPCODE, (opcode & I_BIT) != 0);}static voidprint_flags(__u8 flags){ printk(" flags: 0x%.2x\n", flags);}static voidprint_version(char *which, __u8 version){ printk(" Version%s: 0x%.2x\n", which, version);}static voidprint_response(__u8 response){ if (response != 0) printk(" Response: 0x%.2x\n", response);}static voidprint_status(__u8 status){ if (status != 0) printk(" Status: 0x%.2x\n", status);}static voidprint_lun(__u64 lun){ char string[20]; if (lun != 0ll) printk(" LUN: %s\n", string_llx(lun, string));}static voidprint_isid_tsih(__u8 isid[6], __u16 tsih){ printk(" ISID: 0x%.2x %.2x %.2x %.2x %.2x %.2x\n", isid[0], isid[1], isid[2], isid[3], isid[4], isid[5]); printk(" TSIH: %u\n", be16_to_cpu(tsih));}static voidprint_dsl(__u32 length){ if (length != 0) printk(" DSL: %u\n", be32_to_cpu(length));}static voidprint_itt(__u32 init_task_tag){ if (init_task_tag == ALL_ONES) printk(" ITT: 0x%08x\n", init_task_tag); else printk(" ITT: %u\n", be32_to_cpu(init_task_tag));}static voidprint_ttt(__u32 target_xfer_tag){ if (target_xfer_tag == ALL_ONES) printk(" TTT: 0x%08x\n", target_xfer_tag); else printk(" TTT: %u\n", be32_to_cpu(target_xfer_tag));}static voidprint_cid(__u16 cid){ printk(" CID: %u\n", be16_to_cpu(cid));}static voidprint_expstatsn(__u32 exp_stat_sn){ if (exp_stat_sn != 0) printk(" ExpStatSN: %u\n", be32_to_cpu(exp_stat_sn));}static voidprint_cmdsn_expstatsn(__u32 cmd_sn, __u32 exp_stat_sn){ printk(" CmdSN: %u\n", be32_to_cpu(cmd_sn)); print_expstatsn(exp_stat_sn);}static voidprint_statsn_exp_max(__u32 stat_sn, __u32 exp_cmd_sn, __u32 max_cmd_sn){ if (stat_sn != 0) printk(" StatSN: %u\n", be32_to_cpu(stat_sn)); printk(" ExpCmdSN: %u\n", be32_to_cpu(exp_cmd_sn)); printk(" MaxCmdSN: %u\n", be32_to_cpu(max_cmd_sn));}static voidprint_residual(__u32 resid){ if (resid != 0) printk(" ResidualCount: %u\n", be32_to_cpu(resid));}static voidprint_datasn(__u32 data_sn){ if (data_sn != 0) printk(" DataSN: %u\n", be32_to_cpu(data_sn));}static voidprint_offset(__u32 offset){ if (offset != 0) printk(" BufferOffset: %u\n", be32_to_cpu(offset));}static voidprint_rtt(__u32 ref_task_tag){ if (ref_task_tag != 0) printk(" RTT: %u\n", be32_to_cpu(ref_task_tag));}static voidprint_exp_data_sn(__u32 exp_data_sn){ if (exp_data_sn != 0) printk(" ExpDataSN: %u\n", be32_to_cpu(exp_data_sn));}static voidprint_begrun(__u32 begrun){ printk(" BegRun: %u\n", be32_to_cpu(begrun));}static voidprint_runlen(__u32 runlen){ printk(" RunLength: %u\n", be32_to_cpu(runlen));}voidprint_init_scsi_cmnd(struct iscsi_init_scsi_cmnd *cmd){ print_opcode(cmd->opcode); print_flags(cmd->flags); print_rsvd_u16(1, cmd->rsvd1); print_dsl(cmd->length); print_lun(cmd->lun); print_itt(cmd->init_task_tag); printk(" EDTL: %u\n", be32_to_cpu(cmd->xfer_len)); print_cmdsn_expstatsn(cmd->cmd_sn, cmd->exp_stat_sn); printk (" CDB: 0x%.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x " "%.2x %.2x %.2x %.2x %.2x\n", cmd->cdb[0], cmd->cdb[1], cmd->cdb[2], cmd->cdb[3], cmd->cdb[4], cmd->cdb[5], cmd->cdb[6], cmd->cdb[7], cmd->cdb[8], cmd->cdb[9], cmd->cdb[10], cmd->cdb[11], cmd->cdb[12], cmd->cdb[13], cmd->cdb[14], cmd->cdb[15]);}voidprint_targ_scsi_rsp(struct iscsi_targ_scsi_rsp *cmd){ print_opcode(cmd->opcode); print_flags(cmd->flags); print_response(cmd->response); print_status(cmd->status); print_dsl(cmd->length); print_lun(cmd->lun); print_itt(cmd->init_task_tag); print_ttt(cmd->target_xfer_tag); print_statsn_exp_max(cmd->stat_sn, cmd->exp_cmd_sn, cmd->max_cmd_sn); print_exp_data_sn(cmd->exp_data_sn); if (cmd->bidi_resid != 0) printk(" BidiResidualCount: %u\n", be32_to_cpu(cmd->bidi_resid)); print_residual(cmd->resid);}voidprint_init_text_cmnd(struct iscsi_init_text_cmnd *cmd){ print_opcode(cmd->opcode); print_flags(cmd->flags); print_rsvd_u16(2, cmd->rsvd2); print_dsl(cmd->length); print_lun(cmd->lun); print_itt(cmd->init_task_tag); print_ttt(cmd->target_xfer_tag); print_cmdsn_expstatsn(cmd->cmd_sn, cmd->exp_stat_sn); print_rsvd_u64(4, cmd->rsvd4); print_rsvd_u64(5, cmd->rsvd5);}voidprint_targ_text_rsp(struct iscsi_targ_text_rsp *cmd){ print_opcode(cmd->opcode); print_flags(cmd->flags); print_rsvd_u16(2, cmd->rsvd2); print_dsl(cmd->length); print_lun(cmd->lun); print_itt(cmd->init_task_tag); print_ttt(cmd->target_xfer_tag); print_statsn_exp_max(cmd->stat_sn, cmd->exp_cmd_sn, cmd->max_cmd_sn); print_rsvd_u32(4, cmd->rsvd4); print_rsvd_u64(5, cmd->rsvd5);}voidprint_init_login_cmnd(struct iscsi_init_login_cmnd *cmd){ print_opcode(cmd->opcode); print_flags(cmd->flags); print_version("Max", cmd->version_max); print_version("Min", cmd->version_min); print_dsl(cmd->length); print_isid_tsih(cmd->isid, cmd->tsih); print_itt(cmd->init_task_tag); print_cid(cmd->cid); print_rsvd_u16(1, cmd->rsvd1); print_cmdsn_expstatsn(cmd->cmd_sn, cmd->exp_stat_sn); print_rsvd_u64(2, cmd->rsvd2); print_rsvd_u64(3, cmd->rsvd3);}voidprint_targ_login_rsp(struct iscsi_targ_login_rsp *cmd){ print_opcode(cmd->opcode); print_flags(cmd->flags); print_version("Max", cmd->version_max); print_version("Active", cmd->version_active); print_dsl(cmd->length); print_isid_tsih(cmd->isid, cmd->tsih); print_itt(cmd->init_task_tag); print_rsvd_u32(1, cmd->rsvd1); print_statsn_exp_max(cmd->stat_sn, cmd->exp_cmd_sn, cmd->max_cmd_sn); if (cmd->status_class != 0) printk(" StatusClass: 0x%.2x\n", cmd->status_class); if (cmd->status_detail != 0) printk(" StatusDetail: 0x%.2x\n", cmd->status_detail); print_rsvd_u16(2, cmd->rsvd2); print_rsvd_u64(3, cmd->rsvd3);}voidprint_init_logout_cmnd(struct iscsi_init_logout_cmnd *cmd){ print_opcode(cmd->opcode); printk("reasoncod: 0x%.2x\n", cmd->flags); print_rsvd_u16(1, cmd->rsvd1); print_dsl(cmd->length); print_lun(cmd->lun); print_itt(cmd->init_task_tag); print_cid(cmd->cid); print_rsvd_u16(2, cmd->rsvd2); print_cmdsn_expstatsn(cmd->cmd_sn, cmd->exp_stat_sn); print_rsvd_u64(4, cmd->rsvd4); print_rsvd_u64(5, cmd->rsvd5);}voidprint_targ_logout_rsp(struct iscsi_targ_logout_rsp *cmd){ print_opcode(cmd->opcode); print_flags(cmd->flags); print_response(cmd->response); print_rsvd_u8(1, cmd->rsvd1); print_dsl(cmd->length); print_lun(cmd->lun); print_itt(cmd->init_task_tag); print_rsvd_u32(3, cmd->rsvd3);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -