/[lwip]/lwip/src/core/tcp.c
ViewVC logotype

Diff of /lwip/src/core/tcp.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.14 by jani, Fri Jan 17 14:18:55 2003 UTC revision 1.15 by davidhaas, Thu Feb 6 22:18:56 2003 UTC
# Line 69  struct tcp_pcb *tcp_tmp_pcb; Line 69  struct tcp_pcb *tcp_tmp_pcb;
69    
70  static u8_t tcp_timer;  static u8_t tcp_timer;
71    
72    static u16_t tcp_new_port(void);
73    
74  /*-----------------------------------------------------------------------------------*/  /*-----------------------------------------------------------------------------------*/
75  /*  /*
76   * tcp_init():   * tcp_init():
# Line 250  tcp_bind(struct tcp_pcb *pcb, struct ip_ Line 252  tcp_bind(struct tcp_pcb *pcb, struct ip_
252  {  {
253    struct tcp_pcb *cpcb;    struct tcp_pcb *cpcb;
254    
255      if(port == 0) {
256        port = tcp_new_port();
257      }
258    
259    /* Check if the address already is in use. */    /* Check if the address already is in use. */
260    for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs;    for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs;
261        cpcb != NULL; cpcb = cpcb->next) {        cpcb != NULL; cpcb = cpcb->next) {
# Line 275  tcp_bind(struct tcp_pcb *pcb, struct ip_ Line 281  tcp_bind(struct tcp_pcb *pcb, struct ip_
281      pcb->local_ip = *ipaddr;      pcb->local_ip = *ipaddr;
282    }    }
283    pcb->local_port = port;    pcb->local_port = port;
284    DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %d\n", port));    DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %u\n", port));
285    return ERR_OK;    return ERR_OK;
286  }  }
287  #if LWIP_CALLBACK_API  #if LWIP_CALLBACK_API
# Line 337  tcp_recved(struct tcp_pcb *pcb, u16_t le Line 343  tcp_recved(struct tcp_pcb *pcb, u16_t le
343       !(pcb->flags & TF_ACK_NOW)) {       !(pcb->flags & TF_ACK_NOW)) {
344      tcp_ack(pcb);      tcp_ack(pcb);
345    }    }
346    DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %d bytes, wnd %u (%u).\n",    DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %u bytes, wnd %u (%u).\n",
347                       len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));                       len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));
348  }  }
349  /*-----------------------------------------------------------------------------------*/  /*-----------------------------------------------------------------------------------*/
# Line 352  static u16_t Line 358  static u16_t
358  tcp_new_port(void)  tcp_new_port(void)
359  {  {
360    struct tcp_pcb *pcb;    struct tcp_pcb *pcb;
361    static u16_t port = 4096;  #ifndef TCP_LOCAL_PORT_RANGE_START
362    #define TCP_LOCAL_PORT_RANGE_START 4096
363    #define TCP_LOCAL_PORT_RANGE_END   0x7fff
364    #endif
365      static u16_t port = TCP_LOCAL_PORT_RANGE_START;
366        
367   again:   again:
368    if(++port > 0x7fff) {    if(++port > TCP_LOCAL_PORT_RANGE_END) {
369      port = 4096;      port = TCP_LOCAL_PORT_RANGE_START;
370    }    }
371        
372    for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {    for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
# Line 393  tcp_connect(struct tcp_pcb *pcb, struct Line 403  tcp_connect(struct tcp_pcb *pcb, struct
403    err_t ret;    err_t ret;
404    u32_t iss;    u32_t iss;
405    
406    DEBUGF(TCP_DEBUG, ("tcp_connect to port %d\n", port));    DEBUGF(TCP_DEBUG, ("tcp_connect to port %u\n", port));
407    if(ipaddr != NULL) {    if(ipaddr != NULL) {
408      pcb->remote_ip = *ipaddr;      pcb->remote_ip = *ipaddr;
409    } else {    } else {
# Line 458  tcp_slowtmr(void) Line 468  tcp_slowtmr(void)
468    if (pcb == NULL) DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs"));    if (pcb == NULL) DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs"));
469    while(pcb != NULL) {    while(pcb != NULL) {
470      DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb"));      DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb"));
471      ASSERT("tcp_slowtmr: active pcb->state != CLOSED", pcb->state != CLOSED);      LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED", pcb->state != CLOSED);
472      ASSERT("tcp_slowtmr: active pcb->state != LISTEN", pcb->state != LISTEN);      LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN", pcb->state != LISTEN);
473      ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);      LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
474    
475      pcb_remove = 0;      pcb_remove = 0;
476    
# Line 476  tcp_slowtmr(void) Line 486  tcp_slowtmr(void)
486        if(pcb->unacked != NULL && pcb->rtime >= pcb->rto) {        if(pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
487    
488          /* Time for a retransmission. */          /* Time for a retransmission. */
489          DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %d pcb->rto %d\n",          DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %u pcb->rto %u\n",
490                                 pcb->rtime, pcb->rto));                                 pcb->rtime, pcb->rto));
491    
492          /* Double retransmission time-out unless we are trying to          /* Double retransmission time-out unless we are trying to
# Line 537  tcp_slowtmr(void) Line 547  tcp_slowtmr(void)
547        tcp_pcb_purge(pcb);              tcp_pcb_purge(pcb);      
548        /* Remove PCB from tcp_active_pcbs list. */        /* Remove PCB from tcp_active_pcbs list. */
549        if(prev != NULL) {        if(prev != NULL) {
550          ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);          LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
551          prev->next = pcb->next;          prev->next = pcb->next;
552        } else {        } else {
553          /* This PCB was the first. */          /* This PCB was the first. */
554          ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);          LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
555          tcp_active_pcbs = pcb->next;          tcp_active_pcbs = pcb->next;
556        }        }
557    
# Line 573  tcp_slowtmr(void) Line 583  tcp_slowtmr(void)
583    prev = NULL;        prev = NULL;    
584    pcb = tcp_tw_pcbs;    pcb = tcp_tw_pcbs;
585    while(pcb != NULL) {    while(pcb != NULL) {
586      ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);      LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
587      pcb_remove = 0;      pcb_remove = 0;
588    
589      /* Check if this PCB has stayed long enough in TIME-WAIT */      /* Check if this PCB has stayed long enough in TIME-WAIT */
# Line 588  tcp_slowtmr(void) Line 598  tcp_slowtmr(void)
598        tcp_pcb_purge(pcb);              tcp_pcb_purge(pcb);      
599        /* Remove PCB from tcp_tw_pcbs list. */        /* Remove PCB from tcp_tw_pcbs list. */
600        if(prev != NULL) {        if(prev != NULL) {
601          ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);          LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
602          prev->next = pcb->next;          prev->next = pcb->next;
603        } else {        } else {
604          /* This PCB was the first. */          /* This PCB was the first. */
605          ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);          LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
606          tcp_tw_pcbs = pcb->next;          tcp_tw_pcbs = pcb->next;
607        }        }
608        pcb2 = pcb->next;        pcb2 = pcb->next;
# Line 1002  tcp_pcb_remove(struct tcp_pcb **pcblist, Line 1012  tcp_pcb_remove(struct tcp_pcb **pcblist,
1012    }      }  
1013    pcb->state = CLOSED;    pcb->state = CLOSED;
1014    
1015    ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());    LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
1016  }  }
1017  /*-----------------------------------------------------------------------------------*/  /*-----------------------------------------------------------------------------------*/
1018  /*  /*
# Line 1036  tcp_debug_print(struct tcp_hdr *tcphdr) Line 1046  tcp_debug_print(struct tcp_hdr *tcphdr)
1046    DEBUGF(TCP_DEBUG, ("|            %08lu           | (ack no)\n",    DEBUGF(TCP_DEBUG, ("|            %08lu           | (ack no)\n",
1047                       tcphdr->ackno));                       tcphdr->ackno));
1048    DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));    DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1049    DEBUGF(TCP_DEBUG, ("| %2d |    |%d%d%d%d%d|    %5d      | (offset, flags (",    DEBUGF(TCP_DEBUG, ("| %2u |    |%u%u%u%u%u|    %5u      | (offset, flags (",
1050                             TCPH_OFFSET(tcphdr),
1051                       TCPH_FLAGS(tcphdr) >> 4 & 1,                       TCPH_FLAGS(tcphdr) >> 4 & 1,
1052                       TCPH_FLAGS(tcphdr) >> 4 & 1,                       TCPH_FLAGS(tcphdr) >> 4 & 1,
1053                       TCPH_FLAGS(tcphdr) >> 3 & 1,                       TCPH_FLAGS(tcphdr) >> 3 & 1,
# Line 1047  tcp_debug_print(struct tcp_hdr *tcphdr) Line 1058  tcp_debug_print(struct tcp_hdr *tcphdr)
1058    tcp_debug_print_flags(TCPH_FLAGS(tcphdr));    tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
1059    DEBUGF(TCP_DEBUG, ("), win)\n"));    DEBUGF(TCP_DEBUG, ("), win)\n"));
1060    DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));    DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1061    DEBUGF(TCP_DEBUG, ("|    0x%04x     |     %5d     | (chksum, urgp)\n",    DEBUGF(TCP_DEBUG, ("|    0x%04x     |     %5u     | (chksum, urgp)\n",
1062                       ntohs(tcphdr->chksum), ntohs(tcphdr->urgp)));                       ntohs(tcphdr->chksum), ntohs(tcphdr->urgp)));
1063    DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));    DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
1064  }  }
# Line 1122  tcp_debug_print_pcbs(void) Line 1133  tcp_debug_print_pcbs(void)
1133    struct tcp_pcb *pcb;    struct tcp_pcb *pcb;
1134    DEBUGF(TCP_DEBUG, ("Active PCB states:\n"));    DEBUGF(TCP_DEBUG, ("Active PCB states:\n"));
1135    for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {    for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
1136      DEBUGF(TCP_DEBUG, ("Local port %d, foreign port %d snd_nxt %lu rcv_nxt %lu ",      DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
1137                         pcb->local_port, pcb->remote_port,                         pcb->local_port, pcb->remote_port,
1138                         pcb->snd_nxt, pcb->rcv_nxt));                         pcb->snd_nxt, pcb->rcv_nxt));
1139      tcp_debug_print_state(pcb->state);      tcp_debug_print_state(pcb->state);
1140    }        }    
1141    DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));    DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));
1142    for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) {    for(pcb = (struct tcp_pcb *)tcp_listen_pcbs; pcb != NULL; pcb = pcb->next) {
1143      DEBUGF(TCP_DEBUG, ("Local port %d, foreign port %d snd_nxt %lu rcv_nxt %lu ",      DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
1144                         pcb->local_port, pcb->remote_port,                         pcb->local_port, pcb->remote_port,
1145                         pcb->snd_nxt, pcb->rcv_nxt));                         pcb->snd_nxt, pcb->rcv_nxt));
1146      tcp_debug_print_state(pcb->state);      tcp_debug_print_state(pcb->state);
1147    }        }    
1148    DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n"));    DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n"));
1149    for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {    for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
1150      DEBUGF(TCP_DEBUG, ("Local port %d, foreign port %d snd_nxt %lu rcv_nxt %lu ",      DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
1151                         pcb->local_port, pcb->remote_port,                         pcb->local_port, pcb->remote_port,
1152                         pcb->snd_nxt, pcb->rcv_nxt));                         pcb->snd_nxt, pcb->rcv_nxt));
1153      tcp_debug_print_state(pcb->state);      tcp_debug_print_state(pcb->state);
# Line 1148  tcp_pcbs_sane(void) Line 1159  tcp_pcbs_sane(void)
1159  {  {
1160    struct tcp_pcb *pcb;    struct tcp_pcb *pcb;
1161    for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {    for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
1162      ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);      LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
1163      ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);      LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
1164      ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);      LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
1165    }    }
1166    for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {    for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
1167      ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);      LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
1168    }    }
1169    return 1;    return 1;
1170  }  }

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26