VirtualBox

Changeset 22940 in vbox


Ignore:
Timestamp:
Sep 11, 2009 6:18:51 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
52205
Message:

NAT: BSD mbuf's related changeset (socket.c)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r21665 r22940  
    565565        size_t len;
    566566        u_long n;
     567#ifdef VBOX_WITH_SLIRP_BSD_MBUF
     568        uint8_t *buffer;
     569#endif
    567570
    568571        QSOCKET_LOCK(udb);
     
    570573        QSOCKET_UNLOCK(udb);
    571574
     575#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    572576        if (!(m = m_get(pData)))
    573577        {
     
    594598            }
    595599        }
    596 
    597600        m->m_len = recvfrom(so->s, m->m_data, len, 0,
    598601                            (struct sockaddr *)&addr, &addrlen);
    599602        Log2((" did recvfrom %d, errno = %d-%s\n",
    600603                    m->m_len, errno, strerror(errno)));
    601         if(m->m_len < 0)
     604#else
     605        if (!(m = m_gethdr(pData, M_NOWAIT, MT_HEADER)))
     606        {
     607            SOCKET_UNLOCK(so);
     608            return;
     609        }
     610        /*How many data has been received ?*/
     611        /*
     612        * 1. calculate how much we can read
     613        * 2. read as much as possible
     614        * 3. attach buffer to allocated header mbuf
     615        */
     616        ioctlsocket(so->s, FIONREAD, &n);
     617        Assert(n > 0);
     618        buffer = RTMemAlloc(n);
     619        Assert(buffer);
     620        len = recvfrom(so->s, buffer, n, 0,
     621                            (struct sockaddr *)&addr, &addrlen);
     622        /* @todo (r=vvl) check which flags and type should be passed */
     623        if (len > 0)
     624            m_append(pData, m, len, buffer);
     625        RTMemFree(buffer);
     626#endif
     627        if(len < 0)
    602628        {
    603629            u_char code = ICMP_UNREACH_PORT;
     
    663689    struct sockaddr_in host_addr;
    664690#endif
     691#ifdef VBOX_WITH_SLIRP_BSD_MBUF
     692    uint8_t *buf;
     693    int mlen;
     694#endif
    665695
    666696    DEBUG_CALL("sosendto");
     
    714744
    715745    /* Don't care what port we get */
     746#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    716747    ret = sendto(so->s, m->m_data, m->m_len, 0, &addr, sizeof (struct sockaddr_in));
     748#else
     749    mlen = m_length(m, NULL);
     750    buf = RTMemAlloc(mlen);
     751    if (buf == NULL)
     752    {
     753        return -1;
     754    }
     755    m_copydata(m, 0, mlen, buf);
     756    ret = sendto(so->s, buf, mlen, 0,
     757                 (struct sockaddr *)&addr, sizeof (struct sockaddr));
     758#endif
    717759    if (ret < 0)
    718760    {
     
    10931135                break;
    10941136            case IP_SUCCESS: /* echo replied */
     1137#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    10951138                m = m_get(pData);
     1139#else
     1140                m = m_gethdr(pData, M_NOWAIT, MT_HEADER);
     1141#endif
    10961142                m->m_data += if_maxlinkhdr;
    10971143                ip = mtod(m, struct ip *);
     
    11111157                data_len += ICMP_MINLEN;
    11121158
     1159#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    11131160                nbytes = (data_len + icr[i].DataSize > m->m_size? m->m_size - data_len: icr[i].DataSize);
    11141161                memcpy(icp->icmp_data, icr[i].Data, nbytes);
     1162#else
     1163                AssertMsgFailed(("ICMP"));
     1164#endif
    11151165
    11161166                data_len += icr[i].DataSize;
     
    11411191                data_len = (ip_broken->ip_hl << 2) + 64;
    11421192
     1193#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    11431194                nbytes =(hlen + ICMP_MINLEN + data_len > m->m_size? m->m_size - (hlen + ICMP_MINLEN): data_len);
    11441195                memcpy(icp->icmp_data, ip_broken,  nbytes);
     1196#else
     1197                AssertMsgFailed(("ICMP"));
     1198#endif
    11451199                icmp_reflect(pData, m);
    11461200                break;
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