VirtualBox

Changeset 55922 in vbox


Ignore:
Timestamp:
May 19, 2015 3:04:59 AM (10 years ago)
Author:
vboxsync
Message:

DevPCNet: ASTRP_RCV bit is only for 802.3 frames, not Ethernet frames.
Data sheet mentions it elsewhere, but not in the documentation for the
bit itself. The code has always been incorrect, but r77259 broke it
further. The casualty was OpenStep, which now gets its network back.

File:
1 edited

Legend:

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

    r55909 r55922  
    18391839        else
    18401840        {
     1841            PCRTNETETHERHDR pEth = (PCRTNETETHERHDR)buf;
     1842            bool fStrip = false;
     1843            size_t len_802_3;
    18411844            uint8_t   *src = &pThis->abRecvBuf[8];
    18421845            RTGCPHYS32 crda = CSR_CRDA(pThis);
     
    18441847            RMD        rmd, next_rmd;
    18451848
     1849            /*
     1850             * Ethernet framing considers these two octets to be
     1851             * payload type; 802.3 framing considers them to be
     1852             * payload length.  IEEE 802.3x-1997 restricts Ethernet
     1853             * type to be greater than or equal to 1536 (0x0600), so
     1854             * that both framings can coexist on the wire.
     1855             *
     1856             * NB: CSR_ASTRP_RCV bit affects only 802.3 frames!
     1857             */
     1858            len_802_3 = RT_BE2H_U16(pEth->EtherType);
     1859            if (len_802_3 < 46 && CSR_ASTRP_RCV(pThis))
     1860            {
     1861                cbToRecv = RT_MIN(sizeof(RTNETETHERHDR) + len_802_3, cbToRecv);
     1862                fStrip = true;
     1863                fAddFCS = false;
     1864            }
     1865
    18461866            memcpy(src, buf, cbToRecv);
    1847             if (!CSR_ASTRP_RCV(pThis))
    1848             {
    1849                 uint32_t fcs = ~0;
    1850                 uint8_t *p = src;
    1851 
     1867
     1868            if (!fStrip) {
    18521869                while (cbToRecv < 60)
    18531870                    src[cbToRecv++] = 0;
     1871
    18541872                if (fAddFCS)
    18551873                {
     1874                    uint32_t fcs = ~0;
     1875                    uint8_t *p = src;
     1876
    18561877                    while (p != &src[cbToRecv])
    18571878                        CRC(fcs, *p++);
     1879
     1880                    /* FCS at the end of the packet */
    18581881                    ((uint32_t *)&src[cbToRecv])[0] = htonl(fcs);
    1859                     /* FCS at end of packet */
    18601882                    cbToRecv += 4;
    18611883                }
    18621884            }
     1885
    18631886            cbPacket = (int)cbToRecv;                           Assert((size_t)cbPacket == cbToRecv);
    18641887
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