VirtualBox

Changeset 50304 in vbox for trunk/src


Ignore:
Timestamp:
Jan 31, 2014 5:45:25 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
91987
Message:

iSCSI: Add option to dump malformed response packets

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/VBox/Storage/ISCSI.cpp

    r49781 r50304  
    569569    /** Flag whether to use the host IP stack or DevINIP. */
    570570    bool                fHostIP;
     571    /** Flag whether to dump malformed packets in the release log. */
     572    bool                fDumpMalformedPackets;
    571573
    572574    /** Head of request queue */
     
    629631static const char *s_iscsiConfigDefaultHostIPStack = "1";
    630632
     633/** Default dump malformed packet configuration value. */
     634static const char *s_iscsiConfigDefaultDumpMalformedPackets = "0";
     635
    631636/** Description of all accepted config parameters. */
    632637static const VDCONFIGINFO s_iscsiConfigInfo[] =
    633638{
    634     { "TargetName",         NULL,                               VDCFGVALUETYPE_STRING,  VD_CFGKEY_MANDATORY },
     639    { "TargetName",           NULL,                                      VDCFGVALUETYPE_STRING,  VD_CFGKEY_MANDATORY },
    635640    /* 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 }
    647653};
    648654
     
    801807
    802808    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 */
     821static 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    }
    803837}
    804838
     
    16541688    {
    16551689        /*
     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        /*
    16561700         * Close connection to target.
    16571701         */
     
    16651709
    16661710    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));
    16681712    return rc;
    16691713}
     
    21222166            rc = iscsiValidatePDU(&aResBuf, 1);
    21232167            if (RT_FAILURE(rc))
     2168            {
     2169                iscsiDumpPacket(pImage, (PISCSIREQ)&aResBuf, 1, rc, false /* fRequest */);
    21242170                continue;
     2171            }
    21252172            cmd = (ISCSIOPCODE)(RT_N2H_U32(pcvResSeg[0]) & ISCSIOP_MASK);
    21262173            switch (cmd)
     
    21432190                default:
    21442191                    rc = VERR_PARSE_ERROR;
     2192                    iscsiDumpPacket(pImage, (PISCSIREQ)&aResBuf, 1, rc, false /* fRequest */);
    21452193            }
    21462194            if (RT_FAILURE(rc))
     
    21612209                {
    21622210                    rc = VERR_PARSE_ERROR;
     2211                    iscsiDumpPacket(pImage, (PISCSIREQ)&aResBuf, 1, rc, false /* fRequest */);
    21632212                    continue;
    21642213                }
     
    24452494                default:
    24462495                    rc = VERR_PARSE_ERROR;
     2496                    iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */);
    24472497            }
    24482498
     
    24622512                else
    24632513                {
    2464                    rc = VERR_PARSE_ERROR;
    2465                    break;
     2514                    rc = VERR_PARSE_ERROR;
     2515                    iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */);
     2516                    break;
    24662517                }
    24672518            }
     
    25342585        } while (0);
    25352586    }
     2587    else
     2588        iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */);
    25362589
    25372590    return rc;
     
    28472900    {
    28482901        LogRel(("iSCSI: Received malformed PDU from target %s (rc=%Rrc), ignoring\n", pImage->pszTargetName, rc));
     2902        iscsiDumpPacket(pImage, (PISCSIREQ)paRes, cnRes, rc, false /* fRequest */);
    28492903        rc = VINF_SUCCESS;
    28502904    }
     
    37653819    uint32_t uWriteSplitDef = 0;
    37663820    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;
    37693824    rc = RTStrToUInt32Full(s_iscsiConfigDefaultWriteSplit, 0, &uWriteSplitDef);
    37703825    AssertRC(rc);
    37713826    rc = RTStrToUInt32Full(s_iscsiConfigDefaultTimeout, 0, &uTimeoutDef);
    37723827    AssertRC(rc);
    3773     rc = RTStrToUInt64Full(s_iscsiConfigDefaultHostIPStack, 0, &uHostIPTmp);
     3828    rc = RTStrToUInt64Full(s_iscsiConfigDefaultHostIPStack, 0, &uCfgTmp);
    37743829    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);
    37763835
    37773836    pImage->uOpenFlags      = uOpenFlags;
     
    38413900                           "WriteSplit\0"
    38423901                           "Timeout\0"
    3843                            "HostIPStack\0"))
     3902                           "HostIPStack\0"
     3903                           "DumpMalformedPackets\0"))
    38443904    {
    38453905        rc = vdIfError(pImage->pIfError, VERR_VD_ISCSI_UNKNOWN_CFG_VALUES, RT_SRC_POS, N_("iSCSI: configuration error: unknown configuration keys present"));
     
    40004060    {
    40014061        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"));
    40024071        goto out;
    40034072    }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette