Done some work on task #1549 (function documentation)

This commit is contained in:
goldsimon 2007-06-08 11:35:54 +00:00
parent 8a30754e9c
commit d258bc263a

View File

@ -113,6 +113,16 @@ tcp_tmr(void)
/** /**
* Closes the connection held by the PCB. * Closes the connection held by the PCB.
* *
* Listening pcbs are freed and may not be referenced any more.
* Connection pcbs are freed if not yet connected and may not be referenced
* any more. If a connection is established (at least SYN received or in
* a closing state), the connection is closed, and put in a closing state.
* The pcb is then automatically freed in tcp_slowtmr(). It is therefore
* unsafe to reference it.
*
* @param pcb the tcp_pcb to close
* @return ERR_OK if connection has been closed
* another err_t if closing failed and pcb is not freed
*/ */
err_t err_t
tcp_close(struct tcp_pcb *pcb) tcp_close(struct tcp_pcb *pcb)
@ -190,6 +200,7 @@ tcp_close(struct tcp_pcb *pcb)
* the local protocol control block. This is done when a connection is * the local protocol control block. This is done when a connection is
* killed because of shortage of memory. * killed because of shortage of memory.
* *
* @param pcb the tcp_pcb to abort
*/ */
void void
tcp_abort(struct tcp_pcb *pcb) tcp_abort(struct tcp_pcb *pcb)
@ -244,8 +255,14 @@ tcp_abort(struct tcp_pcb *pcb)
* IP address is not given (i.e., ipaddr == NULL), the IP address of * IP address is not given (i.e., ipaddr == NULL), the IP address of
* the outgoing network interface is used instead. * the outgoing network interface is used instead.
* *
* @param pcb the tcp_pcb to bind (no check is done whether this pcb is
* already bound!)
* @param ipaddr the local ip address to bind to (use IP_ADDR_ANY to bind
* to any local address
* @param port the local port to bind to
* @return ERR_USE if the port is already in use
* ERR_OK if bound
*/ */
err_t err_t
tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
{ {
@ -294,6 +311,9 @@ tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
return ERR_OK; return ERR_OK;
} }
#if LWIP_CALLBACK_API #if LWIP_CALLBACK_API
/**
* Default accept callback if no accept callback is specified by the user.
*/
static err_t static err_t
tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)
{ {
@ -311,6 +331,12 @@ tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)
* is reallocated in order to consume less memory. Setting the * is reallocated in order to consume less memory. Setting the
* connection to LISTEN is an irreversible process. * connection to LISTEN is an irreversible process.
* *
* @param pcb the original tcp_pcb
* @return tcp_pcb used for listening, consumes less memory.
*
* @note The original tcp_pcb is freed. This function therefore has to be
* called like this:
* tpcb = tcp_listen(tpcb);
*/ */
struct tcp_pcb * struct tcp_pcb *
tcp_listen(struct tcp_pcb *pcb) tcp_listen(struct tcp_pcb *pcb)
@ -347,6 +373,8 @@ tcp_listen(struct tcp_pcb *pcb)
* processed the data. The purpose is to advertise a larger window * processed the data. The purpose is to advertise a larger window
* when the data has been processed. * when the data has been processed.
* *
* @param pcb the tcp_pcb for which data is read
* @param len the amount of bytes that have been read by the application
*/ */
void void
tcp_recved(struct tcp_pcb *pcb, u16_t len) tcp_recved(struct tcp_pcb *pcb, u16_t len)
@ -388,6 +416,8 @@ tcp_recved(struct tcp_pcb *pcb, u16_t len)
/** /**
* A nastly hack featuring 'goto' statements that allocates a * A nastly hack featuring 'goto' statements that allocates a
* new TCP local port. * new TCP local port.
*
* @return a new (free) local TCP port number
*/ */
static u16_t static u16_t
tcp_new_port(void) tcp_new_port(void)
@ -426,6 +456,13 @@ tcp_new_port(void)
* Connects to another host. The function given as the "connected" * Connects to another host. The function given as the "connected"
* argument will be called when the connection has been established. * argument will be called when the connection has been established.
* *
* @param pcb the tcp_pcb used to establish the connection
* @param ipaddr the remote ip address to connect to
* @param port the remote tcp port to connect to
* @param connected callback function to call when connected (or on error)
* @return ERR_VAL if invalid arguments are given
* ERR_OK if connect request has been sent
* other err_t values if connect request couldn't be sent
*/ */
err_t err_t
tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port, tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
@ -481,6 +518,8 @@ tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
* Called every 500 ms and implements the retransmission timer and the timer that * Called every 500 ms and implements the retransmission timer and the timer that
* removes PCBs that have been in TIME-WAIT for enough time. It also increments * removes PCBs that have been in TIME-WAIT for enough time. It also increments
* various timers such as the inactivity timer in each PCB. * various timers such as the inactivity timer in each PCB.
*
* Automatically called from tcp_tmr().
*/ */
void void
tcp_slowtmr(void) tcp_slowtmr(void)
@ -685,6 +724,8 @@ tcp_slowtmr(void)
/** /**
* Is called every TCP_FAST_INTERVAL (250 ms) and sends delayed ACKs. * Is called every TCP_FAST_INTERVAL (250 ms) and sends delayed ACKs.
*
* Automatically called from tcp_tmr().
*/ */
void void
tcp_fasttmr(void) tcp_fasttmr(void)
@ -704,6 +745,8 @@ tcp_fasttmr(void)
/** /**
* Deallocates a list of TCP segments (tcp_seg structures). * Deallocates a list of TCP segments (tcp_seg structures).
* *
* @param seg tcp_seg list of TCP segments to free
* @return the number of pbufs that were deallocated
*/ */
u8_t u8_t
tcp_segs_free(struct tcp_seg *seg) tcp_segs_free(struct tcp_seg *seg)
@ -719,8 +762,10 @@ tcp_segs_free(struct tcp_seg *seg)
} }
/** /**
* Frees a TCP segment. * Frees a TCP segment (tcp_seg structure).
* *
* @param seg single tcp_seg to free
* @return the number of pbufs that were deallocated
*/ */
u8_t u8_t
tcp_seg_free(struct tcp_seg *seg) tcp_seg_free(struct tcp_seg *seg)
@ -742,6 +787,8 @@ tcp_seg_free(struct tcp_seg *seg)
/** /**
* Sets the priority of a connection. * Sets the priority of a connection.
* *
* @param pcb the tcp_pcb to manipulate
* @param prio new priority
*/ */
void void
tcp_setprio(struct tcp_pcb *pcb, u8_t prio) tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
@ -752,7 +799,10 @@ tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
/** /**
* Returns a copy of the given TCP segment. * Returns a copy of the given TCP segment.
* The pbuf and data are not copied, only the pointers
* *
* @param seg the old tcp_seg
* @return a copy of seg
*/ */
struct tcp_seg * struct tcp_seg *
tcp_seg_copy(struct tcp_seg *seg) tcp_seg_copy(struct tcp_seg *seg)
@ -770,6 +820,10 @@ tcp_seg_copy(struct tcp_seg *seg)
#endif #endif
#if LWIP_CALLBACK_API #if LWIP_CALLBACK_API
/**
* Default receive callback that is called if the user didn't register
* a recv callback for the pcb.
*/
static err_t static err_t
tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{ {
@ -783,6 +837,11 @@ tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
} }
#endif /* LWIP_CALLBACK_API */ #endif /* LWIP_CALLBACK_API */
/**
* Kills the oldest active connection that has lower priority than prio.
*
* @param prio minimum priority
*/
static void static void
tcp_kill_prio(u8_t prio) tcp_kill_prio(u8_t prio)
{ {
@ -793,8 +852,7 @@ tcp_kill_prio(u8_t prio)
mprio = TCP_PRIO_MAX; mprio = TCP_PRIO_MAX;
/* We kill the oldest active connection that has lower priority than /* We kill the oldest active connection that has lower priority than prio. */
prio. */
inactivity = 0; inactivity = 0;
inactive = NULL; inactive = NULL;
for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
@ -813,7 +871,10 @@ tcp_kill_prio(u8_t prio)
} }
} }
/**
* Kills the oldest connection that is in TIME_WAIT state.
* Called from tcp_alloc() if no more connections are available.
*/
static void static void
tcp_kill_timewait(void) tcp_kill_timewait(void)
{ {
@ -822,6 +883,7 @@ tcp_kill_timewait(void)
inactivity = 0; inactivity = 0;
inactive = NULL; inactive = NULL;
/* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */
for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
inactivity = tcp_ticks - pcb->tmr; inactivity = tcp_ticks - pcb->tmr;
@ -835,8 +897,12 @@ tcp_kill_timewait(void)
} }
} }
/**
* Allocate a new tcp_pcb structure.
*
* @param prio priority for the new pcb
* @return a new tcp_pcb that initially is in state CLOSED
*/
struct tcp_pcb * struct tcp_pcb *
tcp_alloc(u8_t prio) tcp_alloc(u8_t prio)
{ {
@ -848,9 +914,12 @@ tcp_alloc(u8_t prio)
/* Try killing oldest connection in TIME-WAIT. */ /* Try killing oldest connection in TIME-WAIT. */
LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n")); LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
tcp_kill_timewait(); tcp_kill_timewait();
/* Try to allocate a tcp_pcb again. */
pcb = memp_malloc(MEMP_TCP_PCB); pcb = memp_malloc(MEMP_TCP_PCB);
if (pcb == NULL) { if (pcb == NULL) {
/* Try killing active connections with lower priority than the new one. */
tcp_kill_prio(prio); tcp_kill_prio(prio);
/* Try to allocate a tcp_pcb again. */
pcb = memp_malloc(MEMP_TCP_PCB); pcb = memp_malloc(MEMP_TCP_PCB);
} }
} }
@ -898,26 +967,28 @@ tcp_alloc(u8_t prio)
/** /**
* Creates a new TCP protocol control block but doesn't place it on * Creates a new TCP protocol control block but doesn't place it on
* any of the TCP PCB lists. * any of the TCP PCB lists.
* The pcb is not put on any list until binding using tcp_bind().
* *
* @internal: Maybe there should be a idle TCP PCB list where these * @internal: Maybe there should be a idle TCP PCB list where these
* PCBs are put on. We can then implement port reservation using * PCBs are put on. Port reservation using tcp_bind() is implemented but
* tcp_bind(). Currently, we lack this (BSD socket type of) feature. * allocated pcbs that are not bound can't be killed automatically if wanting
* to allocate a pcb with higher prio (@see tcp_kill_prio())
*
* @return a new tcp_pcb that initially is in state CLOSED
*/ */
struct tcp_pcb * struct tcp_pcb *
tcp_new(void) tcp_new(void)
{ {
return tcp_alloc(TCP_PRIO_NORMAL); return tcp_alloc(TCP_PRIO_NORMAL);
} }
/* /**
* tcp_arg():
*
* Used to specify the argument that should be passed callback * Used to specify the argument that should be passed callback
* functions. * functions.
* *
* @param pcb tcp_pcb to set the callback argument
* @param arg void pointer argument to pass to callback functions
*/ */
void void
tcp_arg(struct tcp_pcb *pcb, void *arg) tcp_arg(struct tcp_pcb *pcb, void *arg)
{ {
@ -929,6 +1000,8 @@ tcp_arg(struct tcp_pcb *pcb, void *arg)
* Used to specify the function that should be called when a TCP * Used to specify the function that should be called when a TCP
* connection receives data. * connection receives data.
* *
* @param pcb tcp_pcb to set the recv callback
* @param recv callback function to call for this pcb when data is received
*/ */
void void
tcp_recv(struct tcp_pcb *pcb, tcp_recv(struct tcp_pcb *pcb,
@ -941,8 +1014,9 @@ tcp_recv(struct tcp_pcb *pcb,
* Used to specify the function that should be called when TCP data * Used to specify the function that should be called when TCP data
* has been successfully delivered to the remote host. * has been successfully delivered to the remote host.
* *
* @param pcb tcp_pcb to set the sent callback
* @param recv callback function to call for this pcb when data is successfully sent
*/ */
void void
tcp_sent(struct tcp_pcb *pcb, tcp_sent(struct tcp_pcb *pcb,
err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)) err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len))
@ -954,6 +1028,9 @@ tcp_sent(struct tcp_pcb *pcb,
* Used to specify the function that should be called when a fatal error * Used to specify the function that should be called when a fatal error
* has occured on the connection. * has occured on the connection.
* *
* @param pcb tcp_pcb to set the err callback
* @param recv callback function to call for this pcb when a fatal error
* has occured on the connection
*/ */
void void
tcp_err(struct tcp_pcb *pcb, tcp_err(struct tcp_pcb *pcb,
@ -966,6 +1043,9 @@ tcp_err(struct tcp_pcb *pcb,
* Used for specifying the function that should be called when a * Used for specifying the function that should be called when a
* LISTENing connection has been connected to another host. * LISTENing connection has been connected to another host.
* *
* @param pcb tcp_pcb to set the accept callback
* @param recv callback function to call for this pcb when LISTENing
* connection has been connected to another host
*/ */
void void
tcp_accept(struct tcp_pcb *pcb, tcp_accept(struct tcp_pcb *pcb,
@ -995,6 +1075,7 @@ tcp_poll(struct tcp_pcb *pcb,
/** /**
* Purges a TCP PCB. Removes any buffered data and frees the buffer memory. * Purges a TCP PCB. Removes any buffered data and frees the buffer memory.
* *
* @param pcb tcp_pcb to purge. The pcb itself is not deallocated!
*/ */
void void
tcp_pcb_purge(struct tcp_pcb *pcb) tcp_pcb_purge(struct tcp_pcb *pcb)
@ -1032,6 +1113,7 @@ tcp_pcb_purge(struct tcp_pcb *pcb)
/** /**
* Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first. * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.
* *
* @param pcb tcp_pcb to purge. The pcb itself is also deallocated!
*/ */
void void
tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
@ -1055,6 +1137,7 @@ tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
/** /**
* Calculates a new initial sequence number for new connections. * Calculates a new initial sequence number for new connections.
* *
* @return u32_t pseudo random sequence number
*/ */
u32_t u32_t
tcp_next_iss(void) tcp_next_iss(void)
@ -1066,6 +1149,11 @@ tcp_next_iss(void)
} }
#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG #if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
/**
* Print a tcp header for debugging purposes.
*
* @param tcphdr pointer to a struct tcp_hdr
*/
void void
tcp_debug_print(struct tcp_hdr *tcphdr) tcp_debug_print(struct tcp_hdr *tcphdr)
{ {
@ -1097,6 +1185,11 @@ tcp_debug_print(struct tcp_hdr *tcphdr)
LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
} }
/**
* Print a tcp state for debugging purposes.
*
* @param s enum tcp_state to print
*/
void void
tcp_debug_print_state(enum tcp_state s) tcp_debug_print_state(enum tcp_state s)
{ {
@ -1138,6 +1231,11 @@ tcp_debug_print_state(enum tcp_state s)
} }
} }
/**
* Print tcp flags for debugging purposes.
*
* @param flags tcp flags, all active flags are printed
*/
void void
tcp_debug_print_flags(u8_t flags) tcp_debug_print_flags(u8_t flags)
{ {
@ -1167,6 +1265,9 @@ tcp_debug_print_flags(u8_t flags)
} }
} }
/**
* Print all tcp_pcbs in every list for debugging purposes.
*/
void void
tcp_debug_print_pcbs(void) tcp_debug_print_pcbs(void)
{ {
@ -1194,6 +1295,9 @@ tcp_debug_print_pcbs(void)
} }
} }
/**
* Check state consistency of the tcp_pcb lists.
*/
s16_t s16_t
tcp_pcbs_sane(void) tcp_pcbs_sane(void)
{ {