- Timestamp:
- Jan 31, 2014 5:45:25 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 91987
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/src/VBox/Storage/ISCSI.cpp ¶
r49781 r50304 569 569 /** Flag whether to use the host IP stack or DevINIP. */ 570 570 bool fHostIP; 571 /** Flag whether to dump malformed packets in the release log. */ 572 bool fDumpMalformedPackets; 571 573 572 574 /** Head of request queue */ … … 629 631 static const char *s_iscsiConfigDefaultHostIPStack = "1"; 630 632 633 /** Default dump malformed packet configuration value. */ 634 static const char *s_iscsiConfigDefaultDumpMalformedPackets = "0"; 635 631 636 /** Description of all accepted config parameters. */ 632 637 static const VDCONFIGINFO s_iscsiConfigInfo[] = 633 638 { 634 { "TargetName", NULL,VDCFGVALUETYPE_STRING, VD_CFGKEY_MANDATORY },639 { "TargetName", NULL, VDCFGVALUETYPE_STRING, VD_CFGKEY_MANDATORY }, 635 640 /* LUN is defined of string type to handle the "enc" prefix. */ 636 { "LUN", s_iscsiConfigDefaultLUN, VDCFGVALUETYPE_STRING, VD_CFGKEY_MANDATORY }, 637 { "TargetAddress", NULL, VDCFGVALUETYPE_STRING, VD_CFGKEY_MANDATORY }, 638 { "InitiatorName", NULL, VDCFGVALUETYPE_STRING, 0 }, 639 { "InitiatorUsername", NULL, VDCFGVALUETYPE_STRING, 0 }, 640 { "InitiatorSecret", NULL, VDCFGVALUETYPE_BYTES, 0 }, 641 { "TargetUsername", NULL, VDCFGVALUETYPE_STRING, VD_CFGKEY_EXPERT }, 642 { "TargetSecret", NULL, VDCFGVALUETYPE_BYTES, VD_CFGKEY_EXPERT }, 643 { "WriteSplit", s_iscsiConfigDefaultWriteSplit, VDCFGVALUETYPE_INTEGER, VD_CFGKEY_EXPERT }, 644 { "Timeout", s_iscsiConfigDefaultTimeout, VDCFGVALUETYPE_INTEGER, VD_CFGKEY_EXPERT }, 645 { "HostIPStack", s_iscsiConfigDefaultHostIPStack, VDCFGVALUETYPE_INTEGER, VD_CFGKEY_EXPERT }, 646 { NULL, NULL, VDCFGVALUETYPE_INTEGER, 0 } 641 { "LUN", s_iscsiConfigDefaultLUN, VDCFGVALUETYPE_STRING, VD_CFGKEY_MANDATORY }, 642 { "TargetAddress", NULL, VDCFGVALUETYPE_STRING, VD_CFGKEY_MANDATORY }, 643 { "InitiatorName", NULL, VDCFGVALUETYPE_STRING, 0 }, 644 { "InitiatorUsername", NULL, VDCFGVALUETYPE_STRING, 0 }, 645 { "InitiatorSecret", NULL, VDCFGVALUETYPE_BYTES, 0 }, 646 { "TargetUsername", NULL, VDCFGVALUETYPE_STRING, VD_CFGKEY_EXPERT }, 647 { "TargetSecret", NULL, VDCFGVALUETYPE_BYTES, VD_CFGKEY_EXPERT }, 648 { "WriteSplit", s_iscsiConfigDefaultWriteSplit, VDCFGVALUETYPE_INTEGER, VD_CFGKEY_EXPERT }, 649 { "Timeout", s_iscsiConfigDefaultTimeout, VDCFGVALUETYPE_INTEGER, VD_CFGKEY_EXPERT }, 650 { "HostIPStack", s_iscsiConfigDefaultHostIPStack, VDCFGVALUETYPE_INTEGER, VD_CFGKEY_EXPERT }, 651 { "DumpMalformedPackets", s_iscsiConfigDefaultDumpMalformedPackets, VDCFGVALUETYPE_INTEGER, VD_CFGKEY_EXPERT }, 652 { NULL, NULL, VDCFGVALUETYPE_INTEGER, 0 } 647 653 }; 648 654 … … 801 807 802 808 return pIScsiCmdHead; 809 } 810 811 /** 812 * Dumps an iSCSI packet if enabled. 813 * 814 * @returns nothing. 815 * @param pImage The iSCSI image instance data. 816 * @param paISCSISegs Pointer to the segments array. 817 * @param cnISCSISegs Number of segments in the array. 818 * @param rc Status code for this packet. 819 * @param fRequest Flag whether this is request or response packet. 820 */ 821 static void iscsiDumpPacket(PISCSIIMAGE pImage, PISCSIREQ paISCSISegs, unsigned cnISCSISegs, int rc, bool fRequest) 822 { 823 if (pImage->fDumpMalformedPackets) 824 { 825 LogRel(("iSCSI{%s}: Dumping %s packet completed with status code %Rrc\n", pImage->pszTargetName, fRequest ? "request" : "response", rc)); 826 for (unsigned i = 0; i < cnISCSISegs; i++) 827 { 828 if (paISCSISegs[i].cbSeg) 829 { 830 LogRel(("iSCSI{%s}: Segment %u, size %zu\n" 831 "%.*Rhxd\n", 832 pImage->pszTargetName, i, paISCSISegs[i].cbSeg, 833 paISCSISegs[i].cbSeg, paISCSISegs[i].pcvSeg)); 834 } 835 } 836 } 803 837 } 804 838 … … 1654 1688 { 1655 1689 /* 1690 * Dump the last request and response of we are supposed to do so and there is a request 1691 * or response. 1692 */ 1693 if (cnISCSIReq) 1694 iscsiDumpPacket(pImage, aISCSIReq, cnISCSIReq, VINF_SUCCESS, true /* fRequest */); 1695 1696 if (cnISCSIRes) 1697 iscsiDumpPacket(pImage, (PISCSIREQ)aISCSIRes, cnISCSIRes, rc, false /* fRequest */); 1698 1699 /* 1656 1700 * Close connection to target. 1657 1701 */ … … 1665 1709 1666 1710 LogFlowFunc(("returning %Rrc\n", rc)); 1667 LogRel(("iSCSI: login to target %s %s \n", pImage->pszTargetName, RT_SUCCESS(rc) ? "successful" : "failed"));1711 LogRel(("iSCSI: login to target %s %s (%Rrc)\n", pImage->pszTargetName, RT_SUCCESS(rc) ? "successful" : "failed", rc)); 1668 1712 return rc; 1669 1713 } … … 2122 2166 rc = iscsiValidatePDU(&aResBuf, 1); 2123 2167 if (RT_FAILURE(rc)) 2168 { 2169 iscsiDumpPacket(pImage, (PISCSIREQ)&aResBuf, 1, rc, false /* fRequest */); 2124 2170 continue; 2171 } 2125 2172 cmd = (ISCSIOPCODE)(RT_N2H_U32(pcvResSeg[0]) & ISCSIOP_MASK); 2126 2173 switch (cmd) … … 2143 2190 default: 2144 2191 rc = VERR_PARSE_ERROR; 2192 iscsiDumpPacket(pImage, (PISCSIREQ)&aResBuf, 1, rc, false /* fRequest */); 2145 2193 } 2146 2194 if (RT_FAILURE(rc)) … … 2161 2209 { 2162 2210 rc = VERR_PARSE_ERROR; 2211 iscsiDumpPacket(pImage, (PISCSIREQ)&aResBuf, 1, rc, false /* fRequest */); 2163 2212 continue; 2164 2213 } … … 2445 2494 default: 2446 2495 rc = VERR_PARSE_ERROR; 2496 iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */); 2447 2497 } 2448 2498 … … 2462 2512 else 2463 2513 { 2464 rc = VERR_PARSE_ERROR; 2465 break; 2514 rc = VERR_PARSE_ERROR; 2515 iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */); 2516 break; 2466 2517 } 2467 2518 } … … 2534 2585 } while (0); 2535 2586 } 2587 else 2588 iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */); 2536 2589 2537 2590 return rc; … … 2847 2900 { 2848 2901 LogRel(("iSCSI: Received malformed PDU from target %s (rc=%Rrc), ignoring\n", pImage->pszTargetName, rc)); 2902 iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */); 2849 2903 rc = VINF_SUCCESS; 2850 2904 } … … 3765 3819 uint32_t uWriteSplitDef = 0; 3766 3820 uint32_t uTimeoutDef = 0; 3767 uint64_t uHostIPTmp = 0; 3768 bool fHostIPDef = 0; 3821 uint64_t uCfgTmp = 0; 3822 bool fHostIPDef = false; 3823 bool fDumpMalformedPacketsDef = false; 3769 3824 rc = RTStrToUInt32Full(s_iscsiConfigDefaultWriteSplit, 0, &uWriteSplitDef); 3770 3825 AssertRC(rc); 3771 3826 rc = RTStrToUInt32Full(s_iscsiConfigDefaultTimeout, 0, &uTimeoutDef); 3772 3827 AssertRC(rc); 3773 rc = RTStrToUInt64Full(s_iscsiConfigDefaultHostIPStack, 0, &u HostIPTmp);3828 rc = RTStrToUInt64Full(s_iscsiConfigDefaultHostIPStack, 0, &uCfgTmp); 3774 3829 AssertRC(rc); 3775 fHostIPDef = !!uHostIPTmp; 3830 fHostIPDef = RT_BOOL(uCfgTmp); 3831 3832 rc = RTStrToUInt64Full(s_iscsiConfigDefaultDumpMalformedPackets, 0, &uCfgTmp); 3833 AssertRC(rc); 3834 fDumpMalformedPacketsDef = RT_BOOL(uCfgTmp); 3776 3835 3777 3836 pImage->uOpenFlags = uOpenFlags; … … 3841 3900 "WriteSplit\0" 3842 3901 "Timeout\0" 3843 "HostIPStack\0")) 3902 "HostIPStack\0" 3903 "DumpMalformedPackets\0")) 3844 3904 { 3845 3905 rc = vdIfError(pImage->pIfError, VERR_VD_ISCSI_UNKNOWN_CFG_VALUES, RT_SRC_POS, N_("iSCSI: configuration error: unknown configuration keys present")); … … 4000 4060 { 4001 4061 rc = vdIfError(pImage->pIfError, rc, RT_SRC_POS, N_("iSCSI: configuration error: failed to read HostIPStack as boolean")); 4062 goto out; 4063 } 4064 4065 rc = VDCFGQueryBoolDef(pImage->pIfConfig, 4066 "DumpMalformedPackets", &pImage->fDumpMalformedPackets, 4067 fDumpMalformedPacketsDef); 4068 if (RT_FAILURE(rc)) 4069 { 4070 rc = vdIfError(pImage->pIfError, rc, RT_SRC_POS, N_("iSCSI: configuration error: failed to read DumpMalformedPackets as boolean")); 4002 4071 goto out; 4003 4072 }
Note:
See TracChangeset
for help on using the changeset viewer.