From 7f56678d844eaa6ae1d0f061caba6518eb659c3d Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Fri, 9 Oct 2015 17:06:09 -0400 Subject: [PATCH] Added liblwip.so and libintercept build files --- ext/bin/lwip/liblwip.so | Bin 195864 -> 342016 bytes ext/bin/lwip/liblwip.so.no-opt | Bin 0 -> 214600 bytes ext/lwip/doc/FILES | 6 - ext/lwip/doc/contrib.txt | 63 -- ext/lwip/doc/rawapi.txt | 511 ------------- ext/lwip/doc/savannah.txt | 135 ---- ext/lwip/doc/snmp_agent.txt | 181 ----- ext/lwip/doc/sys_arch.txt | 267 ------- ext/lwip/test/unit/core/test_mem.c | 73 -- ext/lwip/test/unit/core/test_mem.h | 8 - ext/lwip/test/unit/etharp/test_etharp.c | 262 ------- ext/lwip/test/unit/etharp/test_etharp.h | 8 - ext/lwip/test/unit/lwip_check.h | 37 - ext/lwip/test/unit/lwip_unittests.c | 45 -- ext/lwip/test/unit/lwipopts.h | 50 -- ext/lwip/test/unit/tcp/tcp_helper.c | 294 -------- ext/lwip/test/unit/tcp/tcp_helper.h | 52 -- ext/lwip/test/unit/tcp/test_tcp.c | 667 ----------------- ext/lwip/test/unit/tcp/test_tcp.h | 8 - ext/lwip/test/unit/tcp/test_tcp_oos.c | 944 ------------------------ ext/lwip/test/unit/tcp/test_tcp_oos.h | 8 - ext/lwip/test/unit/udp/test_udp.c | 68 -- ext/lwip/test/unit/udp/test_udp.h | 8 - ext/lwipopts.h | 24 +- make-linux.mk | 4 +- netcon/intercept.c | 1 - netcon/libintercept.so.1.0 | Bin 52880 -> 0 bytes netcon/make-intercept.mk | 29 + netcon/make-liblwip.mk | 106 +++ netcon/utils.c | 93 --- 30 files changed, 140 insertions(+), 3812 deletions(-) create mode 100755 ext/bin/lwip/liblwip.so.no-opt delete mode 100644 ext/lwip/doc/FILES delete mode 100644 ext/lwip/doc/contrib.txt delete mode 100644 ext/lwip/doc/rawapi.txt delete mode 100644 ext/lwip/doc/savannah.txt delete mode 100644 ext/lwip/doc/snmp_agent.txt delete mode 100644 ext/lwip/doc/sys_arch.txt delete mode 100644 ext/lwip/test/unit/core/test_mem.c delete mode 100644 ext/lwip/test/unit/core/test_mem.h delete mode 100644 ext/lwip/test/unit/etharp/test_etharp.c delete mode 100644 ext/lwip/test/unit/etharp/test_etharp.h delete mode 100644 ext/lwip/test/unit/lwip_check.h delete mode 100644 ext/lwip/test/unit/lwip_unittests.c delete mode 100644 ext/lwip/test/unit/lwipopts.h delete mode 100644 ext/lwip/test/unit/tcp/tcp_helper.c delete mode 100644 ext/lwip/test/unit/tcp/tcp_helper.h delete mode 100644 ext/lwip/test/unit/tcp/test_tcp.c delete mode 100644 ext/lwip/test/unit/tcp/test_tcp.h delete mode 100644 ext/lwip/test/unit/tcp/test_tcp_oos.c delete mode 100644 ext/lwip/test/unit/tcp/test_tcp_oos.h delete mode 100644 ext/lwip/test/unit/udp/test_udp.c delete mode 100644 ext/lwip/test/unit/udp/test_udp.h delete mode 100755 netcon/libintercept.so.1.0 create mode 100644 netcon/make-intercept.mk create mode 100644 netcon/make-liblwip.mk delete mode 100644 netcon/utils.c diff --git a/ext/bin/lwip/liblwip.so b/ext/bin/lwip/liblwip.so index 9c12995984651414840ebd418ca54b05228ca1ec..c315404a8f86e51a6fe8b94a856dd512dc5dc56b 100755 GIT binary patch literal 342016 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%0AgC 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 !_8%Cg_%HQlkskApF?z`` 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%0D4memU^x0$-3AgHM=|NDA8EI^eIv{C)=7 z;n+t)dq=<9fS-eT|3bhh{(QGxen0YW!TkPlT=~B_!RjkkzR4-&vMFl2mX>H zt@qDZ;4cTh2da1KpBZgmA@Eayzc8-;^PT#a1Ajf@j6t#G=SR!01AZCsUE|7ka>{Q5 zemUZk*W=``bL8I-{5g?h5q|l=kuTv|r+gyxzR}` zGZy%Dz%P!&FL3aM?AL@y^@Gk-Xi#Yu44t^c*y%0xL$KkJc@Y{gD3HZ)& z@}KU=zaRL;o=Bu`Z25UoT@Ryt#iR_E3|3jz#b-;Vu z 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 K<>b+t|NjFr3Av*H diff --git a/ext/bin/lwip/liblwip.so.no-opt b/ext/bin/lwip/liblwip.so.no-opt new file mode 100755 index 0000000000000000000000000000000000000000..71859331c23163cbfc24877d8962b6a75dabf169 GIT binary patch literal 214600 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 literal 0 HcmV?d00001 diff --git a/ext/lwip/doc/FILES b/ext/lwip/doc/FILES deleted file mode 100644 index 05d356f4f..000000000 --- a/ext/lwip/doc/FILES +++ /dev/null @@ -1,6 +0,0 @@ -savannah.txt - How to obtain the current development source code. -contrib.txt - How to contribute to lwIP as a developer. -rawapi.txt - The documentation for the core API of lwIP. - Also provides an overview about the other APIs and multithreading. -snmp_agent.txt - The documentation for the lwIP SNMP agent. -sys_arch.txt - The documentation for a system abstraction layer of lwIP. diff --git a/ext/lwip/doc/contrib.txt b/ext/lwip/doc/contrib.txt deleted file mode 100644 index 39596fca3..000000000 --- a/ext/lwip/doc/contrib.txt +++ /dev/null @@ -1,63 +0,0 @@ -1 Introduction - -This document describes some guidelines for people participating -in lwIP development. - -2 How to contribute to lwIP - -Here is a short list of suggestions to anybody working with lwIP and -trying to contribute bug reports, fixes, enhancements, platform ports etc. -First of all as you may already know lwIP is a volunteer project so feedback -to fixes or questions might often come late. Hopefully the bug and patch tracking -features of Savannah help us not lose users' input. - -2.1 Source code style: - -1. do not use tabs. -2. indentation is two spaces per level (i.e. per tab). -3. end debug messages with a trailing newline (\n). -4. one space between keyword and opening bracket. -5. no space between function and opening bracket. -6. one space and no newline before opening curly braces of a block. -7. closing curly brace on a single line. -8. spaces surrounding assignment and comparisons. -9. don't initialize static and/or global variables to zero, the compiler takes care of that. -10. use current source code style as further reference. - -2.2 Source code documentation style: - -1. JavaDoc compliant and Doxygen compatible. -2. Function documentation above functions in .c files, not .h files. - (This forces you to synchronize documentation and implementation.) -3. Use current documentation style as further reference. - -2.3 Bug reports and patches: - -1. Make sure you are reporting bugs or send patches against the latest - sources. (From the latest release and/or the current CVS sources.) -2. If you think you found a bug make sure it's not already filed in the - bugtracker at Savannah. -3. If you have a fix put the patch on Savannah. If it is a patch that affects - both core and arch specific stuff please separate them so that the core can - be applied separately while leaving the other patch 'open'. The prefered way - is to NOT touch archs you can't test and let maintainers take care of them. - This is a good way to see if they are used at all - the same goes for unix - netifs except tapif. -4. Do not file a bug and post a fix to it to the patch area. Either a bug report - or a patch will be enough. - If you correct an existing bug then attach the patch to the bug rather than creating a new entry in the patch area. -5. Trivial patches (compiler warning, indentation and spelling fixes or anything obvious which takes a line or two) - can go to the lwip-users list. This is still the fastest way of interaction and the list is not so crowded - as to allow for loss of fixes. Putting bugs on Savannah and subsequently closing them is too much an overhead - for reporting a compiler warning fix. -6. Patches should be specific to a single change or to related changes.Do not mix bugfixes with spelling and other - trivial fixes unless the bugfix is trivial too.Do not reorganize code and rename identifiers in the same patch you - change behaviour if not necessary.A patch is easier to read and understand if it's to the point and short than - if it's not to the point and long :) so the chances for it to be applied are greater. - -2.4 Platform porters: - -1. If you have ported lwIP to a platform (an OS, a uC/processor or a combination of these) and - you think it could benefit others[1] you might want discuss this on the mailing list. You - can also ask for CVS access to submit and maintain your port in the contrib CVS module. - \ No newline at end of file diff --git a/ext/lwip/doc/rawapi.txt b/ext/lwip/doc/rawapi.txt deleted file mode 100644 index 8c190305e..000000000 --- a/ext/lwip/doc/rawapi.txt +++ /dev/null @@ -1,511 +0,0 @@ -Raw TCP/IP interface for lwIP - -Authors: Adam Dunkels, Leon Woestenberg, Christiaan Simons - -lwIP provides three Application Program's Interfaces (APIs) for programs -to use for communication with the TCP/IP code: -* low-level "core" / "callback" or "raw" API. -* higher-level "sequential" API. -* BSD-style socket API. - -The sequential API provides a way for ordinary, sequential, programs -to use the lwIP stack. It is quite similar to the BSD socket API. The -model of execution is based on the blocking open-read-write-close -paradigm. Since the TCP/IP stack is event based by nature, the TCP/IP -code and the application program must reside in different execution -contexts (threads). - -The socket API is a compatibility API for existing applications, -currently it is built on top of the sequential API. It is meant to -provide all functions needed to run socket API applications running -on other platforms (e.g. unix / windows etc.). However, due to limitations -in the specification of this API, there might be incompatibilities -that require small modifications of existing programs. - -** Threading - -lwIP started targeting single-threaded environments. When adding multi- -threading support, instead of making the core thread-safe, another -approach was chosen: there is one main thread running the lwIP core -(also known as the "tcpip_thread"). The raw API may only be used from -this thread! Application threads using the sequential- or socket API -communicate with this main thread through message passing. - - As such, the list of functions that may be called from - other threads or an ISR is very limited! Only functions - from these API header files are thread-safe: - - api.h - - netbuf.h - - netdb.h - - netifapi.h - - sockets.h - - sys.h - - Additionaly, memory (de-)allocation functions may be - called from multiple threads (not ISR!) with NO_SYS=0 - since they are protected by SYS_LIGHTWEIGHT_PROT and/or - semaphores. - - Only since 1.3.0, if SYS_LIGHTWEIGHT_PROT is set to 1 - and LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT is set to 1, - pbuf_free() may also be called from another thread or - an ISR (since only then, mem_free - for PBUF_RAM - may - be called from an ISR: otherwise, the HEAP is only - protected by semaphores). - - -** The remainder of this document discusses the "raw" API. ** - -The raw TCP/IP interface allows the application program to integrate -better with the TCP/IP code. Program execution is event based by -having callback functions being called from within the TCP/IP -code. The TCP/IP code and the application program both run in the same -thread. The sequential API has a much higher overhead and is not very -well suited for small systems since it forces a multithreaded paradigm -on the application. - -The raw TCP/IP interface is not only faster in terms of code execution -time but is also less memory intensive. The drawback is that program -development is somewhat harder and application programs written for -the raw TCP/IP interface are more difficult to understand. Still, this -is the preferred way of writing applications that should be small in -code size and memory usage. - -Both APIs can be used simultaneously by different application -programs. In fact, the sequential API is implemented as an application -program using the raw TCP/IP interface. - ---- Callbacks - -Program execution is driven by callbacks. Each callback is an ordinary -C function that is called from within the TCP/IP code. Every callback -function is passed the current TCP or UDP connection state as an -argument. Also, in order to be able to keep program specific state, -the callback functions are called with a program specified argument -that is independent of the TCP/IP state. - -The function for setting the application connection state is: - -- void tcp_arg(struct tcp_pcb *pcb, void *arg) - - Specifies the program specific state that should be passed to all - other callback functions. The "pcb" argument is the current TCP - connection control block, and the "arg" argument is the argument - that will be passed to the callbacks. - - ---- TCP connection setup - -The functions used for setting up connections is similar to that of -the sequential API and of the BSD socket API. A new TCP connection -identifier (i.e., a protocol control block - PCB) is created with the -tcp_new() function. This PCB can then be either set to listen for new -incoming connections or be explicitly connected to another host. - -- struct tcp_pcb *tcp_new(void) - - Creates a new connection identifier (PCB). If memory is not - available for creating the new pcb, NULL is returned. - -- err_t tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port) - - Binds the pcb to a local IP address and port number. The IP address - can be specified as IP_ADDR_ANY in order to bind the connection to - all local IP addresses. - - If another connection is bound to the same port, the function will - return ERR_USE, otherwise ERR_OK is returned. - -- struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb) - - Commands a pcb to start listening for incoming connections. When an - incoming connection is accepted, the function specified with the - tcp_accept() function will be called. The pcb will have to be bound - to a local port with the tcp_bind() function. - - The tcp_listen() function returns a new connection identifier, and - the one passed as an argument to the function will be - deallocated. The reason for this behavior is that less memory is - needed for a connection that is listening, so tcp_listen() will - reclaim the memory needed for the original connection and allocate a - new smaller memory block for the listening connection. - - tcp_listen() may return NULL if no memory was available for the - listening connection. If so, the memory associated with the pcb - passed as an argument to tcp_listen() will not be deallocated. - -- struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) - - Same as tcp_listen, but limits the number of outstanding connections - in the listen queue to the value specified by the backlog argument. - To use it, your need to set TCP_LISTEN_BACKLOG=1 in your lwipopts.h. - -- void tcp_accepted(struct tcp_pcb *pcb) - - Inform lwIP that an incoming connection has been accepted. This would - usually be called from the accept callback. This allows lwIP to perform - housekeeping tasks, such as allowing further incoming connections to be - queued in the listen backlog. - ATTENTION: the PCB passed in must be the listening pcb, not the pcb passed - into the accept callback! - -- void tcp_accept(struct tcp_pcb *pcb, - err_t (* accept)(void *arg, struct tcp_pcb *newpcb, - err_t err)) - - Specified the callback function that should be called when a new - connection arrives on a listening connection. - -- err_t tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port, err_t (* connected)(void *arg, - struct tcp_pcb *tpcb, - err_t err)); - - Sets up the pcb to connect to the remote host and sends the - initial SYN segment which opens the connection. - - The tcp_connect() function returns immediately; it does not wait for - the connection to be properly setup. Instead, it will call the - function specified as the fourth argument (the "connected" argument) - when the connection is established. If the connection could not be - properly established, either because the other host refused the - connection or because the other host didn't answer, the "err" - callback function of this pcb (registered with tcp_err, see below) - will be called. - - The tcp_connect() function can return ERR_MEM if no memory is - available for enqueueing the SYN segment. If the SYN indeed was - enqueued successfully, the tcp_connect() function returns ERR_OK. - - ---- Sending TCP data - -TCP data is sent by enqueueing the data with a call to -tcp_write(). When the data is successfully transmitted to the remote -host, the application will be notified with a call to a specified -callback function. - -- err_t tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len, - u8_t apiflags) - - Enqueues the data pointed to by the argument dataptr. The length of - the data is passed as the len parameter. The apiflags can be one or more of: - - TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated - for the data to be copied into. If this flag is not given, no new memory - should be allocated and the data should only be referenced by pointer. This - also means that the memory behind dataptr must not change until the data is - ACKed by the remote host - - TCP_WRITE_FLAG_MORE: indicates that more data follows. If this is given, - the PSH flag is set in the last segment created by this call to tcp_write. - If this flag is given, the PSH flag is not set. - - The tcp_write() function will fail and return ERR_MEM if the length - of the data exceeds the current send buffer size or if the length of - the queue of outgoing segment is larger than the upper limit defined - in lwipopts.h. The number of bytes available in the output queue can - be retrieved with the tcp_sndbuf() function. - - The proper way to use this function is to call the function with at - most tcp_sndbuf() bytes of data. If the function returns ERR_MEM, - the application should wait until some of the currently enqueued - data has been successfully received by the other host and try again. - -- void tcp_sent(struct tcp_pcb *pcb, - err_t (* sent)(void *arg, struct tcp_pcb *tpcb, - u16_t len)) - - Specifies the callback function that should be called when data has - successfully been received (i.e., acknowledged) by the remote - host. The len argument passed to the callback function gives the - amount bytes that was acknowledged by the last acknowledgment. - - ---- Receiving TCP data - -TCP data reception is callback based - an application specified -callback function is called when new data arrives. When the -application has taken the data, it has to call the tcp_recved() -function to indicate that TCP can advertise increase the receive -window. - -- void tcp_recv(struct tcp_pcb *pcb, - err_t (* recv)(void *arg, struct tcp_pcb *tpcb, - struct pbuf *p, err_t err)) - - Sets the callback function that will be called when new data - arrives. The callback function will be passed a NULL pbuf to - indicate that the remote host has closed the connection. If - there are no errors and the callback function is to return - ERR_OK, then it must free the pbuf. Otherwise, it must not - free the pbuf so that lwIP core code can store it. - -- void tcp_recved(struct tcp_pcb *pcb, u16_t len) - - Must be called when the application has received the data. The len - argument indicates the length of the received data. - - ---- Application polling - -When a connection is idle (i.e., no data is either transmitted or -received), lwIP will repeatedly poll the application by calling a -specified callback function. This can be used either as a watchdog -timer for killing connections that have stayed idle for too long, or -as a method of waiting for memory to become available. For instance, -if a call to tcp_write() has failed because memory wasn't available, -the application may use the polling functionality to call tcp_write() -again when the connection has been idle for a while. - -- void tcp_poll(struct tcp_pcb *pcb, - err_t (* poll)(void *arg, struct tcp_pcb *tpcb), - u8_t interval) - - Specifies the polling interval and the callback function that should - be called to poll the application. The interval is specified in - number of TCP coarse grained timer shots, which typically occurs - twice a second. An interval of 10 means that the application would - be polled every 5 seconds. - - ---- Closing and aborting connections - -- err_t tcp_close(struct tcp_pcb *pcb) - - Closes the connection. The function may return ERR_MEM if no memory - was available for closing the connection. If so, the application - should wait and try again either by using the acknowledgment - callback or the polling functionality. If the close succeeds, the - function returns ERR_OK. - - The pcb is deallocated by the TCP code after a call to tcp_close(). - -- void tcp_abort(struct tcp_pcb *pcb) - - Aborts the connection by sending a RST (reset) segment to the remote - host. The pcb is deallocated. This function never fails. - - ATTENTION: When calling this from one of the TCP callbacks, make - sure you always return ERR_ABRT (and never return ERR_ABRT otherwise - or you will risk accessing deallocated memory or memory leaks! - - -If a connection is aborted because of an error, the application is -alerted of this event by the err callback. Errors that might abort a -connection are when there is a shortage of memory. The callback -function to be called is set using the tcp_err() function. - -- void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg, - err_t err)) - - The error callback function does not get the pcb passed to it as a - parameter since the pcb may already have been deallocated. - - ---- Lower layer TCP interface - -TCP provides a simple interface to the lower layers of the -system. During system initialization, the function tcp_init() has -to be called before any other TCP function is called. When the system -is running, the two timer functions tcp_fasttmr() and tcp_slowtmr() -must be called with regular intervals. The tcp_fasttmr() should be -called every TCP_FAST_INTERVAL milliseconds (defined in tcp.h) and -tcp_slowtmr() should be called every TCP_SLOW_INTERVAL milliseconds. - - ---- UDP interface - -The UDP interface is similar to that of TCP, but due to the lower -level of complexity of UDP, the interface is significantly simpler. - -- struct udp_pcb *udp_new(void) - - Creates a new UDP pcb which can be used for UDP communication. The - pcb is not active until it has either been bound to a local address - or connected to a remote address. - -- void udp_remove(struct udp_pcb *pcb) - - Removes and deallocates the pcb. - -- err_t udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port) - - Binds the pcb to a local address. The IP-address argument "ipaddr" - can be IP_ADDR_ANY to indicate that it should listen to any local IP - address. The function currently always return ERR_OK. - -- err_t udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port) - - Sets the remote end of the pcb. This function does not generate any - network traffic, but only set the remote address of the pcb. - -- err_t udp_disconnect(struct udp_pcb *pcb) - - Remove the remote end of the pcb. This function does not generate - any network traffic, but only removes the remote address of the pcb. - -- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p) - - Sends the pbuf p. The pbuf is not deallocated. - -- void udp_recv(struct udp_pcb *pcb, - void (* recv)(void *arg, struct udp_pcb *upcb, - struct pbuf *p, - ip_addr_t *addr, - u16_t port), - void *recv_arg) - - Specifies a callback function that should be called when a UDP - datagram is received. - - ---- System initalization - -A truly complete and generic sequence for initializing the lwip stack -cannot be given because it depends on the build configuration (lwipopts.h) -and additional initializations for your runtime environment (e.g. timers). - -We can give you some idea on how to proceed when using the raw API. -We assume a configuration using a single Ethernet netif and the -UDP and TCP transport layers, IPv4 and the DHCP client. - -Call these functions in the order of appearance: - -- stats_init() - - Clears the structure where runtime statistics are gathered. - -- sys_init() - - Not of much use since we set the NO_SYS 1 option in lwipopts.h, - to be called for easy configuration changes. - -- mem_init() - - Initializes the dynamic memory heap defined by MEM_SIZE. - -- memp_init() - - Initializes the memory pools defined by MEMP_NUM_x. - -- pbuf_init() - - Initializes the pbuf memory pool defined by PBUF_POOL_SIZE. - -- etharp_init() - - Initializes the ARP table and queue. - Note: you must call etharp_tmr at a ARP_TMR_INTERVAL (5 seconds) regular interval - after this initialization. - -- ip_init() - - Doesn't do much, it should be called to handle future changes. - -- udp_init() - - Clears the UDP PCB list. - -- tcp_init() - - Clears the TCP PCB list and clears some internal TCP timers. - Note: you must call tcp_fasttmr() and tcp_slowtmr() at the - predefined regular intervals after this initialization. - -- netif_add(struct netif *netif, ip_addr_t *ipaddr, - ip_addr_t *netmask, ip_addr_t *gw, - void *state, err_t (* init)(struct netif *netif), - err_t (* input)(struct pbuf *p, struct netif *netif)) - - Adds your network interface to the netif_list. Allocate a struct - netif and pass a pointer to this structure as the first argument. - Give pointers to cleared ip_addr structures when using DHCP, - or fill them with sane numbers otherwise. The state pointer may be NULL. - - The init function pointer must point to a initialization function for - your ethernet netif interface. The following code illustrates it's use. - - err_t netif_if_init(struct netif *netif) - { - u8_t i; - - for(i = 0; i < ETHARP_HWADDR_LEN; i++) netif->hwaddr[i] = some_eth_addr[i]; - init_my_eth_device(); - return ERR_OK; - } - - For ethernet drivers, the input function pointer must point to the lwip - function ethernet_input() declared in "netif/etharp.h". Other drivers - must use ip_input() declared in "lwip/ip.h". - -- netif_set_default(struct netif *netif) - - Registers the default network interface. - -- netif_set_up(struct netif *netif) - - When the netif is fully configured this function must be called. - -- dhcp_start(struct netif *netif) - - Creates a new DHCP client for this interface on the first call. - Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at - the predefined regular intervals after starting the client. - - You can peek in the netif->dhcp struct for the actual DHCP status. - - ---- Optimalization hints - -The first thing you want to optimize is the lwip_standard_checksum() -routine from src/core/inet.c. You can override this standard -function with the #define LWIP_CHKSUM . - -There are C examples given in inet.c or you might want to -craft an assembly function for this. RFC1071 is a good -introduction to this subject. - -Other significant improvements can be made by supplying -assembly or inline replacements for htons() and htonl() -if you're using a little-endian architecture. -#define LWIP_PLATFORM_BYTESWAP 1 -#define LWIP_PLATFORM_HTONS(x) -#define LWIP_PLATFORM_HTONL(x) - -Check your network interface driver if it reads at -a higher speed than the maximum wire-speed. If the -hardware isn't serviced frequently and fast enough -buffer overflows are likely to occur. - -E.g. when using the cs8900 driver, call cs8900if_service(ethif) -as frequently as possible. When using an RTOS let the cs8900 interrupt -wake a high priority task that services your driver using a binary -semaphore or event flag. Some drivers might allow additional tuning -to match your application and network. - -For a production release it is recommended to set LWIP_STATS to 0. -Note that speed performance isn't influenced much by simply setting -high values to the memory options. - -For more optimization hints take a look at the lwIP wiki. - ---- Zero-copy MACs - -To achieve zero-copy on transmit, the data passed to the raw API must -remain unchanged until sent. Because the send- (or write-)functions return -when the packets have been enqueued for sending, data must be kept stable -after that, too. - -This implies that PBUF_RAM/PBUF_POOL pbufs passed to raw-API send functions -must *not* be reused by the application unless their ref-count is 1. - -For no-copy pbufs (PBUF_ROM/PBUF_REF), data must be kept unchanged, too, -but the stack/driver will/must copy PBUF_REF'ed data when enqueueing, while -PBUF_ROM-pbufs are just enqueued (as ROM-data is expected to never change). - -Also, data passed to tcp_write without the copy-flag must not be changed! - -Therefore, be careful which type of PBUF you use and if you copy TCP data -or not! diff --git a/ext/lwip/doc/savannah.txt b/ext/lwip/doc/savannah.txt deleted file mode 100644 index 409905b10..000000000 --- a/ext/lwip/doc/savannah.txt +++ /dev/null @@ -1,135 +0,0 @@ -Daily Use Guide for using Savannah for lwIP - -Table of Contents: - -1 - Obtaining lwIP from the CVS repository -2 - Committers/developers CVS access using SSH (to be written) -3 - Merging from DEVEL branch to main trunk (stable branch) -4 - How to release lwIP - - - -1 Obtaining lwIP from the CVS repository ----------------------------------------- - -To perform an anonymous CVS checkout of the main trunk (this is where -bug fixes and incremental enhancements occur), do this: - -cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout lwip - -Or, obtain a stable branch (updated with bug fixes only) as follows: -cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \ - -r STABLE-0_7 -d lwip-0.7 lwip - -Or, obtain a specific (fixed) release as follows: -cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \ - -r STABLE-0_7_0 -d lwip-0.7.0 lwip - -3 Committers/developers CVS access using SSH --------------------------------------------- - -The Savannah server uses SSH (Secure Shell) protocol 2 authentication and encryption. -As such, CVS commits to the server occur through a SSH tunnel for project members. -To create a SSH2 key pair in UNIX-like environments, do this: - -ssh-keygen -t dsa - -Under Windows, a recommended SSH client is "PuTTY", freely available with good -documentation and a graphic user interface. Use its key generator. - -Now paste the id_dsa.pub contents into your Savannah account public key list. Wait -a while so that Savannah can update its configuration (This can take minutes). - -Try to login using SSH: - -ssh -v your_login@cvs.sv.gnu.org - -If it tells you: - -Authenticating with public key "your_key_name"... -Server refused to allocate pty - -then you could login; Savannah refuses to give you a shell - which is OK, as we -are allowed to use SSH for CVS only. Now, you should be able to do this: - -export CVS_RSH=ssh -cvs -z3 -d:ext:your_login@cvs.sv.gnu.org:/sources/lwip co lwip - -after which you can edit your local files with bug fixes or new features and -commit them. Make sure you know what you are doing when using CVS to make -changes on the repository. If in doubt, ask on the lwip-members mailing list. - -(If SSH asks about authenticity of the host, you can check the key - fingerprint against http://savannah.nongnu.org/cvs/?group=lwip) - - -3 Merging from DEVEL branch to main trunk (stable) --------------------------------------------------- - -Merging is a delicate process in CVS and requires the -following disciplined steps in order to prevent conflicts -in the future. Conflicts can be hard to solve! - -Merging from branch A to branch B requires that the A branch -has a tag indicating the previous merger. This tag is called -'merged_from_A_to_B'. After merging, the tag is moved in the -A branch to remember this merger for future merge actions. - -IMPORTANT: AFTER COMMITTING A SUCCESFUL MERGE IN THE -REPOSITORY, THE TAG MUST BE SET ON THE SOURCE BRANCH OF THE -MERGE ACTION (REPLACING EXISTING TAGS WITH THE SAME NAME). - -Merge all changes in DEVEL since our last merge to main: - -In the working copy of the main trunk: -cvs update -P -jmerged_from_DEVEL_to_main -jDEVEL - -(This will apply the changes between 'merged_from_DEVEL_to_main' -and 'DEVEL' to your work set of files) - -We can now commit the merge result. -cvs commit -R -m "Merged from DEVEL to main." - -If this worked out OK, we now move the tag in the DEVEL branch -to this merge point, so we can use this point for future merges: - -cvs rtag -F -r DEVEL merged_from_DEVEL_to_main lwip - -4 How to release lwIP ---------------------- - -First, checkout a clean copy of the branch to be released. Tag this set with -tag name "STABLE-0_6_3". (I use release number 0.6.3 throughout this example). - -Login CVS using pserver authentication, then export a clean copy of the -tagged tree. Export is similar to a checkout, except that the CVS metadata -is not created locally. - -export CVS_RSH=ssh -cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \ - -r STABLE-0_6_3 -d lwip-0.6.3 lwip - -Archive this directory using tar, gzip'd, bzip2'd and zip'd. - -tar czvf lwip-0.6.3.tar.gz lwip-0.6.3 -tar cjvf lwip-0.6.3.tar.bz2 lwip-0.6.3 -zip -r lwip-0.6.3.zip lwip-0.6.3 - -Now, sign the archives with a detached GPG binary signature as follows: - -gpg -b lwip-0.6.3.tar.gz -gpg -b lwip-0.6.3.tar.bz2 -gpg -b lwip-0.6.3.zip - -Upload these files using anonymous FTP: -ncftp ftp://savannah.gnu.org/incoming/savannah/lwip - -ncftp>mput *0.6.3.* - -Additionally, you may post a news item on Savannah, like this: - -A new 0.6.3 release is now available here: -http://savannah.nongnu.org/files/?group=lwip&highlight=0.6.3 - -You will have to submit this via the user News interface, then approve -this via the Administrator News interface. \ No newline at end of file diff --git a/ext/lwip/doc/snmp_agent.txt b/ext/lwip/doc/snmp_agent.txt deleted file mode 100644 index 2653230f4..000000000 --- a/ext/lwip/doc/snmp_agent.txt +++ /dev/null @@ -1,181 +0,0 @@ -SNMPv1 agent for lwIP - -Author: Christiaan Simons - -This is a brief introduction how to use and configure the SNMP agent. -Note the agent uses the raw-API UDP interface so you may also want to -read rawapi.txt to gain a better understanding of the SNMP message handling. - -0 Agent Capabilities -==================== - -SNMPv1 per RFC1157 - This is an old(er) standard but is still widely supported. - For SNMPv2c and v3 have a greater complexity and need many - more lines of code. IMHO this breaks the idea of "lightweight IP". - - Note the S in SNMP stands for "Simple". Note that "Simple" is - relative. SNMP is simple compared to the complex ISO network - management protocols CMIP (Common Management Information Protocol) - and CMOT (CMip Over Tcp). - -MIB II per RFC1213 - The standard lwIP stack management information base. - This is a required MIB, so this is always enabled. - When builing lwIP without TCP, the mib-2.tcp group is omitted. - The groups EGP, CMOT and transmission are disabled by default. - - Most mib-2 objects are not writable except: - sysName, sysLocation, sysContact, snmpEnableAuthenTraps. - Writing to or changing the ARP and IP address and route - tables is not possible. - - Note lwIP has a very limited notion of IP routing. It currently - doen't have a route table and doesn't have a notion of the U,G,H flags. - Instead lwIP uses the interface list with only one default interface - acting as a single gateway interface (G) for the default route. - - The agent returns a "virtual table" with the default route 0.0.0.0 - for the default interface and network routes (no H) for each - network interface in the netif_list. - All routes are considered to be up (U). - -Loading additional MIBs - MIBs can only be added in compile-time, not in run-time. - There is no MIB compiler thus additional MIBs must be hand coded. - -Large SNMP message support - The packet decoding and encoding routines are designed - to use pbuf-chains. Larger payloads than the minimum - SNMP requirement of 484 octets are supported if the - PBUF_POOL_SIZE and IP_REASS_BUFSIZE are set to match your - local requirement. - -1 Building the Agent -==================== - -First of all you'll need to add the following define -to your local lwipopts.h: - -#define LWIP_SNMP 1 - -and add the source files in lwip/src/core/snmp -and some snmp headers in lwip/src/include/lwip to your makefile. - -Note you'll might need to adapt you network driver to update -the mib2 variables for your interface. - -2 Running the Agent -=================== - -The following function calls must be made in your program to -actually get the SNMP agent running. - -Before starting the agent you should supply pointers -to non-volatile memory for sysContact, sysLocation, -and snmpEnableAuthenTraps. You can do this by calling - -snmp_set_syscontact() -snmp_set_syslocation() -snmp_set_snmpenableauthentraps() - -Additionally you may want to set - -snmp_set_sysdescr() -snmp_set_sysobjid() (if you have a private MIB) -snmp_set_sysname() - -Also before starting the agent you need to setup -one or more trap destinations using these calls: - -snmp_trap_dst_enable(); -snmp_trap_dst_ip_set(); - -In the lwIP initialisation sequence call snmp_init() just after -the call to udp_init(). - -Exactly every 10 msec the SNMP uptime timestamp must be updated with -snmp_inc_sysuptime(). You should call this from a timer interrupt -or a timer signal handler depending on your runtime environment. - -An alternative way to update the SNMP uptime timestamp is to do a call like -snmp_add_sysuptime(100) each 1000ms (which is bigger "step", but call to -a lower frequency). Another one is to not call snmp_inc_sysuptime() or -snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro. -This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside -snmp_get_sysuptime(u32_t *value), and enable to change "sysuptime" value only -when it's queried (any function which need "sysuptime" have to call -snmp_get_sysuptime). - - -3 Private MIBs -============== - -If want to extend the agent with your own private MIB you'll need to -add the following define to your local lwipopts.h: - -#define SNMP_PRIVATE_MIB 1 - -You must provide the private_mib.h and associated files yourself. -Note we don't have a "MIB compiler" that generates C source from a MIB, -so you're required to do some serious coding if you enable this! - -Note the lwIP enterprise ID (26381) is assigned to the lwIP project, -ALL OBJECT IDENTIFIERS LIVING UNDER THIS ID ARE ASSIGNED BY THE lwIP -MAINTAINERS! - -If you need to create your own private MIB you'll need -to apply for your own enterprise ID with IANA: http://www.iana.org/numbers.html - -You can set it by passing a struct snmp_obj_id to the agent -using snmp_set_sysobjid(&my_object_id), just before snmp_init(). - -Note the object identifiers for thes MIB-2 and your private MIB -tree must be kept in sorted ascending (lexicographical) order. -This to ensure correct getnext operation. - -An example for a private MIB is part of the "minimal Unix" project: -contrib/ports/unix/proj/minimal/lwip_prvmib.c - -The next chapter gives a more detailed description of the -MIB-2 tree and the optional private MIB. - -4 The Gory Details -================== - -4.0 Object identifiers and the MIB tree. - -We have three distinct parts for all object identifiers: - -The prefix - .iso.org.dod.internet - -the middle part - .mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress - -and the index part - .1.192.168.0.1 - -Objects located above the .internet hierarchy aren't supported. -Currently only the .mgmt sub-tree is available and -when the SNMP_PRIVATE_MIB is enabled the .private tree -becomes available too. - -Object identifiers from incoming requests are checked -for a matching prefix, middle part and index part -or are expanded(*) for GetNext requests with short -or inexisting names in the request. -(* we call this "expansion" but this also -resembles the "auto-completion" operation) - -The middle part is usually located in ROM (const) -to preserve precious RAM on small microcontrollers. -However RAM location is possible for a dynamically -changing private tree. - -The index part is handled by functions which in -turn use dynamically allocated index trees from RAM. -These trees are updated by e.g. the etharp code -when new entries are made or removed form the ARP cache. - -/** @todo more gory details */ diff --git a/ext/lwip/doc/sys_arch.txt b/ext/lwip/doc/sys_arch.txt deleted file mode 100644 index 847cd7777..000000000 --- a/ext/lwip/doc/sys_arch.txt +++ /dev/null @@ -1,267 +0,0 @@ -sys_arch interface for lwIP 0.6++ - -Author: Adam Dunkels - -The operating system emulation layer provides a common interface -between the lwIP code and the underlying operating system kernel. The -general idea is that porting lwIP to new architectures requires only -small changes to a few header files and a new sys_arch -implementation. It is also possible to do a sys_arch implementation -that does not rely on any underlying operating system. - -The sys_arch provides semaphores and mailboxes to lwIP. For the full -lwIP functionality, multiple threads support can be implemented in the -sys_arch, but this is not required for the basic lwIP -functionality. Previous versions of lwIP required the sys_arch to -implement timer scheduling as well but as of lwIP 0.5 this is -implemented in a higher layer. - -In addition to the source file providing the functionality of sys_arch, -the OS emulation layer must provide several header files defining -macros used throughout lwip. The files required and the macros they -must define are listed below the sys_arch description. - -Semaphores can be either counting or binary - lwIP works with both -kinds. Mailboxes are used for message passing and can be implemented -either as a queue which allows multiple messages to be posted to a -mailbox, or as a rendez-vous point where only one message can be -posted at a time. lwIP works with both kinds, but the former type will -be more efficient. A message in a mailbox is just a pointer, nothing -more. - -Semaphores are represented by the type "sys_sem_t" which is typedef'd -in the sys_arch.h file. Mailboxes are equivalently represented by the -type "sys_mbox_t". lwIP does not place any restrictions on how -sys_sem_t or sys_mbox_t are represented internally. - -Since lwIP 1.4.0, semaphore and mailbox functions are prototyped in a way that -allows both using pointers or actual OS structures to be used. This way, memory -required for such types can be either allocated in place (globally or on the -stack) or on the heap (allocated internally in the "*_new()" functions). - -The following functions must be implemented by the sys_arch: - -- void sys_init(void) - - Is called to initialize the sys_arch layer. - -- err_t sys_sem_new(sys_sem_t *sem, u8_t count) - - Creates a new semaphore. The semaphore is allocated to the memory that 'sem' - points to (which can be both a pointer or the actual OS structure). - The "count" argument specifies the initial state of the semaphore (which is - either 0 or 1). - If the semaphore has been created, ERR_OK should be returned. Returning any - other error will provide a hint what went wrong, but except for assertions, - no real error handling is implemented. - -- void sys_sem_free(sys_sem_t *sem) - - Deallocates a semaphore. - -- void sys_sem_signal(sys_sem_t *sem) - - Signals a semaphore. - -- u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) - - Blocks the thread while waiting for the semaphore to be - signaled. If the "timeout" argument is non-zero, the thread should - only be blocked for the specified time (measured in - milliseconds). If the "timeout" argument is zero, the thread should be - blocked until the semaphore is signalled. - - If the timeout argument is non-zero, the return value is the number of - milliseconds spent waiting for the semaphore to be signaled. If the - semaphore wasn't signaled within the specified time, the return value is - SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore - (i.e., it was already signaled), the function may return zero. - - Notice that lwIP implements a function with a similar name, - sys_sem_wait(), that uses the sys_arch_sem_wait() function. - -- int sys_sem_valid(sys_sem_t *sem) - - Returns 1 if the semaphore is valid, 0 if it is not valid. - When using pointers, a simple way is to check the pointer for != NULL. - When directly using OS structures, implementing this may be more complex. - This may also be a define, in which case the function is not prototyped. - -- void sys_sem_set_invalid(sys_sem_t *sem) - - Invalidate a semaphore so that sys_sem_valid() returns 0. - ATTENTION: This does NOT mean that the semaphore shall be deallocated: - sys_sem_free() is always called before calling this function! - This may also be a define, in which case the function is not prototyped. - -- err_t sys_mbox_new(sys_mbox_t *mbox, int size) - - Creates an empty mailbox for maximum "size" elements. Elements stored - in mailboxes are pointers. You have to define macros "_MBOX_SIZE" - in your lwipopts.h, or ignore this parameter in your implementation - and use a default size. - If the mailbox has been created, ERR_OK should be returned. Returning any - other error will provide a hint what went wrong, but except for assertions, - no real error handling is implemented. - -- void sys_mbox_free(sys_mbox_t *mbox) - - Deallocates a mailbox. If there are messages still present in the - mailbox when the mailbox is deallocated, it is an indication of a - programming error in lwIP and the developer should be notified. - -- void sys_mbox_post(sys_mbox_t *mbox, void *msg) - - Posts the "msg" to the mailbox. This function have to block until - the "msg" is really posted. - -- err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) - - Try to post the "msg" to the mailbox. Returns ERR_MEM if this one - is full, else, ERR_OK if the "msg" is posted. - -- u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) - - Blocks the thread until a message arrives in the mailbox, but does - not block the thread longer than "timeout" milliseconds (similar to - the sys_arch_sem_wait() function). If "timeout" is 0, the thread should - be blocked until a message arrives. The "msg" argument is a result - parameter that is set by the function (i.e., by doing "*msg = - ptr"). The "msg" parameter maybe NULL to indicate that the message - should be dropped. - - The return values are the same as for the sys_arch_sem_wait() function: - Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a - timeout. - - Note that a function with a similar name, sys_mbox_fetch(), is - implemented by lwIP. - -- u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) - - This is similar to sys_arch_mbox_fetch, however if a message is not - present in the mailbox, it immediately returns with the code - SYS_MBOX_EMPTY. On success 0 is returned. - - To allow for efficient implementations, this can be defined as a - function-like macro in sys_arch.h instead of a normal function. For - example, a naive implementation could be: - #define sys_arch_mbox_tryfetch(mbox,msg) \ - sys_arch_mbox_fetch(mbox,msg,1) - although this would introduce unnecessary delays. - -- int sys_mbox_valid(sys_mbox_t *mbox) - - Returns 1 if the mailbox is valid, 0 if it is not valid. - When using pointers, a simple way is to check the pointer for != NULL. - When directly using OS structures, implementing this may be more complex. - This may also be a define, in which case the function is not prototyped. - -- void sys_mbox_set_invalid(sys_mbox_t *mbox) - - Invalidate a mailbox so that sys_mbox_valid() returns 0. - ATTENTION: This does NOT mean that the mailbox shall be deallocated: - sys_mbox_free() is always called before calling this function! - This may also be a define, in which case the function is not prototyped. - -If threads are supported by the underlying operating system and if -such functionality is needed in lwIP, the following function will have -to be implemented as well: - -- sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio) - - Starts a new thread named "name" with priority "prio" that will begin its - execution in the function "thread()". The "arg" argument will be passed as an - argument to the thread() function. The stack size to used for this thread is - the "stacksize" parameter. The id of the new thread is returned. Both the id - and the priority are system dependent. - -- sys_prot_t sys_arch_protect(void) - - This optional function does a "fast" critical region protection and returns - the previous protection level. This function is only called during very short - critical regions. An embedded system which supports ISR-based drivers might - want to implement this function by disabling interrupts. Task-based systems - might want to implement this by using a mutex or disabling tasking. This - function should support recursive calls from the same task or interrupt. In - other words, sys_arch_protect() could be called while already protected. In - that case the return value indicates that it is already protected. - - sys_arch_protect() is only required if your port is supporting an operating - system. - -- void sys_arch_unprotect(sys_prot_t pval) - - This optional function does a "fast" set of critical region protection to the - value specified by pval. See the documentation for sys_arch_protect() for - more information. This function is only required if your port is supporting - an operating system. - -For some configurations, you also need: - -- u32_t sys_now(void) - - This optional function returns the current time in milliseconds (don't care - for wraparound, this is only used for time diffs). - Not implementing this function means you cannot use some modules (e.g. TCP - timestamps, internal timeouts for NO_SYS==1). - - -Note: - -Be carefull with using mem_malloc() in sys_arch. When malloc() refers to -mem_malloc() you can run into a circular function call problem. In mem.c -mem_init() tries to allcate a semaphore using mem_malloc, which of course -can't be performed when sys_arch uses mem_malloc. - -------------------------------------------------------------------------------- -Additional files required for the "OS support" emulation layer: -------------------------------------------------------------------------------- - -cc.h - Architecture environment, some compiler specific, some - environment specific (probably should move env stuff - to sys_arch.h.) - - Typedefs for the types used by lwip - - u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t - - Compiler hints for packing lwip's structures - - PACK_STRUCT_FIELD(x) - PACK_STRUCT_STRUCT - PACK_STRUCT_BEGIN - PACK_STRUCT_END - - Platform specific diagnostic output - - LWIP_PLATFORM_DIAG(x) - non-fatal, print a message. - LWIP_PLATFORM_ASSERT(x) - fatal, print message and abandon execution. - Portability defines for printf formatters: - U16_F, S16_F, X16_F, U32_F, S32_F, X32_F, SZT_F - - "lightweight" synchronization mechanisms - - SYS_ARCH_DECL_PROTECT(x) - declare a protection state variable. - SYS_ARCH_PROTECT(x) - enter protection mode. - SYS_ARCH_UNPROTECT(x) - leave protection mode. - - If the compiler does not provide memset() this file must include a - definition of it, or include a file which defines it. - - This file must either include a system-local which defines - the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO - to make lwip/arch.h define the codes which are used throughout. - - -perf.h - Architecture specific performance measurement. - Measurement calls made throughout lwip, these can be defined to nothing. - PERF_START - start measuring something. - PERF_STOP(x) - stop measuring something, and record the result. - -sys_arch.h - Tied to sys_arch.c - - Arch dependent types for the following objects: - sys_sem_t, sys_mbox_t, sys_thread_t, - And, optionally: - sys_prot_t - - Defines to set vars of sys_mbox_t and sys_sem_t to NULL. - SYS_MBOX_NULL NULL - SYS_SEM_NULL NULL diff --git a/ext/lwip/test/unit/core/test_mem.c b/ext/lwip/test/unit/core/test_mem.c deleted file mode 100644 index d3a5d540d..000000000 --- a/ext/lwip/test/unit/core/test_mem.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "test_mem.h" - -#include "lwip/mem.h" -#include "lwip/stats.h" - -#if !LWIP_STATS || !MEM_STATS -#error "This tests needs MEM-statistics enabled" -#endif -#if LWIP_DNS -#error "This test needs DNS turned off (as it mallocs on init)" -#endif - -/* Setups/teardown functions */ - -static void -mem_setup(void) -{ -} - -static void -mem_teardown(void) -{ -} - - -/* Test functions */ - -/** Call mem_malloc, mem_free and mem_trim and check stats */ -START_TEST(test_mem_one) -{ -#define SIZE1 16 -#define SIZE1_2 12 -#define SIZE2 16 - void *p1, *p2; - mem_size_t s1, s2; - LWIP_UNUSED_ARG(_i); - -#if LWIP_DNS - fail("This test needs DNS turned off (as it mallocs on init)"); -#endif - - fail_unless(lwip_stats.mem.used == 0); - - p1 = mem_malloc(SIZE1); - fail_unless(p1 != NULL); - fail_unless(lwip_stats.mem.used >= SIZE1); - s1 = lwip_stats.mem.used; - - p2 = mem_malloc(SIZE2); - fail_unless(p2 != NULL); - fail_unless(lwip_stats.mem.used >= SIZE2 + s1); - s2 = lwip_stats.mem.used; - - mem_trim(p1, SIZE1_2); - - mem_free(p2); - fail_unless(lwip_stats.mem.used <= s2 - SIZE2); - - mem_free(p1); - fail_unless(lwip_stats.mem.used == 0); -} -END_TEST - - -/** Create the suite including all tests for this module */ -Suite * -mem_suite(void) -{ - TFun tests[] = { - test_mem_one - }; - return create_suite("MEM", tests, sizeof(tests)/sizeof(TFun), mem_setup, mem_teardown); -} diff --git a/ext/lwip/test/unit/core/test_mem.h b/ext/lwip/test/unit/core/test_mem.h deleted file mode 100644 index 13803edc6..000000000 --- a/ext/lwip/test/unit/core/test_mem.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __TEST_MEM_H__ -#define __TEST_MEM_H__ - -#include "../lwip_check.h" - -Suite *mem_suite(void); - -#endif diff --git a/ext/lwip/test/unit/etharp/test_etharp.c b/ext/lwip/test/unit/etharp/test_etharp.c deleted file mode 100644 index cbbc9502a..000000000 --- a/ext/lwip/test/unit/etharp/test_etharp.c +++ /dev/null @@ -1,262 +0,0 @@ -#include "test_etharp.h" - -#include "lwip/udp.h" -#include "netif/etharp.h" -#include "lwip/stats.h" - -#if !LWIP_STATS || !UDP_STATS || !MEMP_STATS || !ETHARP_STATS -#error "This tests needs UDP-, MEMP- and ETHARP-statistics enabled" -#endif -#if !ETHARP_SUPPORT_STATIC_ENTRIES -#error "This test needs ETHARP_SUPPORT_STATIC_ENTRIES enabled" -#endif - -static struct netif test_netif; -static ip_addr_t test_ipaddr, test_netmask, test_gw; -struct eth_addr test_ethaddr = {1,1,1,1,1,1}; -struct eth_addr test_ethaddr2 = {1,1,1,1,1,2}; -struct eth_addr test_ethaddr3 = {1,1,1,1,1,3}; -struct eth_addr test_ethaddr4 = {1,1,1,1,1,4}; -static int linkoutput_ctr; - -/* Helper functions */ -static void -etharp_remove_all(void) -{ - int i; - /* call etharp_tmr often enough to have all entries cleaned */ - for(i = 0; i < 0xff; i++) { - etharp_tmr(); - } -} - -static err_t -default_netif_linkoutput(struct netif *netif, struct pbuf *p) -{ - fail_unless(netif == &test_netif); - fail_unless(p != NULL); - linkoutput_ctr++; - return ERR_OK; -} - -static err_t -default_netif_init(struct netif *netif) -{ - fail_unless(netif != NULL); - netif->linkoutput = default_netif_linkoutput; - netif->output = etharp_output; - netif->mtu = 1500; - netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; - netif->hwaddr_len = ETHARP_HWADDR_LEN; - return ERR_OK; -} - -static void -default_netif_add(void) -{ - IP4_ADDR(&test_gw, 192,168,0,1); - IP4_ADDR(&test_ipaddr, 192,168,0,1); - IP4_ADDR(&test_netmask, 255,255,0,0); - - fail_unless(netif_default == NULL); - netif_set_default(netif_add(&test_netif, &test_ipaddr, &test_netmask, - &test_gw, NULL, default_netif_init, NULL)); - netif_set_up(&test_netif); -} - -static void -default_netif_remove(void) -{ - fail_unless(netif_default == &test_netif); - netif_remove(&test_netif); -} - -static void -create_arp_response(ip_addr_t *adr) -{ - int k; - struct eth_hdr *ethhdr; - struct etharp_hdr *etharphdr; - struct pbuf *p = pbuf_alloc(PBUF_RAW, sizeof(struct eth_hdr) + sizeof(struct etharp_hdr), PBUF_RAM); - if(p == NULL) { - FAIL_RET(); - } - ethhdr = (struct eth_hdr*)p->payload; - etharphdr = (struct etharp_hdr*)(ethhdr + 1); - - ethhdr->dest = test_ethaddr; - ethhdr->src = test_ethaddr2; - ethhdr->type = htons(ETHTYPE_ARP); - - etharphdr->hwtype = htons(/*HWTYPE_ETHERNET*/ 1); - etharphdr->proto = htons(ETHTYPE_IP); - etharphdr->hwlen = ETHARP_HWADDR_LEN; - etharphdr->protolen = sizeof(ip_addr_t); - etharphdr->opcode = htons(ARP_REPLY); - - SMEMCPY(ðarphdr->sipaddr, adr, sizeof(ip_addr_t)); - SMEMCPY(ðarphdr->dipaddr, &test_ipaddr, sizeof(ip_addr_t)); - - k = 6; - while(k > 0) { - k--; - /* Write the ARP MAC-Addresses */ - etharphdr->shwaddr.addr[k] = test_ethaddr2.addr[k]; - etharphdr->dhwaddr.addr[k] = test_ethaddr.addr[k]; - /* Write the Ethernet MAC-Addresses */ - ethhdr->dest.addr[k] = test_ethaddr.addr[k]; - ethhdr->src.addr[k] = test_ethaddr2.addr[k]; - } - - ethernet_input(p, &test_netif); -} - -/* Setups/teardown functions */ - -static void -etharp_setup(void) -{ - etharp_remove_all(); - default_netif_add(); -} - -static void -etharp_teardown(void) -{ - etharp_remove_all(); - default_netif_remove(); -} - - -/* Test functions */ - -START_TEST(test_etharp_table) -{ -#if ETHARP_SUPPORT_STATIC_ENTRIES - err_t err; -#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ - s8_t idx; - ip_addr_t *unused_ipaddr; - struct eth_addr *unused_ethaddr; - struct udp_pcb* pcb; - LWIP_UNUSED_ARG(_i); - - if (netif_default != &test_netif) { - fail("This test needs a default netif"); - } - - linkoutput_ctr = 0; - - pcb = udp_new(); - fail_unless(pcb != NULL); - if (pcb != NULL) { - ip_addr_t adrs[ARP_TABLE_SIZE + 2]; - int i; - for(i = 0; i < ARP_TABLE_SIZE + 2; i++) { - IP4_ADDR(&adrs[i], 192,168,0,i+2); - } - /* fill ARP-table with dynamic entries */ - for(i = 0; i < ARP_TABLE_SIZE; i++) { - struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 10, PBUF_RAM); - fail_unless(p != NULL); - if (p != NULL) { - err_t err = udp_sendto(pcb, p, &adrs[i], 123); - fail_unless(err == ERR_OK); - /* etharp request sent? */ - fail_unless(linkoutput_ctr == (2*i) + 1); - pbuf_free(p); - - /* create an ARP response */ - create_arp_response(&adrs[i]); - /* queued UDP packet sent? */ - fail_unless(linkoutput_ctr == (2*i) + 2); - - idx = etharp_find_addr(NULL, &adrs[i], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == i); - etharp_tmr(); - } - } - linkoutput_ctr = 0; -#if ETHARP_SUPPORT_STATIC_ENTRIES - /* create one static entry */ - err = etharp_add_static_entry(&adrs[ARP_TABLE_SIZE], &test_ethaddr3); - fail_unless(err == ERR_OK); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == 0); - fail_unless(linkoutput_ctr == 0); -#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ - - linkoutput_ctr = 0; - /* fill ARP-table with dynamic entries */ - for(i = 0; i < ARP_TABLE_SIZE; i++) { - struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 10, PBUF_RAM); - fail_unless(p != NULL); - if (p != NULL) { - err_t err = udp_sendto(pcb, p, &adrs[i], 123); - fail_unless(err == ERR_OK); - /* etharp request sent? */ - fail_unless(linkoutput_ctr == (2*i) + 1); - pbuf_free(p); - - /* create an ARP response */ - create_arp_response(&adrs[i]); - /* queued UDP packet sent? */ - fail_unless(linkoutput_ctr == (2*i) + 2); - - idx = etharp_find_addr(NULL, &adrs[i], &unused_ethaddr, &unused_ipaddr); - if (i < ARP_TABLE_SIZE - 1) { - fail_unless(idx == i+1); - } else { - /* the last entry must not overwrite the static entry! */ - fail_unless(idx == 1); - } - etharp_tmr(); - } - } -#if ETHARP_SUPPORT_STATIC_ENTRIES - /* create a second static entry */ - err = etharp_add_static_entry(&adrs[ARP_TABLE_SIZE+1], &test_ethaddr4); - fail_unless(err == ERR_OK); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == 0); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == 2); - /* and remove it again */ - err = etharp_remove_static_entry(&adrs[ARP_TABLE_SIZE+1]); - fail_unless(err == ERR_OK); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == 0); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == -1); -#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ - - /* check that static entries don't time out */ - etharp_remove_all(); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == 0); - -#if ETHARP_SUPPORT_STATIC_ENTRIES - /* remove the first static entry */ - err = etharp_remove_static_entry(&adrs[ARP_TABLE_SIZE]); - fail_unless(err == ERR_OK); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == -1); - idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr); - fail_unless(idx == -1); -#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ - - udp_remove(pcb); - } -} -END_TEST - - -/** Create the suite including all tests for this module */ -Suite * -etharp_suite(void) -{ - TFun tests[] = { - test_etharp_table - }; - return create_suite("ETHARP", tests, sizeof(tests)/sizeof(TFun), etharp_setup, etharp_teardown); -} diff --git a/ext/lwip/test/unit/etharp/test_etharp.h b/ext/lwip/test/unit/etharp/test_etharp.h deleted file mode 100644 index 96e00c3bb..000000000 --- a/ext/lwip/test/unit/etharp/test_etharp.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __TEST_ETHARP_H__ -#define __TEST_ETHARP_H__ - -#include "../lwip_check.h" - -Suite* etharp_suite(void); - -#endif diff --git a/ext/lwip/test/unit/lwip_check.h b/ext/lwip/test/unit/lwip_check.h deleted file mode 100644 index e27f55aee..000000000 --- a/ext/lwip/test/unit/lwip_check.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef __LWIP_CHECK_H__ -#define __LWIP_CHECK_H__ - -/* Common header file for lwIP unit tests using the check framework */ - -#include -#include -#include - -#define FAIL_RET() do { fail(); return; } while(0) -#define EXPECT(x) fail_unless(x) -#define EXPECT_RET(x) do { fail_unless(x); if(!(x)) { return; }} while(0) -#define EXPECT_RETX(x, y) do { fail_unless(x); if(!(x)) { return y; }} while(0) -#define EXPECT_RETNULL(x) EXPECT_RETX(x, NULL) - -/** typedef for a function returning a test suite */ -typedef Suite* (suite_getter_fn)(void); - -/** Create a test suite */ -static Suite* create_suite(const char* name, TFun *tests, size_t num_tests, SFun setup, SFun teardown) -{ - size_t i; - Suite *s = suite_create(name); - - for(i = 0; i < num_tests; i++) { - /* Core test case */ - TCase *tc_core = tcase_create("Core"); - if ((setup != NULL) || (teardown != NULL)) { - tcase_add_checked_fixture(tc_core, setup, teardown); - } - tcase_add_test(tc_core, tests[i]); - suite_add_tcase(s, tc_core); - } - return s; -} - -#endif /* __LWIP_CHECK_H__ */ diff --git a/ext/lwip/test/unit/lwip_unittests.c b/ext/lwip/test/unit/lwip_unittests.c deleted file mode 100644 index 4f537e668..000000000 --- a/ext/lwip/test/unit/lwip_unittests.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "lwip_check.h" - -#include "udp/test_udp.h" -#include "tcp/test_tcp.h" -#include "tcp/test_tcp_oos.h" -#include "core/test_mem.h" -#include "etharp/test_etharp.h" - -#include "lwip/init.h" - - -int main() -{ - int number_failed; - SRunner *sr; - size_t i; - suite_getter_fn* suites[] = { - udp_suite, - tcp_suite, - tcp_oos_suite, - mem_suite, - etharp_suite - }; - size_t num = sizeof(suites)/sizeof(void*); - LWIP_ASSERT("No suites defined", num > 0); - - lwip_init(); - - sr = srunner_create((suites[0])()); - for(i = 1; i < num; i++) { - srunner_add_suite(sr, ((suite_getter_fn*)suites[i])()); - } - -#ifdef LWIP_UNITTESTS_NOFORK - srunner_set_fork_status(sr, CK_NOFORK); -#endif -#ifdef LWIP_UNITTESTS_FORK - srunner_set_fork_status(sr, CK_FORK); -#endif - - srunner_run_all(sr, CK_NORMAL); - number_failed = srunner_ntests_failed(sr); - srunner_free(sr); - return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; -} diff --git a/ext/lwip/test/unit/lwipopts.h b/ext/lwip/test/unit/lwipopts.h deleted file mode 100644 index 88e76d7a5..000000000 --- a/ext/lwip/test/unit/lwipopts.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2001-2003 Swedish Institute of Computer Science. - * All rights reserved. - * - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Simon Goldschmidt - * - */ -#ifndef __LWIPOPTS_H__ -#define __LWIPOPTS_H__ - -/* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */ -#define NO_SYS 1 -#define LWIP_NETCONN 0 -#define LWIP_SOCKET 0 - -/* Minimal changes to opt.h required for tcp unit tests: */ -#define MEM_SIZE 16000 -#define TCP_SND_QUEUELEN 40 -#define MEMP_NUM_TCP_SEG TCP_SND_QUEUELEN -#define TCP_SND_BUF (12 * TCP_MSS) -#define TCP_WND (10 * TCP_MSS) - -/* Minimal changes to opt.h required for etharp unit tests: */ -#define ETHARP_SUPPORT_STATIC_ENTRIES 1 - -#endif /* __LWIPOPTS_H__ */ diff --git a/ext/lwip/test/unit/tcp/tcp_helper.c b/ext/lwip/test/unit/tcp/tcp_helper.c deleted file mode 100644 index dd550f1b2..000000000 --- a/ext/lwip/test/unit/tcp/tcp_helper.c +++ /dev/null @@ -1,294 +0,0 @@ -#include "tcp_helper.h" - -#include "lwip/tcp_impl.h" -#include "lwip/stats.h" -#include "lwip/pbuf.h" -#include "lwip/inet_chksum.h" - -#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS -#error "This tests needs TCP- and MEMP-statistics enabled" -#endif - -/** Remove all pcbs on the given list. */ -static void -tcp_remove(struct tcp_pcb* pcb_list) -{ - struct tcp_pcb *pcb = pcb_list; - struct tcp_pcb *pcb2; - - while(pcb != NULL) { - pcb2 = pcb; - pcb = pcb->next; - tcp_abort(pcb2); - } -} - -/** Remove all pcbs on listen-, active- and time-wait-list (bound- isn't exported). */ -void -tcp_remove_all(void) -{ - tcp_remove(tcp_listen_pcbs.pcbs); - tcp_remove(tcp_active_pcbs); - tcp_remove(tcp_tw_pcbs); - fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 0); - fail_unless(lwip_stats.memp[MEMP_TCP_PCB_LISTEN].used == 0); - fail_unless(lwip_stats.memp[MEMP_TCP_SEG].used == 0); - fail_unless(lwip_stats.memp[MEMP_PBUF_POOL].used == 0); -} - -/** Create a TCP segment usable for passing to tcp_input */ -static struct pbuf* -tcp_create_segment_wnd(ip_addr_t* src_ip, ip_addr_t* dst_ip, - u16_t src_port, u16_t dst_port, void* data, size_t data_len, - u32_t seqno, u32_t ackno, u8_t headerflags, u16_t wnd) -{ - struct pbuf *p, *q; - struct ip_hdr* iphdr; - struct tcp_hdr* tcphdr; - u16_t pbuf_len = (u16_t)(sizeof(struct ip_hdr) + sizeof(struct tcp_hdr) + data_len); - - p = pbuf_alloc(PBUF_RAW, pbuf_len, PBUF_POOL); - EXPECT_RETNULL(p != NULL); - /* first pbuf must be big enough to hold the headers */ - EXPECT_RETNULL(p->len >= (sizeof(struct ip_hdr) + sizeof(struct tcp_hdr))); - if (data_len > 0) { - /* first pbuf must be big enough to hold at least 1 data byte, too */ - EXPECT_RETNULL(p->len > (sizeof(struct ip_hdr) + sizeof(struct tcp_hdr))); - } - - for(q = p; q != NULL; q = q->next) { - memset(q->payload, 0, q->len); - } - - iphdr = p->payload; - /* fill IP header */ - iphdr->dest.addr = dst_ip->addr; - iphdr->src.addr = src_ip->addr; - IPH_VHL_SET(iphdr, 4, IP_HLEN / 4); - IPH_TOS_SET(iphdr, 0); - IPH_LEN_SET(iphdr, htons(p->tot_len)); - IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); - - /* let p point to TCP header */ - pbuf_header(p, -(s16_t)sizeof(struct ip_hdr)); - - tcphdr = p->payload; - tcphdr->src = htons(src_port); - tcphdr->dest = htons(dst_port); - tcphdr->seqno = htonl(seqno); - tcphdr->ackno = htonl(ackno); - TCPH_HDRLEN_SET(tcphdr, sizeof(struct tcp_hdr)/4); - TCPH_FLAGS_SET(tcphdr, headerflags); - tcphdr->wnd = htons(wnd); - - if (data_len > 0) { - /* let p point to TCP data */ - pbuf_header(p, -(s16_t)sizeof(struct tcp_hdr)); - /* copy data */ - pbuf_take(p, data, data_len); - /* let p point to TCP header again */ - pbuf_header(p, sizeof(struct tcp_hdr)); - } - - /* calculate checksum */ - - tcphdr->chksum = inet_chksum_pseudo(p, src_ip, dst_ip, - IP_PROTO_TCP, p->tot_len); - - pbuf_header(p, sizeof(struct ip_hdr)); - - return p; -} - -/** Create a TCP segment usable for passing to tcp_input */ -struct pbuf* -tcp_create_segment(ip_addr_t* src_ip, ip_addr_t* dst_ip, - u16_t src_port, u16_t dst_port, void* data, size_t data_len, - u32_t seqno, u32_t ackno, u8_t headerflags) -{ - return tcp_create_segment_wnd(src_ip, dst_ip, src_port, dst_port, data, - data_len, seqno, ackno, headerflags, TCP_WND); -} - -/** Create a TCP segment usable for passing to tcp_input - * - IP-addresses, ports, seqno and ackno are taken from pcb - * - seqno and ackno can be altered with an offset - */ -struct pbuf* -tcp_create_rx_segment(struct tcp_pcb* pcb, void* data, size_t data_len, u32_t seqno_offset, - u32_t ackno_offset, u8_t headerflags) -{ - return tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port, - data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags); -} - -/** Create a TCP segment usable for passing to tcp_input - * - IP-addresses, ports, seqno and ackno are taken from pcb - * - seqno and ackno can be altered with an offset - * - TCP window can be adjusted - */ -struct pbuf* tcp_create_rx_segment_wnd(struct tcp_pcb* pcb, void* data, size_t data_len, - u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags, u16_t wnd) -{ - return tcp_create_segment_wnd(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port, - data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags, wnd); -} - -/** Safely bring a tcp_pcb into the requested state */ -void -tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip, - ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port) -{ - /* @todo: are these all states? */ - /* @todo: remove from previous list */ - pcb->state = state; - if (state == ESTABLISHED) { - TCP_REG(&tcp_active_pcbs, pcb); - pcb->local_ip.addr = local_ip->addr; - pcb->local_port = local_port; - pcb->remote_ip.addr = remote_ip->addr; - pcb->remote_port = remote_port; - } else if(state == LISTEN) { - TCP_REG(&tcp_listen_pcbs.pcbs, pcb); - pcb->local_ip.addr = local_ip->addr; - pcb->local_port = local_port; - } else if(state == TIME_WAIT) { - TCP_REG(&tcp_tw_pcbs, pcb); - pcb->local_ip.addr = local_ip->addr; - pcb->local_port = local_port; - pcb->remote_ip.addr = remote_ip->addr; - pcb->remote_port = remote_port; - } else { - fail(); - } -} - -void -test_tcp_counters_err(void* arg, err_t err) -{ - struct test_tcp_counters* counters = arg; - EXPECT_RET(arg != NULL); - counters->err_calls++; - counters->last_err = err; -} - -static void -test_tcp_counters_check_rxdata(struct test_tcp_counters* counters, struct pbuf* p) -{ - struct pbuf* q; - u32_t i, received; - if(counters->expected_data == NULL) { - /* no data to compare */ - return; - } - EXPECT_RET(counters->recved_bytes + p->tot_len <= counters->expected_data_len); - received = counters->recved_bytes; - for(q = p; q != NULL; q = q->next) { - char *data = q->payload; - for(i = 0; i < q->len; i++) { - EXPECT_RET(data[i] == counters->expected_data[received]); - received++; - } - } - EXPECT(received == counters->recved_bytes + p->tot_len); -} - -err_t -test_tcp_counters_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err) -{ - struct test_tcp_counters* counters = arg; - EXPECT_RETX(arg != NULL, ERR_OK); - EXPECT_RETX(pcb != NULL, ERR_OK); - EXPECT_RETX(err == ERR_OK, ERR_OK); - - if (p != NULL) { - if (counters->close_calls == 0) { - counters->recv_calls++; - test_tcp_counters_check_rxdata(counters, p); - counters->recved_bytes += p->tot_len; - } else { - counters->recv_calls_after_close++; - counters->recved_bytes_after_close += p->tot_len; - } - pbuf_free(p); - } else { - counters->close_calls++; - } - EXPECT(counters->recv_calls_after_close == 0 && counters->recved_bytes_after_close == 0); - return ERR_OK; -} - -/** Allocate a pcb and set up the test_tcp_counters_* callbacks */ -struct tcp_pcb* -test_tcp_new_counters_pcb(struct test_tcp_counters* counters) -{ - struct tcp_pcb* pcb = tcp_new(); - if (pcb != NULL) { - /* set up args and callbacks */ - tcp_arg(pcb, counters); - tcp_recv(pcb, test_tcp_counters_recv); - tcp_err(pcb, test_tcp_counters_err); - pcb->snd_wnd = TCP_WND; - pcb->snd_wnd_max = TCP_WND; - } - return pcb; -} - -/** Calls tcp_input() after adjusting current_iphdr_dest */ -void test_tcp_input(struct pbuf *p, struct netif *inp) -{ - struct ip_hdr *iphdr = (struct ip_hdr*)p->payload; - ip_addr_copy(current_iphdr_dest, iphdr->dest); - ip_addr_copy(current_iphdr_src, iphdr->src); - current_netif = inp; - current_header = iphdr; - - tcp_input(p, inp); - - current_iphdr_dest.addr = 0; - current_iphdr_src.addr = 0; - current_netif = NULL; - current_header = NULL; -} - -static err_t test_tcp_netif_output(struct netif *netif, struct pbuf *p, - ip_addr_t *ipaddr) -{ - struct test_tcp_txcounters *txcounters = (struct test_tcp_txcounters*)netif->state; - LWIP_UNUSED_ARG(ipaddr); - txcounters->num_tx_calls++; - txcounters->num_tx_bytes += p->tot_len; - if (txcounters->copy_tx_packets) { - struct pbuf *p_copy = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); - err_t err; - EXPECT(p_copy != NULL); - err = pbuf_copy(p_copy, p); - EXPECT(err == ERR_OK); - if (txcounters->tx_packets == NULL) { - txcounters->tx_packets = p_copy; - } else { - pbuf_cat(txcounters->tx_packets, p_copy); - } - } - return ERR_OK; -} - -void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters, - ip_addr_t *ip_addr, ip_addr_t *netmask) -{ - struct netif *n; - memset(netif, 0, sizeof(struct netif)); - memset(txcounters, 0, sizeof(struct test_tcp_txcounters)); - netif->output = test_tcp_netif_output; - netif->state = txcounters; - netif->flags |= NETIF_FLAG_UP; - ip_addr_copy(netif->netmask, *netmask); - ip_addr_copy(netif->ip_addr, *ip_addr); - for (n = netif_list; n != NULL; n = n->next) { - if (n == netif) { - return; - } - } - netif->next = NULL; - netif_list = netif; -} diff --git a/ext/lwip/test/unit/tcp/tcp_helper.h b/ext/lwip/test/unit/tcp/tcp_helper.h deleted file mode 100644 index 4a72c9358..000000000 --- a/ext/lwip/test/unit/tcp/tcp_helper.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef __TCP_HELPER_H__ -#define __TCP_HELPER_H__ - -#include "../lwip_check.h" -#include "lwip/arch.h" -#include "lwip/tcp.h" -#include "lwip/netif.h" - -/* counters used for test_tcp_counters_* callback functions */ -struct test_tcp_counters { - u32_t recv_calls; - u32_t recved_bytes; - u32_t recv_calls_after_close; - u32_t recved_bytes_after_close; - u32_t close_calls; - u32_t err_calls; - err_t last_err; - char* expected_data; - u32_t expected_data_len; -}; - -struct test_tcp_txcounters { - u32_t num_tx_calls; - u32_t num_tx_bytes; - u8_t copy_tx_packets; - struct pbuf *tx_packets; -}; - -/* Helper functions */ -void tcp_remove_all(void); - -struct pbuf* tcp_create_segment(ip_addr_t* src_ip, ip_addr_t* dst_ip, - u16_t src_port, u16_t dst_port, void* data, size_t data_len, - u32_t seqno, u32_t ackno, u8_t headerflags); -struct pbuf* tcp_create_rx_segment(struct tcp_pcb* pcb, void* data, size_t data_len, - u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags); -struct pbuf* tcp_create_rx_segment_wnd(struct tcp_pcb* pcb, void* data, size_t data_len, - u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags, u16_t wnd); -void tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip, - ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port); -void test_tcp_counters_err(void* arg, err_t err); -err_t test_tcp_counters_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err); - -struct tcp_pcb* test_tcp_new_counters_pcb(struct test_tcp_counters* counters); - -void test_tcp_input(struct pbuf *p, struct netif *inp); - -void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters, - ip_addr_t *ip_addr, ip_addr_t *netmask); - - -#endif diff --git a/ext/lwip/test/unit/tcp/test_tcp.c b/ext/lwip/test/unit/tcp/test_tcp.c deleted file mode 100644 index 6fd5be506..000000000 --- a/ext/lwip/test/unit/tcp/test_tcp.c +++ /dev/null @@ -1,667 +0,0 @@ -#include "test_tcp.h" - -#include "lwip/tcp_impl.h" -#include "lwip/stats.h" -#include "tcp_helper.h" - -#ifdef _MSC_VER -#pragma warning(disable: 4307) /* we explicitly wrap around TCP seqnos */ -#endif - -#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS -#error "This tests needs TCP- and MEMP-statistics enabled" -#endif -#if TCP_SND_BUF <= TCP_WND -#error "This tests needs TCP_SND_BUF to be > TCP_WND" -#endif - -static u8_t test_tcp_timer; - -/* our own version of tcp_tmr so we can reset fast/slow timer state */ -static void -test_tcp_tmr(void) -{ - tcp_fasttmr(); - if (++test_tcp_timer & 1) { - tcp_slowtmr(); - } -} - -/* Setups/teardown functions */ - -static void -tcp_setup(void) -{ - /* reset iss to default (6510) */ - tcp_ticks = 0; - tcp_ticks = 0 - (tcp_next_iss() - 6510); - tcp_next_iss(); - tcp_ticks = 0; - - test_tcp_timer = 0; - tcp_remove_all(); -} - -static void -tcp_teardown(void) -{ - netif_list = NULL; - tcp_remove_all(); -} - - -/* Test functions */ - -/** Call tcp_new() and tcp_abort() and test memp stats */ -START_TEST(test_tcp_new_abort) -{ - struct tcp_pcb* pcb; - LWIP_UNUSED_ARG(_i); - - fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 0); - - pcb = tcp_new(); - fail_unless(pcb != NULL); - if (pcb != NULL) { - fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 0); - } -} -END_TEST - -/** Create an ESTABLISHED pcb and check if receive callback is called */ -START_TEST(test_tcp_recv_inseq) -{ - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf* p; - char data[] = {1, 2, 3, 4}; - ip_addr_t remote_ip, local_ip; - u16_t data_len; - u16_t remote_port = 0x100, local_port = 0x101; - struct netif netif; - LWIP_UNUSED_ARG(_i); - - /* initialize local vars */ - memset(&netif, 0, sizeof(netif)); - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - data_len = sizeof(data); - /* initialize counter struct */ - memset(&counters, 0, sizeof(counters)); - counters.expected_data_len = data_len; - counters.expected_data = data; - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - - /* create a segment */ - p = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0); - EXPECT(p != NULL); - if (p != NULL) { - /* pass the segment to tcp_input */ - test_tcp_input(p, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 1); - EXPECT(counters.recved_bytes == data_len); - EXPECT(counters.err_calls == 0); - } - - /* make sure the pcb is freed */ - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} -END_TEST - -/** Provoke fast retransmission by duplicate ACKs and then recover by ACKing all sent data. - * At the end, send more data. */ -START_TEST(test_tcp_fast_retx_recover) -{ - struct netif netif; - struct test_tcp_txcounters txcounters; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf* p; - char data1[] = { 1, 2, 3, 4}; - char data2[] = { 5, 6, 7, 8}; - char data3[] = { 9, 10, 11, 12}; - char data4[] = {13, 14, 15, 16}; - char data5[] = {17, 18, 19, 20}; - char data6[] = {21, 22, 23, 24}; - ip_addr_t remote_ip, local_ip, netmask; - u16_t remote_port = 0x100, local_port = 0x101; - err_t err; - LWIP_UNUSED_ARG(_i); - - /* initialize local vars */ - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - IP4_ADDR(&netmask, 255, 255, 255, 0); - test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); - memset(&counters, 0, sizeof(counters)); - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->mss = TCP_MSS; - /* disable initial congestion window (we don't send a SYN here...) */ - pcb->cwnd = pcb->snd_wnd; - - /* send data1 */ - err = tcp_write(pcb, data1, sizeof(data1), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - EXPECT_RET(txcounters.num_tx_calls == 1); - EXPECT_RET(txcounters.num_tx_bytes == sizeof(data1) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr)); - memset(&txcounters, 0, sizeof(txcounters)); - /* "recv" ACK for data1 */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 4, TCP_ACK); - EXPECT_RET(p != NULL); - test_tcp_input(p, &netif); - EXPECT_RET(txcounters.num_tx_calls == 0); - EXPECT_RET(pcb->unacked == NULL); - /* send data2 */ - err = tcp_write(pcb, data2, sizeof(data2), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - EXPECT_RET(txcounters.num_tx_calls == 1); - EXPECT_RET(txcounters.num_tx_bytes == sizeof(data2) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr)); - memset(&txcounters, 0, sizeof(txcounters)); - /* duplicate ACK for data1 (data2 is lost) */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); - EXPECT_RET(p != NULL); - test_tcp_input(p, &netif); - EXPECT_RET(txcounters.num_tx_calls == 0); - EXPECT_RET(pcb->dupacks == 1); - /* send data3 */ - err = tcp_write(pcb, data3, sizeof(data3), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - /* nagle enabled, no tx calls */ - EXPECT_RET(txcounters.num_tx_calls == 0); - EXPECT_RET(txcounters.num_tx_bytes == 0); - memset(&txcounters, 0, sizeof(txcounters)); - /* 2nd duplicate ACK for data1 (data2 and data3 are lost) */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); - EXPECT_RET(p != NULL); - test_tcp_input(p, &netif); - EXPECT_RET(txcounters.num_tx_calls == 0); - EXPECT_RET(pcb->dupacks == 2); - /* queue data4, don't send it (unsent-oversize is != 0) */ - err = tcp_write(pcb, data4, sizeof(data4), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - /* 3nd duplicate ACK for data1 (data2 and data3 are lost) -> fast retransmission */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); - EXPECT_RET(p != NULL); - test_tcp_input(p, &netif); - /*EXPECT_RET(txcounters.num_tx_calls == 1);*/ - EXPECT_RET(pcb->dupacks == 3); - memset(&txcounters, 0, sizeof(txcounters)); - /* TODO: check expected data?*/ - - /* send data5, not output yet */ - err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - /*err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK);*/ - EXPECT_RET(txcounters.num_tx_calls == 0); - EXPECT_RET(txcounters.num_tx_bytes == 0); - memset(&txcounters, 0, sizeof(txcounters)); - { - int i = 0; - do - { - err = tcp_write(pcb, data6, TCP_MSS, TCP_WRITE_FLAG_COPY); - i++; - }while(err == ERR_OK); - EXPECT_RET(err != ERR_OK); - } - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - /*EXPECT_RET(txcounters.num_tx_calls == 0); - EXPECT_RET(txcounters.num_tx_bytes == 0);*/ - memset(&txcounters, 0, sizeof(txcounters)); - - /* send even more data */ - err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - /* ...and even more data */ - err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - /* ...and even more data */ - err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - /* ...and even more data */ - err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - - /* send ACKs for data2 and data3 */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 12, TCP_ACK); - EXPECT_RET(p != NULL); - test_tcp_input(p, &netif); - /*EXPECT_RET(txcounters.num_tx_calls == 0);*/ - - /* ...and even more data */ - err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - /* ...and even more data */ - err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - -#if 0 - /* create expected segment */ - p1 = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0); - EXPECT_RET(p != NULL); - if (p != NULL) { - /* pass the segment to tcp_input */ - test_tcp_input(p, &netif); - /* check if counters are as expected */ - EXPECT_RET(counters.close_calls == 0); - EXPECT_RET(counters.recv_calls == 1); - EXPECT_RET(counters.recved_bytes == data_len); - EXPECT_RET(counters.err_calls == 0); - } -#endif - /* make sure the pcb is freed */ - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} -END_TEST - -static u8_t tx_data[TCP_WND*2]; - -static void -check_seqnos(struct tcp_seg *segs, int num_expected, u32_t *seqnos_expected) -{ - struct tcp_seg *s = segs; - int i; - for (i = 0; i < num_expected; i++, s = s->next) { - EXPECT_RET(s != NULL); - EXPECT(s->tcphdr->seqno == htonl(seqnos_expected[i])); - } - EXPECT(s == NULL); -} - -/** Send data with sequence numbers that wrap around the u32_t range. - * Then, provoke fast retransmission by duplicate ACKs and check that all - * segment lists are still properly sorted. */ -START_TEST(test_tcp_fast_rexmit_wraparound) -{ - struct netif netif; - struct test_tcp_txcounters txcounters; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf* p; - ip_addr_t remote_ip, local_ip, netmask; - u16_t remote_port = 0x100, local_port = 0x101; - err_t err; -#define SEQNO1 (0xFFFFFF00 - TCP_MSS) -#define ISS 6510 - u16_t i, sent_total = 0; - u32_t seqnos[] = { - SEQNO1, - SEQNO1 + (1 * TCP_MSS), - SEQNO1 + (2 * TCP_MSS), - SEQNO1 + (3 * TCP_MSS), - SEQNO1 + (4 * TCP_MSS), - SEQNO1 + (5 * TCP_MSS)}; - LWIP_UNUSED_ARG(_i); - - for (i = 0; i < sizeof(tx_data); i++) { - tx_data[i] = (u8_t)i; - } - - /* initialize local vars */ - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - IP4_ADDR(&netmask, 255, 255, 255, 0); - test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); - memset(&counters, 0, sizeof(counters)); - - /* create and initialize the pcb */ - tcp_ticks = SEQNO1 - ISS; - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - EXPECT(pcb->lastack == SEQNO1); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->mss = TCP_MSS; - /* disable initial congestion window (we don't send a SYN here...) */ - pcb->cwnd = 2*TCP_MSS; - - /* send 6 mss-sized segments */ - for (i = 0; i < 6; i++) { - err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - sent_total += TCP_MSS; - } - check_seqnos(pcb->unsent, 6, seqnos); - EXPECT(pcb->unacked == NULL); - err = tcp_output(pcb); - EXPECT(txcounters.num_tx_calls == 2); - EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U)); - memset(&txcounters, 0, sizeof(txcounters)); - - check_seqnos(pcb->unacked, 2, seqnos); - check_seqnos(pcb->unsent, 4, &seqnos[2]); - - /* ACK the first segment */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, TCP_MSS, TCP_ACK); - test_tcp_input(p, &netif); - /* ensure this didn't trigger a retransmission */ - EXPECT(txcounters.num_tx_calls == 1); - EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U); - memset(&txcounters, 0, sizeof(txcounters)); - check_seqnos(pcb->unacked, 2, &seqnos[1]); - check_seqnos(pcb->unsent, 3, &seqnos[3]); - - /* 3 dupacks */ - EXPECT(pcb->dupacks == 0); - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); - test_tcp_input(p, &netif); - EXPECT(txcounters.num_tx_calls == 0); - EXPECT(pcb->dupacks == 1); - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); - test_tcp_input(p, &netif); - EXPECT(txcounters.num_tx_calls == 0); - EXPECT(pcb->dupacks == 2); - /* 3rd dupack -> fast rexmit */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); - test_tcp_input(p, &netif); - EXPECT(pcb->dupacks == 3); - EXPECT(txcounters.num_tx_calls == 4); - memset(&txcounters, 0, sizeof(txcounters)); - EXPECT(pcb->unsent == NULL); - check_seqnos(pcb->unacked, 5, &seqnos[1]); - - /* make sure the pcb is freed */ - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} -END_TEST - -/** Send data with sequence numbers that wrap around the u32_t range. - * Then, provoke RTO retransmission and check that all - * segment lists are still properly sorted. */ -START_TEST(test_tcp_rto_rexmit_wraparound) -{ - struct netif netif; - struct test_tcp_txcounters txcounters; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - ip_addr_t remote_ip, local_ip, netmask; - u16_t remote_port = 0x100, local_port = 0x101; - err_t err; -#define SEQNO1 (0xFFFFFF00 - TCP_MSS) -#define ISS 6510 - u16_t i, sent_total = 0; - u32_t seqnos[] = { - SEQNO1, - SEQNO1 + (1 * TCP_MSS), - SEQNO1 + (2 * TCP_MSS), - SEQNO1 + (3 * TCP_MSS), - SEQNO1 + (4 * TCP_MSS), - SEQNO1 + (5 * TCP_MSS)}; - LWIP_UNUSED_ARG(_i); - - for (i = 0; i < sizeof(tx_data); i++) { - tx_data[i] = (u8_t)i; - } - - /* initialize local vars */ - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - IP4_ADDR(&netmask, 255, 255, 255, 0); - test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); - memset(&counters, 0, sizeof(counters)); - - /* create and initialize the pcb */ - tcp_ticks = 0; - tcp_ticks = 0 - tcp_next_iss(); - tcp_ticks = SEQNO1 - tcp_next_iss(); - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - EXPECT(pcb->lastack == SEQNO1); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->mss = TCP_MSS; - /* disable initial congestion window (we don't send a SYN here...) */ - pcb->cwnd = 2*TCP_MSS; - - /* send 6 mss-sized segments */ - for (i = 0; i < 6; i++) { - err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - sent_total += TCP_MSS; - } - check_seqnos(pcb->unsent, 6, seqnos); - EXPECT(pcb->unacked == NULL); - err = tcp_output(pcb); - EXPECT(txcounters.num_tx_calls == 2); - EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U)); - memset(&txcounters, 0, sizeof(txcounters)); - - check_seqnos(pcb->unacked, 2, seqnos); - check_seqnos(pcb->unsent, 4, &seqnos[2]); - - /* call the tcp timer some times */ - for (i = 0; i < 10; i++) { - test_tcp_tmr(); - EXPECT(txcounters.num_tx_calls == 0); - } - /* 11th call to tcp_tmr: RTO rexmit fires */ - test_tcp_tmr(); - EXPECT(txcounters.num_tx_calls == 1); - check_seqnos(pcb->unacked, 1, seqnos); - check_seqnos(pcb->unsent, 5, &seqnos[1]); - - /* fake greater cwnd */ - pcb->cwnd = pcb->snd_wnd; - /* send more data */ - err = tcp_output(pcb); - EXPECT(err == ERR_OK); - /* check queues are sorted */ - EXPECT(pcb->unsent == NULL); - check_seqnos(pcb->unacked, 6, seqnos); - - /* make sure the pcb is freed */ - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} -END_TEST - -/** Provoke fast retransmission by duplicate ACKs and then recover by ACKing all sent data. - * At the end, send more data. */ -static void test_tcp_tx_full_window_lost(u8_t zero_window_probe_from_unsent) -{ - struct netif netif; - struct test_tcp_txcounters txcounters; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf *p; - ip_addr_t remote_ip, local_ip, netmask; - u16_t remote_port = 0x100, local_port = 0x101; - err_t err; - u16_t sent_total, i; - u8_t expected = 0xFE; - - for (i = 0; i < sizeof(tx_data); i++) { - u8_t d = (u8_t)i; - if (d == 0xFE) { - d = 0xF0; - } - tx_data[i] = d; - } - if (zero_window_probe_from_unsent) { - tx_data[TCP_WND] = expected; - } else { - tx_data[0] = expected; - } - - /* initialize local vars */ - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - IP4_ADDR(&netmask, 255, 255, 255, 0); - test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); - memset(&counters, 0, sizeof(counters)); - memset(&txcounters, 0, sizeof(txcounters)); - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->mss = TCP_MSS; - /* disable initial congestion window (we don't send a SYN here...) */ - pcb->cwnd = pcb->snd_wnd; - - /* send a full window (minus 1 packets) of TCP data in MSS-sized chunks */ - sent_total = 0; - if ((TCP_WND - TCP_MSS) % TCP_MSS != 0) { - u16_t initial_data_len = (TCP_WND - TCP_MSS) % TCP_MSS; - err = tcp_write(pcb, &tx_data[sent_total], initial_data_len, TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - EXPECT(txcounters.num_tx_calls == 1); - EXPECT(txcounters.num_tx_bytes == initial_data_len + 40U); - memset(&txcounters, 0, sizeof(txcounters)); - sent_total += initial_data_len; - } - for (; sent_total < (TCP_WND - TCP_MSS); sent_total += TCP_MSS) { - err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - EXPECT(txcounters.num_tx_calls == 1); - EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U); - memset(&txcounters, 0, sizeof(txcounters)); - } - EXPECT(sent_total == (TCP_WND - TCP_MSS)); - - /* now ACK the packet before the first */ - p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); - test_tcp_input(p, &netif); - /* ensure this didn't trigger a retransmission */ - EXPECT(txcounters.num_tx_calls == 0); - EXPECT(txcounters.num_tx_bytes == 0); - - EXPECT(pcb->persist_backoff == 0); - /* send the last packet, now a complete window has been sent */ - err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); - sent_total += TCP_MSS; - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - EXPECT(txcounters.num_tx_calls == 1); - EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U); - memset(&txcounters, 0, sizeof(txcounters)); - EXPECT(pcb->persist_backoff == 0); - - if (zero_window_probe_from_unsent) { - /* ACK all data but close the TX window */ - p = tcp_create_rx_segment_wnd(pcb, NULL, 0, 0, TCP_WND, TCP_ACK, 0); - test_tcp_input(p, &netif); - /* ensure this didn't trigger any transmission */ - EXPECT(txcounters.num_tx_calls == 0); - EXPECT(txcounters.num_tx_bytes == 0); - EXPECT(pcb->persist_backoff == 1); - } - - /* send one byte more (out of window) -> persist timer starts */ - err = tcp_write(pcb, &tx_data[sent_total], 1, TCP_WRITE_FLAG_COPY); - EXPECT_RET(err == ERR_OK); - err = tcp_output(pcb); - EXPECT_RET(err == ERR_OK); - EXPECT(txcounters.num_tx_calls == 0); - EXPECT(txcounters.num_tx_bytes == 0); - memset(&txcounters, 0, sizeof(txcounters)); - if (!zero_window_probe_from_unsent) { - /* no persist timer unless a zero window announcement has been received */ - EXPECT(pcb->persist_backoff == 0); - } else { - EXPECT(pcb->persist_backoff == 1); - - /* call tcp_timer some more times to let persist timer count up */ - for (i = 0; i < 4; i++) { - test_tcp_tmr(); - EXPECT(txcounters.num_tx_calls == 0); - EXPECT(txcounters.num_tx_bytes == 0); - } - - /* this should trigger the zero-window-probe */ - txcounters.copy_tx_packets = 1; - test_tcp_tmr(); - txcounters.copy_tx_packets = 0; - EXPECT(txcounters.num_tx_calls == 1); - EXPECT(txcounters.num_tx_bytes == 1 + 40U); - EXPECT(txcounters.tx_packets != NULL); - if (txcounters.tx_packets != NULL) { - u8_t sent; - u16_t ret; - ret = pbuf_copy_partial(txcounters.tx_packets, &sent, 1, 40U); - EXPECT(ret == 1); - EXPECT(sent == expected); - } - if (txcounters.tx_packets != NULL) { - pbuf_free(txcounters.tx_packets); - txcounters.tx_packets = NULL; - } - } - - /* make sure the pcb is freed */ - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} - -START_TEST(test_tcp_tx_full_window_lost_from_unsent) -{ - LWIP_UNUSED_ARG(_i); - test_tcp_tx_full_window_lost(1); -} -END_TEST - -START_TEST(test_tcp_tx_full_window_lost_from_unacked) -{ - LWIP_UNUSED_ARG(_i); - test_tcp_tx_full_window_lost(0); -} -END_TEST - -/** Create the suite including all tests for this module */ -Suite * -tcp_suite(void) -{ - TFun tests[] = { - test_tcp_new_abort, - test_tcp_recv_inseq, - test_tcp_fast_retx_recover, - test_tcp_fast_rexmit_wraparound, - test_tcp_rto_rexmit_wraparound, - test_tcp_tx_full_window_lost_from_unacked, - test_tcp_tx_full_window_lost_from_unsent - }; - return create_suite("TCP", tests, sizeof(tests)/sizeof(TFun), tcp_setup, tcp_teardown); -} diff --git a/ext/lwip/test/unit/tcp/test_tcp.h b/ext/lwip/test/unit/tcp/test_tcp.h deleted file mode 100644 index f1c4a463f..000000000 --- a/ext/lwip/test/unit/tcp/test_tcp.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __TEST_TCP_H__ -#define __TEST_TCP_H__ - -#include "../lwip_check.h" - -Suite *tcp_suite(void); - -#endif diff --git a/ext/lwip/test/unit/tcp/test_tcp_oos.c b/ext/lwip/test/unit/tcp/test_tcp_oos.c deleted file mode 100644 index 764de1c43..000000000 --- a/ext/lwip/test/unit/tcp/test_tcp_oos.c +++ /dev/null @@ -1,944 +0,0 @@ -#include "test_tcp_oos.h" - -#include "lwip/tcp_impl.h" -#include "lwip/stats.h" -#include "tcp_helper.h" - -#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS -#error "This tests needs TCP- and MEMP-statistics enabled" -#endif -#if !TCP_QUEUE_OOSEQ -#error "This tests needs TCP_QUEUE_OOSEQ enabled" -#endif - -/** CHECK_SEGMENTS_ON_OOSEQ: - * 1: check count, seqno and len of segments on pcb->ooseq (strict) - * 0: only check that bytes are received in correct order (less strict) */ -#define CHECK_SEGMENTS_ON_OOSEQ 1 - -#if CHECK_SEGMENTS_ON_OOSEQ -#define EXPECT_OOSEQ(x) EXPECT(x) -#else -#define EXPECT_OOSEQ(x) -#endif - -/* helper functions */ - -/** Get the numbers of segments on the ooseq list */ -static int tcp_oos_count(struct tcp_pcb* pcb) -{ - int num = 0; - struct tcp_seg* seg = pcb->ooseq; - while(seg != NULL) { - num++; - seg = seg->next; - } - return num; -} - -/** Get the numbers of pbufs on the ooseq list */ -static int tcp_oos_pbuf_count(struct tcp_pcb* pcb) -{ - int num = 0; - struct tcp_seg* seg = pcb->ooseq; - while(seg != NULL) { - num += pbuf_clen(seg->p); - seg = seg->next; - } - return num; -} - -/** Get the seqno of a segment (by index) on the ooseq list - * - * @param pcb the pcb to check for ooseq segments - * @param seg_index index of the segment on the ooseq list - * @return seqno of the segment - */ -static u32_t -tcp_oos_seg_seqno(struct tcp_pcb* pcb, int seg_index) -{ - int num = 0; - struct tcp_seg* seg = pcb->ooseq; - - /* then check the actual segment */ - while(seg != NULL) { - if(num == seg_index) { - return seg->tcphdr->seqno; - } - num++; - seg = seg->next; - } - fail(); - return 0; -} - -/** Get the tcplen (datalen + SYN/FIN) of a segment (by index) on the ooseq list - * - * @param pcb the pcb to check for ooseq segments - * @param seg_index index of the segment on the ooseq list - * @return tcplen of the segment - */ -static int -tcp_oos_seg_tcplen(struct tcp_pcb* pcb, int seg_index) -{ - int num = 0; - struct tcp_seg* seg = pcb->ooseq; - - /* then check the actual segment */ - while(seg != NULL) { - if(num == seg_index) { - return TCP_TCPLEN(seg); - } - num++; - seg = seg->next; - } - fail(); - return -1; -} - -/** Get the tcplen (datalen + SYN/FIN) of all segments on the ooseq list - * - * @param pcb the pcb to check for ooseq segments - * @return tcplen of all segment - */ -static int -tcp_oos_tcplen(struct tcp_pcb* pcb) -{ - int len = 0; - struct tcp_seg* seg = pcb->ooseq; - - /* then check the actual segment */ - while(seg != NULL) { - len += TCP_TCPLEN(seg); - seg = seg->next; - } - return len; -} - -/* Setup/teardown functions */ - -static void -tcp_oos_setup(void) -{ - tcp_remove_all(); -} - -static void -tcp_oos_teardown(void) -{ - tcp_remove_all(); -} - - - -/* Test functions */ - -/** create multiple segments and pass them to tcp_input in a wrong - * order to see if ooseq-caching works correctly - * FIN is received in out-of-sequence segments only */ -START_TEST(test_tcp_recv_ooseq_FIN_OOSEQ) -{ - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf *p_8_9, *p_4_8, *p_4_10, *p_2_14, *p_fin, *pinseq; - char data[] = { - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16}; - ip_addr_t remote_ip, local_ip; - u16_t data_len; - u16_t remote_port = 0x100, local_port = 0x101; - struct netif netif; - LWIP_UNUSED_ARG(_i); - - /* initialize local vars */ - memset(&netif, 0, sizeof(netif)); - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - data_len = sizeof(data); - /* initialize counter struct */ - memset(&counters, 0, sizeof(counters)); - counters.expected_data_len = data_len; - counters.expected_data = data; - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - - /* create segments */ - /* pinseq is sent as last segment! */ - pinseq = tcp_create_rx_segment(pcb, &data[0], 4, 0, 0, TCP_ACK); - /* p1: 8 bytes before FIN */ - /* seqno: 8..16 */ - p_8_9 = tcp_create_rx_segment(pcb, &data[8], 8, 8, 0, TCP_ACK|TCP_FIN); - /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */ - /* seqno: 4..11 */ - p_4_8 = tcp_create_rx_segment(pcb, &data[4], 8, 4, 0, TCP_ACK); - /* p3: same as p2 but 2 bytes longer */ - /* seqno: 4..13 */ - p_4_10 = tcp_create_rx_segment(pcb, &data[4], 10, 4, 0, TCP_ACK); - /* p4: 14 bytes before FIN, includes data from p1 and p2, plus partly from pinseq */ - /* seqno: 2..15 */ - p_2_14 = tcp_create_rx_segment(pcb, &data[2], 14, 2, 0, TCP_ACK); - /* FIN, seqno 16 */ - p_fin = tcp_create_rx_segment(pcb, NULL, 0,16, 0, TCP_ACK|TCP_FIN); - EXPECT(pinseq != NULL); - EXPECT(p_8_9 != NULL); - EXPECT(p_4_8 != NULL); - EXPECT(p_4_10 != NULL); - EXPECT(p_2_14 != NULL); - EXPECT(p_fin != NULL); - if ((pinseq != NULL) && (p_8_9 != NULL) && (p_4_8 != NULL) && (p_4_10 != NULL) && (p_2_14 != NULL) && (p_fin != NULL)) { - /* pass the segment to tcp_input */ - test_tcp_input(p_8_9, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 8); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 9); /* includes FIN */ - - /* pass the segment to tcp_input */ - test_tcp_input(p_4_8, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */ - - /* pass the segment to tcp_input */ - test_tcp_input(p_4_10, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* ooseq queue: unchanged */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */ - - /* pass the segment to tcp_input */ - test_tcp_input(p_2_14, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */ - - /* pass the segment to tcp_input */ - test_tcp_input(p_fin, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* ooseq queue: unchanged */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */ - - /* pass the segment to tcp_input */ - test_tcp_input(pinseq, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 1); - EXPECT(counters.recv_calls == 1); - EXPECT(counters.recved_bytes == data_len); - EXPECT(counters.err_calls == 0); - EXPECT(pcb->ooseq == NULL); - } - - /* make sure the pcb is freed */ - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} -END_TEST - - -/** create multiple segments and pass them to tcp_input in a wrong - * order to see if ooseq-caching works correctly - * FIN is received IN-SEQUENCE at the end */ -START_TEST(test_tcp_recv_ooseq_FIN_INSEQ) -{ - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf *p_1_2, *p_4_8, *p_3_11, *p_2_12, *p_15_1, *p_15_1a, *pinseq, *pinseqFIN; - char data[] = { - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16}; - ip_addr_t remote_ip, local_ip; - u16_t data_len; - u16_t remote_port = 0x100, local_port = 0x101; - struct netif netif; - LWIP_UNUSED_ARG(_i); - - /* initialize local vars */ - memset(&netif, 0, sizeof(netif)); - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - data_len = sizeof(data); - /* initialize counter struct */ - memset(&counters, 0, sizeof(counters)); - counters.expected_data_len = data_len; - counters.expected_data = data; - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - - /* create segments */ - /* p1: 7 bytes - 2 before FIN */ - /* seqno: 1..2 */ - p_1_2 = tcp_create_rx_segment(pcb, &data[1], 2, 1, 0, TCP_ACK); - /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */ - /* seqno: 4..11 */ - p_4_8 = tcp_create_rx_segment(pcb, &data[4], 8, 4, 0, TCP_ACK); - /* p3: same as p2 but 2 bytes longer and one byte more at the front */ - /* seqno: 3..13 */ - p_3_11 = tcp_create_rx_segment(pcb, &data[3], 11, 3, 0, TCP_ACK); - /* p4: 13 bytes - 2 before FIN - should be ignored as contained in p1 and p3 */ - /* seqno: 2..13 */ - p_2_12 = tcp_create_rx_segment(pcb, &data[2], 12, 2, 0, TCP_ACK); - /* pinseq is the first segment that is held back to create ooseq! */ - /* seqno: 0..3 */ - pinseq = tcp_create_rx_segment(pcb, &data[0], 4, 0, 0, TCP_ACK); - /* p5: last byte before FIN */ - /* seqno: 15 */ - p_15_1 = tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK); - /* p6: same as p5, should be ignored */ - p_15_1a= tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK); - /* pinseqFIN: last 2 bytes plus FIN */ - /* only segment containing seqno 14 and FIN */ - pinseqFIN = tcp_create_rx_segment(pcb, &data[14], 2, 14, 0, TCP_ACK|TCP_FIN); - EXPECT(pinseq != NULL); - EXPECT(p_1_2 != NULL); - EXPECT(p_4_8 != NULL); - EXPECT(p_3_11 != NULL); - EXPECT(p_2_12 != NULL); - EXPECT(p_15_1 != NULL); - EXPECT(p_15_1a != NULL); - EXPECT(pinseqFIN != NULL); - if ((pinseq != NULL) && (p_1_2 != NULL) && (p_4_8 != NULL) && (p_3_11 != NULL) && (p_2_12 != NULL) - && (p_15_1 != NULL) && (p_15_1a != NULL) && (pinseqFIN != NULL)) { - /* pass the segment to tcp_input */ - test_tcp_input(p_1_2, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); - - /* pass the segment to tcp_input */ - test_tcp_input(p_4_8, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 4); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 8); - - /* pass the segment to tcp_input */ - test_tcp_input(p_3_11, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); - /* p_3_11 has removed p_4_8 from ooseq */ - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 3); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 11); - - /* pass the segment to tcp_input */ - test_tcp_input(p_2_12, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 2); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 12); - - /* pass the segment to tcp_input */ - test_tcp_input(pinseq, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 1); - EXPECT(counters.recved_bytes == 14); - EXPECT(counters.err_calls == 0); - EXPECT(pcb->ooseq == NULL); - - /* pass the segment to tcp_input */ - test_tcp_input(p_15_1, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 1); - EXPECT(counters.recved_bytes == 14); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); - - /* pass the segment to tcp_input */ - test_tcp_input(p_15_1a, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 1); - EXPECT(counters.recved_bytes == 14); - EXPECT(counters.err_calls == 0); - /* check ooseq queue: unchanged */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); - EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15); - EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); - - /* pass the segment to tcp_input */ - test_tcp_input(pinseqFIN, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 1); - EXPECT(counters.recv_calls == 2); - EXPECT(counters.recved_bytes == data_len); - EXPECT(counters.err_calls == 0); - EXPECT(pcb->ooseq == NULL); - } - - /* make sure the pcb is freed */ - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} -END_TEST - -static char data_full_wnd[TCP_WND]; - -/** create multiple segments and pass them to tcp_input with the first segment missing - * to simulate overruning the rxwin with ooseq queueing enabled */ -START_TEST(test_tcp_recv_ooseq_overrun_rxwin) -{ -#if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS - int i, k; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf *pinseq, *p_ovr; - ip_addr_t remote_ip, local_ip; - u16_t remote_port = 0x100, local_port = 0x101; - struct netif netif; - int datalen = 0; - int datalen2; - - for(i = 0; i < sizeof(data_full_wnd); i++) { - data_full_wnd[i] = (char)i; - } - - /* initialize local vars */ - memset(&netif, 0, sizeof(netif)); - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - /* initialize counter struct */ - memset(&counters, 0, sizeof(counters)); - counters.expected_data_len = TCP_WND; - counters.expected_data = data_full_wnd; - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->rcv_nxt = 0x8000; - - /* create segments */ - /* pinseq is sent as last segment! */ - pinseq = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK); - - for(i = TCP_MSS, k = 0; i < TCP_WND; i += TCP_MSS, k++) { - int count, expected_datalen; - struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], - TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); - EXPECT_RET(p != NULL); - /* pass the segment to tcp_input */ - test_tcp_input(p, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - count = tcp_oos_count(pcb); - EXPECT_OOSEQ(count == k+1); - datalen = tcp_oos_tcplen(pcb); - if (i + TCP_MSS < TCP_WND) { - expected_datalen = (k+1)*TCP_MSS; - } else { - expected_datalen = TCP_WND - TCP_MSS; - } - if (datalen != expected_datalen) { - EXPECT_OOSEQ(datalen == expected_datalen); - } - } - - /* pass in one more segment, cleary overrunning the rxwin */ - p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); - EXPECT_RET(p_ovr != NULL); - /* pass the segment to tcp_input */ - test_tcp_input(p_ovr, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == k); - datalen2 = tcp_oos_tcplen(pcb); - EXPECT_OOSEQ(datalen == datalen2); - - /* now pass inseq */ - test_tcp_input(pinseq, &netif); - EXPECT(pcb->ooseq == NULL); - - /* make sure the pcb is freed */ - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -#endif /* !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS */ - LWIP_UNUSED_ARG(_i); -} -END_TEST - -START_TEST(test_tcp_recv_ooseq_max_bytes) -{ -#if TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) - int i, k; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf *p_ovr; - ip_addr_t remote_ip, local_ip; - u16_t remote_port = 0x100, local_port = 0x101; - struct netif netif; - int datalen = 0; - int datalen2; - - for(i = 0; i < sizeof(data_full_wnd); i++) { - data_full_wnd[i] = (char)i; - } - - /* initialize local vars */ - memset(&netif, 0, sizeof(netif)); - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - /* initialize counter struct */ - memset(&counters, 0, sizeof(counters)); - counters.expected_data_len = TCP_WND; - counters.expected_data = data_full_wnd; - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->rcv_nxt = 0x8000; - - /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */ - - /* create segments and 'recv' them */ - for(k = 1, i = 1; k < TCP_OOSEQ_MAX_BYTES; k += TCP_MSS, i++) { - int count; - struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[k], - TCP_MSS, k, 0, TCP_ACK); - EXPECT_RET(p != NULL); - EXPECT_RET(p->next == NULL); - /* pass the segment to tcp_input */ - test_tcp_input(p, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - count = tcp_oos_pbuf_count(pcb); - EXPECT_OOSEQ(count == i); - datalen = tcp_oos_tcplen(pcb); - EXPECT_OOSEQ(datalen == (i * TCP_MSS)); - } - - /* pass in one more segment, overrunning the limit */ - p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[k+1], 1, k+1, 0, TCP_ACK); - EXPECT_RET(p_ovr != NULL); - /* pass the segment to tcp_input */ - test_tcp_input(p_ovr, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue (ensure the new segment was not accepted) */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1)); - datalen2 = tcp_oos_tcplen(pcb); - EXPECT_OOSEQ(datalen2 == ((i-1) * TCP_MSS)); - - /* make sure the pcb is freed */ - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -#endif /* TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */ - LWIP_UNUSED_ARG(_i); -} -END_TEST - -START_TEST(test_tcp_recv_ooseq_max_pbufs) -{ -#if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) - int i; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf *p_ovr; - ip_addr_t remote_ip, local_ip; - u16_t remote_port = 0x100, local_port = 0x101; - struct netif netif; - int datalen = 0; - int datalen2; - - for(i = 0; i < sizeof(data_full_wnd); i++) { - data_full_wnd[i] = (char)i; - } - - /* initialize local vars */ - memset(&netif, 0, sizeof(netif)); - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - /* initialize counter struct */ - memset(&counters, 0, sizeof(counters)); - counters.expected_data_len = TCP_WND; - counters.expected_data = data_full_wnd; - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->rcv_nxt = 0x8000; - - /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */ - - /* create segments and 'recv' them */ - for(i = 1; i <= TCP_OOSEQ_MAX_PBUFS; i++) { - int count; - struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[i], - 1, i, 0, TCP_ACK); - EXPECT_RET(p != NULL); - EXPECT_RET(p->next == NULL); - /* pass the segment to tcp_input */ - test_tcp_input(p, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue */ - count = tcp_oos_pbuf_count(pcb); - EXPECT_OOSEQ(count == i); - datalen = tcp_oos_tcplen(pcb); - EXPECT_OOSEQ(datalen == i); - } - - /* pass in one more segment, overrunning the limit */ - p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[i+1], 1, i+1, 0, TCP_ACK); - EXPECT_RET(p_ovr != NULL); - /* pass the segment to tcp_input */ - test_tcp_input(p_ovr, &netif); - /* check if counters are as expected */ - EXPECT(counters.close_calls == 0); - EXPECT(counters.recv_calls == 0); - EXPECT(counters.recved_bytes == 0); - EXPECT(counters.err_calls == 0); - /* check ooseq queue (ensure the new segment was not accepted) */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1)); - datalen2 = tcp_oos_tcplen(pcb); - EXPECT_OOSEQ(datalen2 == (i-1)); - - /* make sure the pcb is freed */ - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -#endif /* TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */ - LWIP_UNUSED_ARG(_i); -} -END_TEST - -static void -check_rx_counters(struct tcp_pcb *pcb, struct test_tcp_counters *counters, u32_t exp_close_calls, u32_t exp_rx_calls, - u32_t exp_rx_bytes, u32_t exp_err_calls, int exp_oos_count, int exp_oos_len) -{ - int oos_len; - EXPECT(counters->close_calls == exp_close_calls); - EXPECT(counters->recv_calls == exp_rx_calls); - EXPECT(counters->recved_bytes == exp_rx_bytes); - EXPECT(counters->err_calls == exp_err_calls); - /* check that pbuf is queued in ooseq */ - EXPECT_OOSEQ(tcp_oos_count(pcb) == exp_oos_count); - oos_len = tcp_oos_tcplen(pcb); - EXPECT_OOSEQ(exp_oos_len == oos_len); -} - -/* this test uses 4 packets: - * - data (len=TCP_MSS) - * - FIN - * - data after FIN (len=1) (invalid) - * - 2nd FIN (invalid) - * - * the parameter 'delay_packet' is a bitmask that choses which on these packets is ooseq - */ -static void test_tcp_recv_ooseq_double_FINs(int delay_packet) -{ - int i, k; - struct test_tcp_counters counters; - struct tcp_pcb* pcb; - struct pbuf *p_normal_fin, *p_data_after_fin, *p, *p_2nd_fin_ooseq; - ip_addr_t remote_ip, local_ip; - u16_t remote_port = 0x100, local_port = 0x101; - struct netif netif; - u32_t exp_rx_calls = 0, exp_rx_bytes = 0, exp_close_calls = 0, exp_oos_pbufs = 0, exp_oos_tcplen = 0; - int first_dropped = 0xff; - int last_dropped = 0; - - for(i = 0; i < sizeof(data_full_wnd); i++) { - data_full_wnd[i] = (char)i; - } - - /* initialize local vars */ - memset(&netif, 0, sizeof(netif)); - IP4_ADDR(&local_ip, 192, 168, 1, 1); - IP4_ADDR(&remote_ip, 192, 168, 1, 2); - /* initialize counter struct */ - memset(&counters, 0, sizeof(counters)); - counters.expected_data_len = TCP_WND; - counters.expected_data = data_full_wnd; - - /* create and initialize the pcb */ - pcb = test_tcp_new_counters_pcb(&counters); - EXPECT_RET(pcb != NULL); - tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); - pcb->rcv_nxt = 0x8000; - - /* create segments */ - p = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK); - p_normal_fin = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS, 0, TCP_ACK|TCP_FIN); - k = 1; - p_data_after_fin = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS+1], k, TCP_MSS+1, 0, TCP_ACK); - p_2nd_fin_ooseq = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS+1+k, 0, TCP_ACK|TCP_FIN); - - if(delay_packet & 1) { - /* drop normal data */ - first_dropped = 1; - last_dropped = 1; - } else { - /* send normal data */ - test_tcp_input(p, &netif); - exp_rx_calls++; - exp_rx_bytes += TCP_MSS; - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - if(delay_packet & 2) { - /* drop FIN */ - if(first_dropped > 2) { - first_dropped = 2; - } - last_dropped = 2; - } else { - /* send FIN */ - test_tcp_input(p_normal_fin, &netif); - if (first_dropped < 2) { - /* already dropped packets, this one is ooseq */ - exp_oos_pbufs++; - exp_oos_tcplen++; - } else { - /* inseq */ - exp_close_calls++; - } - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - if(delay_packet & 4) { - /* drop data-after-FIN */ - if(first_dropped > 3) { - first_dropped = 3; - } - last_dropped = 3; - } else { - /* send data-after-FIN */ - test_tcp_input(p_data_after_fin, &netif); - if (first_dropped < 3) { - /* already dropped packets, this one is ooseq */ - if (delay_packet & 2) { - /* correct FIN was ooseq */ - exp_oos_pbufs++; - exp_oos_tcplen += k; - } - } else { - /* inseq: no change */ - } - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - if(delay_packet & 8) { - /* drop 2nd-FIN */ - if(first_dropped > 4) { - first_dropped = 4; - } - last_dropped = 4; - } else { - /* send 2nd-FIN */ - test_tcp_input(p_2nd_fin_ooseq, &netif); - if (first_dropped < 3) { - /* already dropped packets, this one is ooseq */ - if (delay_packet & 2) { - /* correct FIN was ooseq */ - exp_oos_pbufs++; - exp_oos_tcplen++; - } - } else { - /* inseq: no change */ - } - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - if(delay_packet & 1) { - /* dropped normal data before */ - test_tcp_input(p, &netif); - exp_rx_calls++; - exp_rx_bytes += TCP_MSS; - if((delay_packet & 2) == 0) { - /* normal FIN was NOT delayed */ - exp_close_calls++; - exp_oos_pbufs = exp_oos_tcplen = 0; - } - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - if(delay_packet & 2) { - /* dropped normal FIN before */ - test_tcp_input(p_normal_fin, &netif); - exp_close_calls++; - exp_oos_pbufs = exp_oos_tcplen = 0; - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - if(delay_packet & 4) { - /* dropped data-after-FIN before */ - test_tcp_input(p_data_after_fin, &netif); - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - if(delay_packet & 8) { - /* dropped 2nd-FIN before */ - test_tcp_input(p_2nd_fin_ooseq, &netif); - } - /* check if counters are as expected */ - check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); - - /* check that ooseq data has been dumped */ - EXPECT(pcb->ooseq == NULL); - - /* make sure the pcb is freed */ - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); - tcp_abort(pcb); - EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); -} - -/** create multiple segments and pass them to tcp_input with the first segment missing - * to simulate overruning the rxwin with ooseq queueing enabled */ -#define FIN_TEST(name, num) \ - START_TEST(name) \ - { \ - LWIP_UNUSED_ARG(_i); \ - test_tcp_recv_ooseq_double_FINs(num); \ - } \ - END_TEST -FIN_TEST(test_tcp_recv_ooseq_double_FIN_0, 0) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_1, 1) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_2, 2) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_3, 3) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_4, 4) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_5, 5) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_6, 6) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_7, 7) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_8, 8) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_9, 9) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_10, 10) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_11, 11) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_12, 12) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_13, 13) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_14, 14) -FIN_TEST(test_tcp_recv_ooseq_double_FIN_15, 15) - - -/** Create the suite including all tests for this module */ -Suite * -tcp_oos_suite(void) -{ - TFun tests[] = { - test_tcp_recv_ooseq_FIN_OOSEQ, - test_tcp_recv_ooseq_FIN_INSEQ, - test_tcp_recv_ooseq_overrun_rxwin, - test_tcp_recv_ooseq_max_bytes, - test_tcp_recv_ooseq_max_pbufs, - test_tcp_recv_ooseq_double_FIN_0, - test_tcp_recv_ooseq_double_FIN_1, - test_tcp_recv_ooseq_double_FIN_2, - test_tcp_recv_ooseq_double_FIN_3, - test_tcp_recv_ooseq_double_FIN_4, - test_tcp_recv_ooseq_double_FIN_5, - test_tcp_recv_ooseq_double_FIN_6, - test_tcp_recv_ooseq_double_FIN_7, - test_tcp_recv_ooseq_double_FIN_8, - test_tcp_recv_ooseq_double_FIN_9, - test_tcp_recv_ooseq_double_FIN_10, - test_tcp_recv_ooseq_double_FIN_11, - test_tcp_recv_ooseq_double_FIN_12, - test_tcp_recv_ooseq_double_FIN_13, - test_tcp_recv_ooseq_double_FIN_14, - test_tcp_recv_ooseq_double_FIN_15 - }; - return create_suite("TCP_OOS", tests, sizeof(tests)/sizeof(TFun), tcp_oos_setup, tcp_oos_teardown); -} diff --git a/ext/lwip/test/unit/tcp/test_tcp_oos.h b/ext/lwip/test/unit/tcp/test_tcp_oos.h deleted file mode 100644 index 5e411f009..000000000 --- a/ext/lwip/test/unit/tcp/test_tcp_oos.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __TEST_TCP_OOS_H__ -#define __TEST_TCP_OOS_H__ - -#include "../lwip_check.h" - -Suite *tcp_oos_suite(void); - -#endif diff --git a/ext/lwip/test/unit/udp/test_udp.c b/ext/lwip/test/unit/udp/test_udp.c deleted file mode 100644 index a2f02af06..000000000 --- a/ext/lwip/test/unit/udp/test_udp.c +++ /dev/null @@ -1,68 +0,0 @@ -#include "test_udp.h" - -#include "lwip/udp.h" -#include "lwip/stats.h" - -#if !LWIP_STATS || !UDP_STATS || !MEMP_STATS -#error "This tests needs UDP- and MEMP-statistics enabled" -#endif - -/* Helper functions */ -static void -udp_remove_all(void) -{ - struct udp_pcb *pcb = udp_pcbs; - struct udp_pcb *pcb2; - - while(pcb != NULL) { - pcb2 = pcb; - pcb = pcb->next; - udp_remove(pcb2); - } - fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 0); -} - -/* Setups/teardown functions */ - -static void -udp_setup(void) -{ - udp_remove_all(); -} - -static void -udp_teardown(void) -{ - udp_remove_all(); -} - - -/* Test functions */ - -START_TEST(test_udp_new_remove) -{ - struct udp_pcb* pcb; - LWIP_UNUSED_ARG(_i); - - fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 0); - - pcb = udp_new(); - fail_unless(pcb != NULL); - if (pcb != NULL) { - fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 1); - udp_remove(pcb); - fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 0); - } -} -END_TEST - - -/** Create the suite including all tests for this module */ -Suite * -udp_suite(void) -{ - TFun tests[] = { - test_udp_new_remove, - }; - return create_suite("UDP", tests, sizeof(tests)/sizeof(TFun), udp_setup, udp_teardown); -} diff --git a/ext/lwip/test/unit/udp/test_udp.h b/ext/lwip/test/unit/udp/test_udp.h deleted file mode 100644 index 933536824..000000000 --- a/ext/lwip/test/unit/udp/test_udp.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __TEST_UDP_H__ -#define __TEST_UDP_H__ - -#include "../lwip_check.h" - -Suite* udp_suite(void); - -#endif diff --git a/ext/lwipopts.h b/ext/lwipopts.h index bc8e75704..7a75e79bb 100644 --- a/ext/lwipopts.h +++ b/ext/lwipopts.h @@ -42,31 +42,11 @@ * Include user defined options first. Anything not defined in these files * will be set to standard values. Override anything you dont like! */ -#include "lwipopts.h" #include "lwip/debug.h" - -/* - -#define LWIP_MALLOC_MEMPOOL 1 -*/ - -/* -#define LWIP_CHECKSUM_ON_COPY 1 - -#define TCP_OVERSIZE TCP_MSS -*/ -//#define TCP_SND_QUEUELEN 128 - -//#define TCP_WND - - -//#define PBUF_POOL_BUFSIZE 2048 - - -#define TCP_MSS 2048 -#define TCP_WND 512 +//#define TCP_MSS 2048 +//#define TCP_WND 512 /*------------------------------------------------------------------------------ ---------------------------------- Timers -------------------------------------- diff --git a/make-linux.mk b/make-linux.mk index 6d042e898..2f60597c8 100644 --- a/make-linux.mk +++ b/make-linux.mk @@ -111,7 +111,9 @@ installer: one FORCE ./ext/installfiles/linux/buildinstaller.sh clean: - rm -rf *.o netcon/*.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-cli zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm + rm -rf *.o + rm -rf netcon/*.o netcon/*.so netcon/*.1.0 + rm -rf node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/lz4/*.o ext/json-parser/*.o zerotier-one zerotier-idtool zerotier-cli zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm debug: FORCE make ZT_DEBUG=1 one diff --git a/netcon/intercept.c b/netcon/intercept.c index 074f92d24..cd3210442 100755 --- a/netcon/intercept.c +++ b/netcon/intercept.c @@ -72,7 +72,6 @@ char *progname = ""; #include "intercept.h" #include "common.h" #include "defs.h" -#include "utils.c" /* Global Declarations */ #ifdef USE_SOCKS_DNS diff --git a/netcon/libintercept.so.1.0 b/netcon/libintercept.so.1.0 deleted file mode 100755 index f315f77743a55301f2c69d2949133faedf3f417f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52880 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 MP +# + +CONTRIBDIR=../ext/contrib +LWIPARCH=$(CONTRIBDIR)/ports/unix + +#Set this to where you have the lwip core module checked out from CVS +#default assumes it's a dir named lwip at the same level as the contrib module +LWIPDIR=../ext/lwip/src + + +CCDEP=gcc +CC=gcc +CFLAGS=-O3 -g -Wall -DIPv4 -fPIC + +CFLAGS:=$(CFLAGS) \ + -I$(LWIPDIR)/include -I$(LWIPARCH)/include -I$(LWIPDIR)/include/ipv4 \ + -I$(LWIPDIR) -I. + + +# COREFILES, CORE4FILES: The minimum set of files needed for lwIP. +COREFILES=$(LWIPDIR)/core/mem.c $(LWIPDIR)/core/memp.c $(LWIPDIR)/core/netif.c \ + $(LWIPDIR)/core/pbuf.c $(LWIPDIR)/core/raw.c $(LWIPDIR)/core/stats.c \ + $(LWIPDIR)/core/sys.c $(LWIPDIR)/core/tcp.c $(LWIPDIR)/core/tcp_in.c \ + $(LWIPDIR)/core/tcp_out.c $(LWIPDIR)/core/udp.c $(LWIPDIR)/core/dhcp.c \ + $(LWIPDIR)/core/init.c $(LWIPDIR)/core/timers.c $(LWIPDIR)/core/def.c +CORE4FILES=$(wildcard $(LWIPDIR)/core/ipv4/*.c) $(LWIPDIR)/core/ipv4/inet.c \ + $(LWIPDIR)/core/ipv4/inet_chksum.c + +# SNMPFILES: Extra SNMPv1 agent +SNMPFILES=$(LWIPDIR)/core/snmp/asn1_dec.c $(LWIPDIR)/core/snmp/asn1_enc.c \ + $(LWIPDIR)/core/snmp/mib2.c $(LWIPDIR)/core/snmp/mib_structs.c \ + $(LWIPDIR)/core/snmp/msg_in.c $(LWIPDIR)/core/snmp/msg_out.c + +# APIFILES: The files which implement the sequential and socket APIs. +APIFILES=$(LWIPDIR)/api/api_lib.c $(LWIPDIR)/api/api_msg.c $(LWIPDIR)/api/tcpip.c \ + $(LWIPDIR)/api/err.c $(LWIPDIR)/api/sockets.c $(LWIPDIR)/api/netbuf.c $(LWIPDIR)/api/netdb.c + +# NETIFFILES: Files implementing various generic network interface functions.' +NETIFFILES=$(LWIPDIR)/netif/etharp.c $(LWIPDIR)/netif/slipif.c + +# NETIFFILES: Add PPP netif +NETIFFILES+=$(LWIPDIR)/netif/ppp/auth.c $(LWIPDIR)/netif/ppp/chap.c \ + $(LWIPDIR)/netif/ppp/chpms.c $(LWIPDIR)/netif/ppp/fsm.c \ + $(LWIPDIR)/netif/ppp/ipcp.c $(LWIPDIR)/netif/ppp/lcp.c \ + $(LWIPDIR)/netif/ppp/magic.c $(LWIPDIR)/netif/ppp/md5.c \ + $(LWIPDIR)/netif/ppp/pap.c $(LWIPDIR)/netif/ppp/ppp.c \ + $(LWIPDIR)/netif/ppp/randm.c $(LWIPDIR)/netif/ppp/vj.c + +# ARCHFILES: Architecture specific files. +ARCHFILES=$(wildcard $(LWIPARCH)/*.c $(LWIPARCH)tapif.c $(LWIPARCH)/netif/list.c $(LWIPARCH)/netif/tcpdump.c) + + +# LWIPFILES: All the above. +LWIPFILES=$(COREFILES) $(CORE4FILES) $(SNMPFILES) $(APIFILES) $(NETIFFILES) $(ARCHFILES) +LWIPFILESW=$(wildcard $(LWIPFILES)) +LWIPOBJS=$(notdir $(LWIPFILESW:.c=.o)) + +LWIPLIB=liblwip.so + +%.o: + $(CC) $(CFLAGS) -c $(<:.o=.c) + +all: $(LWIPLIB) +.PHONY: all + +clean: + rm -f *.o $(LWIPLIB) *.s .depend* *.core core + +depend dep: .depend + +include .depend + +$(LWIPLIB): $(LWIPOBJS) + $(CC) -g -nostartfiles -shared -o $@ $^ + +.depend: $(LWIPFILES) + $(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend diff --git a/netcon/utils.c b/netcon/utils.c deleted file mode 100644 index 8192e10ea..000000000 --- a/netcon/utils.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * ZeroTier One - Network Virtualization Everywhere - * Copyright (C) 2011-2015 ZeroTier, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * -- - * - * ZeroTier may be used and distributed under the terms of the GPLv3, which - * are available at: http://www.gnu.org/licenses/gpl-3.0.html - * - * If you would like to embed ZeroTier into a commercial application or - * redistribute it in a modified binary form, please contact ZeroTier Networks - * LLC. Start here: http://www.zerotier.com/ - */ - -void get_path_from_pid(char* dest, int pid) -{ - char ppath[50]; - sprintf(ppath, "/proc/%d/exe", pid); - if (readlink (ppath, dest, 50) != -1){ - } -} - -void print_ip(int ip) -{ - unsigned char bytes[4]; - bytes[0] = ip & 0xFF; - bytes[1] = (ip >> 8) & 0xFF; - bytes[2] = (ip >> 16) & 0xFF; - bytes[3] = (ip >> 24) & 0xFF; - printf("%d.%d.%d.%d\n", bytes[0], bytes[1], bytes[2], bytes[3]); - //return buf; -} - - -/* --- */ - - -#ifdef NETCON_SERVICE -ip_addr_t convert_ip(struct sockaddr_in * addr) -{ - ip_addr_t conn_addr; - struct sockaddr_in *ipv4 = addr; - short a = ip4_addr1(&(ipv4->sin_addr)); - short b = ip4_addr2(&(ipv4->sin_addr)); - short c = ip4_addr3(&(ipv4->sin_addr)); - short d = ip4_addr4(&(ipv4->sin_addr)); - IP4_ADDR(&conn_addr, a,b,c,d); - return conn_addr; -} - -ip_addr_t ip_addr_sin(register struct sockaddr_in *sin) { - ip_addr_t ip; - *((struct sockaddr_in*) &ip) = *sin; - return ip; -} -#endif - - -/* --- */ - - -#ifdef NETCON_INTERCEPT - -typedef unsigned char u8_t; - -#define ip4_addr1(ipaddr) (((u8_t*)(ipaddr))[0]) -#define ip4_addr2(ipaddr) (((u8_t*)(ipaddr))[1]) -#define ip4_addr3(ipaddr) (((u8_t*)(ipaddr))[2]) -#define ip4_addr4(ipaddr) (((u8_t*)(ipaddr))[3]) - -int is_local(struct sockaddr_in* addr) -{ - struct sockaddr_in *ipv4 = addr; - short a = ip4_addr1(&(ipv4->sin_addr)); - short b = ip4_addr2(&(ipv4->sin_addr)); - short c = ip4_addr3(&(ipv4->sin_addr)); - short d = ip4_addr4(&(ipv4->sin_addr)); - return (a==127 && b == 0 && c == 0 && d == 1); -} -#endif