VirtualBox

Changeset 22905 in vbox


Ignore:
Timestamp:
Sep 10, 2009 11:13:49 AM (15 years ago)
Author:
vboxsync
Message:

NAT: BSD mbuf (ip_output)

File:
1 edited

Legend:

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

    r22673 r22905  
    8585    DEBUG_ARG("so = %lx", (long)so);
    8686    DEBUG_ARG("m0 = %lx", (long)m0);
     87
     88#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    8789    if(m->m_data != (MBUF_HEAD(m) + if_maxlinkhdr))
    8890    {
     
    9092        AssertMsgFailed(("!!Ethernet frame corrupted!!"));
    9193    }
     94#else
     95    M_ASSERTPKTHDR(m);
     96    Assert(m->m_pkthdr.header);
     97#endif
    9298
    9399#if 0 /* We do no options */
     
    98104    }
    99105#endif
     106#ifdef VBOX_WITH_SLIRP_BSD_MBUF
     107    M_ASSERTPKTHDR(m);
     108    Assert(m->m_pkthdr.header);
     109    ip = (struct ip *)m->m_pkthdr.header;
     110#else
    100111    ip = mtod(m, struct ip *);
     112#endif
    101113    /*
    102114     * Fill in IP header.
     
    122134       * all so we need to calculate destination ethernet address
    123135       */
     136#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    124137     eh = (struct ethhdr *)MBUF_HEAD(m);
     138#else
     139    /*todo: make prepend */
     140    m = m_prepend(pData, m, ETH_HLEN, M_DONTWAIT);
     141    Assert(m);
     142    eh = mtod(m, struct ethhdr *);
     143    m_adj(m, ETH_HLEN); /*let the rest of code do it job*/
     144#endif
    125145     if (memcmp(eh->h_source, zerro_ethaddr, ETH_ALEN) == 0)
    126146     {
     
    150170        {
    151171            STAM_PROFILE_START(&pData->StatALIAS_output, a);
     172#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    152173            rc = LibAliasOut((m->m_la ? m->m_la : pData->proxy_alias),
    153174                mtod(m, char *), m->m_len);
    154175            Log2(("NAT: LibAlias return %d\n", rc));
     176#else
     177            struct m_tag *t;
     178            if (t = m_tag_find(m, PACKET_TAG_ALIAS, NULL) != 0)
     179            {
     180                rc = LibAliasOut((struct libalias *)&t[1], mtod(m, char *), m_length(m, NULL));
     181            }
     182            else
     183            {
     184                rc = LibAliasOut(pData->proxy_alias, mtod(m, char *),
     185                                 m_length(m, NULL));
     186            }
     187            if (rc == PKT_ALIAS_IGNORED)
     188            {
     189                Log(("NAT: packet was droppped\n"));
     190                goto bad;
     191            }
     192#endif
    155193            STAM_PROFILE_STOP(&pData->StatALIAS_output, a);
    156194        }
     
    181219        int mhlen, firstlen = len;
    182220        struct mbuf **mnext = &m->m_nextpkt;
     221#ifdef VBOX_WITH_SLIRP_BSD_MBUF
     222        uint8_t buf[len]; /* intermediate buffer we'll use for copy from orriginal packet*/
     223#endif
    183224
    184225        /*
     
    191232        {
    192233            register struct ip *mhip;
     234#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    193235            m = m_get(pData);
     236#else
     237            m = m_gethdr(pData, M_DONTWAIT, MT_HEADER);
     238#endif
    194239            if (m == 0)
    195240            {
     
    198243                goto sendorfree;
    199244            }
     245#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    200246            m->m_data += if_maxlinkhdr;
    201247            mhip = mtod(m, struct ip *);
    202248            *mhip = *ip;
     249#else
     250            m_copyback(pData, m, 0, mhlen, ip);
     251            m->m_pkthdr.header = mtod(m, void *);
     252            mhip = mtod(m, struct ip *);
     253            m_adj(m, mhlen);
     254#endif
    203255            /* we've calculated eth_dst for first packet */
     256#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    204257            eh = (struct ethhdr *)MBUF_HEAD(m);
     258#else
     259            m = m_prepend(pData, m, ETH_HLEN, M_DONTWAIT);
     260            Assert(m);
     261            eh = mtod(m, struct ethhdr *);
     262            m_adj(m, ETH_HLEN);
     263#endif
    205264            Assert((rc == 0));
    206265
     
    214273            }
    215274#endif
     275#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    216276            m->m_len = mhlen;
     277#endif
    217278            mhip->ip_off = ((off - hlen) >> 3) + (ip->ip_off & ~IP_MF);
    218279            if (ip->ip_off & IP_MF)
     
    224285            mhip->ip_len = htons((u_int16_t)(len + mhlen));
    225286
     287#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    226288            if (m_copy(m, m0, off, len) < 0)
    227289            {
     
    229291                goto sendorfree;
    230292            }
     293#else
     294            m_copydata(m0, off, len, buf); /* copy to buffer */
     295            m_append(pData, m, len, buf); /* copy from buffer */
     296#endif
    231297
    232298            mhip->ip_off = htons((u_int16_t)mhip->ip_off);
     
    250316        {
    251317            STAM_PROFILE_START(&pData->StatALIAS_output, a);
     318#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    252319            rc = LibAliasOut((m->m_la ? m->m_la : pData->proxy_alias),
    253320                mtod(m, char *), m->m_len);
     321#else
     322            struct m_tag *t;
     323            if (t = m_tag_find(m, PACKET_TAG_ALIAS, NULL) != 0)
     324            {
     325                rc = LibAliasOut((struct libalias *)&t[1], mtod(m, char *), m_length(m, NULL));
     326            }
     327            else
     328            {
     329                rc = LibAliasOut(pData->proxy_alias, mtod(m, char *),
     330                                 m_length(m, NULL));
     331            }
     332            if (rc == PKT_ALIAS_IGNORED)
     333            {
     334                Log(("NAT: packet was droppped\n"));
     335                goto bad;
     336            }
     337#endif
    254338            Log2(("NAT: LibAlias return %d\n", rc));
    255339            STAM_PROFILE_STOP(&pData->StatALIAS_output, a);
     
    264348            {
    265349                int rc;
     350#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    266351                rc = LibAliasOut((m->m_la ? m->m_la : pData->proxy_alias),
    267352                    mtod(m, char *), m->m_len);
     353#else
     354                struct m_tag *t;
     355                if (t = m_tag_find(m, PACKET_TAG_ALIAS, NULL) != 0)
     356                {
     357                    rc = LibAliasOut((struct libalias *)&t[1], mtod(m, char *), m_length(m, NULL));
     358                }
     359                else
     360                {
     361                    rc = LibAliasOut(pData->proxy_alias, mtod(m, char *),
     362                                     m_length(m, NULL));
     363                }
     364                if (rc == PKT_ALIAS_IGNORED)
     365                {
     366                    Log(("NAT: packet was droppped\n"));
     367                    goto bad;
     368                }
     369#endif
    268370                Log2(("NAT: LibAlias return %d\n", rc));
    269371                if_output(pData, so, m);
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