tcp.c
上传用户:yyhongfa
上传日期:2013-01-18
资源大小:267k
文件大小:38k
开发平台:

C/C++

  1. /**
  2.  * @file
  3.  *
  4.  * Transmission Control Protocol for IP
  5.  *
  6.  * This file contains common functions for the TCP implementation, such as functinos
  7.  * for manipulating the data structures and the TCP timer functions. TCP functions
  8.  * related to input and output is found in tcp_in.c and tcp_out.c respectively.
  9.  *
  10.  */
  11. /*
  12.  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
  13.  * All rights reserved. 
  14.  * 
  15.  * Redistribution and use in source and binary forms, with or without modification, 
  16.  * are permitted provided that the following conditions are met:
  17.  *
  18.  * 1. Redistributions of source code must retain the above copyright notice,
  19.  *    this list of conditions and the following disclaimer.
  20.  * 2. Redistributions in binary form must reproduce the above copyright notice,
  21.  *    this list of conditions and the following disclaimer in the documentation
  22.  *    and/or other materials provided with the distribution.
  23.  * 3. The name of the author may not be used to endorse or promote products
  24.  *    derived from this software without specific prior written permission. 
  25.  *
  26.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
  27.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  28.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
  29.  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  30.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
  31.  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  32.  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
  33.  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
  34.  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
  35.  * OF SUCH DAMAGE.
  36.  *
  37.  * This file is part of the lwIP TCP/IP stack.
  38.  * 
  39.  * Author: Adam Dunkels <adam@sics.se>
  40.  *
  41.  */
  42. #include <string.h>
  43. #include "lwip/opt.h"
  44. #include "lwip/def.h"
  45. #include "lwip/mem.h"
  46. #include "lwip/memp.h"
  47. #include "lwip/tcp.h"
  48. #include "uart.h"
  49. #if LWIP_TCP
  50. /* Incremented every coarse grained timer shot
  51.    (typically every 500 ms, determined by TCP_COARSE_TIMEOUT). */
  52. u32_t tcp_ticks;
  53. const u8_t tcp_backoff[13] =
  54.     { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
  55. /* The TCP PCB lists. */
  56. /** List of all TCP PCBs in LISTEN state */
  57. union tcp_listen_pcbs_t tcp_listen_pcbs;
  58. /** List of all TCP PCBs that are in a state in which
  59.  * they accept or send data. */
  60. struct tcp_pcb *tcp_active_pcbs;  
  61. /** List of all TCP PCBs in TIME-WAIT state */
  62. struct tcp_pcb *tcp_tw_pcbs;
  63. struct tcp_pcb *tcp_tmp_pcb;
  64. static u8_t tcp_timer;
  65. static u16_t tcp_new_port(void);
  66. /**
  67.  * Initializes the TCP layer.
  68.  */
  69. void
  70. tcp_init(void)
  71. {
  72.   /* Clear globals. */
  73.   tcp_listen_pcbs.listen_pcbs = NULL;
  74.   tcp_active_pcbs = NULL;
  75.   tcp_tw_pcbs = NULL;
  76.   tcp_tmp_pcb = NULL;
  77.   
  78.   /* initialize timer */
  79.   tcp_ticks = 0;
  80.   tcp_timer = 0;
  81.   
  82. }
  83. /*
  84. *this fun will be called ,when some EVENT happed to TCP CONNECT
  85. * created by skier 2006.01.30
  86. */
  87. #if LWIP_EVENT_API
  88. typedef enum
  89. {
  90.     PPP_DEAD = 0,
  91.     PPP_ESTABLISHED,
  92.     UDP_ESTABLISHED,
  93.     TCP_CONNECTING,
  94.     TCP_ESTABLISHED,
  95.     TCP_CLOSING,
  96.     
  97.     TCPIP_STATE_UNKNOWN, 
  98. }MY_TCPIP_STATE;
  99. extern void set_Mytcpip_state(MY_TCPIP_STATE state);
  100. extern void tcp_data_ind(u8_t *buf, u16_t len);
  101. extern void clear_sys_err(void);
  102. extern void add_sys_err(void);
  103. /*
  104. *create by skier 2006.01.31
  105. *this func will be called when the state of TCP Connect is changed.
  106. *this fun is very simple, you shuold complete it very carefully.
  107. */
  108. err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
  109.          LWIP_STATE lwip_event,
  110.          struct pbuf *p,
  111.          u16_t size,
  112.          err_t err)
  113. {
  114.      struct pbuf *temp = p;
  115.      //DEBUG_FUNCTION("lwip_tcp_event()");
  116.      switch(lwip_event)
  117.      {
  118.           case LWIP_EVENT_ACCEPT:
  119.      //tcp listen. accept a TCP Connect.
  120.                    DEBUG_EVENT("LWIP_EVENT_ACCEPT");
  121.      break;
  122.           case LWIP_EVENT_SENT:
  123.       //receive the ACK from TCP Peer.
  124.       //Data send successful!
  125.                    DEBUG_EVENT("LWIP_EVENT_SENT");
  126.      clear_sys_err();
  127.      break;
  128.   /*
  129.   *receive some data from TCP Peer
  130.   */
  131.           case LWIP_EVENT_RECV:
  132.      DEBUG_EVENT("LWIP_EVENT_RECV");
  133.  
  134.      while(temp != NULL)
  135.                    {
  136.                           tcp_data_ind((u8_t *)temp->payload, temp->len);
  137.                    temp = temp->next;
  138.                    }
  139.      clear_sys_err();
  140.  
  141.      break;
  142.           case LWIP_EVENT_CONNECTED:
  143.      //I this the connect of My TCP connect successful!
  144.      DEBUG_EVENT("LWIP_EVENT_CONNECTED");
  145.      set_Mytcpip_state(TCP_ESTABLISHED);
  146.      break;
  147.   
  148.           case LWIP_EVENT_POLL:
  149.                     // DEBUG_EVENT("LWIP_EVENT_POLL");
  150. break;
  151.           case LWIP_EVENT_ERR:
  152.      DEBUG_EVENT("LWIP_EVENT_ERR");                
  153.      set_Mytcpip_state(PPP_ESTABLISHED);
  154.      add_sys_err();
  155.     break;
  156.    default : 
  157.     break;
  158.      }
  159.    return ERR_OK;  
  160. }
  161. #endif
  162. #if LWIP_TCP
  163. static int tcpip_tcp_timer_active = 0;
  164. static void
  165. tcpip_tcp_timer(void *arg)
  166. {
  167.   (void)arg;
  168.   /* call TCP timer handler */
  169.   tcp_tmr();
  170.   /* timer still needed? */
  171.   if (tcp_active_pcbs || tcp_tw_pcbs) {
  172.     /* restart timer */
  173.     //TIMEOUT(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  174.       TCP_TIMER_START(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  175.   } else {
  176.     /* disable timer */
  177.     tcpip_tcp_timer_active = 0;
  178. /*
  179. *new added by skier 2006.01.29
  180. */
  181.     TCP_TIMER_STOP(tcpip_tcp_timer, NULL);
  182.   }
  183. }
  184. #if !NO_SYS
  185. void
  186. tcp_timer_needed(void)
  187. {
  188.   /* timer is off but needed again? */
  189.   if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
  190.     /* enable and start timer */
  191.     tcpip_tcp_timer_active = 1;
  192.     TCP_TIMER_START(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
  193.   }
  194. }
  195. #endif /* !NO_SYS */
  196. #endif /* LWIP_TCP */
  197. /**
  198.  * Called periodically to dispatch TCP timers.
  199.  *
  200.  */
  201. void
  202. tcp_tmr(void)
  203. {
  204.   /* Call tcp_fasttmr() every 250 ms */
  205.   tcp_fasttmr();
  206.   if (++tcp_timer & 1) {
  207.     /* Call tcp_tmr() every 500 ms, i.e., every other timer
  208.        tcp_tmr() is called. */
  209.     tcp_slowtmr();
  210.   }
  211. }
  212. /**
  213.  * Closes the connection held by the PCB.
  214.  *
  215.  */
  216. err_t
  217. tcp_close(struct tcp_pcb *pcb)
  218. {
  219.   err_t err;
  220. #if TCP_DEBUG
  221.   LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in state "));
  222.   tcp_debug_print_state(pcb->state);
  223.   LWIP_DEBUGF(TCP_DEBUG, ("n"));
  224. #endif /* TCP_DEBUG */
  225.   switch (pcb->state) {
  226.   case CLOSED:
  227.     /* Closing a pcb in the CLOSED state might seem erroneous,
  228.      * however, it is in this state once allocated and as yet unused
  229.      * and the user needs some way to free it should the need arise.
  230.      * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
  231.      * or for a pcb that has been used and then entered the CLOSED state 
  232.      * is erroneous, but this should never happen as the pcb has in those cases
  233.      * been freed, and so any remaining handles are bogus. */
  234.     err = ERR_OK;
  235.     memp_free(MEMP_TCP_PCB, pcb);
  236.     pcb = NULL;
  237.     break;
  238.   case LISTEN:
  239.     err = ERR_OK;
  240.     tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb);
  241.     memp_free(MEMP_TCP_PCB_LISTEN, pcb);
  242.     pcb = NULL;
  243.     break;
  244.   case SYN_SENT:
  245.     err = ERR_OK;
  246.     tcp_pcb_remove(&tcp_active_pcbs, pcb);
  247.     memp_free(MEMP_TCP_PCB, pcb);
  248.     pcb = NULL;
  249.     break;
  250.   case SYN_RCVD:
  251.   case ESTABLISHED:
  252.     err = tcp_send_ctrl(pcb, TCP_FIN);
  253.     if (err == ERR_OK) {
  254.       pcb->state = FIN_WAIT_1;
  255.     }
  256.     break;
  257.   case CLOSE_WAIT:
  258.     err = tcp_send_ctrl(pcb, TCP_FIN);
  259.     if (err == ERR_OK) {
  260.       pcb->state = LAST_ACK;
  261.     }
  262.     break;
  263.   default:
  264.     /* Has already been closed, do nothing. */
  265.     err = ERR_OK;
  266.     pcb = NULL;
  267.     break;
  268.   }
  269.   if (pcb != NULL && err == ERR_OK) {
  270.     err = tcp_output(pcb);
  271.   }
  272.   return err;
  273. }
  274. /**
  275.  * Aborts a connection by sending a RST to the remote host and deletes
  276.  * the local protocol control block. This is done when a connection is
  277.  * killed because of shortage of memory.
  278.  *
  279.  */
  280. void
  281. tcp_abort(struct tcp_pcb *pcb)
  282. {
  283.   u32_t seqno, ackno;
  284.   u16_t remote_port, local_port;
  285.   struct ip_addr remote_ip, local_ip;
  286. #if LWIP_CALLBACK_API  
  287.   void (* errf)(void *arg, err_t err);
  288. #endif /* LWIP_CALLBACK_API */
  289.   void *errf_arg;
  290.   
  291.   /* Figure out on which TCP PCB list we are, and remove us. If we
  292.      are in an active state, call the receive function associated with
  293.      the PCB with a NULL argument, and send an RST to the remote end. */
  294.   if (pcb->state == TIME_WAIT) {
  295.     tcp_pcb_remove(&tcp_tw_pcbs, pcb);
  296.     memp_free(MEMP_TCP_PCB, pcb);
  297.   } else {
  298.     seqno = pcb->snd_nxt;
  299.     ackno = pcb->rcv_nxt;
  300.     ip_addr_set(&local_ip, &(pcb->local_ip));
  301.     ip_addr_set(&remote_ip, &(pcb->remote_ip));
  302.     local_port = pcb->local_port;
  303.     remote_port = pcb->remote_port;
  304. #if LWIP_CALLBACK_API
  305.     errf = pcb->errf;
  306. #endif /* LWIP_CALLBACK_API */
  307.     errf_arg = pcb->callback_arg;
  308.     tcp_pcb_remove(&tcp_active_pcbs, pcb);
  309.     if (pcb->unacked != NULL) {
  310.       tcp_segs_free(pcb->unacked);
  311.     }
  312.     if (pcb->unsent != NULL) {
  313.       tcp_segs_free(pcb->unsent);
  314.     }
  315. #if TCP_QUEUE_OOSEQ    
  316.     if (pcb->ooseq != NULL) {
  317.       tcp_segs_free(pcb->ooseq);
  318.     }
  319. #endif /* TCP_QUEUE_OOSEQ */
  320.     memp_free(MEMP_TCP_PCB, pcb);
  321.     TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
  322.     LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abort: sending RSTn"));
  323.     tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port);
  324.   }
  325. }
  326. /**
  327.  * Binds the connection to a local portnumber and IP address. If the
  328.  * IP address is not given (i.e., ipaddr == NULL), the IP address of
  329.  * the outgoing network interface is used instead.
  330.  *
  331.  */
  332. err_t
  333. tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
  334. {
  335.   struct tcp_pcb *cpcb;
  336. #if SO_REUSE
  337.   int reuse_port_all_set = 1;
  338. #endif /* SO_REUSE */
  339.   if (port == 0) {
  340.     port = tcp_new_port();
  341.   }
  342. #if SO_REUSE == 0
  343.   /* Check if the address already is in use. */
  344.   for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs;
  345.       cpcb != NULL; cpcb = cpcb->next) {
  346.     if (cpcb->local_port == port) {
  347.       if (ip_addr_isany(&(cpcb->local_ip)) ||
  348.         ip_addr_isany(ipaddr) ||
  349.         ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  350.           return ERR_USE;
  351.       }
  352.     }
  353.   }
  354.   for(cpcb = tcp_active_pcbs;
  355.       cpcb != NULL; cpcb = cpcb->next) {
  356.     if (cpcb->local_port == port) {
  357.       if (ip_addr_isany(&(cpcb->local_ip)) ||
  358.    ip_addr_isany(ipaddr) ||
  359.    ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  360.   return ERR_USE;
  361.       }
  362.     }
  363.   }
  364. #else /* SO_REUSE */
  365.   /* Search through list of PCB's in LISTEN state. 
  366.      
  367.   If there is a PCB bound to specified port and IP_ADDR_ANY another PCB can be bound to the interface IP
  368.   or to the loopback address on the same port if SOF_REUSEADDR is set. Any combination of PCB's bound to 
  369.   the same local port, but to one address out of {IP_ADDR_ANY, 127.0.0.1, interface IP} at a time is valid.
  370.   But no two PCB's bound to same local port and same local address is valid.
  371.   
  372.   If SOF_REUSEPORT is set several PCB's can be bound to same local port and same local address also. But then 
  373.   all PCB's must have the SOF_REUSEPORT option set.
  374.   
  375.   When the two options aren't set and specified port is already bound, ERR_USE is returned saying that 
  376.   address is already in use. */
  377.   for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; cpcb != NULL; cpcb = cpcb->next) {
  378.     if(cpcb->local_port == port) {
  379.       if(ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  380.         if(pcb->so_options & SOF_REUSEPORT) {
  381.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in listening PCB's: SO_REUSEPORT set and same address.n"));
  382.           reuse_port_all_set = (reuse_port_all_set && (cpcb->so_options & SOF_REUSEPORT));
  383.         }
  384.         else {
  385.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in listening PCB's: SO_REUSEPORT not set and same address.n"));
  386.           return ERR_USE;
  387.         }
  388.       }
  389.       else if((ip_addr_isany(ipaddr) && !ip_addr_isany(&(cpcb->local_ip))) ||
  390.               (!ip_addr_isany(ipaddr) && ip_addr_isany(&(cpcb->local_ip)))) {
  391.         if(!(pcb->so_options & SOF_REUSEADDR) && !(pcb->so_options & SOF_REUSEPORT)) {
  392.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in listening PCB's SO_REUSEPORT or SO_REUSEADDR not set and not the same address.n"));
  393.           return ERR_USE;
  394.         }      
  395.         else {
  396.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in listening PCB's SO_REUSEPORT or SO_REUSEADDR set and not the same address.n"));
  397.         }     
  398.       }
  399.     }
  400.   }
  401.   /* Search through list of PCB's in a state in which they can accept or send data. Same decription as for 
  402.      PCB's in state LISTEN applies to this PCB's regarding the options SOF_REUSEADDR and SOF_REUSEPORT. */
  403.   for(cpcb = tcp_active_pcbs; cpcb != NULL; cpcb = cpcb->next) {
  404.     if(cpcb->local_port == port) {
  405.       if(ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  406.         if(pcb->so_options & SOF_REUSEPORT) {
  407.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in active PCB's SO_REUSEPORT set and same address.n"));
  408.           reuse_port_all_set = (reuse_port_all_set && (cpcb->so_options & SOF_REUSEPORT));
  409.         }
  410.         else {
  411.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in active PCB's SO_REUSEPORT not set and same address.n"));
  412.           return ERR_USE;
  413.         }
  414.       }
  415.       else if((ip_addr_isany(ipaddr) && !ip_addr_isany(&(cpcb->local_ip))) ||
  416.               (!ip_addr_isany(ipaddr) && ip_addr_isany(&(cpcb->local_ip)))) {
  417.         if(!(pcb->so_options & SOF_REUSEADDR) && !(pcb->so_options & SOF_REUSEPORT)) {
  418.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in active PCB's SO_REUSEPORT or SO_REUSEADDR not set and not the same address.n"));
  419.           return ERR_USE;
  420.         }   
  421.         else {
  422.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in active PCB's SO_REUSEPORT or SO_REUSEADDR set and not the same address.n"));
  423.         }        
  424.       }
  425.     }
  426.   }
  427.   /* Search through list of PCB's in TIME_WAIT state. If SO_REUSEADDR is set a bound combination [IP, port} 
  428.      can be rebound. The same applies when SOF_REUSEPORT is set. 
  429.      
  430.      If SOF_REUSEPORT is set several PCB's can be bound to same local port and same local address also. But then 
  431.      all PCB's must have the SOF_REUSEPORT option set.
  432.      
  433.      When the two options aren't set and specified port is already bound, ERR_USE is returned saying that 
  434.      address is already in use. */
  435.   for(cpcb = tcp_tw_pcbs; cpcb != NULL; cpcb = cpcb->next) {
  436.     if(cpcb->local_port == port) {
  437.       if(ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
  438.         if(!(pcb->so_options & SOF_REUSEADDR) && !(pcb->so_options & SOF_REUSEPORT)) {
  439.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in TIME_WAIT PCB's SO_REUSEPORT or SO_REUSEADDR not set and same address.n"));
  440.           return ERR_USE;
  441.         }
  442.         else if(pcb->so_options & SOF_REUSEPORT) {
  443.           LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: in TIME_WAIT PCB's SO_REUSEPORT set and same address.n"));
  444.           reuse_port_all_set = (reuse_port_all_set && (cpcb->so_options & SOF_REUSEPORT));
  445.         }
  446.       }
  447.     }
  448.   }
  449.   /* If SOF_REUSEPORT isn't set in all PCB's bound to specified port and local address specified then 
  450.      {IP, port} can't be reused. */
  451.   if(!reuse_port_all_set) {
  452.     LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: not all sockets have SO_REUSEPORT set.n"));
  453.     return ERR_USE;
  454.   }
  455. #endif /* SO_REUSE */
  456.   if (!ip_addr_isany(ipaddr)) {
  457.     pcb->local_ip = *ipaddr;
  458.   }
  459.   pcb->local_port = port;
  460.   LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %un", port));
  461.   return ERR_OK;
  462. }
  463. #if LWIP_CALLBACK_API
  464. static err_t
  465. tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)
  466. {
  467.   (void)arg;
  468.   (void)pcb;
  469.   (void)err;
  470.   return ERR_ABRT;
  471. }
  472. #endif /* LWIP_CALLBACK_API */
  473. /**
  474.  * Set the state of the connection to be LISTEN, which means that it
  475.  * is able to accept incoming connections. The protocol control block
  476.  * is reallocated in order to consume less memory. Setting the
  477.  * connection to LISTEN is an irreversible process.
  478.  *
  479.  */
  480. struct tcp_pcb *
  481. tcp_listen(struct tcp_pcb *pcb)
  482. {
  483.   struct tcp_pcb_listen *lpcb;
  484.   /* already listening? */
  485.   if (pcb->state == LISTEN) {
  486.     return pcb;
  487.   }
  488.   lpcb = memp_malloc(MEMP_TCP_PCB_LISTEN);
  489.   if (lpcb == NULL) {
  490.     return NULL;
  491.   }
  492.   lpcb->callback_arg = pcb->callback_arg;
  493.   lpcb->local_port = pcb->local_port;
  494.   lpcb->state = LISTEN;
  495.   lpcb->so_options = pcb->so_options;
  496.   lpcb->so_options |= SOF_ACCEPTCONN;
  497.   lpcb->ttl = pcb->ttl;
  498.   lpcb->tos = pcb->tos;
  499.   ip_addr_set(&lpcb->local_ip, &pcb->local_ip);
  500.   memp_free(MEMP_TCP_PCB, pcb);
  501. #if LWIP_CALLBACK_API
  502.   lpcb->accept = tcp_accept_null;
  503. #endif /* LWIP_CALLBACK_API */
  504.   TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb);
  505.   return (struct tcp_pcb *)lpcb;
  506. }
  507. /**
  508.  * This function should be called by the application when it has
  509.  * processed the data. The purpose is to advertise a larger window
  510.  * when the data has been processed.
  511.  *
  512.  */
  513. void
  514. tcp_recved(struct tcp_pcb *pcb, u16_t len)
  515. {
  516.   if ((u32_t)pcb->rcv_wnd + len > TCP_WND) {
  517.     pcb->rcv_wnd = TCP_WND;
  518.   } else {
  519.     pcb->rcv_wnd += len;
  520.   }
  521.   if (!(pcb->flags & TF_ACK_DELAY) &&
  522.      !(pcb->flags & TF_ACK_NOW)) {
  523.     /*
  524.      * We send an ACK here (if one is not already pending, hence
  525.      * the above tests) as tcp_recved() implies that the application
  526.      * has processed some data, and so we can open the receiver's
  527.      * window to allow more to be transmitted.  This could result in
  528.      * two ACKs being sent for each received packet in some limited cases
  529.      * (where the application is only receiving data, and is slow to
  530.      * process it) but it is necessary to guarantee that the sender can
  531.      * continue to transmit.
  532.      */
  533.     tcp_ack(pcb);
  534.   } 
  535.   else if (pcb->flags & TF_ACK_DELAY && pcb->rcv_wnd >= TCP_WND/2) {
  536.     /* If we can send a window update such that there is a full
  537.      * segment available in the window, do so now.  This is sort of
  538.      * nagle-like in its goals, and tries to hit a compromise between
  539.      * sending acks each time the window is updated, and only sending
  540.      * window updates when a timer expires.  The "threshold" used
  541.      * above (currently TCP_WND/2) can be tuned to be more or less
  542.      * aggressive  */
  543.     tcp_ack_now(pcb);
  544.   }
  545.   LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %u bytes, wnd %u (%u).n",
  546.          len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));
  547. }
  548. /**
  549.  * A nastly hack featuring 'goto' statements that allocates a
  550.  * new TCP local port.
  551.  */
  552. static u16_t
  553. tcp_new_port(void)
  554. {
  555.   struct tcp_pcb *pcb;
  556. #ifndef TCP_LOCAL_PORT_RANGE_START
  557. #define TCP_LOCAL_PORT_RANGE_START 4096
  558. #define TCP_LOCAL_PORT_RANGE_END   0x7fff
  559. #endif
  560.   static u16_t port = TCP_LOCAL_PORT_RANGE_START;
  561.   
  562.  again:
  563.   if (++port > TCP_LOCAL_PORT_RANGE_END) {
  564.     port = TCP_LOCAL_PORT_RANGE_START;
  565.   }
  566.   
  567.   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  568.     if (pcb->local_port == port) {
  569.       goto again;
  570.     }
  571.   }
  572.   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  573.     if (pcb->local_port == port) {
  574.       goto again;
  575.     }
  576.   }
  577.   for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
  578.     if (pcb->local_port == port) {
  579.       goto again;
  580.     }
  581.   }
  582.   return port;
  583. }
  584. /**
  585.  * Connects to another host. The function given as the "connected"
  586.  * argument will be called when the connection has been established.
  587.  *
  588.  */
  589. err_t
  590. tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
  591.       err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err))
  592. {
  593.   u32_t optdata;
  594.   err_t ret;
  595.   u32_t iss;
  596.   LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %un", port));
  597.   if (ipaddr != NULL) {
  598.     pcb->remote_ip = *ipaddr;
  599.   } else {
  600.     return ERR_VAL;
  601.   }
  602.   pcb->remote_port = port;
  603.   if (pcb->local_port == 0) {
  604.     pcb->local_port = tcp_new_port();
  605.   }
  606.   iss = tcp_next_iss();
  607.   pcb->rcv_nxt = 0;
  608.   pcb->snd_nxt = iss;
  609.   pcb->lastack = iss - 1;
  610.   pcb->snd_lbb = iss - 1;
  611.   pcb->rcv_wnd = TCP_WND;
  612.   pcb->snd_wnd = TCP_WND;
  613.   pcb->mss = TCP_MSS;
  614.   pcb->cwnd = 1;
  615.   pcb->ssthresh = pcb->mss * 10;
  616.   pcb->state = SYN_SENT;
  617. #if LWIP_CALLBACK_API  
  618.   pcb->connected = connected;
  619. #endif /* LWIP_CALLBACK_API */  
  620.   TCP_REG(&tcp_active_pcbs, pcb);
  621.   
  622.   /* Build an MSS option */
  623.   optdata = htonl(((u32_t)2 << 24) | 
  624.       ((u32_t)4 << 16) | 
  625.       (((u32_t)pcb->mss / 256) << 8) |
  626.       (pcb->mss & 255));
  627.   ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, (u8_t *)&optdata, 4);
  628.   if (ret == ERR_OK) { 
  629.     tcp_output(pcb);
  630.   }
  631.   return ret;
  632. /**
  633.  * Called every 500 ms and implements the retransmission timer and the timer that
  634.  * removes PCBs that have been in TIME-WAIT for enough time. It also increments
  635.  * various timers such as the inactivity timer in each PCB.
  636.  */
  637. void
  638. tcp_slowtmr(void)
  639. {
  640.   struct tcp_pcb *pcb, *pcb2, *prev;
  641.   u32_t eff_wnd;
  642.   u8_t pcb_remove;      /* flag if a PCB should be removed */
  643.   err_t err;
  644.   err = ERR_OK;
  645.   ++tcp_ticks;
  646.   /* Steps through all of the active PCBs. */
  647.   prev = NULL;
  648.   pcb = tcp_active_pcbs;
  649.   if (pcb == NULL) {
  650.     LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbsn"));
  651.   }
  652.   while (pcb != NULL) {
  653.     LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcbn"));
  654.     LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSEDn", pcb->state != CLOSED);
  655.     LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTENn", pcb->state != LISTEN);
  656.     LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAITn", pcb->state != TIME_WAIT);
  657.     pcb_remove = 0;
  658.     if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
  659.       ++pcb_remove;
  660.       LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reachedn"));
  661.     }
  662.     else if (pcb->nrtx == TCP_MAXRTX) {
  663.       ++pcb_remove;
  664.       LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reachedn"));
  665.     } else {
  666.       ++pcb->rtime;
  667.       if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
  668.         /* Time for a retransmission. */
  669.         LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %u pcb->rto %un",
  670.           pcb->rtime, pcb->rto));
  671.         /* Double retransmission time-out unless we are trying to
  672.          * connect to somebody (i.e., we are in SYN_SENT). */
  673.         if (pcb->state != SYN_SENT) {
  674.           pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
  675.         }
  676.         /* Reduce congestion window and ssthresh. */
  677.         eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
  678.         pcb->ssthresh = eff_wnd >> 1;
  679.         if (pcb->ssthresh < pcb->mss) {
  680.           pcb->ssthresh = pcb->mss * 2;
  681.         }
  682.         pcb->cwnd = pcb->mss;
  683.         LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %u ssthresh %un",
  684.                                 pcb->cwnd, pcb->ssthresh));
  685.  
  686.         /* The following needs to be called AFTER cwnd is set to one mss - STJ */
  687.         tcp_rexmit_rto(pcb);
  688.      }
  689.     }
  690.     /* Check if this PCB has stayed too long in FIN-WAIT-2 */
  691.     if (pcb->state == FIN_WAIT_2) {
  692.       if ((u32_t)(tcp_ticks - pcb->tmr) >
  693.         TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
  694.         ++pcb_remove;
  695.         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2n"));
  696.       }
  697.     }
  698.    /* Check if KEEPALIVE should be sent */
  699.    if((pcb->so_options & SOF_KEEPALIVE) && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
  700.       if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + TCP_MAXIDLE) / TCP_SLOW_INTERVAL)  {
  701.          LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %u.%u.%u.%u.n",
  702.                                  ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip),
  703.                                  ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip)));
  704.          tcp_abort(pcb);
  705.       }
  706.       else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + pcb->keep_cnt * TCP_KEEPINTVL) / TCP_SLOW_INTERVAL) {
  707.          tcp_keepalive(pcb);
  708.          pcb->keep_cnt++;
  709.       }
  710.    }
  711.     /* If this PCB has queued out of sequence data, but has been
  712.        inactive for too long, will drop the data (it will eventually
  713.        be retransmitted). */
  714. #if TCP_QUEUE_OOSEQ    
  715.     if (pcb->ooseq != NULL &&
  716.        (u32_t)tcp_ticks - pcb->tmr >=
  717.        pcb->rto * TCP_OOSEQ_TIMEOUT) {
  718.       tcp_segs_free(pcb->ooseq);
  719.       pcb->ooseq = NULL;
  720.       LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued datan"));
  721.     }
  722. #endif /* TCP_QUEUE_OOSEQ */
  723.     /* Check if this PCB has stayed too long in SYN-RCVD */
  724.     if (pcb->state == SYN_RCVD) {
  725.       if ((u32_t)(tcp_ticks - pcb->tmr) >
  726.    TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
  727.         ++pcb_remove;
  728.         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVDn"));
  729.       }
  730.     }
  731.     /* If the PCB should be removed, do it. */
  732.     if (pcb_remove) {
  733.       tcp_pcb_purge(pcb);      
  734.       /* Remove PCB from tcp_active_pcbs list. */
  735.       if (prev != NULL) {
  736.   LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
  737.         prev->next = pcb->next;
  738.       } else {
  739.         /* This PCB was the first. */
  740.         LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
  741.         tcp_active_pcbs = pcb->next;
  742.       }
  743.       TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_ABRT);
  744.       pcb2 = pcb->next;
  745.       memp_free(MEMP_TCP_PCB, pcb);
  746.       pcb = pcb2;
  747.     } else {
  748.       /* We check if we should poll the connection. */
  749.       ++pcb->polltmr;
  750.       if (pcb->polltmr >= pcb->pollinterval) {
  751.         pcb->polltmr = 0;
  752.         LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling applicationn"));
  753.         TCP_EVENT_POLL(pcb, err);
  754.         if (err == ERR_OK) {
  755.           tcp_output(pcb);
  756.         }
  757.       }
  758.       
  759.       prev = pcb;
  760.       pcb = pcb->next;
  761.     }
  762.   }
  763.   
  764.   /* Steps through all of the TIME-WAIT PCBs. */
  765.   prev = NULL;    
  766.   pcb = tcp_tw_pcbs;
  767.   while (pcb != NULL) {
  768.     LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  769.     pcb_remove = 0;
  770.     /* Check if this PCB has stayed long enough in TIME-WAIT */
  771.     if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
  772.       ++pcb_remove;
  773.     }
  774.     
  775.     /* If the PCB should be removed, do it. */
  776.     if (pcb_remove) {
  777.       tcp_pcb_purge(pcb);      
  778.       /* Remove PCB from tcp_tw_pcbs list. */
  779.       if (prev != NULL) {
  780.   LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
  781.         prev->next = pcb->next;
  782.       } else {
  783.         /* This PCB was the first. */
  784.         LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
  785.         tcp_tw_pcbs = pcb->next;
  786.       }
  787.       pcb2 = pcb->next;
  788.       memp_free(MEMP_TCP_PCB, pcb);
  789.       pcb = pcb2;
  790.     } else {
  791.       prev = pcb;
  792.       pcb = pcb->next;
  793.     }
  794.   }
  795. }
  796. /**
  797.  * Is called every TCP_FAST_INTERVAL (250 ms) and sends delayed ACKs.
  798.  */
  799. void
  800. tcp_fasttmr(void)
  801. {
  802.   struct tcp_pcb *pcb;
  803.   /* send delayed ACKs */  
  804.   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  805.     if (pcb->flags & TF_ACK_DELAY) {
  806.       LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACKn"));
  807.       tcp_ack_now(pcb);
  808.       pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
  809.     }
  810.   }
  811. }
  812. /**
  813.  * Deallocates a list of TCP segments (tcp_seg structures).
  814.  *
  815.  */
  816. u8_t
  817. tcp_segs_free(struct tcp_seg *seg)
  818. {
  819.   u8_t count = 0;
  820.   struct tcp_seg *next;
  821.   while (seg != NULL) {
  822.     next = seg->next;
  823.     count += tcp_seg_free(seg);
  824.     seg = next;
  825.   }
  826.   return count;
  827. }
  828. /**
  829.  * Frees a TCP segment.
  830.  *
  831.  */
  832. u8_t
  833. tcp_seg_free(struct tcp_seg *seg)
  834. {
  835.   u8_t count = 0;
  836.   
  837.   if (seg != NULL) {
  838.     if (seg->p != NULL) {
  839.       count = pbuf_free(seg->p);
  840. #if TCP_DEBUG
  841.       seg->p = NULL;
  842. #endif /* TCP_DEBUG */
  843.     }
  844.     memp_free(MEMP_TCP_SEG, seg);
  845.   }
  846.   return count;
  847. }
  848. /**
  849.  * Sets the priority of a connection.
  850.  *
  851.  */
  852. void
  853. tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
  854. {
  855.   pcb->prio = prio;
  856. }
  857. #if TCP_QUEUE_OOSEQ
  858. /**
  859.  * Returns a copy of the given TCP segment.
  860.  *
  861.  */ 
  862. struct tcp_seg *
  863. tcp_seg_copy(struct tcp_seg *seg)
  864. {
  865.   struct tcp_seg *cseg;
  866.   cseg = memp_malloc(MEMP_TCP_SEG);
  867.   if (cseg == NULL) {
  868.     return NULL;
  869.   }
  870.   memcpy((char *)cseg, (const char *)seg, sizeof(struct tcp_seg)); 
  871.   pbuf_ref(cseg->p);
  872.   return cseg;
  873. }
  874. #endif
  875. #if LWIP_CALLBACK_API
  876. static err_t
  877. tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  878. {
  879.   arg = arg;
  880.   if (p != NULL) {
  881.     pbuf_free(p);
  882.   } else if (err == ERR_OK) {
  883.     return tcp_close(pcb);
  884.   }
  885.   return ERR_OK;
  886. }
  887. #endif /* LWIP_CALLBACK_API */
  888. static void
  889. tcp_kill_prio(u8_t prio)
  890. {
  891.   struct tcp_pcb *pcb, *inactive;
  892.   u32_t inactivity;
  893.   u8_t mprio;
  894.   mprio = TCP_PRIO_MAX;
  895.   
  896.   /* We kill the oldest active connection that has lower priority than
  897.      prio. */
  898.   inactivity = 0;
  899.   inactive = NULL;
  900.   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  901.     if (pcb->prio <= prio &&
  902.        pcb->prio <= mprio &&
  903.        (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  904.       inactivity = tcp_ticks - pcb->tmr;
  905.       inactive = pcb;
  906.       mprio = pcb->prio;
  907.     }
  908.   }
  909.   if (inactive != NULL) {
  910.     LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%ld)n",
  911.            (void *)inactive, inactivity));
  912.     tcp_abort(inactive);
  913.   }      
  914. }
  915. static void
  916. tcp_kill_timewait(void)
  917. {
  918.   struct tcp_pcb *pcb, *inactive;
  919.   u32_t inactivity;
  920.   inactivity = 0;
  921.   inactive = NULL;
  922.   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  923.     if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
  924.       inactivity = tcp_ticks - pcb->tmr;
  925.       inactive = pcb;
  926.     }
  927.   }
  928.   if (inactive != NULL) {
  929.     LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%ld)n",
  930.            (void *)inactive, inactivity));
  931.     tcp_abort(inactive);
  932.   }      
  933. }
  934. struct tcp_pcb *
  935. tcp_alloc(u8_t prio)
  936. {
  937.   struct tcp_pcb *pcb;
  938.   u32_t iss;
  939.   
  940.   pcb = memp_malloc(MEMP_TCP_PCB);
  941.   if (pcb == NULL) {
  942.     /* Try killing oldest connection in TIME-WAIT. */
  943.     LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connectionn"));
  944.     tcp_kill_timewait();
  945.     pcb = memp_malloc(MEMP_TCP_PCB);
  946.     if (pcb == NULL) {
  947.       tcp_kill_prio(prio);    
  948.       pcb = memp_malloc(MEMP_TCP_PCB);
  949.     }
  950.   }
  951.   if (pcb != NULL) {
  952.     memset(pcb, 0, sizeof(struct tcp_pcb));
  953.     pcb->prio = TCP_PRIO_NORMAL;
  954.     pcb->snd_buf = TCP_SND_BUF;
  955.     pcb->snd_queuelen = 0;
  956.     pcb->rcv_wnd = TCP_WND;
  957.     pcb->tos = 0;
  958.     pcb->ttl = TCP_TTL;
  959.     pcb->mss = TCP_MSS;
  960.     pcb->rto = 3000 / TCP_SLOW_INTERVAL;
  961.     pcb->sa = 0;
  962.     pcb->sv = 3000 / TCP_SLOW_INTERVAL;
  963.     pcb->rtime = 0;
  964.     pcb->cwnd = 1;
  965.     iss = tcp_next_iss();
  966.     pcb->snd_wl2 = iss;
  967.     pcb->snd_nxt = iss;
  968.     pcb->snd_max = iss;
  969.     pcb->lastack = iss;
  970.     pcb->snd_lbb = iss;   
  971.     pcb->tmr = tcp_ticks;
  972.     pcb->polltmr = 0;
  973.    /*new added by skier 2006.01.31*/
  974.     pcb->pollinterval = 10;
  975.    //end:skier
  976. #if LWIP_CALLBACK_API
  977.     pcb->recv = tcp_recv_null;
  978. #endif /* LWIP_CALLBACK_API */  
  979.     
  980.     /* Init KEEPALIVE timer */
  981.     pcb->keepalive = TCP_KEEPDEFAULT;
  982.     pcb->keep_cnt = 0;
  983.   }
  984.   return pcb;
  985. }
  986. /**
  987.  * Creates a new TCP protocol control block but doesn't place it on
  988.  * any of the TCP PCB lists.
  989.  *
  990.  * @internal: Maybe there should be a idle TCP PCB list where these
  991.  * PCBs are put on. We can then implement port reservation using
  992.  * tcp_bind(). Currently, we lack this (BSD socket type of) feature.
  993.  */
  994. struct tcp_pcb *
  995. tcp_new(void)
  996. {
  997.   return tcp_alloc(TCP_PRIO_NORMAL);
  998. }
  999. /*
  1000.  * tcp_arg():
  1001.  *
  1002.  * Used to specify the argument that should be passed callback
  1003.  * functions.
  1004.  *
  1005.  */ 
  1006. void
  1007. tcp_arg(struct tcp_pcb *pcb, void *arg)
  1008. {  
  1009.   pcb->callback_arg = arg;
  1010. }
  1011. #if LWIP_CALLBACK_API
  1012. /**
  1013.  * Used to specify the function that should be called when a TCP
  1014.  * connection receives data.
  1015.  *
  1016.  */ 
  1017. void
  1018. tcp_recv(struct tcp_pcb *pcb,
  1019.    err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err))
  1020. {
  1021.   pcb->recv = recv;
  1022. }
  1023. /**
  1024.  * Used to specify the function that should be called when TCP data
  1025.  * has been successfully delivered to the remote host.
  1026.  *
  1027.  */ 
  1028. void
  1029. tcp_sent(struct tcp_pcb *pcb,
  1030.    err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len))
  1031. {
  1032.   pcb->sent = sent;
  1033. }
  1034. /**
  1035.  * Used to specify the function that should be called when a fatal error
  1036.  * has occured on the connection.
  1037.  *
  1038.  */ 
  1039. void
  1040. tcp_err(struct tcp_pcb *pcb,
  1041.    void (* errf)(void *arg, err_t err))
  1042. {
  1043.   pcb->errf = errf;
  1044. }
  1045. /**
  1046.  * Used for specifying the function that should be called when a
  1047.  * LISTENing connection has been connected to another host.
  1048.  *
  1049.  */ 
  1050. void
  1051. tcp_accept(struct tcp_pcb *pcb,
  1052.      err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err))
  1053. {
  1054.   ((struct tcp_pcb_listen *)pcb)->accept = accept;
  1055. }
  1056. #endif /* LWIP_CALLBACK_API */
  1057. /**
  1058.  * Used to specify the function that should be called periodically
  1059.  * from TCP. The interval is specified in terms of the TCP coarse
  1060.  * timer interval, which is called twice a second.
  1061.  *
  1062.  */ 
  1063. void
  1064. tcp_poll(struct tcp_pcb *pcb,
  1065.    err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval)
  1066. {
  1067. #if LWIP_CALLBACK_API
  1068.   pcb->poll = poll;
  1069. #endif /* LWIP_CALLBACK_API */  
  1070.   pcb->pollinterval = interval;
  1071. }
  1072. /**
  1073.  * Purges a TCP PCB. Removes any buffered data and frees the buffer memory.
  1074.  *
  1075.  */
  1076. void
  1077. tcp_pcb_purge(struct tcp_pcb *pcb)
  1078. {
  1079.   if (pcb->state != CLOSED &&
  1080.      pcb->state != TIME_WAIT &&
  1081.      pcb->state != LISTEN) {
  1082.     LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purgen"));
  1083.     
  1084.     if (pcb->unsent != NULL) {    
  1085.       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sentn"));
  1086.     }
  1087.     if (pcb->unacked != NULL) {    
  1088.       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unackedn"));
  1089.     }
  1090. #if TCP_QUEUE_OOSEQ /* LW */
  1091.     if (pcb->ooseq != NULL) {    
  1092.       LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseqn"));
  1093.     }
  1094.     
  1095.     tcp_segs_free(pcb->ooseq);
  1096.     pcb->ooseq = NULL;
  1097. #endif /* TCP_QUEUE_OOSEQ */
  1098.     tcp_segs_free(pcb->unsent);
  1099.     tcp_segs_free(pcb->unacked);
  1100.     pcb->unacked = pcb->unsent = NULL;
  1101.   }
  1102. }
  1103. /**
  1104.  * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.
  1105.  *
  1106.  */
  1107. void
  1108. tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
  1109. {
  1110.   TCP_RMV(pcblist, pcb);
  1111.   tcp_pcb_purge(pcb);
  1112.   
  1113.   /* if there is an outstanding delayed ACKs, send it */
  1114.   if (pcb->state != TIME_WAIT &&
  1115.      pcb->state != LISTEN &&
  1116.      pcb->flags & TF_ACK_DELAY) {
  1117.     pcb->flags |= TF_ACK_NOW;
  1118.     tcp_output(pcb);
  1119.   }  
  1120.   pcb->state = CLOSED;
  1121.   LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
  1122. }
  1123. /**
  1124.  * Calculates a new initial sequence number for new connections.
  1125.  *
  1126.  */
  1127. u32_t
  1128. tcp_next_iss(void)
  1129. {
  1130.   static u32_t iss = 6510;
  1131.   
  1132.   iss += tcp_ticks;       /* XXX */
  1133.   return iss;
  1134. }
  1135. #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
  1136. void
  1137. tcp_debug_print(struct tcp_hdr *tcphdr)
  1138. {
  1139.   LWIP_DEBUGF(TCP_DEBUG, ("TCP header:n"));
  1140.   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+n"));
  1141.   LWIP_DEBUGF(TCP_DEBUG, ("|    %5u      |    %5u      | (src port, dest port)n",
  1142.          ntohs(tcphdr->src), ntohs(tcphdr->dest)));
  1143.   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+n"));
  1144.   LWIP_DEBUGF(TCP_DEBUG, ("|           %010lu          | (seq no)n",
  1145.           ntohl(tcphdr->seqno)));
  1146.   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+n"));
  1147.   LWIP_DEBUGF(TCP_DEBUG, ("|           %010lu          | (ack no)n",
  1148.          ntohl(tcphdr->ackno)));
  1149.   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+n"));
  1150.   LWIP_DEBUGF(TCP_DEBUG, ("| %2u |   |%u%u%u%u%u%u|     %5u     | (hdrlen, flags (",
  1151.        TCPH_HDRLEN(tcphdr),
  1152.          TCPH_FLAGS(tcphdr) >> 5 & 1,
  1153.          TCPH_FLAGS(tcphdr) >> 4 & 1,
  1154.          TCPH_FLAGS(tcphdr) >> 3 & 1,
  1155.          TCPH_FLAGS(tcphdr) >> 2 & 1,
  1156.          TCPH_FLAGS(tcphdr) >> 1 & 1,
  1157.          TCPH_FLAGS(tcphdr) & 1,
  1158.          ntohs(tcphdr->wnd)));
  1159.   tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
  1160.   LWIP_DEBUGF(TCP_DEBUG, ("), win)n"));
  1161.   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+n"));
  1162.   LWIP_DEBUGF(TCP_DEBUG, ("|    0x%04x     |     %5u     | (chksum, urgp)n",
  1163.          ntohs(tcphdr->chksum), ntohs(tcphdr->urgp)));
  1164.   LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+n"));
  1165. }
  1166. void
  1167. tcp_debug_print_state(enum tcp_state s)
  1168. {
  1169.   LWIP_DEBUGF(TCP_DEBUG, ("State: "));
  1170.   switch (s) {
  1171.   case CLOSED:
  1172.     LWIP_DEBUGF(TCP_DEBUG, ("CLOSEDn"));
  1173.     break;
  1174.  case LISTEN:
  1175.    LWIP_DEBUGF(TCP_DEBUG, ("LISTENn"));
  1176.    break;
  1177.   case SYN_SENT:
  1178.     LWIP_DEBUGF(TCP_DEBUG, ("SYN_SENTn"));
  1179.     break;
  1180.   case SYN_RCVD:
  1181.     LWIP_DEBUGF(TCP_DEBUG, ("SYN_RCVDn"));
  1182.     break;
  1183.   case ESTABLISHED:
  1184.     LWIP_DEBUGF(TCP_DEBUG, ("ESTABLISHEDn"));
  1185.     break;
  1186.   case FIN_WAIT_1:
  1187.     LWIP_DEBUGF(TCP_DEBUG, ("FIN_WAIT_1n"));
  1188.     break;
  1189.   case FIN_WAIT_2:
  1190.     LWIP_DEBUGF(TCP_DEBUG, ("FIN_WAIT_2n"));
  1191.     break;
  1192.   case CLOSE_WAIT:
  1193.     LWIP_DEBUGF(TCP_DEBUG, ("CLOSE_WAITn"));
  1194.     break;
  1195.   case CLOSING:
  1196.     LWIP_DEBUGF(TCP_DEBUG, ("CLOSINGn"));
  1197.     break;
  1198.   case LAST_ACK:
  1199.     LWIP_DEBUGF(TCP_DEBUG, ("LAST_ACKn"));
  1200.     break;
  1201.   case TIME_WAIT:
  1202.     LWIP_DEBUGF(TCP_DEBUG, ("TIME_WAITn"));
  1203.    break;
  1204.   }
  1205. }
  1206. void
  1207. tcp_debug_print_flags(u8_t flags)
  1208. {
  1209.   if (flags & TCP_FIN) {
  1210.     LWIP_DEBUGF(TCP_DEBUG, ("FIN "));
  1211.   }
  1212.   if (flags & TCP_SYN) {
  1213.     LWIP_DEBUGF(TCP_DEBUG, ("SYN "));
  1214.   }
  1215.   if (flags & TCP_RST) {
  1216.     LWIP_DEBUGF(TCP_DEBUG, ("RST "));
  1217.   }
  1218.   if (flags & TCP_PSH) {
  1219.     LWIP_DEBUGF(TCP_DEBUG, ("PSH "));
  1220.   }
  1221.   if (flags & TCP_ACK) {
  1222.     LWIP_DEBUGF(TCP_DEBUG, ("ACK "));
  1223.   }
  1224.   if (flags & TCP_URG) {
  1225.     LWIP_DEBUGF(TCP_DEBUG, ("URG "));
  1226.   }
  1227.   if (flags & TCP_ECE) {
  1228.     LWIP_DEBUGF(TCP_DEBUG, ("ECE "));
  1229.   }
  1230.   if (flags & TCP_CWR) {
  1231.     LWIP_DEBUGF(TCP_DEBUG, ("CWR "));
  1232.   }
  1233. }
  1234. void
  1235. tcp_debug_print_pcbs(void)
  1236. {
  1237.   struct tcp_pcb *pcb;
  1238.   LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:n"));
  1239.   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  1240.     LWIP_DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
  1241.                        pcb->local_port, pcb->remote_port,
  1242.                        pcb->snd_nxt, pcb->rcv_nxt));
  1243.     tcp_debug_print_state(pcb->state);
  1244.   }    
  1245.   LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:n"));
  1246.   for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
  1247.     LWIP_DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
  1248.                        pcb->local_port, pcb->remote_port,
  1249.                        pcb->snd_nxt, pcb->rcv_nxt));
  1250.     tcp_debug_print_state(pcb->state);
  1251.   }    
  1252.   LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:n"));
  1253.   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  1254.     LWIP_DEBUGF(TCP_DEBUG, ("Local port %u, foreign port %u snd_nxt %lu rcv_nxt %lu ",
  1255.                        pcb->local_port, pcb->remote_port,
  1256.                        pcb->snd_nxt, pcb->rcv_nxt));
  1257.     tcp_debug_print_state(pcb->state);
  1258.   }    
  1259. }
  1260. int
  1261. tcp_pcbs_sane(void)
  1262. {
  1263.   struct tcp_pcb *pcb;
  1264.   for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
  1265.     LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
  1266.     LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
  1267.     LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
  1268.   }
  1269.   for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
  1270.     LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
  1271.   }
  1272.   return 1;
  1273. }
  1274. #endif /* TCP_DEBUG */
  1275. #endif /* LWIP_TCP */