VirtualBox

Changeset 22843 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Sep 8, 2009 4:51:53 PM (15 years ago)
Author:
vboxsync
Message:

NAT: using host resolver instead of dnsproxy.

Location:
trunk/src/VBox/Devices
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Makefile.kmk

    r22830 r22843  
    757757        Network/slirp/libalias/alias_proxy.c \
    758758        Network/slirp/libalias/alias_ftp.c \
     759        Network/slirp/libalias/alias_dns.c \
    759760        Network/slirp/libalias/alias_nbt.c \
    760761        Network/slirp/libalias/alias_util.c
  • trunk/src/VBox/Devices/Network/slirp/ip_input.c

    r22013 r22843  
    6666}
    6767
     68static struct libalias *select_alias(PNATState pData, struct mbuf* m)
     69{
     70    struct libalias *la = pData->proxy_alias;
     71    struct udphdr *udp = NULL;
     72    struct ip *pip = NULL;
     73
     74    if (m->m_la)
     75        return m->m_la;
     76
     77#if 0
     78    pip = mtod(m, struct ip *);
     79    if (pip->ip_p == IPPROTO_UDP) {
     80        udp = (struct udphdr *)((uint8_t *)pip + (pip->ip_hl << 2));
     81        if (   pip->ip_dst.s_addr == htonl(ntohl(special_addr.s_addr) | CTL_DNS)
     82            && htons(udp->uh_dport) == 53)
     83        {
     84            return pData->dns_alias;
     85        }
     86        /* here we can add catch for dhcp and tftp servers */
     87    }
     88#endif
     89    return la;
     90}
     91
    6892/*
    6993 * Ip input routine.  Checksum and byte swap header.  If fragmented
     
    87111        int rc;
    88112        STAM_PROFILE_START(&pData->StatALIAS_input, a);
    89         rc = LibAliasIn(m->m_la ? m->m_la : pData->proxy_alias, mtod(m, char *),
    90             m->m_len);
     113        rc = LibAliasIn(select_alias(pData, m), mtod(m, char *), m->m_len);
    91114        STAM_PROFILE_STOP(&pData->StatALIAS_input, a);
    92115        Log2(("NAT: LibAlias return %d\n", rc));
     
    135158        goto bad;
    136159    }
     160
    137161    NTOHS(ip->ip_id);
    138162    NTOHS(ip->ip_off);
     
    149173        goto bad;
    150174    }
     175
    151176    /* Should drop packet if mbuf too long? hmmm... */
    152177    if (m->m_len > ip->ip_len)
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r22674 r22843  
    207207};
    208208
     209
    209210#ifdef RT_OS_WINDOWS
    210211static int get_dns_addr_domain(PNATState pData, bool fVerbose,
     
    340341    int found = 0;
    341342    struct in_addr tmp_addr;
     343    int nameservers = 0;
    342344
    343345#ifdef RT_OS_OS2
     
    441443
    442444#endif
     445
     446static void alias_init(PNATState pData, struct libalias **pla, int la_flags, struct in_addr addr)
     447{
     448        int flags = 0;
     449        struct libalias *la;
     450        la = LibAliasInit(pData, NULL);
     451        if (la == NULL)
     452        {
     453            LogRel(("NAT: LibAlias default rule wasn't initialized\n"));
     454            AssertMsgFailed(("NAT: LibAlias default rule wasn't initialized\n"));
     455        }
     456        flags = LibAliasSetMode(la, 0, 0);
     457#ifndef NO_FW_PUNCH
     458        flags |= PKT_ALIAS_PUNCH_FW;
     459#endif
     460#ifdef DEBUG
     461        flags |= PKT_ALIAS_LOG; /* set logging */
     462#endif
     463        flags |= la_flags;
     464        flags = LibAliasSetMode(la, flags, ~0);
     465        LibAliasSetAddress(la, addr);
     466        *pla = la;
     467}
    443468
    444469static int slirp_init_dns_list(PNATState pData)
     
    539564
    540565    /* set default addresses */
    541     inet_aton("127.0.0.1", &loopback_addr);
     566    loopback_addr.s_addr = INADDR_LOOPBACK;
    542567    if (slirp_init_dns_list(pData) < 0)
    543568        fNATfailed = 1;
     
    547572    getouraddr(pData);
    548573    {
    549         int flags = 0;
    550574        struct in_addr proxy_addr;
    551         pData->proxy_alias = LibAliasInit(pData, NULL);
    552         if (pData->proxy_alias == NULL)
    553         {
    554             LogRel(("NAT: LibAlias default rule wasn't initialized\n"));
    555             AssertMsgFailed(("NAT: LibAlias default rule wasn't initialized\n"));
    556         }
    557         flags = LibAliasSetMode(pData->proxy_alias, 0, 0);
    558 #ifndef NO_FW_PUNCH
    559         flags |= PKT_ALIAS_PUNCH_FW;
    560 #endif
    561         flags |= PKT_ALIAS_LOG; /* set logging */
    562         flags = LibAliasSetMode(pData->proxy_alias, flags, ~0);
    563575        proxy_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS);
    564         LibAliasSetAddress(pData->proxy_alias, proxy_addr);
     576        alias_init(pData, &pData->proxy_alias, 0, proxy_addr);
     577
     578#if 0
     579        proxy_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_DNS);
     580        alias_init(pData, &pData->dns_alias, PKT_ALIAS_REVERSE, proxy_addr);
     581#endif
     582
    565583        ftp_alias_load(pData);
    566584        nbt_alias_load(pData);
     585        dns_alias_load(pData);
    567586    }
    568587    return fNATfailed ? VINF_NAT_DNS : VINF_SUCCESS;
     
    643662    ftp_alias_unload(pData);
    644663    nbt_alias_unload(pData);
     664    dns_alias_unload(pData);
    645665    while(!LIST_EMPTY(&instancehead))
    646666    {
     
    16371657        psin = (struct sockaddr_in *)&sa;
    16381658
    1639         lib = LibAliasInit(pData, NULL);
    1640         flags = LibAliasSetMode(lib, 0, 0);
    1641         flags |= PKT_ALIAS_LOG; /* set logging */
    1642         flags |= PKT_ALIAS_REVERSE; /* set logging */
    1643         flags = LibAliasSetMode(lib, flags, ~0);
    16441659
    16451660        alias.s_addr =  htonl(ntohl(guest_addr) | CTL_ALIAS);
    1646         link = LibAliasRedirectPort(lib, psin->sin_addr, htons(rule->host_port),
     1661        alias_init(pData, &so->so_la, PKT_ALIAS_REVERSE, alias);
     1662        link = LibAliasRedirectPort(so->so_la, psin->sin_addr, htons(rule->host_port),
    16471663            alias, htons(rule->guest_port),
    16481664            special_addr,  -1, /* not very clear for now*/
     
    16541670            goto remove_port_forwarding;
    16551671        }
    1656         so->so_la = lib;
    16571672        rule->activated = 1;
    16581673        continue;
  • trunk/src/VBox/Devices/Network/slirp/slirp.h

    r22664 r22843  
    388388    RTStrPrintfV(buffer, 1024, format, args);
    389389
    390 #if defined(DEBUG_vvl) && 0
     390#if defined(DEBUG_vvl)
    391391    LogRel(("NAT:ALIAS: %s\n", buffer));
    392392#else
     
    415415int nbt_alias_load(PNATState);
    416416int nbt_alias_unload(PNATState);
    417 
     417int dns_alias_load(PNATState);
     418int dns_alias_unload(PNATState);
    418419int slirp_arp_lookup_ip_by_ether(PNATState, const uint8_t *, uint32_t *);
    419420int slirp_arp_lookup_ether_by_ip(PNATState, uint32_t, uint8_t *);
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r22664 r22843  
    249249    LIST_HEAD(RT_NOTHING, libalias) instancehead;
    250250    struct libalias *proxy_alias;
     251    struct libalias *dns_alias;
    251252    LIST_HEAD(handler_chain, proto_handler) handler_chain;
    252253    struct port_forward_rule_list port_forward_rule_head;
     
    256257    struct proto_handler *ftp_module;
    257258    struct proto_handler *nbt_module;
     259    struct proto_handler *dns_module;
    258260
    259261#define PROFILE_COUNTER(name, dsc)     STAMPROFILE Stat ## name
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r22014 r22843  
    107107     */
    108108    len = ntohs((u_int16_t)uh->uh_ulen);
     109    Assert((ip->ip_len == len));
     110    Assert((ip->ip_len + iphlen == m->m_len));
    109111
    110112    if (ip->ip_len != len)
     
    159161    }
    160162
     163    if (   ntohs(uh->uh_dport) == 53
     164        && CTL_CHECK(ntohl(ip->ip_dst.s_addr), CTL_DNS))
     165    {
     166        struct sockaddr_in dst, src;
     167        src.sin_addr.s_addr = ip->ip_dst.s_addr;
     168        src.sin_port = uh->uh_dport;
     169        dst.sin_addr.s_addr = ip->ip_src.s_addr;
     170        dst.sin_port = uh->uh_sport;
     171        /* udp_output2 will do opposite operations on mbuf*/
     172       
     173        m->m_data += sizeof(struct udpiphdr);
     174        m->m_len -= sizeof(struct udpiphdr);
     175        udp_output2(pData, NULL, m, &src, &dst, IPTOS_LOWDELAY);
     176        goto bad;
     177    }
    161178    /*
    162179     *  handle TFTP
     
    234251     * DNS proxy
    235252     */
     253#if 0
    236254    if (   (ip->ip_dst.s_addr == htonl(ntohl(special_addr.s_addr) | CTL_DNS))
    237255        && (ntohs(uh->uh_dport) == 53))
     
    240258        goto bad; /* it isn't bad, probably better to add additional label done for boot/tftf :)  */
    241259    }
     260#endif
    242261
    243262    iphlen += sizeof(struct udphdr);
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