VirtualBox

Ignore:
Timestamp:
Dec 8, 2008 5:33:32 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
40474
Message:

slirp: icmp should be compilable on Windows now

File:
1 edited

Legend:

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

    r15086 r15087  
    1818
    1919#ifdef VBOX_WITH_SLIRP_ICMP
    20 static void send_icmp_to_guest(PNATState, char *, struct socket *);
     20static void send_icmp_to_guest(PNATState, char *, size_t, struct socket *, const struct sockaddr_in *);
    2121static void sorecvfrom_icmp_win(PNATState, struct socket *);
    2222#endif
     
    433433
    434434    if (so->so_type == IPPROTO_ICMP) {   /* This is a "ping" reply */
     435#if !defined(VBOX_WITH_SLIRP_ICMP) || (defined(VBOX_WITH_SLIRP_ICMP) && !defined(RT_OS_WINDOWS))
    435436          sorecvfrom_icmp_unix(pData, so);
     437#endif
     438#if defined(VBOX_WITH_SLIRP_ICMP) && !defined(RT_OS_WINDOWS)
     439          sorecvfrom_icmp_win(pData, so);
     440#endif
    436441          udp_detach(pData, so);
    437442    } else {                                /* A "normal" UDP packet */
     
    766771#ifdef VBOX_WITH_SLIRP_ICMP
    767772static void
    768 send_icmp_to_guest(PNATState pData, char *buff, struct socket *so)
     773send_icmp_to_guest(PNATState pData, char *buff, size_t len, struct socket *so, const struct sockaddr_in *addr)
    769774{
    770775        struct ip *ip;
     
    795800        Assert(m != NULL);
    796801       
    797         src = addr.sin_addr.s_addr;
     802        src = addr->sin_addr.s_addr;
    798803       
    799804        ip = mtod(m, struct ip *);
     
    830835        free(icm);
    831836}
    832 #endif
    833 static void sorecvfrom_icmp_win(PNATState pData, struct socket *so){
    834 #if 0
     837
     838static void
     839sorecvfrom_icmp_win(PNATState pData, struct socket *so)
     840{
     841        int len;
    835842        int i;
     843        ICMP_ECHO_REPLY *icr;
     844        u_char code = ~0;
    836845        len = IcmpParseReplies(pData->pvIcmpBuffer, pData->szIcmpBuffer);
    837 #endif
    838 }
     846        if (len <= 0) {
     847              LogRel(("Error (%d) occured on ICMP receiving \n", GetLastError())); 
     848              return;
     849        }
     850        icr = (ICMP_ECHO_REPLY *)pData->pvIcmpBuffer;
     851        for (i = 0; i < len; ++i) {
     852                switch(icr[i].Status) {
     853                        case IP_DEST_HOST_UNREACHABLE:
     854                                code=ICMP_UNREACH_HOST;
     855                        case IP_DEST_NET_UNREACHABLE:
     856                                code=ICMP_UNREACH_NET;
     857                }
     858        }
     859}
     860#endif
     861
    839862static void sorecvfrom_icmp_unix(PNATState pData, struct socket *so)
    840863{
     
    864887    {
    865888#ifdef VBOX_WITH_SLIRP_ICMP
    866         send_icmp_to_guest(pData, buff, so);
     889        send_icmp_to_guest(pData, buff, len, so, &addr);
    867890#else
    868891        icmp_reflect(pData, so->so_m);
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