VirtualBox

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


Ignore:
Timestamp:
Dec 18, 2008 7:01:32 AM (16 years ago)
Author:
vboxsync
Message:

slirp:icmp: Get rid of old ICMP implementation

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

Legend:

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

    r15522 r15636  
    7171};
    7272
    73 #ifdef VBOX_WITH_SLIRP_ICMP
    7473int
    7574icmp_init(PNATState pData)
     
    265264    return 0;
    266265}
    267 #endif /* VBOX_WITH_SLIRP_ICMP */
    268266
    269267/*
     
    278276    int status;
    279277    uint32_t dst;
    280 #if defined(VBOX_WITH_SLIRP_ICMP) && !defined(RT_OS_WINDOWS)
     278#if !defined(RT_OS_WINDOWS)
    281279    int ttl;
    282280#endif
     
    321319    {
    322320        case ICMP_ECHO:
    323 #ifndef VBOX_WITH_SLIRP_ICMP
    324             icp->icmp_type = ICMP_ECHOREPLY;
    325 #endif /* !VBOX_WITH_SLIRP_ICMP */
    326 
    327321            ip->ip_len += hlen;              /* since ip_input subtracts this */
    328322            dst = ip->ip_dst.s_addr;
    329323            if (dst == alias_addr.s_addr)
    330324            {
    331 #ifdef VBOX_WITH_SLIRP_ICMP
    332325                icp->icmp_type = ICMP_ECHOREPLY;
    333326                ip->ip_dst.s_addr = ip->ip_src.s_addr;
    334327                ip->ip_src.s_addr = dst;
    335 #endif /* VBOX_WITH_SLIRP_ICMP */
    336328                icmp_reflect(pData, m);
    337329            }
     
    339331            {
    340332                struct sockaddr_in addr;
    341 #ifndef VBOX_WITH_SLIRP_ICMP
    342                 struct socket *so;
    343                 if ((so = socreate()) == NULL)
    344                     goto freeit;
    345                 if (udp_attach(pData, so) == -1)
    346                 {
    347                     DEBUG_MISC((dfd,"icmp_input udp_attach errno = %d-%s\n",
    348                                 errno,strerror(errno)));
    349                     sofree(pData, so);
    350                     m_free(pData, m);
    351                     goto end_error;
    352                 }
    353                 so->so_m = m;
    354                 so->so_faddr = ip->ip_dst;
    355                 so->so_fport = htons(7);
    356                 so->so_laddr = ip->ip_src;
    357                 so->so_lport = htons(9);
    358                 so->so_iptos = ip->ip_tos;
    359                 so->so_type = IPPROTO_ICMP;
    360                 so->so_state = SS_ISFCONNECTED;
    361 
    362                 addr.sin_family = AF_INET;
    363                 if ((so->so_faddr.s_addr & htonl(pData->netmask)) == special_addr.s_addr)
    364                 {
    365                     /* It's an alias */
    366                     switch (ntohl(so->so_faddr.s_addr) & ~pData->netmask)
    367                     {
    368                         case CTL_DNS:
    369                             addr.sin_addr = dns_addr;
    370                             break;
    371                         case CTL_ALIAS:
    372                         default:
    373                             addr.sin_addr = loopback_addr;
    374                             break;
    375                     }
    376                 }
    377                 else
    378                     addr.sin_addr = so->so_faddr;
    379                 addr.sin_port = so->so_fport;
    380                 if (sendto(so->s, icmp_ping_msg, strlen(icmp_ping_msg), 0,
    381                             (struct sockaddr *)&addr, sizeof(addr)) == -1)
    382                 {
    383                     DEBUG_MISC((dfd,"icmp_input udp sendto tx errno = %d-%s\n",
    384                                 errno,strerror(errno)));
    385                     icmp_error(pData, m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno));
    386                     udp_detach(pData, so);
    387                 }
    388 #else /* VBOX_WITH_SLIRP_ICMP */
    389 # ifdef RT_OS_WINDOWS
     333#ifdef RT_OS_WINDOWS
    390334                IP_OPTION_INFORMATION ipopt;
    391335                int error;
    392 # endif
     336#endif
    393337                addr.sin_family = AF_INET;
    394338                if ((ip->ip_dst.s_addr & htonl(pData->netmask)) == special_addr.s_addr)
     
    408352                else
    409353                    addr.sin_addr.s_addr = ip->ip_dst.s_addr;
    410 # ifndef RT_OS_WINDOWS
     354#ifndef RT_OS_WINDOWS
    411355                if (pData->icmp_socket.s != -1)
    412356                {
     
    427371                        m_free(pData, m);
    428372                    }
    429                 } 
     373                }
    430374                else
    431375                {
    432                     /* 
     376                    /*
    433377                     * We're freeing the ICMP message, which unable sent or process.
    434378                     * That behavior described in rfc 793, we shouldn't notify sender about
     
    438382                    return;
    439383                }
    440 # else /* RT_OS_WINDOWS */
     384#else /* RT_OS_WINDOWS */
    441385                icmp_attach(pData, m);
    442386                pData->icmp_socket.so_laddr.s_addr = ip->ip_src.s_addr; /* XXX: hack*/
     
    472416                    }
    473417                }
    474 # endif /* RT_OS_WINDOWS */
    475 #endif /* VBOX_WITH_SLIRP_ICMP */
     418#endif /* RT_OS_WINDOWS */
    476419            } /* if ip->ip_dst.s_addr == alias_addr.s_addr */
    477420            break;
     
    668611    m->m_len += hlen;
    669612
    670 #ifndef VBOX_WITH_SLIRP_ICMP
    671     /* fill in ip */
    672     if (optlen > 0)
    673     {
    674         /*
    675          * Strip out original options by copying rest of first
    676          * mbuf's data back, and adjust the IP length.
    677          */
    678         memmove((caddr_t)(ip + 1), (caddr_t)ip + hlen,
    679                  (unsigned )(m->m_len - hlen));
    680         hlen -= optlen;
    681         ip->ip_hl = hlen >> 2;
    682         ip->ip_len -= optlen;
    683         m->m_len -= optlen;
    684     }
    685     ip->ip_ttl = MAXTTL;
    686     {
    687         /* swap */
    688         struct in_addr icmp_dst;
    689         icmp_dst = ip->ip_dst;
    690         ip->ip_dst = ip->ip_src;
    691         ip->ip_src = icmp_dst;
    692     }
    693 #endif /* !VBOX_WITH_SLIRP_ICMP */
    694 
    695613    (void ) ip_output(pData, (struct socket *)NULL, m);
    696614
  • trunk/src/VBox/Devices/Network/slirp/ip_icmp.h

    r15365 r15636  
    3737#ifndef _NETINET_IP_ICMP_H_
    3838#define _NETINET_IP_ICMP_H_
    39 #ifdef VBOX_WITH_SLIRP_ICMP
    4039#include <queue.h>
    41 #endif
    4240
    4341/*
     
    173171void icmp_reflect _P((PNATState, struct mbuf *));
    174172
    175 #ifdef VBOX_WITH_SLIRP_ICMP
    176173struct icmp_msg{
    177174    LIST_ENTRY(icmp_msg) im_list;
     
    184181int icmp_init _P((PNATState ));
    185182struct icmp_msg * icmp_find_original_mbuf _P((PNATState , struct ip *));
    186 #endif /* VBOX_WITH_SLIRP_ICMP */
    187183
    188184#endif
  • trunk/src/VBox/Devices/Network/slirp/ip_input.c

    r15480 r15636  
    147147    }
    148148
    149 #ifdef VBOX_WITH_SLIRP_ICMP
    150149    ip->ip_ttl--;
    151 #endif
    152150    /*
    153151     * If offset or IP_MF are set, must reassemble.
     
    246244        struct ipq_t *q = TAILQ_LAST(head, ipqhead);
    247245        if (q == NULL)
    248         { 
     246        {
    249247            /* gak */
    250248            for (i = 0; i < IPREASS_NHASH; i++)
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r15453 r15636  
    2929# define DO_POLL_EVENTS(rc, error, so, events, label) do {} while (0)
    3030
    31 #define DO_CHECK_FD_SET(so, events, fdset) (FD_ISSET((so)->s, (fdset)))
    32 
    33 # ifdef VBOX_WITH_SLIRP_ICMP
    34 #  define ICMP_ENGAGE_EVENT(so, fdset)               \
     31# define DO_CHECK_FD_SET(so, events, fdset) (FD_ISSET((so)->s, (fdset)))
     32
     33# define ICMP_ENGAGE_EVENT(so, fdset)               \
    3534    do {                                             \
    3635        if (pData->icmp_socket.s != -1)              \
    3736            DO_ENGAGE_EVENT1((so), (fdset), ICMP);   \
    3837    } while (0)
    39 # else /* !VBOX_WITH_SLIRP_ICMP */
    40 #  define ICMP_ENGAGE_EVENT(so, fdset)               do {} while (0)
    41 # endif /* !VBOX_WITH_SLIRP_ICMP */
    4238
    4339#else /* defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) */
     
    361357    if_init(pData);
    362358    ip_init(pData);
    363 #ifdef VBOX_WITH_SLIRP_ICMP
    364359    icmp_init(pData);
    365 #endif /* VBOX_WITH_SLIRP_ICMP */
    366360
    367361    /* Initialise mbufs *after* setting the MTU */
     
    443437        RTStrFree((char *)(void *)pData->pszDomain);
    444438
    445 #ifdef VBOX_WITH_SLIRP_ICMP
    446 # ifdef RT_OS_WINDOWS
     439#ifdef RT_OS_WINDOWS
    447440    pData->pfIcmpCloseHandle(pData->icmp_socket.sh);
    448441    FreeLibrary(pData->hmIcmpLibrary);
     
    450443# else
    451444    closesocket(pData->icmp_socket.s);
    452 # endif
    453445#endif
    454446
     
    713705    if (link_up)
    714706    {
    715 #if defined(VBOX_WITH_SLIRP_ICMP)
    716 # if defined(RT_OS_WINDOWS)
     707#if defined(RT_OS_WINDOWS)
    717708        if (fIcmp)
    718709            sorecvfrom(pData, &pData->icmp_socket);
    719 # else
     710#else
    720711        if (pData->icmp_socket.s != -1 && FD_ISSET(pData->icmp_socket.s, readfds))
    721712            sorecvfrom(pData, &pData->icmp_socket);
    722 # endif
    723713#endif
    724714        /*
     
    915905        }
    916906
    917 #if 0
    918 #if defined(VBOX_WITH_SLIRP_ICMP)
    919 # if defined(RT_OS_WINDOWS)
    920         if (fIcmp)
    921             sorecvfrom(pData, &pData->icmp_socket);
    922 # else
    923         if (pData->icmp_socket.s != -1 && FD_ISSET(pData->icmp_socket.s, readfds))
    924             sorecvfrom(pData, &pData->icmp_socket);
    925 # endif
    926 #endif
    927 #endif
    928907    }
    929908
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r15597 r15636  
    1313#include <sys/filio.h>
    1414#endif
    15 #if defined(VBOX_WITH_SLIRP_ICMP) && defined (RT_OS_WINDOWS)
     15#if defined (RT_OS_WINDOWS)
    1616#include <iphlpapi.h>
    1717#include <icmpapi.h>
     
    1919
    2020
    21 #ifdef VBOX_WITH_SLIRP_ICMP
    2221static void send_icmp_to_guest(PNATState, char *, size_t, struct socket *, const struct sockaddr_in *);
     22#ifdef RT_OS_WINDOWS
    2323static void sorecvfrom_icmp_win(PNATState, struct socket *);
    24 #endif
     24#else /* RT_OS_WINDOWS */
    2525static void sorecvfrom_icmp_unix(PNATState, struct socket *);
     26#endif /* !RT_OS_WINDOWS */
    2627
    2728void
     
    443444    {
    444445        /* This is a "ping" reply */
    445 #if !defined(VBOX_WITH_SLIRP_ICMP) || (defined(VBOX_WITH_SLIRP_ICMP) && !defined(RT_OS_WINDOWS))
     446#ifdef RT_OS_WINDOWS
     447        sorecvfrom_icmp_win(pData, so);
     448#else /* RT_OS_WINDOWS */
    446449        sorecvfrom_icmp_unix(pData, so);
    447 #endif
    448 #if defined(VBOX_WITH_SLIRP_ICMP) && defined(RT_OS_WINDOWS)
    449         sorecvfrom_icmp_win(pData, so);
    450 #endif
     450#endif /* !RT_OS_WINDOWS */
    451451        udp_detach(pData, so);
    452452    }
     
    786786}
    787787
    788 #ifdef VBOX_WITH_SLIRP_ICMP
    789788static void
    790789send_icmp_to_guest(PNATState pData, char *buff, size_t len, struct socket *so, const struct sockaddr_in *addr)
     
    896895}
    897896
    898 # ifdef RT_OS_WINDOWS
     897#ifdef RT_OS_WINDOWS
    899898static void
    900899sorecvfrom_icmp_win(PNATState pData, struct socket *so)
     
    960959                nbytes = (data_len + icr[i].DataSize > m->m_size? m->m_size - data_len: icr[i].DataSize);
    961960                memcpy(icp->icmp_data, icr[i].Data, nbytes);
    962                
     961
    963962                data_len += icr[i].DataSize;
    964963
     
    988987                data_len = (ip_broken->ip_hl << 2) + 64;
    989988
    990                 nbytes =(hlen + ICMP_MINLEN + data_len > m->m_size? m->m_size - (hlen + ICMP_MINLEN): data_len); 
     989                nbytes =(hlen + ICMP_MINLEN + data_len > m->m_size? m->m_size - (hlen + ICMP_MINLEN): data_len);
    991990                memcpy(icp->icmp_data, ip_broken,  nbytes);
    992991                icmp_reflect(pData, m);
     
    998997    }
    999998}
    1000 # endif /* RT_OS_WINDOWS */
    1001 #endif /* VBOX_WITH_SLIRP_ICMP */
    1002 
     999#else /* RT_OS_WINDOWS */
    10031000static void sorecvfrom_icmp_unix(PNATState pData, struct socket *so)
    10041001{
     
    10261023    else
    10271024    {
    1028 #ifdef VBOX_WITH_SLIRP_ICMP
    10291025        send_icmp_to_guest(pData, buff, len, so, &addr);
    1030 #else
    1031         icmp_reflect(pData, so->so_m);
    1032         so->so_m = 0; /* Don't m_free() it again! */
    1033 #endif
    1034     }
    1035 }
    1036 
     1026    }
     1027}
     1028#endif /* !RT_OS_WINDOWS */
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r15243 r15636  
    2323    struct socket   *so_prev;    /* For a linked list of sockets */
    2424
    25 #if !defined(VBOX_WITH_SLIRP_ICMP) || !defined(RT_OS_WINDOWS)
     25#if !defined(RT_OS_WINDOWS)
    2626    int s;                       /* The actual socket */
    2727#else
     
    4545    u_int16_t       so_fport;    /* foreign port */
    4646    u_int16_t       so_lport;    /* local port */
    47 #ifdef VBOX_WITH_SLIRP_ICMP
    4847    u_int16_t       so_hlport; /* host local port */
    4948    struct in_addr  so_hladdr;    /* local host addr */
    50 #endif
    5149
    5250    u_int8_t        so_iptos;    /* Type of service */
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r15472 r15636  
    7272    struct ip save_ip;
    7373    struct socket *so;
    74 #ifdef VBOX_WITH_SLIRP_ICMP
    7574    int ret;
    7675    int ttl;
    77 #endif
    7876
    7977    DEBUG_CALL("udp_input");
     
    239237        udp_emu(pData, so, m);
    240238
    241 #ifdef VBOX_WITH_SLIRP_ICMP
    242239    ttl = ip->ip_ttl = save_ip.ip_ttl;
    243240    ret = setsockopt(so->s, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
     
    245242        LogRel(("NAT: Error (%s) occurred while setting TTL(%d) attribute of IP packet to socket %R[natsock]\n", strerror(errno), ip->ip_ttl, so));
    246243    }
    247 #endif
     244
    248245    if (sosendto(pData, so, m) == -1)
    249246    {
     
    353350{
    354351    struct sockaddr_in addr;
    355 #ifdef VBOX_WITH_SLIRP_ICMP
    356352    struct sockaddr sa_addr;
    357353    socklen_t socklen = sizeof(struct sockaddr);
    358354    int status;
    359 #endif
    360355
    361356    if ((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1)
     
    388383            setsockopt(so->s, SOL_SOCKET, SO_BROADCAST, (const char *)&opt, sizeof(opt));
    389384            insque(pData, so,&udb);
    390 #ifdef VBOX_WITH_SLIRP_ICMP
    391385            status = getsockname(so->s, &sa_addr, &socklen);
    392386            Assert(status == 0 && sa_addr.sa_family == AF_INET);
    393387            so->so_hlport = ((struct sockaddr_in *)&sa_addr)->sin_port;
    394388            so->so_hladdr.s_addr = ((struct sockaddr_in *)&sa_addr)->sin_addr.s_addr;
    395 #endif
    396389        }
    397390    }
     
    402395udp_detach(PNATState pData, struct socket *so)
    403396{
    404 #ifndef VBOX_WITH_SLIRP_ICMP
    405     closesocket(so->s);
    406     sofree(pData, so);
    407 #else /*! VBOX_WITH_SLIRP_ICMP */
    408397    if (so != &pData->icmp_socket)
    409398    {
     
    411400        sofree(pData, so);
    412401    }
    413 #endif /* VBOX_WITH_SLIRP_ICMP */
    414402}
    415403
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