VirtualBox

Changeset 22941 in vbox


Ignore:
Timestamp:
Sep 11, 2009 6:19:44 AM (15 years ago)
Author:
vboxsync
Message:

NAT: BSD mbuf related changeset + (slirp.c, ip_output).

Location:
trunk/src/VBox/Devices/Network/slirp
Files:
2 edited

Legend:

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

    r22905 r22941  
    131131    }
    132132#endif
    133       /* Current TCP/IP stack hasn't routing information at
    134        * all so we need to calculate destination ethernet address
    135        */
    136 #ifndef VBOX_WITH_SLIRP_BSD_MBUF
    137      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
    145      if (memcmp(eh->h_source, zerro_ethaddr, ETH_ALEN) == 0)
    146      {
    147         rc = rt_lookup_in_cache(pData, ip->ip_dst.s_addr, eth_dst);
    148         if (rc != 0)
    149             goto bad;
    150      }
    151      else
    152     {
    153         memcpy(eth_dst, eh->h_source, ETH_ALEN);
    154         rc = 0; /*some times we've already know where to send packet*/
    155     }
    156 
     133    /* Current TCP/IP stack hasn't routing information at
     134     * all so we need to calculate destination ethernet address
     135     */
     136#ifndef VBOX_WITH_SLIRP_BSD_MBUF
     137    eh = (struct ethhdr *)MBUF_HEAD(m);
     138    if (memcmp(eh->h_source, zerro_ethaddr, ETH_ALEN) == 0)
     139    {
     140       rc = rt_lookup_in_cache(pData, ip->ip_dst.s_addr, eth_dst);
     141       if (rc != 0)
     142           goto bad;
     143    }
     144    else
     145    {
     146       memcpy(eth_dst, eh->h_source, ETH_ALEN);
     147       rc = 0; /*some times we've already know where to send packet*/
     148    }
     149#else
     150    /*
     151     * (vvl) Note: Here we should care about dhcp and other services
     152     * aware of ethernet address
     153     */
     154    rc = rt_lookup_in_cache(pData, ip->ip_dst.s_addr, eth_dst);
     155    if (rc != 0)
     156        goto bad;
     157#endif
    157158    /*
    158159     * If small enough for interface, can just send directly.
     
    165166        ip->ip_sum = cksum(m, hlen);
    166167   
    167         Assert((rc == 0));
    168         memcpy(eh->h_source, eth_dst, ETH_ALEN);
    169    
    170168        {
    171169            STAM_PROFILE_START(&pData->StatALIAS_output, a);
     
    193191            STAM_PROFILE_STOP(&pData->StatALIAS_output, a);
    194192        }
     193#ifdef VBOX_WITH_SLIRP_BSD_MBUF
     194        /*todo: make prepend */
     195        m = m_prepend(pData, m, ETH_HLEN, M_DONTWAIT);
     196        Assert(m);
     197        eh = mtod(m, struct ethhdr *);
     198#endif
     199        memcpy(eh->h_source, eth_dst, ETH_ALEN);
    195200
    196201        if_output(pData, so, m);
    197202        goto done;
    198     }
     203     }
    199204
    200205    /*
     
    254259#endif
    255260            /* we've calculated eth_dst for first packet */
    256 #ifndef VBOX_WITH_SLIRP_BSD_MBUF
    257             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
    264             Assert((rc == 0));
    265 
    266             memcpy(eh->h_source, eth_dst, ETH_ALEN);
    267 
    268261#if 0 /* No options */
    269262            if (hlen > sizeof (struct ip))
     
    314307        ip->ip_sum = cksum(m, hlen);
    315308
    316         {
    317             STAM_PROFILE_START(&pData->StatALIAS_output, a);
    318 #ifndef VBOX_WITH_SLIRP_BSD_MBUF
    319             rc = LibAliasOut((m->m_la ? m->m_la : pData->proxy_alias),
    320                 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
    338             Log2(("NAT: LibAlias return %d\n", rc));
    339             STAM_PROFILE_STOP(&pData->StatALIAS_output, a);
    340         }
    341 
    342309sendorfree:
    343310        for (m = m0; m; m = m0)
     
    369336#endif
    370337                Log2(("NAT: LibAlias return %d\n", rc));
     338#ifndef VBOX_WITH_SLIRP_BSD_MBUF
     339                eh = (struct ethhdr *)MBUF_HEAD(m);
     340#else
     341                m = m_prepend(pData, m, ETH_HLEN, M_DONTWAIT);
     342                Assert(m);
     343                eh = mtod(m, struct ethhdr *);
     344#endif
     345                memcpy(eh->h_source, eth_dst, ETH_ALEN);
     346
    371347                if_output(pData, so, m);
    372348            }
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r22873 r22941  
    274274                return VERR_NO_MEMORY;
    275275            }
    276             LogRel(("NAT: adding %R[IP4] to DNS server list\n", &((struct sockaddr_in *)saddr)->sin_addr));
    277             if ((((struct sockaddr_in *)saddr)->sin_addr.s_addr & htonl(IN_CLASSA_NET)) == ntohl(INADDR_LOOPBACK & IN_CLASSA_NET)) {
     276            LogRel(("NAT: adding %R[IP4] to DNS server list\n",
     277                    &((struct sockaddr_in *)saddr)->sin_addr));
     278            if ((((  struct sockaddr_in *)saddr)->sin_addr.s_addr & htonl(IN_CLASSA_NET)) ==
     279                     ntohl(INADDR_LOOPBACK & IN_CLASSA_NET)) {
    278280                da->de_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS);
    279281            }
     
    554556
    555557    /* Initialise mbufs *after* setting the MTU */
     558#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    556559    m_init(pData);
     560#else
     561    mbuf_init(pData);
     562#endif
    557563
    558564#ifndef VBOX_WITH_NAT_SERVICE
     
    13611367    {
    13621368        case ARPOP_REQUEST:
     1369#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    13631370            mr = m_get(pData);
    13641371
     
    13721379            mr->m_len = sizeof(struct arphdr);
    13731380            rah = mtod(mr, struct arphdr *);
     1381#else
     1382            mr = m_gethdr(pData, M_NOWAIT, MT_HEADER);
     1383            rah = mtod(mr, struct arphdr *);
     1384            Assert(mr);
     1385            mr->m_pkthdr.len = mr->m_len = sizeof(* rah);
     1386            mr = m_prepend(pData, mr, ETH_HLEN, M_DONTWAIT);
     1387            reh = mtod(mr, struct ethhdr *);
     1388            memcpy(reh->h_source, eh->h_source, ETH_ALEN); /* XXX: if_encap will swap src and dst*/
     1389#endif
    13741390#ifdef VBOX_WITH_NAT_SERVICE
    13751391            if (tip == special_addr.s_addr) goto arp_ok;
     
    14731489    }
    14741490
     1491#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    14751492    m = m_get(pData);
     1493#else
     1494    m = m_gethdr(pData, M_NOWAIT, MT_HEADER);
     1495#endif
    14761496    if (!m)
    14771497    {
    14781498        LogRel(("NAT: can't allocate new mbuf\n"));
     1499        RTMemFree((void *)pkt);
    14791500        return;
    14801501    }
     
    14821503    /* Note: we add to align the IP header */
    14831504
     1505#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    14841506    if (M_FREEROOM(m) < pkt_len)
    14851507       m_inc(m, pkt_len);
     
    14871509    m->m_len = pkt_len ;
    14881510    memcpy(m->m_data, pkt, pkt_len);
     1511#else
     1512    if (m_append(pData, m, pkt_len, pkt) != 1)
     1513    {
     1514        AssertMsgFailed(("Can't append incommin to mbuf"));
     1515        RTMemFree(pkt);
     1516        m_free(pData, m);
     1517    }
     1518#endif
    14891519
    14901520#if 1
     
    15041534            updtime(pData);
    15051535            m_adj(m, ETH_HLEN);
     1536#ifdef VBOX_WITH_SLIRP_BSD_MBUF
     1537            M_ASSERTPKTHDR(m);
     1538            m->m_pkthdr.header = mtod(m, void *);
     1539#endif
    15061540            ip_input(pData, m);
    15071541            break;
     
    15271561    struct ethhdr *eh;
    15281562    uint8_t *buf = NULL;
     1563    size_t mlen = 0;
    15291564    STAM_PROFILE_START(&pData->StatIF_encap, a);
    15301565
     1566#ifndef VBOX_WITH_SLIRP_BSD_MBUF
    15311567    m->m_data -= if_maxlinkhdr;
    15321568    m->m_len += ETH_HLEN;
     
    15381574        AssertMsgFailed(("!!Ethernet frame corrupted!!"));
    15391575    }
     1576#else
     1577    M_ASSERTPKTHDR(m);
     1578    eh = mtod(m, struct ethhdr *);
     1579#endif
    15401580
    15411581    if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) != 0)
     
    15501590        }
    15511591    }
    1552     buf = RTMemAlloc(1600);
     1592#ifndef VBOX_WITH_SLIRP_BSD_MBUF
     1593    mlen = m->m_len;
     1594#else
     1595    mlen = m_length(pData, m);
     1596#endif
     1597    buf = RTMemAlloc(mlen);
    15531598    if (buf == NULL)
    15541599    {
     
    15571602    }
    15581603    eh->h_proto = htons(eth_proto);
    1559     memcpy(buf, mtod(m, uint8_t *), m->m_len);
    1560     slirp_output(pData->pvUser, NULL, buf, m->m_len);
     1604#ifndef VBOX_WITH_SLIRP_BSD_MBUF
     1605    memcpy(buf, mtod(m, uint8_t *), mlen);
     1606#else
     1607    m_copydata(m, 0, mlen, (char *)buf);
     1608#endif
     1609    slirp_output(pData->pvUser, NULL, buf, mlen);
    15611610done:
    15621611    STAM_PROFILE_STOP(&pData->StatIF_encap, a);
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