VirtualBox

Changeset 19313 in vbox for trunk/src/VBox/Devices/Network


Ignore:
Timestamp:
May 4, 2009 3:16:01 AM (16 years ago)
Author:
vboxsync
Message:

NAT: slirp servicing several guests

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

Legend:

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

    r18902 r19313  
    127127}
    128128
     129#ifndef VBOX_WITH_NAT_SERVICE
    129130static void bootp_reply(PNATState pData, struct bootp_t *bp)
     131#else
     132static void bootp_reply(PNATState pData, struct mbuf *m0)
     133#endif
    130134{
    131135    BOOTPClient *bc;
    132     struct mbuf *m;
     136    struct mbuf *m; /* XXX: @todo vasily - it'd be better to reuse this mbuf here */
     137#ifdef VBOX_WITH_NAT_SERVICE
     138    struct bootp_t *bp = mtod(m0, struct bootp_t *);
     139    struct ethhdr *eh;
     140#endif
    133141    struct bootp_t *rbp;
    134142    struct sockaddr_in saddr, daddr;
     
    172180        return;
    173181
     182#ifndef VBOX_WITH_NAT_SERVICE
    174183    /* XXX: this is a hack to get the client mac address */
    175184    memcpy(client_ethaddr, bp->bp_hwaddr, 6);
     185#endif
    176186
    177187    if ((m = m_get(pData)) == NULL)
    178188        return;
     189#ifdef VBOX_WITH_NAT_SERVICE
     190    eh = mtod(m, struct ethhdr *);
     191    memcpy(eh->h_source, bp->bp_hwaddr, ETH_ALEN); /* XXX: if_encap just swap source with dest*/
     192#endif
    179193    m->m_data += if_maxlinkhdr; /*reserve ether header */
    180194    rbp = mtod(m, struct bootp_t *);
     
    195209                return;
    196210            }
     211#ifdef VBOX_WITH_NAT_SERVICE
     212            memcpy(bc->macaddr, bp->bp_hwaddr, 6);
     213#else
    197214            memcpy(bc->macaddr, client_ethaddr, 6);
     215#endif
    198216        }
    199217    }
     
    215233
    216234    /* Address/port of the DHCP server. */
     235#ifndef VBOX_WITH_NAT_SERVICE
    217236    saddr.sin_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS);
     237#else
     238    saddr.sin_addr.s_addr = special_addr.s_addr;
     239#endif
     240
    218241    saddr.sin_port = htons(BOOTP_SERVER);
    219242
     
    350373
    351374    if (bp->bp_op == BOOTP_REQUEST)
     375#ifndef VBOX_WITH_NAT_SERVICE
    352376        bootp_reply(pData, bp);
    353 }
     377#else
     378        bootp_reply(pData, m);
     379#endif
     380}
  • trunk/src/VBox/Devices/Network/slirp/ip_icmp.c

    r18902 r19313  
    539539    {
    540540        int new_m_size;
     541#ifdef VBOX_WITH_NAT_SERVICE
     542        struct ethhdr *eh, *eh0;
     543        eh0 = (struct ethhdr *)msrc->m_dat;
     544        eh = (struct ethhdr *)m->m_dat;
     545        memcpy(eh->h_source, eh0->h_source, ETH_ALEN);
     546#endif
    541547        m->m_data += if_maxlinkhdr;
    542548        new_m_size = sizeof(struct ip) + ICMP_MINLEN + msrc->m_len + ICMP_MAXDATALEN;
  • trunk/src/VBox/Devices/Network/slirp/ip_output.c

    r14964 r19313  
    6363    DEBUG_ARG("so = %lx", (long)so);
    6464    DEBUG_ARG("m0 = %lx", (long)m0);
     65    Assert(m->m_data == m->m_dat + if_maxlinkhdr);
    6566
    6667#if 0 /* We do no options */
     
    103104        ip->ip_sum = cksum(m, hlen);
    104105
     106#ifdef VBOX_WITH_NAT_SERVICE
     107        {
     108            struct ethhdr *eh, *eh0;
     109            eh = (struct ethhdr *)m->m_dat;
     110            eh0 = (struct ethhdr *)m0->m_dat;
     111            memcpy(eh->h_source, eh0->h_source, ETH_ALEN);
     112        }
     113#endif
    105114        if_output(pData, so, m);
    106115        goto done;
     
    137146        for (off = hlen + len; off < (u_int16_t)ip->ip_len; off += len)
    138147        {
     148#ifdef VBOX_WITH_NAT_SERVICE
     149            struct ethhdr *eh0;
     150            struct ethhdr *eh;
     151#endif
    139152            register struct ip *mhip;
    140153            m = m_get(pData);
     
    145158                goto sendorfree;
    146159            }
     160#ifdef VBOX_WITH_NAT_SERVICE
     161            eh0 = (struct ethhdr *)m0->m_dat;
     162            eh = (struct ethhdr *)m->m_dat;
     163            memcpy(eh->h_source, eh0->h_source, ETH_ALEN);
     164#endif
    147165            m->m_data += if_maxlinkhdr;
    148166            mhip = mtod(m, struct ip *);
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r18902 r19313  
    2828#endif
    2929
     30#ifndef VBOX_WITH_NAT_SERVICE
    3031int slirp_init(PNATState *, const char *, uint32_t, bool, void *);
     32#else
     33int slirp_init(PNATState *, uint32_t, uint32_t, bool, void *);
     34#endif
    3135void slirp_register_timers(PNATState pData, PPDMDRVINS pDrvIns);
    3236void slirp_term(PNATState);
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r18902 r19313  
    196196};
    197197
     198static const uint8_t broadcast_ethaddr[6] =
     199{
     200    0xff, 0xff, 0xff, 0xff, 0xff, 0xff
     201};
     202
     203static const uint8_t zerro_ethaddr[6] =
     204{
     205    0x0, 0x0, 0x0, 0x0, 0x0, 0x0
     206};
     207
    198208#ifdef RT_OS_WINDOWS
    199209# ifndef VBOX_WITH_MULTI_DNS
     
    587597}
    588598
     599#ifndef VBOX_WITH_NAT_SERVICE
    589600int slirp_init(PNATState *ppData, const char *pszNetAddr, uint32_t u32Netmask,
    590601               bool fPassDomain, void *pvUser)
     602#else
     603int slirp_init(PNATState *ppData, uint32_t u32NetAddr, uint32_t u32Netmask,
     604               bool fPassDomain, void *pvUser)
     605#endif
    591606{
    592607    int fNATfailed = 0;
     
    627642    m_init(pData);
    628643
     644#ifndef VBOX_WITH_NAT_SERVICE
    629645    inet_aton(pszNetAddr, &special_addr);
     646#else
     647    special_addr.s_addr = u32NetAddr;
     648#endif
    630649    alias_addr.s_addr = special_addr.s_addr | htonl(CTL_ALIAS);
    631650    /* @todo: add ability to configure this staff */
     
    13661385}
    13671386
     1387#ifndef VBOX_WITH_NAT_SERVICE
    13681388#define ETH_ALEN        6
    13691389#define ETH_HLEN        14
     
    13791399};
    13801400AssertCompileSize(struct ethhdr, 14);
     1401#endif
    13811402
    13821403struct arphdr
     
    14071428    struct ex_list *ex_ptr;
    14081429    uint32_t htip;
     1430    uint32_t tip;
    14091431    struct mbuf *mr;
    14101432    eh = mtod(m, struct ethhdr *);
    14111433    ah = (struct arphdr *)&eh[1];
    14121434    htip = ntohl(*(uint32_t*)ah->ar_tip);
     1435    tip = *(uint32_t*)ah->ar_tip;
    14131436
    14141437    mr = m_get(pData);
     1438#ifdef VBOX_WITH_NAT_SERVICE
     1439    reh = mtod(mr, struct ethhdr *);
     1440    memcpy(reh->h_source, eh->h_source, ETH_ALEN); /* XXX: if_encap will swap src and dst*/
     1441    Log4(("NAT: arp:[%hhx:%hhx:%hhx:%hhx:%hhx:%hhx]->[%hhx:%hhx:%hhx:%hhx:%hhx:%hhx]\n",
     1442        reh->h_source[0], reh->h_source[1], reh->h_source[2], reh->h_source[3], reh->h_source[4], reh->h_source[5],
     1443        reh->h_dest[0], reh->h_dest[1], reh->h_dest[2], reh->h_dest[3], reh->h_dest[4], reh->h_dest[5]));
     1444    Log4(("NAT: arp: %R[IP4]\n", &tip));
     1445#endif
    14151446    mr->m_data += if_maxlinkhdr;
    14161447    mr->m_len = sizeof(struct arphdr);
     
    14211452    {
    14221453        case ARPOP_REQUEST:
     1454#ifdef VBOX_WITH_NAT_SERVICE
     1455            if (tip == special_addr.s_addr) goto arp_ok;
     1456#endif
    14231457            if ((htip & pData->netmask) == ntohl(special_addr.s_addr))
    14241458            {
     
    14291463                for (ex_ptr = exec_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
    14301464                {
    1431                     if ((htip & ~pData->netmask) == ex_ptr->ex_addr)
     1465                    if ((htip & ~pData->netmask) == ex_ptr->ex_addr)
     1466                    {
    14321467                        goto arp_ok;
     1468                    }
    14331469                }
    14341470                return;
     
    14671503    int proto;
    14681504    static bool fWarnedIpv6;
     1505    struct ethhdr *eh = (struct ethhdr*)pkt;
    14691506
    14701507    if (pkt_len < ETH_HLEN)
     
    14731510        return;
    14741511    }
     1512    Log4(("NAT: in:[%hhx:%hhx:%hhx:%hhx:%hhx:%hhx]->[%hhx:%hhx:%hhx:%hhx:%hhx:%hhx]\n",
     1513        eh->h_source[0], eh->h_source[1], eh->h_source[2], eh->h_source[3], eh->h_source[4], eh->h_source[5],
     1514        eh->h_dest[0], eh->h_dest[1], eh->h_dest[2], eh->h_dest[3], eh->h_dest[4], eh->h_dest[5]));
     1515#ifdef VBOX_WITH_NAT_SERVICE
     1516    if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) == 0)
     1517    {
     1518        goto drop;
     1519    }
     1520#endif
    14751521
    14761522    m = m_get(pData);
     
    15161562            break;
    15171563    }
     1564    drop:
    15181565    RTMemFree((void *)pkt);
    15191566}
     
    15291576    eh = mtod(m, struct ethhdr *);
    15301577
     1578#ifndef VBOX_WITH_NAT_SERVICE
    15311579    memcpy(eh->h_dest, client_ethaddr, ETH_ALEN);
    15321580    memcpy(eh->h_source, special_ethaddr, ETH_ALEN - 1);
    15331581    /* XXX: not correct */
    15341582    eh->h_source[5] = CTL_ALIAS;
     1583#else
     1584    Assert((caddr_t)eh == (caddr_t)m->m_dat);
     1585    if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) != 0)
     1586    {
     1587        memcpy(eh->h_dest, eh->h_source, ETH_ALEN);
     1588        memcpy(eh->h_source, special_ethaddr, ETH_ALEN);
     1589        Assert(memcmp(eh->h_dest, special_ethaddr, ETH_ALEN) != 0);
     1590        Assert(memcmp(eh->h_dest, zerro_ethaddr, ETH_ALEN) != 0);
     1591    }
     1592#endif
    15351593    eh->h_proto = htons(eth_proto);
    15361594#if 0
     
    15711629void slirp_set_ethaddr(PNATState pData, const uint8_t *ethaddr)
    15721630{
     1631#ifndef VBOX_WITH_NAT_SERVICE
    15731632    memcpy(client_ethaddr, ethaddr, ETH_ALEN);
     1633#endif
    15741634}
    15751635
  • trunk/src/VBox/Devices/Network/slirp/slirp.h

    r17302 r19313  
    356356#define DO_ALIAS(paddr) do {} while (0)
    357357#endif
    358 #endif
     358
     359
     360# ifdef VBOX_WITH_NAT_SERVICE
     361#  define ETH_ALEN        6
     362#  define ETH_HLEN        14
     363
     364#  define ARPOP_REQUEST   1               /* ARP request                  */
     365#  define ARPOP_REPLY     2               /* ARP reply                    */
     366
     367struct ethhdr
     368{
     369    unsigned char   h_dest[ETH_ALEN];           /* destination eth addr */
     370    unsigned char   h_source[ETH_ALEN];         /* source ether addr    */
     371    unsigned short  h_proto;                    /* packet type ID field */
     372};
     373AssertCompileSize(struct ethhdr, 14);
     374# endif
     375#endif
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r18902 r19313  
    126126    struct in_addr loopback_addr;
    127127    uint32_t netmask;
     128#ifndef VBOX_WITH_NAT_SERVICE
    128129    uint8_t client_ethaddr[6];
     130#endif
    129131    struct ex_list *exec_list;
    130132    char slirp_hostname[33];
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r18902 r19313  
    500500        /* A "normal" UDP packet */
    501501        struct mbuf *m;
     502        struct ethhdr *eh;
    502503        size_t len;
    503504        u_long n;
     
    593594             * make it look like that's where it came from, done by udp_output
    594595             */
     596#ifdef VBOX_WITH_NAT_SERVICE
     597            {
     598                struct ethhdr *eh0;
     599                struct ethhdr *eh;
     600                Assert(so->so_m);
     601                eh0 = (struct ethhdr *)so->so_m->m_dat;
     602                eh = (struct ethhdr *)m->m_dat;
     603
     604                memcpy(eh->h_source, eh0->h_source, ETH_ALEN);
     605            }
     606#endif
    595607            udp_output(pData, so, m, &addr);
    596608            SOCKET_UNLOCK(so);
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r18902 r19313  
    8282    void (* so_timeout)(PNATState pData, struct socket *so, void *arg);
    8383    void *so_timeout_arg;
     84#endif
     85#ifdef VBOX_WITH_NAT_SERVICE
     86    /* storage of source ether address */
     87    unsigned char so_ethaddr[6];
    8488#endif
    8589};
  • trunk/src/VBox/Devices/Network/slirp/tcp_input.c

    r17191 r19313  
    290290    {
    291291        so = inso;
    292 
     292        Log4(("NAT: tcp_input: %R[natsock]\n", so));
     293        Assert(so->so_m);
    293294        /* Re-set a few variables */
    294295        tp = sototcpcb(so);
    295296        m = so->so_m;
     297#ifdef VBOX_WITH_NAT_SERVICE
     298        {
     299            struct ethhdr *eh = (struct ethhdr *)m->m_dat;
     300            memcpy(so->so_ethaddr, eh->h_source, ETH_ALEN);
     301        }
     302#endif
    296303        so->so_m = 0;
    297304        ti = so->so_ti;
     
    474481            goto dropwithreset;
    475482        }
    476        
     483#ifdef VBOX_WITH_NAT_SERVICE
     484        Assert(m);
     485        so->so_m = m; /* save the initial packet */
     486        {
     487            struct ethhdr *eh0;
     488            eh0 = (struct ethhdr *)m->m_dat;
     489        }
     490#endif       
    477491        SOCKET_LOCK(so);
    478492        sbreserve(&so->so_snd, tcp_sndspace);
     
    776790                 * succeeded or not.  So we must time it out.
    777791                 */
     792#ifdef VBOX_WITH_NAT_SERVICE
     793                Assert(m);
     794                {
     795                    struct ethhdr *eh0;
     796                    eh0 = (struct ethhdr *)m->m_dat;
     797                }
     798#endif
    778799                so->so_m = m;
    779800                so->so_ti = ti;
  • trunk/src/VBox/Devices/Network/slirp/tcp_output.c

    r18902 r19313  
    378378            goto out;
    379379        }
     380#ifdef VBOX_WITH_NAT_SERVICE
     381        {
     382            struct ethhdr *eh, *eh0;
     383            eh = (struct ethhdr *)m->m_dat;
     384            if (so->so_m)
     385            {
     386                eh0 = (struct ethhdr *)so->so_m->m_dat;
     387                memcpy(eh->h_source, eh0->h_source, ETH_ALEN);
     388            }
     389            else
     390            {
     391                memcpy(eh->h_source, so->so_ethaddr, ETH_ALEN);
     392            }
     393        }
     394#endif
    380395        m->m_data += if_maxlinkhdr;
    381396        m->m_len = hdrlen;
     
    427442            goto out;
    428443        }
     444#ifdef VBOX_WITH_NAT_SERVICE
     445        {
     446            struct ethhdr *eh;
     447            eh = (struct ethhdr *)m->m_dat;
     448            memcpy(eh->h_source, so->so_ethaddr, ETH_ALEN);
     449        }
     450#endif
    429451        m->m_data += if_maxlinkhdr;
     452#ifndef VBOX_WITH_NAT_SERVICE
     453        /* XXX: it's shouldn't be here at all need to be deleted */
    430454        m->m_data += sizeof(struct ip)
    431455                   + sizeof(struct tcphdr);
     456#endif
    432457        m->m_len = hdrlen;
    433458    }
     
    577602     * the template, but need a way to checksum without them.
    578603     */
     604    Assert(m->m_len == (hdrlen + len));
    579605    m->m_len = hdrlen + len; /* XXX Needed? m_len should be correct */
    580606
     
    589615        error = ip_output(m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route,
    590616                         so->so_options & SO_DONTROUTE, 0);
     617#endif
     618#ifdef VBOX_WITH_NAT_SERVICE
     619        {
     620            struct ethhdr *eh0, *eh;
     621            eh = (struct ethhdr *)m->m_dat;
     622
     623            if (so->so_m != NULL)
     624            {
     625                eh0 = (struct ethhdr *)so->so_m->m_dat;
     626                memcpy(eh->h_source, eh0->h_source, ETH_ALEN);
     627            }
     628        }
    591629#endif
    592630        error = ip_output(pData, so, m);
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r17191 r19313  
    124124        if ((m = m_get(pData)) == NULL)
    125125            return;
     126#ifdef VBOX_WITH_NAT_SERVICE
     127        {
     128            struct ethhdr *eh0, *eh;
     129            Assert(tp->t_socket->so_m);
     130            eh0 = (struct ethhdr *)tp->t_socket->so_m->m_dat;
     131            eh = (struct ethhdr *)m->m_dat;
     132            memcpy(eh->h_source, eh0->h_source, ETH_ALEN);
     133        }
     134#endif
    126135#ifdef TCP_COMPAT_42
    127136        tlen = 1;
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