📄 iscsid.c
字号:
conn->state = STATE_EXIT; return; }/* if (conn->target->max_sessions && *//* (++conn->target->session_cnt > conn->target->max_sessions)) { *//* conn->target->session_cnt--; *//* rsp->status_class = ISCSI_STATUS_INITIATOR_ERR; *//* rsp->status_detail = ISCSI_STATUS_TOO_MANY_CONN; *//* conn->state = STATE_EXIT; *//* return; *//* } */ ki->param_get(conn->tid, 0, conn->session_param); conn->exp_cmd_sn = be32_to_cpu(req->cmd_sn); log_debug(1, "exp_cmd_sn: %d,%d", conn->exp_cmd_sn, req->cmd_sn); conn->max_cmd_sn = conn->exp_cmd_sn; } text_key_add(conn, "TargetPortalGroupTag", "1");}static void login_finish(struct connection *conn){ switch (conn->session_type) { case SESSION_NORMAL: if (!conn->session) session_create(conn); conn->sid = conn->session->sid; break; case SESSION_DISCOVERY: /* set a dummy tsih value */ conn->sid.id.tsih = 1; break; }}static int cmnd_exec_auth(struct connection *conn){ int res; switch (conn->auth_method) { case AUTH_CHAP: res = cmnd_exec_auth_chap(conn); break; case AUTH_NONE: res = 0; break; default: log_error("Unknown auth. method %d", conn->auth_method); res = -3; } return res;}static void cmnd_exec_login(struct connection *conn){ struct iscsi_login_req_hdr *req = (struct iscsi_login_req_hdr *)&conn->req.bhs; struct iscsi_login_rsp_hdr *rsp = (struct iscsi_login_rsp_hdr *)&conn->rsp.bhs; int stay = 0, nsg_disagree = 0; memset(rsp, 0, BHS_SIZE); if ((req->opcode & ISCSI_OPCODE_MASK) != ISCSI_OP_LOGIN_CMD || !(req->opcode & ISCSI_OP_IMMEDIATE)) { //reject } rsp->opcode = ISCSI_OP_LOGIN_RSP; rsp->max_version = ISCSI_VERSION; rsp->active_version = ISCSI_VERSION; rsp->itt = req->itt; if (/*req->max_version < ISCSI_VERSION ||*/ req->min_version > ISCSI_VERSION) { rsp->status_class = ISCSI_STATUS_INITIATOR_ERR; rsp->status_detail = ISCSI_STATUS_NO_VERSION; conn->state = STATE_EXIT; return; } switch (req->flags & ISCSI_FLG_CSG_MASK) { case ISCSI_FLG_CSG_SECURITY: log_debug(1, "Login request (security negotiation): %d", conn->state); rsp->flags = ISCSI_FLG_CSG_SECURITY; switch (conn->state) { case STATE_FREE: conn->state = STATE_SECURITY; login_start(conn); if (rsp->status_class) return; //else fall through case STATE_SECURITY: text_scan_security(conn); if (rsp->status_class) return; if (conn->auth_method != AUTH_NONE) { conn->state = STATE_SECURITY_AUTH; conn->auth_state = AUTH_STATE_START; } break; case STATE_SECURITY_AUTH: switch (cmnd_exec_auth(conn)) { case 0: break; default: case -1: goto init_err; case -2: goto auth_err; } break; default: goto init_err; } break; case ISCSI_FLG_CSG_LOGIN: log_debug(1, "Login request (operational negotiation): %d", conn->state); rsp->flags = ISCSI_FLG_CSG_LOGIN; switch (conn->state) { case STATE_FREE: conn->state = STATE_LOGIN; login_start(conn); if (!account_empty(conn->tid, AUTH_DIR_INCOMING)) goto auth_err; if (rsp->status_class) return; text_scan_login(conn); if (rsp->status_class) return; stay = text_check_param(conn); break; case STATE_LOGIN: text_scan_login(conn); if (rsp->status_class) return; stay = text_check_param(conn); break; default: goto init_err; } break; default: goto init_err; } if (rsp->status_class) return; if (conn->state != STATE_SECURITY_AUTH && req->flags & ISCSI_FLG_TRANSIT) { int nsg = req->flags & ISCSI_FLG_NSG_MASK; switch (nsg) { case ISCSI_FLG_NSG_LOGIN: switch (conn->state) { case STATE_SECURITY: case STATE_SECURITY_DONE: conn->state = STATE_SECURITY_LOGIN; login_security_done(conn); break; default: goto init_err; } break; case ISCSI_FLG_NSG_FULL_FEATURE: switch (conn->state) { case STATE_SECURITY: case STATE_SECURITY_DONE: if ((nsg_disagree = text_check_param(conn))) { conn->state = STATE_LOGIN; nsg = ISCSI_FLG_NSG_LOGIN; break; } conn->state = STATE_SECURITY_FULL; login_security_done(conn); break; case STATE_LOGIN: if (stay) nsg = ISCSI_FLG_NSG_LOGIN; else conn->state = STATE_LOGIN_FULL; break; default: goto init_err; } if (!stay && !nsg_disagree) { text_check_param(conn); login_finish(conn); } break; default: goto init_err; } rsp->flags |= nsg | (stay ? 0 : ISCSI_FLG_TRANSIT); } rsp->sid = conn->sid; rsp->stat_sn = cpu_to_be32(conn->stat_sn++); rsp->exp_cmd_sn = cpu_to_be32(conn->exp_cmd_sn); rsp->max_cmd_sn = cpu_to_be32(conn->max_cmd_sn); return;init_err: rsp->flags = 0; rsp->status_class = ISCSI_STATUS_INITIATOR_ERR; rsp->status_detail = ISCSI_STATUS_INIT_ERR; conn->state = STATE_EXIT; return;auth_err: rsp->flags = 0; rsp->status_class = ISCSI_STATUS_INITIATOR_ERR; rsp->status_detail = ISCSI_STATUS_AUTH_FAILED; conn->state = STATE_EXIT; return;}static void text_scan_text(struct connection *conn){ char *key, *value, *data; int datasize; data = conn->req.data; datasize = conn->req.datasize; while ((key = next_key(&data, &datasize, &value))) { if (!strcmp(key, "SendTargets")) { struct sockaddr_storage ss; socklen_t slen, blen; char *p, buf[NI_MAXHOST + 128]; if (value[0] == 0) continue; p = buf; blen = sizeof(buf); slen = sizeof(ss); getsockname(conn->fd, (struct sockaddr *) &ss, &slen); if (ss.ss_family == AF_INET6) { *p++ = '['; blen--; } slen = sizeof(ss); getnameinfo((struct sockaddr *) &ss, slen, p, blen, NULL, 0, NI_NUMERICHOST); p = buf + strlen(buf); if (ss.ss_family == AF_INET6) *p++ = ']'; sprintf(p, ":%d,1", server_port); target_list_build(conn, buf, strcmp(value, "All") ? value : NULL); } else text_key_add(conn, key, "NotUnderstood"); }}static void cmnd_exec_text(struct connection *conn){ struct iscsi_text_req_hdr *req = (struct iscsi_text_req_hdr *)&conn->req.bhs; struct iscsi_text_rsp_hdr *rsp = (struct iscsi_text_rsp_hdr *)&conn->rsp.bhs; memset(rsp, 0, BHS_SIZE); if (be32_to_cpu(req->ttt) != 0xffffffff) { /* reject */; } rsp->opcode = ISCSI_OP_TEXT_RSP; rsp->itt = req->itt; //rsp->ttt = rsp->ttt; rsp->ttt = 0xffffffff; conn->exp_cmd_sn = be32_to_cpu(req->cmd_sn); if (!(req->opcode & ISCSI_OP_IMMEDIATE)) conn->exp_cmd_sn++; log_debug(1, "Text request: %d", conn->state); text_scan_text(conn); if (req->flags & ISCSI_FLG_FINAL) rsp->flags = ISCSI_FLG_FINAL; rsp->stat_sn = cpu_to_be32(conn->stat_sn++); rsp->exp_cmd_sn = cpu_to_be32(conn->exp_cmd_sn); rsp->max_cmd_sn = cpu_to_be32(conn->max_cmd_sn);}static void cmnd_exec_logout(struct connection *conn){ struct iscsi_logout_req_hdr *req = (struct iscsi_logout_req_hdr *)&conn->req.bhs; struct iscsi_logout_rsp_hdr *rsp = (struct iscsi_logout_rsp_hdr *)&conn->rsp.bhs; memset(rsp, 0, BHS_SIZE); rsp->opcode = ISCSI_OP_LOGOUT_RSP; rsp->flags = ISCSI_FLG_FINAL; rsp->itt = req->itt; conn->exp_cmd_sn = be32_to_cpu(req->cmd_sn); if (!(req->opcode & ISCSI_OP_IMMEDIATE)) conn->exp_cmd_sn++; rsp->stat_sn = cpu_to_be32(conn->stat_sn++); rsp->exp_cmd_sn = cpu_to_be32(conn->exp_cmd_sn); rsp->max_cmd_sn = cpu_to_be32(conn->max_cmd_sn);}int cmnd_execute(struct connection *conn){ int res = 1; switch (conn->req.bhs.opcode & ISCSI_OPCODE_MASK) { case ISCSI_OP_LOGIN_CMD: //if conn->state == STATE_FULL -> reject cmnd_exec_login(conn); conn->rsp.bhs.ahslength = conn->rsp.ahssize / 4; conn->rsp.bhs.datalength[0] = conn->rsp.datasize >> 16; conn->rsp.bhs.datalength[1] = conn->rsp.datasize >> 8; conn->rsp.bhs.datalength[2] = conn->rsp.datasize; log_pdu(2, &conn->rsp); break; case ISCSI_OP_TEXT_CMD: //if conn->state != STATE_FULL -> reject cmnd_exec_text(conn); conn->rsp.bhs.ahslength = conn->rsp.ahssize / 4; conn->rsp.bhs.datalength[0] = conn->rsp.datasize >> 16; conn->rsp.bhs.datalength[1] = conn->rsp.datasize >> 8; conn->rsp.bhs.datalength[2] = conn->rsp.datasize; log_pdu(2, &conn->rsp); break; case ISCSI_OP_LOGOUT_CMD: //if conn->state != STATE_FULL -> reject cmnd_exec_logout(conn); conn->rsp.bhs.ahslength = conn->rsp.ahssize / 4; conn->rsp.bhs.datalength[0] = conn->rsp.datasize >> 16; conn->rsp.bhs.datalength[1] = conn->rsp.datasize >> 8; conn->rsp.bhs.datalength[2] = conn->rsp.datasize; log_pdu(2, &conn->rsp); break; default: //reject res = 0; break; } return res;}void cmnd_finish(struct connection *conn){ switch (conn->state) { case STATE_EXIT: conn->state = STATE_CLOSE; break; case STATE_SECURITY_LOGIN: conn->state = STATE_LOGIN; break; case STATE_SECURITY_FULL: //fall through case STATE_LOGIN_FULL: if (conn->session_type == SESSION_NORMAL) conn->state = STATE_KERNEL; else conn->state = STATE_FULL; break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -