VirtualBox

Changeset 813 in vbox


Ignore:
Timestamp:
Feb 9, 2007 3:53:12 PM (18 years ago)
Author:
vboxsync
Message:

Try to deal with illegal descriptors

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevPCNet.cpp

    r812 r813  
    19221922}
    19231923
     1924/**
     1925 * Fails a TMD with a generic error.
     1926 */
     1927static void pcnetXmitFailTMDGeneric(PCNetState *pData, TMD *pTmd)
     1928{
     1929    /* make carrier error - hope this is correct. */
     1930    pTmd->tmd2.lcar = pTmd->tmd1.err = 1;
     1931    pData->aCSR[0] |= BIT(15) | BIT(13); /* ERR | CERR */
     1932    pData->Led.Asserted.s.fError = pData->Led.Actual.s.fError = 1;
     1933    Log(("#%d pcnetTransmit: Signaling send error. swstyle=%#x\n",
     1934         PCNETSTATE_2_DEVINS(pData)->iInstance, pData->aBCR[BCR_SWS]));
     1935}
     1936
    19241937
    19251938/**
     
    20452058            const unsigned cb = 4096 - tmd.tmd1.bcnt;
    20462059            Log(("#%d pcnetTransmit: stp&enp: cb=%d xmtrc=%#x\n", PCNETSTATE_2_DEVINS(pData)->iInstance, cb, CSR_XMTRC(pData)));
     2060
    20472061            if (RT_LIKELY(pcnetIsLinkUp(pData) || CSR_LOOP(pData)))
    20482062            {
    20492063                RTR3PTR pv;
    20502064
    2051                 int rc = PDMDevHlpPhys2HCVirt(pData->pDevInsHC,
    2052                                               PHYSADDR(pData, tmd.tmd0.tbadr), cb, &pv);
    2053                 if (RT_SUCCESS(rc))
    2054                     pcnetXmitZeroCopyFrame(pData, pv, cb);
     2065                if (RT_LIKELY(cb < 4096))
     2066                {
     2067                    int rc = PDMDevHlpPhys2HCVirt(pData->pDevInsHC,
     2068                                                  PHYSADDR(pData, tmd.tmd0.tbadr), cb, &pv);
     2069                    if (RT_SUCCESS(rc))
     2070                        pcnetXmitZeroCopyFrame(pData, pv, cb);
     2071                    else
     2072                    {
     2073                        pcnetXmitRead1st(pData, PHYSADDR(pData, tmd.tmd0.tbadr), cb);
     2074                    }
     2075                    if (CSR_LOOP(pData))
     2076                        pcnetXmitLoopbackFrame(pData);
     2077                    else
     2078                    {
     2079                        int rc = pcnetXmitCompleteFrame(pData);
     2080                        if (VBOX_FAILURE(rc))
     2081                            return rc; /* can happen during termination */
     2082                    }
     2083                }
    20552084                else
    20562085                {
    2057                     pcnetXmitRead1st(pData, PHYSADDR(pData, tmd.tmd0.tbadr), cb);
    2058                 }
    2059                 if (CSR_LOOP(pData))
    2060                     pcnetXmitLoopbackFrame(pData);
    2061                 else
    2062                 {
    2063                     int rc = pcnetXmitCompleteFrame(pData);
    2064                     if (VBOX_FAILURE(rc))
    2065                         return rc; /* can happen during termination */
     2086                    /* This is only acceptable if it's not the last buffer in the chain (stp=1, enp=0) */
     2087                    LogRel(("PCNET: pcnetAsyncTransmit: illegal 4kb frame -> signalling error\n"));
     2088
     2089                    pcnetXmitFailTMDGeneric(pData, &tmd);
    20662090                }
    20672091            }
     
    21732197             * Simply stop the transmitting for now.
    21742198             */
     2199            /** @todo according to the specs we're supposed to clear the own bit and move on to the next one. */
    21752200            Log(("#%d pcnetTransmit: guest is giving us shit!\n", PCNETSTATE_2_DEVINS(pData)->iInstance));
    21762201            break;
     
    21872212            pData->aCSR[0] |= 0x0200;    /* set TINT */
    21882213        }
     2214
     2215        /** @todo should we continue after an error (tmd.tmd1.err) or not? */
    21892216
    21902217        STAM_COUNTER_INC(&pData->aStatXmitChainCounts[RT_MIN(cBuffers,
Note: See TracChangeset for help on using the changeset viewer.

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