UDP Networking: Misc fixes to get the last changes working + cleanup

This commit is contained in:
Gregory Nutt 2015-05-29 14:32:56 -06:00
parent fa8b7c19b7
commit 0bdf2d5360
6 changed files with 29 additions and 68 deletions

View File

@ -42,6 +42,7 @@
#include <time.h>
#include <semaphore.h>
#include <errno.h>
#include <assert.h>
#include <debug.h>
#include <netinet/in.h>
@ -67,7 +68,7 @@
/* List of tasks waiting for ARP events */
static struct arp_notify_s *g_arp_waiters;
static FAR struct arp_notify_s *g_arp_waiters;
/****************************************************************************
* Private Functions
@ -176,6 +177,7 @@ int arp_wait(FAR struct arp_notify_s *notify, FAR struct timespec *timeout)
{
struct timespec abstime;
irqstate_t flags;
int errcode;
int ret;
/* And wait for the ARP response (or a timeout). Interrupts will be re-
@ -193,11 +195,21 @@ int arp_wait(FAR struct arp_notify_s *notify, FAR struct timespec *timeout)
abstime.tv_nsec -= 1000000000;
}
/* REVISIT: If net_timedwait() is awakened with signal, we will return
* the wrong error code.
*/
/* Wait to get either the correct response or a timeout. */
do
{
/* The only errors that we expect would be if the abstime timeout
* expires or if the wait were interrupted by a signal.
*/
ret = net_timedwait(&notify->nt_sem, &abstime);
errcode = ((ret < 0) ? errno : 0);
}
while (ret < 0 && errcode == EINTR);
/* Then get the real result of the transfer */
(void)net_timedwait(&notify->nt_sem, &abstime);
ret = notify->nt_result;
/* Remove our wait structure from the list (we may no longer be at the

View File

@ -293,7 +293,7 @@ int arp_send(in_addr_t ipaddr)
state.snd_cb = arp_callback_alloc(dev);
if (!state.snd_cb)
{
ndbg("ERROR: Failed to allocate a cllback\n");
ndbg("ERROR: Failed to allocate a callback\n");
ret = -ENOMEM;
goto errout_with_lock;
}
@ -373,6 +373,7 @@ int arp_send(in_addr_t ipaddr)
{
/* Break out on a send failure */
ndbg("ERROR: Send failed: %d\n", ret);
break;
}
@ -390,7 +391,7 @@ int arp_send(in_addr_t ipaddr)
* is received. Otherwise, it will return -ETIMEDOUT.
*/
if (ret == OK)
if (ret >= OK)
{
/* Break out if arp_wait() fails */
@ -400,6 +401,7 @@ int arp_send(in_addr_t ipaddr)
/* Increment the retry count */
state.snd_retries++;
ndbg("ERROR: arp_wait failed: %d\n", ret);
}
sem_destroy(&state.snd_sem);

View File

@ -134,8 +134,8 @@ FAR struct devif_callback_s *
return NULL;
}
ret->nxtdev = dev->d_devcb;
dev->d_devcb = ret;
ret->nxtdev = dev->d_devcb;
dev->d_devcb = ret;
}
/* Add the newly allocated instance to the head of the specified list */

View File

@ -226,7 +226,7 @@ ssize_t psock_sendto(FAR struct socket *psock, FAR const void *buf,
if (nsent < 0)
{
ndbg("ERROR: Unix domain sendto() failed: %ld\n", (long)nsent);
ndbg("ERROR: UDP or Unix domain sendto() failed: %ld\n", (long)nsent);
err = -nsent;
goto errout;
}

View File

@ -303,61 +303,6 @@ static uint16_t sendto_interrupt(FAR struct net_driver_s *dev, FAR void *conn,
return flags;
}
/****************************************************************************
* Function: sendto_txnotify
*
* Description:
* Notify the appropriate device driver that we are have data ready to
* be send (UDP)
*
* Parameters:
* psock - Socket state structure
* conn - The UDP connection structure
*
* Returned Value:
* None
*
****************************************************************************/
static inline void sendto_txnotify(FAR struct socket *psock,
FAR struct udp_conn_s *conn)
{
#ifdef CONFIG_NET_IPv4
#ifdef CONFIG_NET_IPv6
/* If both IPv4 and IPv6 support are enabled, then we will need to select
* the device driver using the appropriate IP domain.
*/
if (psock->s_domain == PF_INET)
#endif
{
/* Notify the device driver that send data is available */
#ifdef CONFIG_NETDEV_MULTINIC
netdev_ipv4_txnotify(conn->u.ipv4.laddr, conn->u.ipv4.raddr);
#else
netdev_ipv4_txnotify(conn->u.ipv4.raddr);
#endif
}
#endif /* CONFIG_NET_IPv4 */
#ifdef CONFIG_NET_IPv6
#ifdef CONFIG_NET_IPv4
else /* if (psock->s_domain == PF_INET6) */
#endif /* CONFIG_NET_IPv4 */
{
/* Notify the device driver that send data is available */
DEBUGASSERT(psock->s_domain == PF_INET6);
#ifdef CONFIG_NETDEV_MULTINIC
netdev_ipv6_txnotify(conn->u.ipv6.laddr, conn->u.ipv6.raddr);
#else
netdev_ipv6_txnotify(conn->u.ipv6.raddr);
#endif
}
#endif /* CONFIG_NET_IPv6 */
}
/****************************************************************************
* Public Functions
****************************************************************************/
@ -430,7 +375,7 @@ ssize_t psock_udp_sendto(FAR struct socket *psock, FAR const void *buf,
if (ret < 0)
{
ndbg("ERROR: Not reachable\n");
ndbg("ERROR: Peer not reachable\n");
return -ENETUNREACH;
}
#endif /* CONFIG_NET_ARP_SEND || CONFIG_NET_ICMPv6_NEIGHBOR */
@ -474,6 +419,7 @@ ssize_t psock_udp_sendto(FAR struct socket *psock, FAR const void *buf,
ret = udp_connect(conn, to);
if (ret < 0)
{
ndbg("ERROR: udp_connect failed: %d\n", ret);
goto errout_with_lock;
}
@ -484,6 +430,7 @@ ssize_t psock_udp_sendto(FAR struct socket *psock, FAR const void *buf,
dev = udp_find_raddr_device(conn);
if (dev == NULL)
{
ndbg("ERROR: udp_find_raddr_device failed\n");
ret = -ENETUNREACH;
goto errout_with_lock;
}
@ -499,7 +446,7 @@ ssize_t psock_udp_sendto(FAR struct socket *psock, FAR const void *buf,
/* Notify the device driver of the availability of TX data */
sendto_txnotify(psock, conn);
netdev_txnotify_dev(dev);
/* Wait for either the receive to complete or for an error/timeout to occur.
* NOTES: (1) net_lockedwait will also terminate if a signal is received, (2)

View File

@ -218,7 +218,7 @@ int net_timedwait(sem_t *sem, FAR const struct timespec *abstime)
}
else
{
/* Wait as long as necessary to get the lot */
/* Wait as long as necessary to get the lock */
ret = sem_wait(sem);
}