⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uip-tcp.h

📁 這是一個實時嵌入式作業系統 實作了MCS51 ARM等MCU
💻 H
字号:
/**************************************************************************** * net/uip/uip-tcp.h * Header file for the uIP TCP/IP stack. * * The uIP TCP/IP stack header file contains definitions for a number * of C macros that are used by uIP programs as well as internal uIP * structures, TCP/IP header structures and function declarations. * *   Copyright (C) 2007 Gregory Nutt. All rights reserved. *   Author: Gregory Nutt <spudmonkey@racsa.co.cr> * * This logic was leveraged from uIP which also has a BSD-style license: * *   Author Adam Dunkels <adam@dunkels.com> *   Copyright (c) 2001-2003, Adam Dunkels. *   All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote *    products derived from this software without specific prior *    written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************/#ifndef __NET_UIP_UIP_TCP_H#define __NET_UIP_UIP_TCP_H/**************************************************************************** * Included Files ****************************************************************************/#include <nuttx/config.h>#ifdef CONFIG_NET_TCP#include <sys/types.h>#include <net/uip/uipopt.h>/**************************************************************************** * Definitions ****************************************************************************//* The TCP states used in the struct uip_conn tcpstateflags field */#define UIP_CLOSED      0 /* The connection is not in use and available */#define UIP_ALLOCATED   1 /* The connection is allocated, but not yet initialized */#define UIP_SYN_RCVD    2#define UIP_SYN_SENT    3#define UIP_ESTABLISHED 4#define UIP_FIN_WAIT_1  5#define UIP_FIN_WAIT_2  6#define UIP_CLOSING     7#define UIP_TIME_WAIT   8#define UIP_LAST_ACK    9#define UIP_TS_MASK     15#define UIP_STOPPED     16/* Header sizes */#define UIP_TCPH_LEN    20    /* Size of TCP header */#define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN)    /* Size of IP + TCP header */#define UIP_TCPIP_HLEN UIP_IPTCPH_LEN/**************************************************************************** * Public Type Definitions ****************************************************************************//* Representation of a uIP TCP connection. * * The uip_conn structure is used for identifying a connection. All * but one field in the structure are to be considered read-only by an * application. The only exception is the "private: field whos purpose * is to let the application store application-specific state (e.g., * file pointers) for the connection. */struct uip_driver_s;      /* Forward reference */struct uip_conn{  dq_entry_t node;        /* Implements a doubly linked list */#if 0 /* Not used */  uip_ipaddr_t lipaddr;   /* The local IP address */#endif  uip_ipaddr_t ripaddr;   /* The IP address of the remote host */  uint16 lport;           /* The local TCP port, in network byte order */  uint16 rport;           /* The remoteTCP port, in network byte order */  uint8  rcv_nxt[4];      /* The sequence number that we expect to                           * receive next */  uint8  snd_nxt[4];      /* The sequence number that was last sent by us */  uint16 len;             /* Length of the data that was previously sent */  uint16 mss;             /* Current maximum segment size for the                           * connection */  uint16 initialmss;      /* Initial maximum segment size for the                           * connection */  uint8  sa;              /* Retransmission time-out calculation state                           * variable */  uint8  sv;              /* Retransmission time-out calculation state                           * variable */  uint8  rto;             /* Retransmission time-out */  uint8  tcpstateflags;   /* TCP state and flags */  uint8  timer;           /* The retransmission timer (units: half-seconds) */  uint8  nrtx;            /* The number of retransmissions for the last                           * segment sent */  uint8  data_flags;      /* Flags that will be handled by the data_event()                           * callback function (see data_event() discussion below).                           */  /* Read-ahead buffering */#if CONFIG_NET_NTCP_READAHEAD_BUFFERS > 0  sq_queue_t readahead;#endif  /* Higher level logic can retain application specific information   * in the following:   *   *   data_event() is called on all events.  Normally, the input flags are   *      returned, however, the implemenation may set one of the following:   *   *        UIP_CLOSE   - Gracefully close the current connection   *        UIP_ABORT   - Abort (reset) the current connection on an error that   *                      prevents UIP_CLOSE from working.   *   *      Or clear the following:   *   *        UIP_NEWDATA - May be cleared to suppress returning the ACK response.   *                     (dev->d_len should also be set to zero in this case).   *   *   *      The provider of the data_event callback must also set data_flags.  This   *      will inform the uIP layer which flags are and are not handled by the   *      callback.   *   accept() is called when the TCP logic has created a connection   *   connection_event() is called on any of the subset of connection-related events   */  void *data_private;  uint8 (*data_event)(struct uip_driver_s *dev, struct uip_conn *conn, uint8 flags);  void *accept_private;  int (*accept)(struct uip_conn *listener, struct uip_conn *conn);  void *connection_private;  void (*connection_event)(struct uip_conn *conn, uint8 flags);};/* The following structure is used to handle read-ahead buffering for TCP * connection.  When incoming TCP data is received while no application is * listening for the data, that data will be retained in these read-ahead * buffers so that no data is lost. */#if CONFIG_NET_NTCP_READAHEAD_BUFFERS > 0struct uip_readahead_s{  sq_entry_t rh_node;      /* Supports a singly linked list */  uint16 rh_nbytes;        /* Number of bytes available in this buffer */  uint8  rh_buffer[CONFIG_NET_TCP_READAHEAD_BUFSIZE];};#endif/* The structure holding the TCP/IP statistics that are gathered if * CONFIG_NET_STATISTICS is defined. */#ifdef CONFIG_NET_STATISTICSstruct uip_tcp_stats_s{  uip_stats_t drop;       /* Number of dropped TCP segments */  uip_stats_t recv;       /* Number of received TCP segments */  uip_stats_t sent;       /* Number of sent TCP segments */  uip_stats_t chkerr;     /* Number of TCP segments with a bad checksum */  uip_stats_t ackerr;     /* Number of TCP segments with a bad ACK number */  uip_stats_t rst;        /* Number of received TCP RST (reset) segments */  uip_stats_t rexmit;     /* Number of retransmitted TCP segments */  uip_stats_t syndrop;    /* Number of dropped SYNs due to too few                             available connections */  uip_stats_t synrst;     /* Number of SYNs for closed ports triggering a RST */};#endif/* The TCP and IP headers */struct uip_tcpip_hdr{#ifdef CONFIG_NET_IPv6  /* IPv6 Ip header */  uint8  vtc;               /* Bits 0-3: version, bits 4-7: traffic class (MS) */  uint8  tcf;               /* Bits 0-3: traffic class (LS), 4-bits: flow label (MS) */  uint16 flow;              /* 16-bit flow label (LS) */  uint8  len[2];            /* 16-bit Payload length */  uint8  proto;             /*  8-bit Next header (same as IPv4 protocol field) */  uint8  ttl;               /*  8-bit Hop limit (like IPv4 TTL field) */  uip_ip6addr_t srcipaddr;  /* 128-bit Source address */  uip_ip6addr_t destipaddr; /* 128-bit Destination address */#else /* CONFIG_NET_IPv6 */  /* IPv4 IP header */  uint8  vhl;              /*  8-bit Version (4) and header length (5 or 6) */  uint8  tos;              /*  8-bit Type of service (e.g., 6=TCP) */  uint8  len[2];           /* 16-bit Total length */  uint8  ipid[2];          /* 16-bit Identification */  uint8  ipoffset[2];      /* 16-bit IP flags + fragment offset */  uint8  ttl;              /*  8-bit Time to Live */  uint8  proto;            /*  8-bit Protocol */  uint16 ipchksum;         /* 16-bit Header checksum */  uint16 srcipaddr[2];     /* 32-bit Source IP address */  uint16 destipaddr[2];    /* 32-bit Destination IP address */#endif /* CONFIG_NET_IPv6 */  /* TCP header */  uint16 srcport;  uint16 destport;  uint8  seqno[4];  uint8  ackno[4];  uint8  tcpoffset;  uint8  flags;  uint8  wnd[2];  uint16 tcpchksum;  uint8  urgp[2];  uint8  optdata[4];};/**************************************************************************** * Public Data ****************************************************************************//**************************************************************************** * Public Function Prototypes ****************************************************************************//* uIP application functions * * Functions used by an application running of top of uIP. This includes * functions for opening and closing connections, sending and receiving * data, etc. * * Find a free connection structure and allocate it for use. This is * normally something done by the implementation of the socket() API */extern struct uip_conn *uip_tcpalloc(void);/* Free a connection structure that is no longer in use. This should * be done by the implementation of close() */extern void uip_tcpfree(struct uip_conn *conn);/* Bind a TCP connection to a local address */#ifdef CONFIG_NET_IPv6extern int uip_tcpbind(struct uip_conn *conn, const struct sockaddr_in6 *addr);#elseextern int uip_tcpbind(struct uip_conn *conn, const struct sockaddr_in *addr);#endif/* This function implements the UIP specific parts of the standard * TCP connect() operation:  It connects to a remote host using TCP. * * This function is used to start a new connection to the specified * port on the specied host. It uses the connection structure that was * allocated by a preceding socket() call.  It sets the connection to * the SYN_SENT state and sets the retransmission timer to 0. This will * cause a TCP SYN segment to be sent out the next time this connection * is periodically processed, which usually is done within 0.5 seconds * after the call to uip_tcpconnect(). * * This function is called from normal user level code. */#ifdef CONFIG_NET_IPv6extern int uip_tcpconnect(struct uip_conn *conn, const struct sockaddr_in6 *addr);#elseextern int uip_tcpconnect(struct uip_conn *conn, const struct sockaddr_in *addr);#endif/* Start listening to the port bound to the specified TCP connection */extern int uip_listen(struct uip_conn *conn);/* Stop listening to the port bound to the specified TCP connection */extern int uip_unlisten(struct uip_conn *conn);/* Check if a connection has outstanding (i.e., unacknowledged) data */#define uip_outstanding(conn) ((conn)->len)/* Access to TCP read-ahead buffers */#if CONFIG_NET_NTCP_READAHEAD_BUFFERS > 0extern struct uip_readahead_s *uip_tcpreadaheadalloc(void);extern void uip_tcpreadaheadrelease(struct uip_readahead_s *buf);#endif /* CONFIG_NET_NTCP_READAHEAD_BUFFERS *//* Tell the sending host to stop sending data. * * This function will close our receiver's window so that we stop * receiving data for the current connection. */#define uip_stop(conn) ((conn)->tcpstateflags |= UIP_STOPPED)/* Find out if the current connection has been previously stopped with * uip_stop(). */#define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED)/* Restart the current connection, if is has previously been stopped * with uip_stop(). * * This function will open the receiver's window again so that we * start receiving data for the current connection. */#define uip_restart(conn,f) \  do { \    (f) |= UIP_NEWDATA; \    (conn)->tcpstateflags &= ~UIP_STOPPED; \  } while(0)/* Get the initial maxium segment size (MSS) of the current * connection. */#define uip_initialmss(conn) ((conn)->initialmss)/* Get the current maxium segment size that can be sent on the current * connection. * * The current maxiumum segment size that can be sent on the * connection is computed from the receiver's window and the MSS of * the connection (which also is available by calling * uip_initialmss()). */#define uip_mss(conn) ((conn)->mss)#endif /* CONFIG_NET_TCP */#endif /* __NET_UIP_UIP_TCP_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -