This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

slow connect in ftp_test


Hi all,

I recently tried running the ftp_test network test on my A&M Viper
board.  I set up the viper to login to a FTP server which I ran on the
host PC.  I am debugging with Insight over the serial port.

During the test, the ethernet interface is initialized ok, but when
connect() is called, it takes about 60 seconds for the function to
return.  The strange thing is, there is absolutely no traffic on the
network until close to the end of the 60 seconds when the viper
successfully connects to the host.  After a successful connection, the
login process (username and password) also take a long time (about 20
seconds).

I used Insight to trace into the connect() call and saw the 60 second
delay happened in the bsd_connect() function of sockio.c:

static int bsd_connect   ( cyg_file *fp, const sockaddr *sa, socklen_t
len )
{
    register struct socket *so;
    struct mbuf *nam;
    int error, s;

    so = (struct socket *)fp->f_data;

    if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING))
        return (EALREADY);

    error = sockargs(&nam, (caddr_t)sa, len, MT_SONAME);

    if (error)
        return (error);

    error = soconnect(so, nam);
    if (error)
        goto bad;

    if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
        m_freem(nam);
        return (EINPROGRESS);
    }

    s = splsoftnet();
    while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
        error = tsleep((caddr_t)&so->so_timeo, PSOCK | PCATCH,
                       netcon, 0);
        if (error)
            break;
    }

    if (error == 0) {
        error = so->so_error;
        so->so_error = 0;
    }

    splx(s);

bad:
    so->so_state &= ~SS_ISCONNECTING;
    m_freem(nam);

    return error;
}

The 60 second delay happens during the tsleep() call in the while loop
after the soconnect() call.  The tsleep is waiting for a semaphore to be
posted, but it is not posted until 60 seconds after the soconnect()
call.

When the semaphore is finally posted it is posted from the tcp_input()
function in tcp_input.c.  The call stack is:

Cyg_HardwareThread::thread_entry(Cyg_thread *)
cyg_netint
ipintr
ipv4_input
tcp_input
soisconnected
cyg_wakeup
cyg_semaphore_post

Why does it take 60 seconds for this semaphore to be posted?

Paul Randall
Delta Information Systems


-- 
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]