51 #if LWIP_IPV4 && LWIP_TCP 54 #ifndef LWIPERF_TCP_MAX_IDLE_SEC 55 #define LWIPERF_TCP_MAX_IDLE_SEC 10U 57 #if LWIPERF_TCP_MAX_IDLE_SEC > 255 58 #error LWIPERF_TCP_MAX_IDLE_SEC must fit into an u8_t 64 #define LWIPERF_ALLOC(type) mem_malloc(sizeof(type)) 65 #define LWIPERF_FREE(type, item) mem_free(item) 69 #ifndef LWIPERF_CHECK_RX_DATA 70 #define LWIPERF_CHECK_RX_DATA 0 74 typedef struct _lwiperf_settings {
75 #define LWIPERF_FLAGS_ANSWER_TEST 0x80000000 76 #define LWIPERF_FLAGS_ANSWER_NOW 0x00000001 86 struct _lwiperf_state_base;
87 typedef struct _lwiperf_state_base lwiperf_state_base_t;
88 struct _lwiperf_state_base {
93 lwiperf_state_base_t* next;
94 lwiperf_state_base_t* related_server_state;
98 typedef struct _lwiperf_state_tcp {
99 lwiperf_state_base_t base;
100 struct tcp_pcb* server_pcb;
101 struct tcp_pcb* conn_pcb;
107 u32_t bytes_transferred;
108 lwiperf_settings_t settings;
109 u8_t have_settings_buf;
110 } lwiperf_state_tcp_t;
113 static lwiperf_state_base_t* lwiperf_all_connections;
115 static const u8_t lwiperf_txbuf_const[1600] = {
116 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
117 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
118 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
119 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
120 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
121 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
122 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
123 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
124 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
125 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
126 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
127 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
128 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
129 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
130 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
131 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
132 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
133 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
134 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
135 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
136 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
137 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
138 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
139 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
140 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
141 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
142 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
143 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
144 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
145 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
146 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
147 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
148 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
149 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
150 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
151 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
152 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
153 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
154 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
155 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
158 static err_t lwiperf_tcp_poll(
void *arg,
struct tcp_pcb *tpcb);
159 static void lwiperf_tcp_err(
void *arg,
err_t err);
163 lwiperf_list_add(lwiperf_state_base_t* item)
165 if (lwiperf_all_connections ==
NULL) {
166 lwiperf_all_connections = item;
168 item = lwiperf_all_connections;
174 lwiperf_list_remove(lwiperf_state_base_t* item)
176 lwiperf_state_base_t* prev =
NULL;
177 lwiperf_state_base_t* iter;
178 for (iter = lwiperf_all_connections; iter !=
NULL; prev = iter, iter = iter->next) {
181 lwiperf_all_connections = iter->next;
186 for (iter = iter->next; iter !=
NULL; iter = iter->next) {
198 if ((conn !=
NULL) && (conn->report_fn !=
NULL)) {
199 u32_t now, duration_ms, bandwidth_kbitpsec;
201 duration_ms = now - conn->time_started;
202 if (duration_ms == 0) {
203 bandwidth_kbitpsec = 0;
205 bandwidth_kbitpsec = (conn->bytes_transferred / duration_ms) * 8U;
207 conn->report_fn(conn->report_arg, report_type,
208 &conn->conn_pcb->local_ip, conn->conn_pcb->local_port,
209 &conn->conn_pcb->remote_ip, conn->conn_pcb->remote_port,
210 conn->bytes_transferred, duration_ms, bandwidth_kbitpsec);
220 lwip_tcp_conn_report(conn, report_type);
221 lwiperf_list_remove(&conn->base);
222 if (conn->conn_pcb !=
NULL) {
223 tcp_arg(conn->conn_pcb,
NULL);
224 tcp_poll(conn->conn_pcb,
NULL, 0);
225 tcp_sent(conn->conn_pcb,
NULL);
226 tcp_recv(conn->conn_pcb,
NULL);
227 tcp_err(conn->conn_pcb,
NULL);
228 err = tcp_close(conn->conn_pcb);
231 tcp_abort(conn->conn_pcb);
235 err = tcp_close(conn->server_pcb);
238 LWIPERF_FREE(lwiperf_state_tcp_t, conn);
243 lwiperf_tcp_client_send_more(lwiperf_state_tcp_t* conn)
252 LWIP_ASSERT(
"conn invalid", (conn !=
NULL) && conn->base.tcp && (conn->base.server == 0));
256 if (conn->settings.amount &
PP_HTONL(0x80000000)) {
259 u32_t diff_ms = now - conn->time_started;
261 u32_t time_ms = time * 10;
262 if (diff_ms >= time_ms) {
269 u32_t amount_bytes =
htonl(conn->settings.amount);
271 if (amount_bytes >= conn->bytes_transferred) {
278 if (conn->bytes_transferred < 24) {
280 txptr = &((
u8_t*)&conn->settings)[conn->bytes_transferred];
281 txlen_max = (
u16_t)(24 - conn->bytes_transferred);
282 apiflags = TCP_WRITE_FLAG_COPY;
283 }
else if (conn->bytes_transferred < 48) {
285 txptr = &((
u8_t*)&conn->settings)[conn->bytes_transferred - 24];
286 txlen_max = (
u16_t)(48 - conn->bytes_transferred);
287 apiflags = TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE;
292 txptr = (
void*)(
size_t)&lwiperf_txbuf_const[conn->bytes_transferred % 10];
294 if (conn->bytes_transferred == 48) {
302 err = tcp_write(conn->conn_pcb, txptr, txlen, apiflags);
309 conn->bytes_transferred += txlen;
315 tcp_output(conn->conn_pcb);
321 lwiperf_tcp_client_sent(
void *arg,
struct tcp_pcb *tpcb,
u16_t len)
323 lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
325 LWIP_ASSERT(
"invalid conn", conn->conn_pcb == tpcb);
329 conn->poll_count = 0;
331 return lwiperf_tcp_client_send_more(conn);
336 lwiperf_tcp_client_connected(
void *arg,
struct tcp_pcb *tpcb,
err_t err)
338 lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
339 LWIP_ASSERT(
"invalid conn", conn->conn_pcb == tpcb);
345 conn->poll_count = 0;
346 conn->time_started =
sys_now();
347 return lwiperf_tcp_client_send_more(conn);
354 lwiperf_tx_start(lwiperf_state_tcp_t* conn)
357 lwiperf_state_tcp_t* client_conn;
358 struct tcp_pcb* newpcb;
362 client_conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);
363 if (client_conn ==
NULL) {
367 if (newpcb ==
NULL) {
368 LWIPERF_FREE(lwiperf_state_tcp_t, client_conn);
372 memcpy(client_conn, conn,
sizeof(lwiperf_state_tcp_t));
373 client_conn->base.server = 0;
374 client_conn->server_pcb =
NULL;
375 client_conn->conn_pcb = newpcb;
376 client_conn->time_started =
sys_now();
377 client_conn->poll_count = 0;
378 client_conn->next_num = 4;
379 client_conn->bytes_transferred = 0;
380 client_conn->settings.flags = 0;
382 tcp_arg(newpcb, client_conn);
383 tcp_sent(newpcb, lwiperf_tcp_client_sent);
384 tcp_poll(newpcb, lwiperf_tcp_poll, 2U);
385 tcp_err(newpcb, lwiperf_tcp_err);
388 remote_port = (
u16_t)
htonl(client_conn->settings.remote_port);
390 err = tcp_connect(newpcb, &remote_addr, remote_port, lwiperf_tcp_client_connected);
395 lwiperf_list_add(&client_conn->base);
401 lwiperf_tcp_recv(
void *arg,
struct tcp_pcb *tpcb,
struct pbuf *p,
err_t err)
406 lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
408 LWIP_ASSERT(
"pcb mismatch", conn->conn_pcb == tpcb);
417 if ((conn->settings.flags &
PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) ==
418 PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) {
420 lwiperf_tx_start(conn);
427 conn->poll_count = 0;
429 if ((!conn->have_settings_buf) || ((conn->bytes_transferred -24) % (1024*128) == 0)) {
431 if (p->
tot_len <
sizeof(lwiperf_settings_t)) {
436 if (!conn->have_settings_buf) {
437 if (
pbuf_copy_partial(p, &conn->settings,
sizeof(lwiperf_settings_t), 0) !=
sizeof(lwiperf_settings_t)) {
442 conn->have_settings_buf = 1;
443 if ((conn->settings.flags &
PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) ==
444 PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) {
446 err_t err2 = lwiperf_tx_start(conn);
454 if (
pbuf_memcmp(p, 0, &conn->settings,
sizeof(lwiperf_settings_t)) != 0) {
460 conn->bytes_transferred +=
sizeof(lwiperf_settings_t);
461 if(conn->bytes_transferred <= 24) {
462 conn->time_started =
sys_now();
473 for (q = p; q !=
NULL; q = q->
next) {
474 #if LWIPERF_CHECK_RX_DATA 477 for (i = 0; i < q->
len; i++) {
478 u8_t val = payload[i];
479 u8_t num = val -
'0';
480 if (num == conn->next_num) {
482 if (conn->next_num == 10) {
493 packet_idx += q->
len;
497 conn->bytes_transferred += packet_idx;
498 tcp_recved(tpcb, tot_len);
505 lwiperf_tcp_err(
void *arg,
err_t err)
507 lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
514 lwiperf_tcp_poll(
void *arg,
struct tcp_pcb *tpcb)
516 lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;
517 LWIP_ASSERT(
"pcb mismatch", conn->conn_pcb == tpcb);
519 if (++conn->poll_count >= LWIPERF_TCP_MAX_IDLE_SEC) {
523 if (!conn->base.server) {
524 lwiperf_tcp_client_send_more(conn);
532 lwiperf_tcp_accept(
void *arg,
struct tcp_pcb *newpcb,
err_t err)
534 lwiperf_state_tcp_t *s, *conn;
539 s = (lwiperf_state_tcp_t*)arg;
540 conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);
544 memset(conn, 0,
sizeof(lwiperf_state_tcp_t));
546 conn->base.server = 1;
547 conn->base.related_server_state = &s->base;
548 conn->server_pcb = s->server_pcb;
549 conn->conn_pcb = newpcb;
550 conn->time_started =
sys_now();
551 conn->report_fn = s->report_fn;
552 conn->report_arg = s->report_arg;
555 tcp_arg(newpcb, conn);
556 tcp_recv(newpcb, lwiperf_tcp_recv);
557 tcp_poll(newpcb, lwiperf_tcp_poll, 2U);
558 tcp_err(conn->conn_pcb, lwiperf_tcp_err);
560 lwiperf_list_add(&conn->base);
574 report_fn, report_arg);
589 lwiperf_state_tcp_t* s = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);
593 memset(s, 0,
sizeof(lwiperf_state_tcp_t));
596 s->report_fn = report_fn;
597 s->report_arg = report_arg;
601 err = tcp_bind(pcb, local_addr, local_port);
603 s->server_pcb = tcp_listen_with_backlog(pcb, 1);
606 if (s->server_pcb ==
NULL) {
610 LWIPERF_FREE(lwiperf_state_tcp_t, s);
615 tcp_arg(s->server_pcb, s);
616 tcp_accept(s->server_pcb, lwiperf_tcp_accept);
618 lwiperf_list_add(&s->base);
626 lwiperf_state_base_t* i, *dealloc, *last =
NULL;
628 for (i = lwiperf_all_connections; i !=
NULL; ) {
629 if ((i == lwiperf_session) || (i->related_server_state == lwiperf_session)) {
635 LWIPERF_FREE(lwiperf_state_tcp_t, dealloc);
void * lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void *report_arg)
u8_t pbuf_header(struct pbuf *p, s16_t header_size_increment)
u16_t pbuf_memcmp(struct pbuf *p, u16_t offset, const void *s2, u16_t n)
void(* lwiperf_report_fn)(void *arg, enum lwiperf_report_type report_type, const ip_addr_t *local_addr, u16_t local_port, const ip_addr_t *remote_addr, u16_t remote_port, u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec)
#define LWIPERF_TCP_PORT_DEFAULT
u8_t pbuf_free(struct pbuf *p)
#define ip_addr_copy(dest, src)
void * lwiperf_start_tcp_server(const ip_addr_t *local_addr, u16_t local_port, lwiperf_report_fn report_fn, void *report_arg)
#define LWIP_ASSERT(message, assertion)
void lwiperf_abort(void *lwiperf_session)
u16_t pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)
#define LWIP_UNUSED_ARG(x)