summaryrefslogtreecommitdiff
path: root/nuttx/net
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-11-20 21:50:55 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-11-20 21:50:55 +0000
commitdca18be1b79f5eead895b554a941dae04c89fa2b (patch)
tree3490d851b5637e54b97ff5872d8f7015ccb02907 /nuttx/net
parent8cd8607510ca423089ca1b0266c22aeee685dcee (diff)
downloadpx4-nuttx-dca18be1b79f5eead895b554a941dae04c89fa2b.tar.gz
px4-nuttx-dca18be1b79f5eead895b554a941dae04c89fa2b.tar.bz2
px4-nuttx-dca18be1b79f5eead895b554a941dae04c89fa2b.zip
Completed integration of TCP connection backlog and poll()/select() for connections
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1295 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/net')
-rw-r--r--nuttx/net/accept.c42
-rw-r--r--nuttx/net/uip/uip-callback.c2
-rw-r--r--nuttx/net/uip/uip-listen.c2
-rw-r--r--nuttx/net/uip/uip-tcpbacklog.c20
-rw-r--r--nuttx/net/uip/uip-tcpcallback.c2
5 files changed, 47 insertions, 21 deletions
diff --git a/nuttx/net/accept.c b/nuttx/net/accept.c
index 3fea60b19..f4c54e5f3 100644
--- a/nuttx/net/accept.c
+++ b/nuttx/net/accept.c
@@ -99,14 +99,14 @@ struct accept_s
****************************************************************************/
#ifdef CONFIG_NET_TCP
-static inline void accept_tcpsender(struct uip_conn *conn, struct accept_s *pstate)
-{
- #ifdef CONFIG_NET_IPv6
- FAR struct sockaddr_in6 *addr = pstate->acpt_addr;
+#ifdef CONFIG_NET_IPv6
+static inline void accept_tcpsender(FAR struct uip_conn *conn,
+ FAR struct sockaddr_in6 *addr)
#else
- FAR struct sockaddr_in *addr = pstate->acpt_addr;
+static inline void accept_tcpsender(FAR struct uip_conn *conn,
+ FAR struct sockaddr_in *addr)
#endif
-
+{
if (addr)
{
addr->sin_family = AF_INET;
@@ -143,7 +143,7 @@ static int accept_interrupt(struct uip_conn *listener, struct uip_conn *conn)
{
/* Get the connection address */
- accept_tcpsender(conn, pstate);
+ accept_tcpsender(conn, pstate->acpt_addr);
/* Save the connection structure */
@@ -293,15 +293,18 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
* the address
*/
+ if (addr)
+ {
#ifdef CONFIG_NET_IPv6
- if (addr->sa_family != AF_INET6 || *addrlen < sizeof(struct sockaddr_in6))
+ if (addr->sa_family != AF_INET6 || *addrlen < sizeof(struct sockaddr_in6))
#else
- if (addr->sa_family != AF_INET || *addrlen < sizeof(struct sockaddr_in))
+ if (addr->sa_family != AF_INET || *addrlen < sizeof(struct sockaddr_in))
#endif
- {
- err = EBADF;
- goto errout;
- }
+ {
+ err = EBADF;
+ goto errout;
+ }
+ }
/* Allocate a socket descriptor for the new connection now
* (so that it cannot fail later)
@@ -330,7 +333,14 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
#ifdef CONFIG_NET_TCPBACKLOG
state.acpt_newconn = uip_backlogremove(conn);
- if (!state.acpt_newconn)
+ if (state.acpt_newconn)
+ {
+ /* Yes... get the address of the connected client */
+
+ nvdbg("Pending conn=%p\n", state.acpt_newconn);
+ accept_tcpsender(state.acpt_newconn, inaddr);
+ }
+ else
#endif
{
/* Set the socket state to accepting */
@@ -380,7 +390,7 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
if (state.acpt_result != 0)
{
err = state.acpt_result;
- goto errout_with_irq;
+ goto errout_with_irq;
}
/* If sem_wait failed, then we were probably reawakened by a signal. In
@@ -409,7 +419,7 @@ errout_with_socket:
sockfd_release(newfd);
errout:
- *get_errno_ptr() = err;
+ errno = err;
return ERROR;
}
diff --git a/nuttx/net/uip/uip-callback.c b/nuttx/net/uip/uip-callback.c
index 9a2ad7816..27f3a522e 100644
--- a/nuttx/net/uip/uip-callback.c
+++ b/nuttx/net/uip/uip-callback.c
@@ -208,7 +208,7 @@ void uip_callbackfree(FAR struct uip_callback_s *cb, FAR struct uip_callback_s *
****************************************************************************/
uint16 uip_callbackexecute(FAR struct uip_driver_s *dev, void *pvconn, uint16 flags,
- FAR struct uip_callback_s *list)
+ FAR struct uip_callback_s *list)
{
FAR struct uip_callback_s *next;
irqstate_t save;
diff --git a/nuttx/net/uip/uip-listen.c b/nuttx/net/uip/uip-listen.c
index b5e17a6bf..9ab3eae72 100644
--- a/nuttx/net/uip/uip-listen.c
+++ b/nuttx/net/uip/uip-listen.c
@@ -259,7 +259,7 @@ int uip_accept(struct uip_driver_s *dev, struct uip_conn *conn, uint16 portno)
ret = uip_backlogadd(listener, conn);
if (ret == OK)
{
- (void)uip_tcpcallback(dev, conn, UIP_BACKLOG);
+ (void)uip_tcpcallback(dev, listener, UIP_BACKLOG);
}
}
#endif
diff --git a/nuttx/net/uip/uip-tcpbacklog.c b/nuttx/net/uip/uip-tcpbacklog.c
index 152d374ba..2562707ee 100644
--- a/nuttx/net/uip/uip-tcpbacklog.c
+++ b/nuttx/net/uip/uip-tcpbacklog.c
@@ -84,6 +84,8 @@ int uip_backlogcreate(FAR struct uip_conn *conn, int nblg)
int offset;
int i;
+ nvdbg("conn=%p nblg=%d\n", conn, nblg);
+
#ifdef CONFIG_DEBUG
if (!conn)
{
@@ -114,6 +116,7 @@ int uip_backlogcreate(FAR struct uip_conn *conn, int nblg)
bls = (FAR struct uip_backlog_s *)zalloc(size);
if (!bls)
{
+ ndbg("Failed to allocate backlog\n");
return -ENOMEM;
}
@@ -164,6 +167,8 @@ int uip_backlogdestroy(FAR struct uip_conn *conn)
FAR struct uip_blcontainer_s *blc;
FAR struct uip_conn *blconn;
+ nvdbg("conn=%p\n", conn);
+
#ifdef CONFIG_DEBUG
if (!conn)
{
@@ -222,6 +227,8 @@ int uip_backlogadd(FAR struct uip_conn *conn, FAR struct uip_conn *blconn)
FAR struct uip_blcontainer_s *blc;
int ret = -EINVAL;
+ nvdbg("conn=%p blconn=%p\n", conn, blconn);
+
#ifdef CONFIG_DEBUG
if (!conn)
{
@@ -237,6 +244,7 @@ int uip_backlogadd(FAR struct uip_conn *conn, FAR struct uip_conn *blconn)
blc = (FAR struct uip_blcontainer_s *)dq_remfirst(&bls->bl_free);
if (!blc)
{
+ ndbg("Failed to allocate container\n");
ret = -ENOMEM;
}
else
@@ -277,8 +285,9 @@ struct uip_conn *uip_backlogremove(FAR struct uip_conn *conn)
return NULL;
}
#endif
+
bls = conn->backlog;
- if (bls && blconn)
+ if (bls)
{
/* Remove the a container at the head of the pending connection list
* (FIFO)
@@ -296,6 +305,8 @@ struct uip_conn *uip_backlogremove(FAR struct uip_conn *conn)
dq_addlast(&blc->bc_node, &bls->bl_free);
}
}
+
+ nvdbg("conn=%p, returning %p\n", conn, blconn);
return blconn;
}
@@ -317,12 +328,15 @@ int uip_backlogdelete(FAR struct uip_conn *conn, FAR struct uip_conn *blconn)
FAR struct uip_backlog_s *bls;
FAR struct uip_blcontainer_s *blc;
+ nvdbg("conn=%p blconn=%p\n", conn, blconn);
+
#ifdef CONFIG_DEBUG
if (!conn)
{
- return NULL;
+ return -EINVAL;
}
#endif
+
bls = conn->backlog;
if (bls)
{
@@ -340,6 +354,8 @@ int uip_backlogdelete(FAR struct uip_conn *conn, FAR struct uip_conn *blconn)
return OK;
}
}
+
+ ndbg("Failed to find pending connection\n");
return -EINVAL;
}
return OK;
diff --git a/nuttx/net/uip/uip-tcpcallback.c b/nuttx/net/uip/uip-tcpcallback.c
index 71a2696d9..1ee61ad29 100644
--- a/nuttx/net/uip/uip-tcpcallback.c
+++ b/nuttx/net/uip/uip-tcpcallback.c
@@ -254,7 +254,7 @@ uint16 uip_tcpcallback(struct uip_driver_s *dev, struct uip_conn *conn, uint16 f
* (In UIP_NEWDATA is cleared bu UIP_SNDACK is not set, then
* dev->d_len should also be cleared).
*/
-
+
ret = uip_callbackexecute(dev, conn, flags, conn->list);
/* There may be no new data handler in place at them moment that the new