VirtualBox

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


Ignore:
Timestamp:
May 31, 2009 6:25:55 AM (16 years ago)
Author:
vboxsync
Message:

NAT/libalias: port-forwarding

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

Legend:

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

    r20053 r20164  
    7676{
    7777    register struct ip *ip;
    78     int hlen;
     78    int hlen = 0;
    7979
    8080    DEBUG_CALL("ip_input");
    8181    DEBUG_ARG("m = %lx", (long)m);
    82     DEBUG_ARG("m_len = %d", m->m_len);
     82    ip = mtod(m, struct ip *);
     83    DEBUG_ARG("ip_dst=%R[IP4](len:%d) m_len = %d", &ip->ip_dst, ntohs(ip->ip_len), m->m_len);
     84    Log2(("ip_dst=%R[IP4](len:%d) m_len = %d\n", &ip->ip_dst, ntohs(ip->ip_len), m->m_len));
    8385
    8486    ipstat.ips_total++;
     
    8688    {
    8789        int rc;
    88         rc = LibAliasIn(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
     90        rc = LibAliasIn(m->m_la ? m->m_la : pData->proxy_alias, mtod(m, char *),
     91            m->m_len);
    8992        Log2(("NAT: LibAlias return %d\n", rc));
    9093    }
     
    199202    return;
    200203bad:
     204    Log2(("NAT: IP datagram to %R[IP4] with size(%d) claimed as bad\n",
     205        &ip->ip_dst, ip->ip_len));
    201206    m_freem(pData, m);
    202207    return;
  • trunk/src/VBox/Devices/Network/slirp/ip_output.c

    r20053 r20164  
    153153        {
    154154            int rc;
    155             rc = LibAliasOut(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
     155            rc = LibAliasOut((m->m_la ? m->m_la : pData->proxy_alias),
     156                mtod(m, char *), m->m_len);
    156157            Log2(("NAT: LibAlias return %d\n", rc));
    157158        }
     
    254255        {
    255256            int rc;
    256             rc = LibAliasOut(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
     257            rc = LibAliasOut((m->m_la ? m->m_la : pData->proxy_alias),
     258                mtod(m, char *), m->m_len);
    257259            Log2(("NAT: LibAlias return %d\n", rc));
    258260        }
     
    269271            {
    270272                int rc;
    271                 rc = LibAliasOut(LIST_FIRST(&instancehead), mtod(m, char *), m->m_len);
     273                rc = LibAliasOut((m->m_la ? m->m_la : pData->proxy_alias),
     274                    mtod(m, char *), m->m_len);
    272275                Log2(("NAT: LibAlias return %d\n", rc));
    273276            }
  • trunk/src/VBox/Devices/Network/slirp/mbuf.c

    r15791 r20164  
    8282    m->m_nextpkt = 0;
    8383    m->m_prevpkt = 0;
     84#ifdef VBOX_WITH_SLIRP_ALIAS
     85    m->m_la = NULL;
     86#endif
    8487
    8588end_error:
  • trunk/src/VBox/Devices/Network/slirp/mbuf.h

    r19759 r20164  
    7474    caddr_t mh_data;           /* Location of data */
    7575    int     mh_len;            /* Amount of data in this mbuf */
     76#ifndef VBOX_SLIRP_ALIAS
     77    struct libalias *mh_la;     /*Real freebsd store hocksin similar way*/
     78#endif
    7679};
    7780
     
    111114#define m_ext           M_dat.m_ext_
    112115#define m_so            m_hdr.mh_so
     116#ifdef VBOX_WITH_SLIRP_ALIAS
     117#define m_la            m_hdr.mh_la
     118#endif
    113119
    114120#define ifq_prev m_prev
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r20053 r20164  
    686686#ifdef VBOX_WITH_SLIRP_ALIAS
    687687    {
    688         struct libalias *lib = NULL;
    689688        int flags = 0;
    690         lib = LibAliasInit(pData, NULL);
    691         if (lib == NULL)
     689        pData->proxy_alias = LibAliasInit(pData, NULL);
     690        if (pData->proxy_alias == NULL)
    692691        {
    693692            LogRel(("NAT: LibAlias default rule wasn't initialized\n"));
    694693            AssertMsgFailed(("NAT: LibAlias default rule wasn't initialized\n"));
    695694        }
    696         flags = LibAliasSetMode(lib, 0, 0);
     695        flags = LibAliasSetMode(pData->proxy_alias, 0, 0);
    697696        flags |= PKT_ALIAS_LOG; /* set logging */
    698         flags = LibAliasSetMode(lib, flags, ~0);
    699         LibAliasSetAddress(lib, special_addr);
     697        flags = LibAliasSetMode(pData->proxy_alias, flags, ~0);
     698        LibAliasSetAddress(pData->proxy_alias, special_addr);
    700699        ftp_alias_load();
    701700       
     
    15411540    struct ethhdr *eh = (struct ethhdr*)pkt;
    15421541
     1542    Log2(("NAT: slirp_input %d\n", pkt_len));
    15431543    if (pkt_len < ETH_HLEN)
    15441544    {
     
    15461546        return;
    15471547    }
    1548     Log4(("NAT: in:%R[ether]->%R[ether]\n", eh->h_source, eh->h_dest));
     1548    Log4(("NAT: in:%R[ether]->%R[ether]\n", &eh->h_source, &eh->h_dest));
    15491549#ifdef VBOX_WITHOUT_SLIRP_CLIENT_ETHER
    15501550    if (memcmp(eh->h_source, special_ethaddr, ETH_ALEN) == 0)
     
    15821582             * the first outgoing connection gets an incorrect timestamp. */
    15831583            updtime(pData);
    1584             m->m_data += ETH_HLEN;
    1585             m->m_len -= ETH_HLEN;
     1584            m_adj(m, ETH_HLEN);
    15861585            ip_input(pData, m);
    15871586            break;
     
    16291628        memcpy(eh->h_source, special_ethaddr, ETH_ALEN);
    16301629        Assert(memcmp(eh->h_dest, special_ethaddr, ETH_ALEN) != 0);
    1631         Assert(memcmp(eh->h_dest, zerro_ethaddr, ETH_ALEN) != 0);
     1630        if (memcmp(eh->h_dest, zerro_ethaddr, ETH_ALEN) == 0)
     1631        {
     1632            /* don't do anything */
     1633            goto done;
     1634        }
    16321635    }
    16331636#endif
     
    16381641    memcpy(buf, mtod(m, uint8_t *), m->m_len);
    16391642    slirp_output(pData->pvUser, NULL, buf, m->m_len);
     1643done:
    16401644    m_free(pData, m);
    16411645#endif
     
    16461650{
    16471651    struct socket *so;
     1652#ifdef VBOX_WITH_SLIRP_ALIAS
     1653    struct alias_link *link;
     1654    struct libalias *lib;
     1655    int flags;
     1656    struct sockaddr sa;
     1657    struct sockaddr_in *psin;
     1658    socklen_t socketlen;
     1659    struct in_addr alias;
     1660    int rc;
     1661#endif
    16481662    Log2(("NAT: set redirect %s hp:%d gp:%d\n", (is_udp?"UDP":"TCP"), host_port, guest_port));
    16491663    if (is_udp)
     
    16571671                      htons(guest_port), 0);
    16581672    }
     1673#ifndef VBOX_WITH_SLIRP_ALIAS
    16591674    Log2(("NAT: redirecting socket %R[natsock]\n", so));
    16601675    return (so != NULL ? 0 : -1);
     1676#else
     1677
     1678    psin = (struct sockaddr_in *)&sa;
     1679    psin->sin_family = AF_INET;
     1680    psin->sin_port = 0;
     1681    psin->sin_addr.s_addr = INADDR_ANY;
     1682    socketlen = sizeof(struct sockaddr);
     1683   
     1684    rc = getsockname(so->s, &sa, &socketlen);
     1685    if (rc < 0 || sa.sa_family != AF_INET)
     1686    {
     1687        Log(("NAT: can't get socket's name\n"));
     1688        return 1;
     1689    }
     1690
     1691    psin = (struct sockaddr_in *)&sa;
     1692   
     1693#if 1
     1694    lib = LibAliasInit(pData, NULL);
     1695    flags = LibAliasSetMode(lib, 0, 0);
     1696    flags |= PKT_ALIAS_LOG; /* set logging */
     1697    flags |= PKT_ALIAS_REVERSE; /* set logging */
     1698    flags = LibAliasSetMode(lib, flags, ~0);
     1699#else
     1700    lib = LIST_FIRST(&instancehead);
     1701#endif
     1702
     1703    alias.s_addr =  htonl(ntohl(guest_addr.s_addr) | CTL_ALIAS);
     1704    link = LibAliasRedirectPort(lib, psin->sin_addr, htons(host_port),
     1705        alias, htons(guest_port),
     1706        special_addr,  -1, /* not very clear for now*/
     1707        (is_udp ? IPPROTO_UDP : IPPROTO_TCP));
     1708    if (link == NULL)
     1709    {
     1710        Log(("NAT: can't create redirect\n"));
     1711        return 1;
     1712    }
     1713    so->so_la = lib;
     1714   
     1715    return 0;
     1716#endif
    16611717}
    16621718
     
    17331789    Log2(("proto: %d, dport: %d sport: %d\n", proto, hdport, hsport));
    17341790    service = 0;
    1735 #if 1
     1791#if 0
    17361792    /* Always return 0 here */
    17371793    switch (hdport)
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r19981 r20164  
    228228#ifdef VBOX_WITH_SLIRP_ALIAS
    229229    LIST_HEAD(, libalias) instancehead;
     230    struct libalias *proxy_alias;
    230231#endif
    231232    STAMPROFILE StatFill;
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r19313 r20164  
    8787    unsigned char so_ethaddr[6];
    8888#endif
     89#ifdef VBOX_WITH_SLIRP_ALIAS
     90    /* required for port-forwarding */
     91    struct libalias *so_la;
     92#endif
    8993};
    9094
  • trunk/src/VBox/Devices/Network/slirp/tcp_output.c

    r19839 r20164  
    601601        }
    602602#endif
     603#ifdef VBOX_WITH_SLIRP_ALIAS
     604        if(so->so_la != NULL)
     605            m->m_la = so->so_la;
     606#endif
    603607        error = ip_output(pData, so, m);
    604608
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r20053 r20164  
    487487        so->so_laddr = inso->so_laddr;
    488488        so->so_lport = inso->so_lport;
     489#ifdef VBOX_WITH_SLIRP_ALIAS
     490        so->so_la = inso->so_la;
     491#endif
    489492    }
    490493
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r19981 r20164  
    7878    DEBUG_CALL("udp_input");
    7979    DEBUG_ARG("m = %lx", (long)m);
     80    ip = mtod(m, struct ip *);
    8081    DEBUG_ARG("iphlen = %d", iphlen);
     82    Log2(("%R[IP4] iphlen = %d\n", &ip->ip_dst, iphlen));
    8183
    8284    udpstat.udps_ipackets++;
     
    259261        m->m_data -= iphlen;
    260262        *ip = save_ip;
    261         DEBUG_MISC((dfd,"udp tx errno = %d-%s\n", errno, strerror(errno)));
     263        DEBUG_MISC((dfd,"NAT: UDP tx errno = %d-%s (on sent to %R[IP4])\n", errno,
     264                strerror(errno), &ip->ip_dst));
    262265        icmp_error(pData, m, ICMP_UNREACH, ICMP_UNREACH_NET, 0, strerror(errno));
    263266        /* in case we receive ICMP on this socket we'll aware that ICMP has been already sent to host*/
     
    276279
    277280bad:
     281    Log2(("NAT: UDP datagram to %R[IP4] with size(%d) claimed as bad\n",
     282        &ip->ip_dst, ip->ip_len));
    278283    m_freem(pData, m);
    279284    return;
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