7#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS
8#error "This tests needs TCP- and MEMP-statistics enabled"
11#error "This tests needs TCP_QUEUE_OOSEQ enabled"
17#define CHECK_SEGMENTS_ON_OOSEQ 1
19#if CHECK_SEGMENTS_ON_OOSEQ
20#define EXPECT_OOSEQ(x) EXPECT(x)
22#define EXPECT_OOSEQ(x)
31 struct tcp_seg* seg = pcb->ooseq;
43 struct tcp_seg* seg = pcb->ooseq;
61 struct tcp_seg* seg = pcb->ooseq;
65 if(
num == seg_index) {
66 return seg->tcphdr->seqno;
85 struct tcp_seg* seg = pcb->ooseq;
89 if(
num == seg_index) {
90 return TCP_TCPLEN(seg);
108 struct tcp_seg* seg = pcb->ooseq;
112 len += TCP_TCPLEN(seg);
145 struct pbuf *p_8_9, *p_4_8, *p_4_10, *p_2_14, *p_fin, *pinseq;
153 u16_t remote_port = 0x100, local_port = 0x101;
159 IP4_ADDR(&local_ip, 192, 168, 1, 1);
160 IP4_ADDR(&remote_ip, 192, 168, 1, 2);
163 data_len =
sizeof(
data);
166 counters.expected_data_len = data_len;
172 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
197 if ((pinseq !=
NULL) && (p_8_9 !=
NULL) && (p_4_8 !=
NULL) && (p_4_10 !=
NULL) && (p_2_14 !=
NULL) && (p_fin !=
NULL)) {
273 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
275 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
287 struct pbuf *p_1_2, *p_4_8, *p_3_11, *p_2_12, *p_15_1, *p_15_1a, *pinseq, *pinseqFIN;
295 u16_t remote_port = 0x100, local_port = 0x101;
301 IP4_ADDR(&local_ip, 192, 168, 1, 1);
302 IP4_ADDR(&remote_ip, 192, 168, 1, 2);
305 data_len =
sizeof(
data);
308 counters.expected_data_len = data_len;
314 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
348 if ((pinseq !=
NULL) && (p_1_2 !=
NULL) && (p_4_8 !=
NULL) && (p_3_11 !=
NULL) && (p_2_12 !=
NULL)
349 && (p_15_1 !=
NULL) && (p_15_1a !=
NULL) && (pinseqFIN !=
NULL)) {
449 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
451 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
461#if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS
465 struct pbuf *pinseq, *p_ovr;
467 u16_t remote_port = 0x100, local_port = 0x101;
478 IP4_ADDR(&local_ip, 192, 168, 1, 1);
479 IP4_ADDR(&remote_ip, 192, 168, 1, 2);
490 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
491 pcb->rcv_nxt = 0x8000;
498 int count, expected_datalen;
518 if (
datalen != expected_datalen) {
543 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
545 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
553#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))
559 u16_t remote_port = 0x100, local_port = 0x101;
570 IP4_ADDR(&local_ip, 192, 168, 1, 1);
571 IP4_ADDR(&remote_ip, 192, 168, 1, 2);
582 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
583 pcb->rcv_nxt = 0x8000;
624 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
626 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
634#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))
640 u16_t remote_port = 0x100, local_port = 0x101;
651 IP4_ADDR(&local_ip, 192, 168, 1, 1);
652 IP4_ADDR(&remote_ip, 192, 168, 1, 2);
663 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
664 pcb->rcv_nxt = 0x8000;
705 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
707 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
715 u32_t exp_rx_bytes,
u32_t exp_err_calls,
int exp_oos_count,
int exp_oos_len)
741 struct pbuf *p_normal_fin, *p_data_after_fin, *
p, *p_2nd_fin_ooseq;
743 u16_t remote_port = 0x100, local_port = 0x101;
745 u32_t exp_rx_calls = 0, exp_rx_bytes = 0, exp_close_calls = 0, exp_oos_pbufs = 0, exp_oos_tcplen = 0;
746 int first_dropped = 0xff;
747 int last_dropped = 0;
755 IP4_ADDR(&local_ip, 192, 168, 1, 1);
756 IP4_ADDR(&remote_ip, 192, 168, 1, 2);
767 tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);
768 pcb->rcv_nxt = 0x8000;
777 if(delay_packet & 1) {
790 if(delay_packet & 2) {
792 if(first_dropped > 2) {
799 if (first_dropped < 2) {
811 if(delay_packet & 4) {
813 if(first_dropped > 3) {
820 if (first_dropped < 3) {
822 if (delay_packet & 2) {
834 if(delay_packet & 8) {
836 if(first_dropped > 4) {
843 if (first_dropped < 3) {
845 if (delay_packet & 2) {
857 if(delay_packet & 1) {
862 if((delay_packet & 2) == 0) {
865 exp_oos_pbufs = exp_oos_tcplen = 0;
871 if(delay_packet & 2) {
875 exp_oos_pbufs = exp_oos_tcplen = 0;
880 if(delay_packet & 4) {
887 if(delay_packet & 8) {
898 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1);
900 EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
905#define FIN_TEST(name, num) \
908 LWIP_UNUSED_ARG(_i); \
909 test_tcp_recv_ooseq_double_FINs(num); \
912FIN_TEST(test_tcp_recv_ooseq_double_FIN_0, 0)
913FIN_TEST(test_tcp_recv_ooseq_double_FIN_1, 1)
914FIN_TEST(test_tcp_recv_ooseq_double_FIN_2, 2)
915FIN_TEST(test_tcp_recv_ooseq_double_FIN_3, 3)
916FIN_TEST(test_tcp_recv_ooseq_double_FIN_4, 4)
917FIN_TEST(test_tcp_recv_ooseq_double_FIN_5, 5)
918FIN_TEST(test_tcp_recv_ooseq_double_FIN_6, 6)
919FIN_TEST(test_tcp_recv_ooseq_double_FIN_7, 7)
920FIN_TEST(test_tcp_recv_ooseq_double_FIN_8, 8)
921FIN_TEST(test_tcp_recv_ooseq_double_FIN_9, 9)
922FIN_TEST(test_tcp_recv_ooseq_double_FIN_10, 10)
923FIN_TEST(test_tcp_recv_ooseq_double_FIN_11, 11)
924FIN_TEST(test_tcp_recv_ooseq_double_FIN_12, 12)
925FIN_TEST(test_tcp_recv_ooseq_double_FIN_13, 13)
926FIN_TEST(test_tcp_recv_ooseq_double_FIN_14, 14)
927FIN_TEST(test_tcp_recv_ooseq_double_FIN_15, 15)
935 test_tcp_recv_ooseq_FIN_OOSEQ,
936 test_tcp_recv_ooseq_FIN_INSEQ,
937 test_tcp_recv_ooseq_overrun_rxwin,
938 test_tcp_recv_ooseq_max_bytes,
939 test_tcp_recv_ooseq_max_pbufs,
940 test_tcp_recv_ooseq_double_FIN_0,
941 test_tcp_recv_ooseq_double_FIN_1,
942 test_tcp_recv_ooseq_double_FIN_2,
943 test_tcp_recv_ooseq_double_FIN_3,
944 test_tcp_recv_ooseq_double_FIN_4,
945 test_tcp_recv_ooseq_double_FIN_5,
946 test_tcp_recv_ooseq_double_FIN_6,
947 test_tcp_recv_ooseq_double_FIN_7,
948 test_tcp_recv_ooseq_double_FIN_8,
949 test_tcp_recv_ooseq_double_FIN_9,
950 test_tcp_recv_ooseq_double_FIN_10,
951 test_tcp_recv_ooseq_double_FIN_11,
952 test_tcp_recv_ooseq_double_FIN_12,
953 test_tcp_recv_ooseq_double_FIN_13,
954 test_tcp_recv_ooseq_double_FIN_14,
955 test_tcp_recv_ooseq_double_FIN_15
#define LWIP_UNUSED_ARG(x)
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLsizei GLuint * counters
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define IP4_ADDR(ipaddr, a, b, c, d)
typedefPACK_STRUCT_END struct ip_addr ip_addr_t
int const JOCTET unsigned int datalen
static Suite * create_suite(const char *name, TFun *tests, size_t num_tests, SFun setup, SFun teardown)
static struct test_info tests[]
struct netif * netif_list
struct netif * netif_default
#define TCP_OOSEQ_MAX_PBUFS
#define TCP_OOSEQ_MAX_BYTES
u8_t pbuf_clen(struct pbuf *p)
void test_tcp_input(struct pbuf *p, struct netif *inp)
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 tcp_pcb * test_tcp_new_counters_pcb(struct test_tcp_counters *counters)
void tcp_remove_all(void)
void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters, ip_addr_t *ip_addr, ip_addr_t *netmask)
static __inline void tcp_set_state(struct sock *sk, int state)
static int tcp_oos_seg_tcplen(struct tcp_pcb *pcb, int seg_index)
static END_TEST 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)
static void test_tcp_recv_ooseq_double_FINs(int delay_packet)
#define FIN_TEST(name, num)
Suite * tcp_oos_suite(void)
static int tcp_oos_tcplen(struct tcp_pcb *pcb)
static void tcp_oos_setup(void)
static int tcp_oos_pbuf_count(struct tcp_pcb *pcb)
static void tcp_oos_teardown(void)
static int tcp_oos_count(struct tcp_pcb *pcb)
static u32_t tcp_oos_seg_seqno(struct tcp_pcb *pcb, int seg_index)
static END_TEST char data_full_wnd[TCP_WND]