1 #include "lwip/debug.h"
2 #include "lwip/stats.h"
8 #define IPERF_SERVER_PORT 5001
15 static struct tcp_pcb *iperf_pcb;
17 enum iperfserver_states
25 struct iperfserver_state
37 static err_t iperfserver_accept(
void *arg,
struct tcp_pcb *newpcb, err_t err);
38 static err_t iperfserver_recv(
void *arg,
struct tcp_pcb *tpcb,
struct pbuf *p, err_t err);
39 static void iperfserver_error(
void *arg, err_t err);
40 static err_t iperfserver_sent(
void *arg,
struct tcp_pcb *tpcb,
u16_t len);
41 static void iperfserver_send(
struct tcp_pcb *tpcb,
struct iperfserver_state *es);
42 static void iperfserver_close(
struct tcp_pcb *tpcb,
struct iperfserver_state *es);
45 iperf_server_init(
void)
47 iperf_pcb = tcp_new();
48 if (iperf_pcb !=
NULL)
55 iperf_pcb = tcp_listen(iperf_pcb);
56 tcp_accept(iperf_pcb, iperfserver_accept);
71 iperfserver_accept(
void *arg,
struct tcp_pcb *newpcb, err_t err)
74 struct iperfserver_state *es;
80 tcp_setprio(newpcb, TCP_PRIO_MIN);
82 es = (
struct iperfserver_state *)mem_malloc(
sizeof(
struct iperfserver_state));
85 es->state = ES_ACCEPTED;
91 tcp_recv(newpcb, iperfserver_recv);
92 tcp_err(newpcb, iperfserver_error);
104 iperfserver_recv(
void *arg,
struct tcp_pcb *tpcb,
struct pbuf *p, err_t err)
106 struct iperfserver_state *es;
110 LWIP_ASSERT(
"arg != NULL",arg !=
NULL);
111 es = (
struct iperfserver_state *)arg;
115 es->state = ES_CLOSING;
116 iperfserver_close(tpcb, es);
119 else if(err != ERR_OK)
129 else if(es->state == ES_ACCEPTED)
134 tcp_recved(tpcb, plen);
138 else if(es->state == ES_CLOSING)
141 tcp_recved(tpcb, p->tot_len);
149 tcp_recved(tpcb, p->tot_len);
158 iperfserver_error(
void *arg, err_t err)
160 struct iperfserver_state *es;
162 LWIP_UNUSED_ARG(err);
164 es = (
struct iperfserver_state *)arg;
172 iperfserver_sent(
void *arg,
struct tcp_pcb *tpcb,
u16_t len)
174 struct iperfserver_state *es;
176 LWIP_UNUSED_ARG(len);
178 es = (
struct iperfserver_state *)arg;
184 tcp_sent(tpcb, iperfserver_sent);
185 iperfserver_send(tpcb, es);
190 if(es->state == ES_CLOSING)
192 iperfserver_close(tpcb, es);
199 iperfserver_send(
struct tcp_pcb *tpcb,
struct iperfserver_state *es)
202 err_t wr_err = ERR_OK;
204 while ((wr_err == ERR_OK) &&
206 (es->p->len <= tcp_sndbuf(tpcb)))
211 wr_err = tcp_write(tpcb, ptr->payload, ptr->len, TCP_WRITE_FLAG_COPY);
212 if (wr_err == ERR_OK)
229 freed = pbuf_free(ptr);
233 tcp_recved(tpcb, plen);
235 else if(wr_err == ERR_MEM)
248 iperfserver_close(
struct tcp_pcb *tpcb,
struct iperfserver_state *es)
251 tcp_sent(tpcb,
NULL);
252 tcp_recv(tpcb,
NULL);