VirtualBox

Ignore:
Timestamp:
Dec 12, 2008 8:55:52 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
40789
Message:

slirp:icmp: enabling UDP traceroute on Unix

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

Legend:

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

    r15312 r15355  
    8181    pData->icmp_socket.s = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP);
    8282# else /* !RT_OS_DARWIN */
    83     pData->icmp_socket.s = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP);
     83    pData->icmp_socket.s = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);
    8484# endif /* RT_OS_DARWIN */
    8585    if (pData->icmp_socket.s == -1)
     
    157157
    158158
     159    LogRel(("%s: processing (proto:%d)\n", __FUNCTION__, ip->ip_p));
    159160    switch (ip->ip_p)
    160161    {
     
    175176                    break;
    176177                }
     178                LogRel(("Have found nothing\n"));
    177179            }
    178180            break;
     
    184186        case IPPROTO_UDP:
    185187            head_socket = &udb;
    186             udp = (struct udphdr *)((char *)ip + (ip->ip_hl >> 2));
     188            udp = (struct udphdr *)((char *)ip + (ip->ip_hl << 2));
    187189            faddr.s_addr = ip->ip_dst.s_addr;
    188190            fport = udp->uh_dport;
     
    194196            if (head_socket == NULL)
    195197            {
    196                 tcp = (struct tcphdr *)((char *)ip + (ip->ip_hl >> 2));
     198                tcp = (struct tcphdr *)((char *)ip + (ip->ip_hl << 2));
    197199                head_socket = &tcb; /* head_socket could be initialized with udb*/
    198200                faddr.s_addr = ip->ip_dst.s_addr;
     
    201203                lport = tcp->th_sport;
    202204            }
    203             for (so = head_socket; so != head_socket; so = so->so_next)
     205            for (so = head_socket->so_next; so != head_socket; so = so->so_next)
    204206            {
    205207                /* Should be reaplaced by hash here */
     208                LogRel(("trying:%R[natsock] against %R[IP4]:%d lport=%d hlport=%d\n", so, &faddr, fport, lport, so->so_hlport));
    206209                if (   so->so_faddr.s_addr == faddr.s_addr
    207210                    && so->so_fport == fport
     211#if 0
    208212                    && so->so_hladdr.s_addr == laddr.s_addr
     213#endif
    209214                    && so->so_hlport == lport)
    210215                {
     
    212217                    icm->im_m = so->so_m;
    213218                    found = 1;
    214                     break;
     219                    LogRel(("hit:%R[natsock]\n", so));
     220                    /*XXX: this storage not very long,
     221                     * better add flag if it should removed from lis
     222                     */
     223                    LIST_INSERT_HEAD(&pData->icmp_msg_head, icm, im_list);
     224                    break;
    215225                }
    216226            }
     
    381391                /* Send the packet */
    382392# ifndef RT_OS_WINDOWS
     393                LogRel(("NAT/ICMP: try to set TTL(%d)\n", ip->ip_ttl));
    383394                status = setsockopt(pData->icmp_socket.s, IPPROTO_IP, IP_TTL, (void *)&ip->ip_ttl, sizeof(ip->ip_ttl));
    384395                if (status < 0)
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r15287 r15355  
    560560        }
    561561#endif /* VBOX_WITH_BSD_REASS */
     562        ICMP_ENGAGE_EVENT(&pData->icmp_socket, readfds);
    562563
    563564        STAM_REL_COUNTER_RESET(&pData->StatTCP);
     
    666667        }
    667668
    668         ICMP_ENGAGE_EVENT(&pData->icmp_socket, readfds);
    669669    }
    670670
     
    737737    if (link_up)
    738738    {
     739#if defined(VBOX_WITH_SLIRP_ICMP)
     740# if defined(RT_OS_WINDOWS)
     741        if (fIcmp)
     742            sorecvfrom(pData, &pData->icmp_socket);
     743# else
     744        if (pData->icmp_socket.s != -1 && FD_ISSET(pData->icmp_socket.s, readfds))
     745            sorecvfrom(pData, &pData->icmp_socket);
     746# endif
     747#endif
    739748        /*
    740749         * Check TCP sockets
     
    930939        }
    931940
     941#if 0
    932942#if defined(VBOX_WITH_SLIRP_ICMP)
    933943# if defined(RT_OS_WINDOWS)
     
    938948            sorecvfrom(pData, &pData->icmp_socket);
    939949# endif
     950#endif
    940951#endif
    941952    }
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r15293 r15355  
    591591                 (struct sockaddr *)&addr, sizeof (struct sockaddr));
    592592    if (ret < 0)
     593    {
     594        LogRel(("UDP: sendto fails (%s)\n", strerror(errno)));
    593595        return -1;
     596    }
    594597
    595598    /*
     
    795798    icp = (struct icmp *)((char *)ip + (ip->ip_hl << 2));
    796799
     800    LogRel(("ICMP:received msg(t:%d, c:%d)\n", icp->icmp_type, icp->icmp_code));
    797801    if (icp->icmp_type != ICMP_ECHOREPLY && icp->icmp_type != ICMP_TIMXCEED)
    798802    {
    799         LogRel(("received ICMP(t:%d, c:%d)\n", icp->icmp_type, icp->icmp_code));
    800803        return;
    801804    }
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r15293 r15355  
    7272    struct ip save_ip;
    7373    struct socket *so;
     74#ifdef VBOX_WITH_SLIRP_ICMP
     75        int ret;
     76#endif
    7477
    7578    DEBUG_CALL("udp_input");
     
    139142        if (uh->uh_sum)
    140143        {
    141          
     144
    142145#endif
    143146            if(cksum(m, len + sizeof(struct ip)))
     
    241244        udp_emu(pData, so, m);
    242245
     246#ifdef VBOX_WITH_SLIRP_ICMP
     247    ip->ip_ttl = save_ip.ip_ttl;
     248    ret = setsockopt(so->s, IPPROTO_IP, IP_TTL, (void *)&ip->ip_ttl, sizeof(ip->ip_ttl));
     249    if (ret < 0) {
     250        LogRel(("NAT: Error (%s) occurred while setting TTL(%d) attribute of IP packet to socket %R[natsock]\n", strerror(errno), ip->ip_ttl, so));
     251    }
     252#endif
    243253    if(sosendto(pData, so,m) == -1)
    244254    {
     
    353363{
    354364    struct sockaddr_in addr;
     365#ifdef VBOX_WITH_SLIRP_ICMP
     366    struct sockaddr sa_addr;
     367    socklen_t socklen = sizeof(struct sockaddr);
     368    int status;
     369#endif
    355370
    356371    if ((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1)
     
    384399            insque(pData, so,&udb);
    385400#ifdef VBOX_WITH_SLIRP_ICMP
    386             so->so_hlport = addr.sin_port;
    387             so->so_hladdr.s_addr = addr.sin_addr.s_addr;
     401            status = getsockname(so->s, &sa_addr, &socklen);
     402            Assert(status == 0 && sa_addr.sa_family == AF_INET);
     403            so->so_hlport = ((struct sockaddr_in *)&sa_addr)->sin_port;
     404            so->so_hladdr.s_addr = ((struct sockaddr_in *)&sa_addr)->sin_addr.s_addr;
    388405#endif
    389406        }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette