VirtualBox

Changeset 16562 in vbox


Ignore:
Timestamp:
Feb 9, 2009 4:02:02 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
42516
Message:

NAT:NSOK_INC/DEC added to count sockets number for allocation enough pollfd buffer
(and latter epoll_event (for Linux only)).

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

Legend:

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

    r16540 r16562  
    622622             * See if we need a tcp_fasttimo
    623623             */
    624             if (    time_fasttimo == 0 
     624            if (    time_fasttimo == 0
    625625                    && so->so_tcpcb != NULL
    626626                    && so->so_tcpcb->t_flags & TF_DELACK)
     
    801801
    802802#ifdef VBOX_WITH_SLIRP_MT
    803             if (   so->so_state & SS_NOFDREF 
    804                 && so->so_deleted == 1) 
    805             {   
     803            if (   so->so_state & SS_NOFDREF
     804                && so->so_deleted == 1)
     805            {
    806806                struct socket *son, *sop = NULL;
    807807                QSOCKET_LOCK(tcb);
    808                 if (so->so_next != NULL) 
     808                if (so->so_next != NULL)
    809809                {
    810810                    if (so->so_next != &tcb)
     
    813813                }
    814814                if (    so->so_prev != &tcb
    815                     && so->so_prev != NULL) 
     815                    && so->so_prev != NULL)
    816816                {
    817817                    SOCKET_LOCK(so->so_prev);
     
    820820                QSOCKET_UNLOCK(tcb);
    821821                remque(pData, so);
     822                NSOCK_DEC();
    822823                SOCKET_UNLOCK(so);
    823824                SOCKET_LOCK_DESTROY(so);
     
    10071008         /* { */
    10081009#ifdef VBOX_WITH_SLIRP_MT
    1009             if (   so->so_state & SS_NOFDREF 
    1010                 && so->so_deleted == 1) 
    1011             {   
     1010            if (   so->so_state & SS_NOFDREF
     1011                && so->so_deleted == 1)
     1012            {
    10121013                struct socket *son, *sop = NULL;
    10131014                QSOCKET_LOCK(udb);
    1014                 if (so->so_next != NULL) 
     1015                if (so->so_next != NULL)
    10151016                {
    10161017                    if (so->so_next != &udb)
     
    10191020                }
    10201021                if (    so->so_prev != &udb
    1021                     && so->so_prev != NULL) 
     1022                    && so->so_prev != NULL)
    10221023                {
    10231024                    SOCKET_LOCK(so->so_prev);
     
    10261027                QSOCKET_UNLOCK(udb);
    10271028                remque(pData, so);
     1029                NSOCK_DEC();
    10281030                SOCKET_UNLOCK(so);
    10291031                SOCKET_LOCK_DESTROY(so);
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r16448 r16562  
    5757{
    5858        struct in_addr de_addr;
    59         LIST_ENTRY(dns_entry) de_list; 
     59        LIST_ENTRY(dns_entry) de_list;
    6060};
    6161LIST_HEAD(dns_list_head, dns_entry);
     
    143143    struct socket icmp_socket;
    144144    struct icmp_storage icmp_msg_head;
     145# ifndef RT_OS_WINDOWS
     146    /* counter of sockets needed for allocation enough room to
     147     * process sockets with poll/epoll
     148     *
     149     * NSOCK_INC/DEC should be injected before every
     150     * operation on socket queue (tcb, udb)
     151     */
     152    int nsock;
     153#  define NSOCK_INC() do {pData->nsock++;} while (0)
     154#  define NSOCK_DEC() do {pData->nsock--;} while (0)
     155# else
     156#  define NSOCK_INC() do {} while (0)
     157#  define NSOCK_DEC() do {} while (0)
     158# endif
    145159# ifdef RT_OS_WINDOWS
    146160    void *pvIcmpBuffer;
     
    345359    loop_end_ ## label ## _mt_nounlock:                                 \
    346360    (so) = (sonext)
    347    
     361
    348362#define DO_TCP_OUTPUT(data, sotcb)                                      \
    349363do {                                                                    \
     
    527541        }                                                               \
    528542    }                                                                   \
    529 }while (0) 
    530    
     543}while (0)
     544
    531545#else
    532546#define QSOCKET_LOCK(queue) do {} while (0)
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r16511 r16562  
    9090    if(so->so_next && so->so_prev)
    9191        remque(pData, so);  /* crashes if so is not in a queue */
     92        NSOCK_DEC();
    9293    so->so_state = SS_NOFDREF; /* for debugging purposes */
    9394
     
    378379        if (sb->sb_cc == 0)
    379380        {
    380             SOCKET_UNLOCK(so);   
     381            SOCKET_UNLOCK(so);
    381382            return 0;
    382383        }
     
    428429    if (nn < 0 && (errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
    429430    {
    430         SOCKET_UNLOCK(so);   
     431        SOCKET_UNLOCK(so);
    431432        return 0;
    432433    }
     
    438439        sofcantsendmore(so);
    439440        tcp_sockclosed(pData, sototcpcb(so));
    440         SOCKET_UNLOCK(so);   
     441        SOCKET_UNLOCK(so);
    441442        return -1;
    442443    }
     
    466467        sofcantsendmore(so);
    467468
    468     SOCKET_UNLOCK(so);   
     469    SOCKET_UNLOCK(so);
    469470    return nn;
    470471}
     
    503504        QSOCKET_UNLOCK(udb);
    504505
    505         if (!(m = m_get(pData))) 
     506        if (!(m = m_get(pData)))
    506507        {
    507508            SOCKET_UNLOCK(so);
     
    698699    QSOCKET_LOCK(tcb);
    699700    insque(pData, so,&tcb);
     701    NSOCK_INC();
    700702    QSOCKET_UNLOCK(tcb);
    701703
  • trunk/src/VBox/Devices/Network/slirp/tcp_subr.c

    r16531 r16562  
    356356    }
    357357/*  soisfdisconnecting(tp->t_socket); */
    358     if (   tp 
     358    if (   tp
    359359        && tp->t_state >= TCPS_FIN_WAIT_2)
    360360        soisfdisconnected(tp->t_socket);
     
    500500    optlen = sizeof(int);
    501501    status = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, &optlen);
    502     if (status < 0) 
     502    if (status < 0)
    503503    {
    504504        LogRel(("NAT: Error(%d) while getting RCV capacity\n", errno));
     
    508508        LogRel(("NAT: old socket rcv size: %dKB\n", opt / 1024));
    509509    opt *= 4;
    510     status = setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(int)); 
    511     if (status < 0) 
     510    status = setsockopt(s, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(int));
     511    if (status < 0)
    512512    {
    513513        LogRel(("NAT: Error(%d) while setting RCV capacity to (%d)\n", errno, opt));
     
    516516    optlen = sizeof(int);
    517517    status = getsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, &optlen);
    518     if (status < 0) 
     518    if (status < 0)
    519519    {
    520520        LogRel(("NAT: Error(%d) while getting SND capacity\n", errno));
     
    524524        LogRel(("NAT: old socket snd size: %dKB\n", opt / 1024));
    525525    opt *= 4;
    526     status = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(int)); 
    527     if (status < 0) 
     526    status = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(int));
     527    if (status < 0)
    528528    {
    529529        LogRel(("NAT: Error(%d) while setting SND capacity to (%d)\n", errno, opt));
     
    580580        return -1;
    581581
    582     SOCKET_LOCK_CREATE(so); 
     582    SOCKET_LOCK_CREATE(so);
    583583    QSOCKET_LOCK(tcb);
    584584    insque(pData, so, &tcb);
     585    NSOCK_INC();
    585586    QSOCKET_UNLOCK(tcb);
    586587    return 0;
     
    808809            if (   m->m_data[m->m_len-1] == '\0'
    809810                && lport != 0
    810                 && (so = solisten(pData, 0, so->so_laddr.s_addr, 
     811                && (so = solisten(pData, 0, so->so_laddr.s_addr,
    811812                                  htons(lport), SS_FACCEPTONCE)) != NULL)
    812813                m->m_len = sprintf(m->m_data, "%d", ntohs(so->so_fport))+1;
     
    824825            if (sscanf(bptr, "DCC CHAT %256s %u %u", buff, &laddr, &lport) == 3)
    825826            {
    826                 if ((so = solisten(pData, 0, htonl(laddr), 
     827                if ((so = solisten(pData, 0, htonl(laddr),
    827828                                   htons(lport), SS_FACCEPTONCE)) == NULL)
    828829                    return 1;
  • trunk/src/VBox/Devices/Network/slirp/udp.c

    r16511 r16562  
    160160     *  handle TFTP
    161161     */
    162     if (   ntohs(uh->uh_dport) == TFTP_SERVER 
     162    if (   ntohs(uh->uh_dport) == TFTP_SERVER
    163163        && CTL_CHECK(ntohl(ip->ip_dst.s_addr), CTL_TFTP))
    164164    {
     
    391391            QSOCKET_LOCK(udb);
    392392            insque(pData, so,&udb);
     393            NSOCK_INC();
    393394            QSOCKET_UNLOCK(udb);
    394395        }
     
    706707    QSOCKET_LOCK(udb);
    707708    insque(pData, so,&udb);
     709    NSOCK_INC();
    708710    QSOCKET_UNLOCK(udb);
    709711
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