From a52d3548a064feadad9c7a72480e5064c4ffd5ca Mon Sep 17 00:00:00 2001 From: likewise Date: Fri, 23 Apr 2004 15:43:44 +0000 Subject: [PATCH] Merged listen_pcb union fix from HEAD. --- src/core/tcp.c | 18 ++++++++++-------- src/core/tcp_in.c | 6 +++--- src/core/tcp_out.c | 11 ++++++++--- src/include/lwip/tcp.h | 8 +++++--- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/core/tcp.c b/src/core/tcp.c index 35ad15f1..a2094d4e 100644 --- a/src/core/tcp.c +++ b/src/core/tcp.c @@ -62,7 +62,9 @@ const u8_t tcp_backoff[13] = { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7}; /* The TCP PCB lists. */ -struct tcp_pcb_listen *tcp_listen_pcbs; /* List of all TCP PCBs in LISTEN state. */ + +/* List of all TCP PCBs in LISTEN state. */ +union tcp_listen_pcbs_t tcp_listen_pcbs; struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a state in which they accept or send data. */ @@ -85,7 +87,7 @@ void tcp_init(void) { /* Clear globals. */ - tcp_listen_pcbs = NULL; + tcp_listen_pcbs.listen_pcbs = NULL; tcp_active_pcbs = NULL; tcp_tw_pcbs = NULL; tcp_tmp_pcb = NULL; @@ -136,7 +138,7 @@ tcp_close(struct tcp_pcb *pcb) switch (pcb->state) { case LISTEN: err = ERR_OK; - tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs, pcb); + tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb); memp_free(MEMP_TCP_PCB_LISTEN, pcb); pcb = NULL; break; @@ -251,7 +253,7 @@ tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) } #if SO_REUSE == 0 /* Check if the address already is in use. */ - for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs; + for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; cpcb != NULL; cpcb = cpcb->next) { if (cpcb->local_port == port) { if (ip_addr_isany(&(cpcb->local_ip)) || @@ -284,7 +286,7 @@ tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) When the two options aren't set and specified port is already bound, ERR_USE is returned saying that address is already in use. */ - for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs; cpcb != NULL; cpcb = cpcb->next) { + for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; cpcb != NULL; cpcb = cpcb->next) { if(cpcb->local_port == port) { if(ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { if(pcb->so_options & SOF_REUSEPORT) { @@ -421,7 +423,7 @@ tcp_listen(struct tcp_pcb *pcb) #if LWIP_CALLBACK_API lpcb->accept = tcp_accept_null; #endif /* LWIP_CALLBACK_API */ - TCP_REG(&tcp_listen_pcbs, lpcb); + TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb); return (struct tcp_pcb *)lpcb; } @@ -493,7 +495,7 @@ tcp_new_port(void) goto again; } } - for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) { + for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { if (pcb->local_port == port) { goto again; } @@ -1263,7 +1265,7 @@ tcp_debug_print_pcbs(void) tcp_debug_print_state(pcb->state); } LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n")); - for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) { + for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { LWIP_DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ", pcb->local_port, pcb->remote_port, pcb->snd_nxt, pcb->rcv_nxt)); diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c index d09e1c70..373c6d9b 100644 --- a/src/core/tcp_in.c +++ b/src/core/tcp_in.c @@ -254,7 +254,7 @@ tcp_input(struct pbuf *p, struct netif *inp) /* Finally, if we still did not get a match, we check all PCBs that are LISTENing for incoming connections. */ prev = NULL; - for(lpcb = tcp_listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { if ((ip_addr_isany(&(lpcb->local_ip)) || ip_addr_cmp(&(lpcb->local_ip), &(iphdr->dest))) && lpcb->local_port == tcphdr->dest) { @@ -264,9 +264,9 @@ tcp_input(struct pbuf *p, struct netif *inp) if (prev != NULL) { ((struct tcp_pcb_listen *)prev)->next = lpcb->next; /* our successor is the remainder of the listening list */ - lpcb->next = tcp_listen_pcbs; + lpcb->next = tcp_listen_pcbs.listen_pcbs; /* put this listening pcb at the head of the listening list */ - tcp_listen_pcbs = lpcb; + tcp_listen_pcbs.listen_pcbs = lpcb; } LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n")); diff --git a/src/core/tcp_out.c b/src/core/tcp_out.c index 70838947..7980d6d0 100644 --- a/src/core/tcp_out.c +++ b/src/core/tcp_out.c @@ -63,8 +63,6 @@ /* Forward declarations.*/ static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb); - - err_t tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags) { @@ -72,6 +70,14 @@ tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags) } +/* + * NB. tcp_write() enqueues data for sending, but does not send it + * straight away. It waits in the expectation of more data being sent + * soon (as it can send them more efficiently by combining them + * together). To prompt the system to send data now, call + * tcp_output() after calling tcp_write(). + */ + err_t tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t copy) { @@ -403,7 +409,6 @@ tcp_output(struct tcp_pcb *pcb) tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip), IP_PROTO_TCP, p->tot_len); - ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, IP_PROTO_TCP); pbuf_free(p); diff --git a/src/include/lwip/tcp.h b/src/include/lwip/tcp.h index 78daae5d..d200e7c3 100644 --- a/src/include/lwip/tcp.h +++ b/src/include/lwip/tcp.h @@ -40,8 +40,6 @@ #include "lwip/ip.h" #include "lwip/icmp.h" -#include "lwip/sys.h" - #include "lwip/err.h" struct tcp_pcb; @@ -457,7 +455,11 @@ void tcp_timer_needed(void); #endif /* The TCP PCB lists. */ -extern struct tcp_pcb_listen *tcp_listen_pcbs; /* List of all TCP PCBs in LISTEN state. */ +union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */ + struct tcp_pcb_listen *listen_pcbs; + struct tcp_pcb *pcbs; +}; +extern union tcp_listen_pcbs_t tcp_listen_pcbs; extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a state in which they accept or send data. */