9 #if !LWIP_STATS || !TCP_STATS || !MEMP_STATS 10 #error "This tests needs TCP- and MEMP-statistics enabled" 15 tcp_remove(
struct tcp_pcb* pcb_list)
17 struct tcp_pcb *pcb = pcb_list;
31 tcp_remove(tcp_listen_pcbs.pcbs);
32 tcp_remove(tcp_active_pcbs);
33 tcp_remove(tcp_tw_pcbs);
34 fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 0);
35 fail_unless(lwip_stats.memp[MEMP_TCP_PCB_LISTEN].used == 0);
36 fail_unless(lwip_stats.memp[MEMP_TCP_SEG].used == 0);
37 fail_unless(lwip_stats.memp[MEMP_PBUF_POOL].used == 0);
43 u16_t src_port,
u16_t dst_port,
void* data,
size_t data_len,
48 struct tcp_hdr* tcphdr;
49 u16_t pbuf_len = (
u16_t)(
sizeof(
struct ip_hdr) +
sizeof(
struct tcp_hdr) + data_len);
50 LWIP_ASSERT(
"data_len too big", data_len <= 0xFFFF);
67 iphdr->dest.addr = ip_2_ip4(dst_ip)->addr;
68 iphdr->src.addr = ip_2_ip4(src_ip)->addr;
69 IPH_VHL_SET(iphdr, 4, IP_HLEN / 4);
70 IPH_TOS_SET(iphdr, 0);
78 tcphdr->src =
htons(src_port);
79 tcphdr->dest =
htons(dst_port);
80 tcphdr->seqno =
htonl(seqno);
81 tcphdr->ackno =
htonl(ackno);
82 TCPH_HDRLEN_SET(tcphdr,
sizeof(
struct tcp_hdr)/4);
83 TCPH_FLAGS_SET(tcphdr, headerflags);
84 tcphdr->wnd =
htons(wnd);
108 u16_t src_port,
u16_t dst_port,
void* data,
size_t data_len,
111 return tcp_create_segment_wnd(src_ip, dst_ip, src_port, dst_port, data,
112 data_len, seqno, ackno, headerflags,
TCP_WND);
123 return tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port,
124 data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags);
135 return tcp_create_segment_wnd(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port,
136 data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags, wnd);
147 if (state == ESTABLISHED) {
148 TCP_REG(&tcp_active_pcbs, pcb);
149 pcb->local_ip.addr = local_ip->addr;
150 pcb->local_port = local_port;
151 pcb->remote_ip.addr = remote_ip->addr;
152 pcb->remote_port = remote_port;
153 }
else if(state == LISTEN) {
154 TCP_REG(&tcp_listen_pcbs.pcbs, pcb);
155 pcb->local_ip.addr = local_ip->addr;
156 pcb->local_port = local_port;
157 }
else if(state == TIME_WAIT) {
158 TCP_REG(&tcp_tw_pcbs, pcb);
159 pcb->local_ip.addr = local_ip->addr;
160 pcb->local_port = local_port;
161 pcb->remote_ip.addr = remote_ip->addr;
162 pcb->remote_port = remote_port;
188 for(q = p; q !=
NULL; q = q->
next) {
190 for(i = 0; i < q->
len; i++) {
209 test_tcp_counters_check_rxdata(counters, p);
227 struct tcp_pcb* pcb = tcp_new();
230 tcp_arg(pcb, counters);
242 struct ip_hdr *iphdr = (
struct ip_hdr*)p->
payload;
247 ip_data.current_ip4_header = iphdr;
261 const ip4_addr_t *ipaddr)
265 if (txcounters !=
NULL)
289 memset(netif, 0,
sizeof(
struct netif));
290 if (txcounters !=
NULL) {
292 netif->
state = txcounters;
294 netif->output = test_tcp_netif_output;
296 ip4_addr_copy(netif->netmask, *ip_2_ip4(netmask));
297 ip4_addr_copy(netif->ip_addr, *ip_2_ip4(ip_addr));
struct tcp_pcb * test_tcp_new_counters_pcb(struct test_tcp_counters *counters)
u16_t ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, const ip_addr_t *src, const ip_addr_t *dest)
struct netif * netif_list
void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters, ip_addr_t *ip_addr, ip_addr_t *netmask)
#define ip_current_netif()
u32_t recv_calls_after_close
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)
void test_tcp_counters_err(void *arg, err_t err)
u8_t pbuf_header(struct pbuf *p, s16_t header_size_increment)
#define NETIF_FLAG_LINK_UP
u32_t recved_bytes_after_close
struct pbuf * pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
#define ip_current_dest_addr()
u16_t inet_chksum(const void *dataptr, u16_t len)
u8_t pbuf_free(struct pbuf *p)
err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from)
void tcp_remove_all(void)
err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)
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_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)
#define LWIP_ASSERT(message, assertion)
#define EXPECT_RETNULL(x)
struct ip_globals ip_data
err_t test_tcp_counters_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
#define ip_current_src_addr()
void pbuf_cat(struct pbuf *h, struct pbuf *t)
#define ip_addr_set_zero(ipaddr)
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)
#define EXPECT_RETX(x, y)
#define LWIP_UNUSED_ARG(x)