From 9de1aa22302e1eae4e094794266ab83b5afb79f1 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Mon, 23 Jun 2014 19:25:16 -0600 Subject: CONFIG_NET_PKT is compatible with current TCP writebuffering logic because the share too much code; move sending of packet socket data from net_send_unbufferer.c to a new uip/uip_pktsend.c file for consistency --- nuttx/include/nuttx/net/uip/uip.h | 26 +++++---- nuttx/net/net_send_unbuffered.c | 23 +------- nuttx/net/tcp/Kconfig | 1 + nuttx/net/uip/Make.defs | 6 ++ nuttx/net/uip/uip_iobsend.c | 2 + nuttx/net/uip/uip_pktsend.c | 115 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 141 insertions(+), 32 deletions(-) create mode 100644 nuttx/net/uip/uip_pktsend.c diff --git a/nuttx/include/nuttx/net/uip/uip.h b/nuttx/include/nuttx/net/uip/uip.h index a0cf88f5c..65f05a5ec 100644 --- a/nuttx/include/nuttx/net/uip/uip.h +++ b/nuttx/include/nuttx/net/uip/uip.h @@ -311,11 +311,11 @@ extern struct uip_stats uip_stat; * TCP/IP stack. */ -extern void uip_initialize(void); +void uip_initialize(void); /* This function may be used at boot time to set the initial ip_id.*/ -extern void uip_setipid(uint16_t id); +void uip_setipid(uint16_t id); /* Critical section management. The NuttX configuration setting * CONFIG_NET_NOINT indicates that uIP not called from the interrupt level. @@ -338,10 +338,10 @@ extern void uip_setipid(uint16_t id); typedef uint8_t uip_lock_t; /* Not really used */ -extern void uip_lockinit(void); -extern uip_lock_t uip_lock(void); -extern void uip_unlock(uip_lock_t flags); -extern int uip_lockedwait(sem_t *sem); +void uip_lockinit(void); +uip_lock_t uip_lock(void); +void uip_unlock(uip_lock_t flags); +int uip_lockedwait(sem_t *sem); #else @@ -391,13 +391,17 @@ extern int uip_lockedwait(sem_t *sem); * len The maximum amount of data bytes to be sent. */ -extern void uip_send(FAR struct uip_driver_s *dev, FAR const void *buf, - int len); +void uip_send(FAR struct uip_driver_s *dev, FAR const void *buf, int len); #ifdef CONFIG_NET_IOB struct iob_s; -extern void uip_iobsend(FAR struct uip_driver_s *dev, FAR struct iob_s *buf, - unsigned int len, unsigned int offset); +void uip_iobsend(FAR struct uip_driver_s *dev, FAR struct iob_s *buf, + unsigned int len, unsigned int offset); +#endif + +#ifdef CONFIG_NET_PKT +void uip_pktsend(FAR struct uip_driver_s *dev, FAR const void *buf, + unsigned int len); #endif /* uIP convenience and converting functions. @@ -547,7 +551,7 @@ extern void uip_iobsend(FAR struct uip_driver_s *dev, FAR struct iob_s *buf, (((in_addr_t)(addr1) & (in_addr_t)(mask)) == \ ((in_addr_t)(addr2) & (in_addr_t)(mask))) #else -extern bool uip_ipaddr_maskcmp(uip_ipaddr_t addr1, uip_ipaddr_t addr2, +bool uip_ipaddr_maskcmp(uip_ipaddr_t addr1, uip_ipaddr_t addr2, uip_ipaddr_t mask); #endif diff --git a/nuttx/net/net_send_unbuffered.c b/nuttx/net/net_send_unbuffered.c index 5c3b4f626..f6f7a597e 100644 --- a/nuttx/net/net_send_unbuffered.c +++ b/nuttx/net/net_send_unbuffered.c @@ -181,29 +181,10 @@ static uint16_t pktsend_interrupt(FAR struct uip_driver_s *dev, else { - /* Copy the user data into d_snddata and send it */ + /* Copy the packet data into the device packet buffer and send it */ -#if 0 - uip_send(dev, pstate->snd_buffer, pstate->snd_buflen); + uip_pktsend(dev, pstate->snd_buffer, pstate->snd_buflen); pstate->snd_sent = pstate->snd_buflen; -#else - /* NOTE: This is almost identical to calling uip_send() while - * the data from the sent operation buffer is copied into dev->d_buf - * instead of dev->d_snddata - */ - - if (pstate->snd_buflen > 0 && pstate->snd_buflen < CONFIG_NET_BUFSIZE) - { - memcpy(dev->d_buf, pstate->snd_buffer, pstate->snd_buflen); - - /* Set the number of bytes to send */ - - dev->d_len = pstate->snd_buflen; - dev->d_sndlen = pstate->snd_buflen; - } - - pstate->snd_sent = pstate->snd_buflen; -#endif } /* Don't allow any further call backs. */ diff --git a/nuttx/net/tcp/Kconfig b/nuttx/net/tcp/Kconfig index 5989d3d90..d6237c35f 100644 --- a/nuttx/net/tcp/Kconfig +++ b/nuttx/net/tcp/Kconfig @@ -83,6 +83,7 @@ config NET_TCP_WRITE_BUFFERS bool "Enable TCP/IP write buffering" default n select NET_IOB + depends on !NET_PKT ---help--- Write buffers allows buffering of ongoing TCP/IP packets, providing for higher performance, streamed output. diff --git a/nuttx/net/uip/Make.defs b/nuttx/net/uip/Make.defs index 6b780152d..0137ae32b 100644 --- a/nuttx/net/uip/Make.defs +++ b/nuttx/net/uip/Make.defs @@ -46,6 +46,12 @@ ifeq ($(CONFIG_NET_IOB),y) NET_CSRCS += uip_iobsend.c endif +# Raw packet socket support + +ifeq ($(CONFIG_NET_PKT),y) +NET_CSRCS += uip_pktsend.c +endif + # Non-interrupt level support required? ifeq ($(CONFIG_NET_NOINTS),y) diff --git a/nuttx/net/uip/uip_iobsend.c b/nuttx/net/uip/uip_iobsend.c index c3bec5f99..fc1d716f3 100644 --- a/nuttx/net/uip/uip_iobsend.c +++ b/nuttx/net/uip/uip_iobsend.c @@ -37,6 +37,8 @@ * Included Files ****************************************************************************/ +#include + #include #include #include diff --git a/nuttx/net/uip/uip_pktsend.c b/nuttx/net/uip/uip_pktsend.c new file mode 100644 index 000000000..c9aa2bfc9 --- /dev/null +++ b/nuttx/net/uip/uip_pktsend.c @@ -0,0 +1,115 @@ +/**************************************************************************** + * net/uip/uip_pktsend.c + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include + +#ifdef CONFIG_NET_PKT + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Type Declarations + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Global Constant Data + ****************************************************************************/ + +/**************************************************************************** + * Global Variables + ****************************************************************************/ + +/**************************************************************************** + * Private Constant Data + ****************************************************************************/ + +/**************************************************************************** + * Private Variables + ****************************************************************************/ + +/**************************************************************************** + * Global Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: uip_pktsend + * + * Description: + * Called from socket logic in order to send a raw packet in response to + * an xmit or poll request from the the network interface driver. + * + * This is almost identical to calling uip_send() except that the data to + * be sent is copied into dev->d_buf (vs. dev->d_snddata), since there is + * no header on the data. + * + * Assumptions: + * Called from the interrupt level or, at a minimum, with interrupts + * disabled. + * + ****************************************************************************/ + +void uip_pktsend(FAR struct uip_driver_s *dev, FAR const void *buf, + unsigned int len) +{ + DEBUGASSERT(dev && len > 0 && len < CONFIG_NET_BUFSIZE); + + /* Copy the data into the device packet buffer */ + + memcpy(dev->d_buf, buf, len); + + /* Set the number of bytes to send */ + + dev->d_len = len; + dev->d_sndlen = len; +} + +#endif /* CONFIG_NET_PKT */ -- cgit v1.2.3