diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-06-24 08:33:58 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-06-24 08:33:58 -0600 |
commit | d9807f44c4ecd17742a8490a5e78b4f1b92df359 (patch) | |
tree | 2410a3619240ce7c26377c195120638dba78cc66 /nuttx/net/pkt/pkt_send.c | |
parent | e28c4fdc5ad68028d0c8fc6373e2bcce600ddc59 (diff) | |
download | nuttx-d9807f44c4ecd17742a8490a5e78b4f1b92df359.tar.gz nuttx-d9807f44c4ecd17742a8490a5e78b4f1b92df359.tar.bz2 nuttx-d9807f44c4ecd17742a8490a5e78b4f1b92df359.zip |
Net PKT: Suppress ARP requests for packet socket transfers
Diffstat (limited to 'nuttx/net/pkt/pkt_send.c')
-rw-r--r-- | nuttx/net/pkt/pkt_send.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/nuttx/net/pkt/pkt_send.c b/nuttx/net/pkt/pkt_send.c index 5cfd3d7de..0481e489e 100644 --- a/nuttx/net/pkt/pkt_send.c +++ b/nuttx/net/pkt/pkt_send.c @@ -243,6 +243,8 @@ ssize_t pkt_send(FAR struct socket *psock, FAR const void *buf, size_t len) state.snd_cb = uip_pktcallbackalloc(conn); if (state.snd_cb) { + FAR struct uip_driver_s *dev; + /* Set up the callback in the connection */ state.snd_cb->flags = UIP_POLL; @@ -250,8 +252,20 @@ ssize_t pkt_send(FAR struct socket *psock, FAR const void *buf, size_t len) state.snd_cb->event = pktsend_interrupt; /* Notify the device driver of the availability of TX data */ + /* TODO better lookup network interface from *psock or *conn */ + + dev = netdev_findbyname("eth0"); + + /* Make sure no ARP frame is sent instead of the frame just written */ + + dev->d_flags |= IFF_NOARP; + + /* Notify the device driver that new TX data is available. + * NOTES: This is in essence what netdev_txnotify() does, which + * is not possible to call since it expects a uip_ipaddr_t as + * its single argument to lookup the network interface. + */ - struct uip_driver_s *dev = netdev_findbyname("eth0"); dev->d_txavail(dev); /* Wait for the send to complete or an error to occure: NOTES: (1) @@ -265,6 +279,10 @@ ssize_t pkt_send(FAR struct socket *psock, FAR const void *buf, size_t len) /* Make sure that no further interrupts are processed */ uip_pktcallbackfree(conn, state.snd_cb); + + /* Clear the no-ARP bit in the device flags */ + + dev->d_flags &= ~IFF_NOARP; } } |