patch #6865 (SO_REUSEADDR for TCP): if tcp_pcb.flags has TF_REUSEADDR set, allow binding to endpoint in TIME_WAIT

This commit is contained in:
goldsimon 2010-02-12 15:33:02 +00:00
parent c73b1b4fa2
commit d3635c5eef
3 changed files with 14 additions and 5 deletions

View File

@ -19,6 +19,10 @@ HISTORY
++ New features: ++ New features:
2010-02-12: Simon Goldschmidt/Jeff Barber
* tcp.c/h: patch #6865 (SO_REUSEADDR for TCP): if tcp_pcb.flags has
TF_REUSEADDR set, allow binding to endpoint in TIME_WAIT
2010-02-12: Simon Goldschmidt 2010-02-12: Simon Goldschmidt
* sys layer: task #10139 (Prefer statically allocated memory): converted * sys layer: task #10139 (Prefer statically allocated memory): converted
mbox and semaphore functions to take pointers to sys_mbox_t/sys_sem_t; mbox and semaphore functions to take pointers to sys_mbox_t/sys_sem_t;

View File

@ -317,15 +317,19 @@ tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port)
} }
} }
} }
/* @todo: until SO_REUSEADDR is implemented (see task #6995 on savannah), /* Unless the REUSEADDR flag is set,
* we have to check the pcbs in TIME-WAIT state, also: */ * we have to check the pcbs in TIME-WAIT state, also: */
if ((pcb->flags & TF_REUSEADDR) == 0) {
for(cpcb = tcp_tw_pcbs; cpcb != NULL; cpcb = cpcb->next) { for(cpcb = tcp_tw_pcbs; cpcb != NULL; cpcb = cpcb->next) {
if (cpcb->local_port == port) { if (cpcb->local_port == port) {
if (ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { if (ip_addr_isany(&(cpcb->local_ip)) ||
ip_addr_isany(ipaddr) ||
ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
return ERR_USE; return ERR_USE;
} }
} }
} }
}
if (!ip_addr_isany(ipaddr)) { if (!ip_addr_isany(ipaddr)) {
pcb->local_ip = *ipaddr; pcb->local_ip = *ipaddr;

View File

@ -370,6 +370,7 @@ struct tcp_pcb {
#define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */ #define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */
#define TF_INFR ((u8_t)0x04U) /* In fast recovery. */ #define TF_INFR ((u8_t)0x04U) /* In fast recovery. */
#define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */ #define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */
#define TF_REUSEADDR ((u8_t)0x10U) /* Bind to endpoint in TIME_WAIT */
#define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */ #define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */
#define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */ #define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */
#define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */ #define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */