VirtualBox

Ignore:
Timestamp:
Dec 12, 2008 1:47:38 PM (16 years ago)
Author:
vboxsync
Message:

slirp:icmp:

  1. trying to socket list for traceroute searching shorter
  2. sockets should be closed, which received ICMP packets (disabled need to be fixed)
Location:
trunk/src/VBox/Devices/Network/slirp
Files:
3 edited

Legend:

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

    r15355 r15365  
    146146    struct udphdr *udp;
    147147    struct tcphdr *tcp;
    148     struct socket *head_socket, *so;
     148    struct socket *head_socket;
     149    struct socket *last_socket;
     150    struct socket *so;
    149151    struct in_addr laddr, faddr;
    150152    u_int lport, fport;
     
    191193            laddr.s_addr = ip->ip_src.s_addr;
    192194            lport = udp->uh_sport;
     195            last_socket = udp_last_so;
    193196            /* fall through */
    194197
     
    202205                laddr.s_addr = ip->ip_src.s_addr;
    203206                lport = tcp->th_sport;
     207                last_socket = tcp_last_so;
    204208            }
    205             for (so = head_socket->so_next; so != head_socket; so = so->so_next)
     209            /* check last socket first */
     210            if (   last_socket->so_faddr.s_addr == faddr.s_addr
     211                && last_socket->so_fport == fport
     212                && last_socket->so_hlport == lport)
     213            {
     214                found = 1;
     215                goto sofound;
     216            }
     217            for (so = head_socket->so_prev; so != head_socket; so = so->so_prev)
    206218            {
    207219                /* Should be reaplaced by hash here */
     
    209221                if (   so->so_faddr.s_addr == faddr.s_addr
    210222                    && so->so_fport == fport
    211 #if 0
    212                     && so->so_hladdr.s_addr == laddr.s_addr
    213 #endif
    214223                    && so->so_hlport == lport)
    215224                {
    216                     icm = malloc(sizeof(struct icmp_msg));
    217                     icm->im_m = so->so_m;
    218225                    found = 1;
    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);
    224226                    break;
    225227                }
     
    229231        default:
    230232            LogRel(("%s:ICMP: unsupported protocol(%d)\n", __FUNCTION__, ip->ip_p));
     233    }
     234    sofound:
     235    if (found == 1 && icm == NULL)
     236    {
     237        icm = malloc(sizeof(struct icmp_msg));
     238        icm->im_m = so->so_m;
     239        icm->im_so = so;
     240        found = 1;
     241        LogRel(("hit:%R[natsock]\n", so));
     242        /*XXX: this storage not very long,
     243         * better add flag if it should removed from lis
     244         */
     245        LIST_INSERT_HEAD(&pData->icmp_msg_head, icm, im_list);
     246        return (icm);
    231247    }
    232248    if (found == 1)
  • trunk/src/VBox/Devices/Network/slirp/ip_icmp.h

    r15293 r15365  
    177177    LIST_ENTRY(icmp_msg) im_list;
    178178    struct mbuf *im_m;
     179    struct socket *im_so;
    179180};
    180181
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r15355 r15365  
    794794    struct mbuf *m;
    795795    struct icmp_msg *icm;
     796    uint8_t proto;
    796797
    797798    ip = (struct ip *)buff;
     
    821822
    822823    ip = mtod(m, struct ip *);
     824    proto = ip->ip_p;
    823825    /* Now ip is pointing on header we've sent from guest */
    824826    if (icp->icmp_type == ICMP_TIMXCEED)
     
    853855    LIST_REMOVE(icm, im_list);
    854856    /* Don't call m_free here*/
     857#if 0
     858    if (icp->icmp_type == ICMP_TIMXCEED)
     859    {
     860        switch (proto)
     861        {
     862            case  IPPROTO_UDP:
     863                /*XXX: so->so_m already freed so we shouldn't call sofree */
     864                if (so == udp_last_so)
     865                    udp_last_so = &udb;
     866                closesocket(icm->im_so->s);
     867                icm->im_so->s = 1;
     868                icm->im_so->so_state = SS_NOFDREF;
     869                if(so->so_next && so->so_prev) {
     870                    remque(pData, so);
     871                    free(icm->im_so);
     872                }
     873            break;
     874            case  IPPROTO_TCP:
     875                /*close tcp should be here */
     876            break;
     877            default:
     878            /* do nothing */
     879            break;
     880        }
     881    }
     882#endif
    855883    free(icm);
    856884}
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