mirror of https://github.com/acidanthera/audk.git
Enhance the parameter check to avoid potential issue in negotiation.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Tian Feng <feng.tian@intel.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16750 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
27c93c06c0
commit
57f2e11478
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
The implementation of iSCSI protocol based on RFC3720.
|
The implementation of iSCSI protocol based on RFC3720.
|
||||||
|
|
||||||
Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -1225,12 +1225,14 @@ IScsiCheckOpParams (
|
||||||
//
|
//
|
||||||
// InitialR2T, result function is OR.
|
// InitialR2T, result function is OR.
|
||||||
//
|
//
|
||||||
|
if (!Session->InitialR2T) {
|
||||||
Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
|
Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
|
||||||
if (Value == NULL) {
|
if (Value == NULL) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Session->InitialR2T = (BOOLEAN) (Session->InitialR2T || (AsciiStrCmp (Value, "Yes") == 0));
|
Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// ImmediateData, result function is AND.
|
// ImmediateData, result function is AND.
|
||||||
|
@ -1240,7 +1242,7 @@ IScsiCheckOpParams (
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && (AsciiStrCmp (Value, "Yes") == 0));
|
Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0));
|
||||||
|
|
||||||
//
|
//
|
||||||
// MaxRecvDataSegmentLength is declarative.
|
// MaxRecvDataSegmentLength is declarative.
|
||||||
|
@ -1265,6 +1267,7 @@ IScsiCheckOpParams (
|
||||||
// ImmediateData=No.
|
// ImmediateData=No.
|
||||||
// This Key/Value is negotiation type.
|
// This Key/Value is negotiation type.
|
||||||
//
|
//
|
||||||
|
if (!(Session->InitialR2T && !Session->ImmediateData)) {
|
||||||
Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH);
|
Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH);
|
||||||
if (Value == NULL) {
|
if (Value == NULL) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
|
@ -1272,6 +1275,7 @@ IScsiCheckOpParams (
|
||||||
|
|
||||||
NumericValue = AsciiStrDecimalToUintn (Value);
|
NumericValue = AsciiStrDecimalToUintn (Value);
|
||||||
Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, NumericValue);
|
Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, NumericValue);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// MaxConnections, result function is Minimum.
|
// MaxConnections, result function is Minimum.
|
||||||
|
@ -1360,7 +1364,7 @@ IScsiCheckOpParams (
|
||||||
Session->MaxOutstandingR2T = (UINT16) MIN (Session->MaxOutstandingR2T, NumericValue);
|
Session->MaxOutstandingR2T = (UINT16) MIN (Session->MaxOutstandingR2T, NumericValue);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Remove declarative key-value paris if any.
|
// Remove declarative key-value pairs, if any.
|
||||||
//
|
//
|
||||||
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE);
|
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE);
|
||||||
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS);
|
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS);
|
||||||
|
@ -1368,9 +1372,17 @@ IScsiCheckOpParams (
|
||||||
//
|
//
|
||||||
// Remove the key-value that may not needed for result function is OR.
|
// Remove the key-value that may not needed for result function is OR.
|
||||||
//
|
//
|
||||||
|
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
|
||||||
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER);
|
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER);
|
||||||
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
|
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remove irrelevant parameter, if any.
|
||||||
|
//
|
||||||
|
if (Session->InitialR2T && !Session->ImmediateData) {
|
||||||
|
IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
if (IsListEmpty (KeyValueList)) {
|
if (IsListEmpty (KeyValueList)) {
|
||||||
//
|
//
|
||||||
// Succeed if no more keys in the list.
|
// Succeed if no more keys in the list.
|
||||||
|
|
Loading…
Reference in New Issue