⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iscsid.c

📁 iscsi企业级target.很好用
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -