support iscsi task function
This commit is contained in:
@@ -93,11 +93,12 @@ const (
|
||||
)
|
||||
|
||||
type iscsiTask struct {
|
||||
tag uint32
|
||||
conn *iscsiConnection
|
||||
cmd *ISCSICommand
|
||||
scmd *api.SCSICommand
|
||||
state taskState
|
||||
tag uint32
|
||||
conn *iscsiConnection
|
||||
cmd *ISCSICommand
|
||||
scmd *api.SCSICommand
|
||||
state taskState
|
||||
result byte
|
||||
|
||||
offset int
|
||||
r2tCount int
|
||||
@@ -143,11 +144,13 @@ func (conn *iscsiConnection) ReInstatement(newConn *iscsiConnection) {
|
||||
conn.conn = newConn.conn
|
||||
}
|
||||
|
||||
func (conn *iscsiConnection) buildRespPackage(oc OpCode) error {
|
||||
func (conn *iscsiConnection) buildRespPackage(oc OpCode, task *iscsiTask) error {
|
||||
conn.txTask = &iscsiTask{conn: conn, cmd: conn.req, tag: conn.req.TaskTag, scmd: &api.SCSICommand{}}
|
||||
conn.txIOState = IOSTATE_TX_BHS
|
||||
conn.statSN += 1
|
||||
task := conn.rxTask
|
||||
if task == nil {
|
||||
task = conn.rxTask
|
||||
}
|
||||
resp := &ISCSICommand{
|
||||
StatSN: conn.req.ExpStatSN,
|
||||
TaskTag: conn.req.TaskTag,
|
||||
@@ -182,11 +185,17 @@ func (conn *iscsiConnection) buildRespPackage(oc OpCode) error {
|
||||
if scmd.Result != 0 && scmd.SenseBuffer != nil {
|
||||
resp.RawData = scmd.SenseBuffer.Bytes()
|
||||
}
|
||||
case OpNoopIn, OpSCSITaskResp, OpReject:
|
||||
case OpNoopIn, OpReject:
|
||||
resp.OpCode = oc
|
||||
resp.Final = true
|
||||
resp.NSG = FullFeaturePhase
|
||||
resp.ExpCmdSN = conn.req.CmdSN + 1
|
||||
case OpSCSITaskResp:
|
||||
resp.OpCode = oc
|
||||
resp.Final = true
|
||||
resp.NSG = FullFeaturePhase
|
||||
resp.ExpCmdSN = conn.req.CmdSN + 1
|
||||
resp.Result = task.result
|
||||
case OpLoginResp:
|
||||
resp.OpCode = OpLoginResp
|
||||
resp.Transit = conn.loginParam.tgtTrans
|
||||
@@ -209,3 +218,41 @@ func (conn *iscsiConnection) buildRespPackage(oc OpCode) error {
|
||||
conn.resp = resp
|
||||
return nil
|
||||
}
|
||||
|
||||
func (conn *iscsiConnection) State() string {
|
||||
switch conn.state {
|
||||
case CONN_STATE_FREE:
|
||||
return "free"
|
||||
case CONN_STATE_SECURITY:
|
||||
return "begin security"
|
||||
case CONN_STATE_SECURITY_AUTH:
|
||||
return "security auth"
|
||||
case CONN_STATE_SECURITY_DONE:
|
||||
return "done security"
|
||||
case CONN_STATE_SECURITY_LOGIN:
|
||||
return "security login"
|
||||
case CONN_STATE_SECURITY_FULL:
|
||||
return "security full"
|
||||
case CONN_STATE_LOGIN:
|
||||
return "begin login"
|
||||
case CONN_STATE_LOGIN_FULL:
|
||||
return "done login"
|
||||
case CONN_STATE_FULL:
|
||||
return "full feature"
|
||||
case CONN_STATE_KERNEL:
|
||||
return "kernel"
|
||||
case CONN_STATE_CLOSE:
|
||||
return "close"
|
||||
case CONN_STATE_EXIT:
|
||||
return "exit"
|
||||
case CONN_STATE_SCSI:
|
||||
return "scsi"
|
||||
case CONN_STATE_INIT:
|
||||
return "init"
|
||||
case CONN_STATE_START:
|
||||
return "start"
|
||||
case CONN_STATE_READY:
|
||||
return "ready"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user