tcp.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #ifndef _NETINET_TCP_H_
  2. #define _NETINET_TCP_H_
  3. /*
  4. * Copyright (C) 2001-2003 by egnite Software GmbH. All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. Neither the name of the copyright holders nor the names of
  16. * contributors may be used to endorse or promote products derived
  17. * from this software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  22. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  23. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  24. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  25. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  26. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  27. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  28. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
  29. * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. * SUCH DAMAGE.
  31. *
  32. * For additional information see http://www.ethernut.de/
  33. *
  34. * -
  35. * Portions Copyright (C) 2000 David J. Hudson <dave@humbug.demon.co.uk>
  36. *
  37. * This file is distributed in the hope that it will be useful, but WITHOUT
  38. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  39. * FITNESS FOR A PARTICULAR PURPOSE.
  40. *
  41. * You can redistribute this file and/or modify it under the terms of the GNU
  42. * General Public License (GPL) as published by the Free Software Foundation;
  43. * either version 2 of the License, or (at your discretion) any later version.
  44. * See the accompanying file "copying-gpl.txt" for more details.
  45. *
  46. * As a special exception to the GPL, permission is granted for additional
  47. * uses of the text contained in this file. See the accompanying file
  48. * "copying-liquorice.txt" for details.
  49. * -
  50. * Portions Copyright (c) 1983, 1993 by
  51. * The Regents of the University of California. All rights reserved.
  52. *
  53. * Redistribution and use in source and binary forms, with or without
  54. * modification, are permitted provided that the following conditions
  55. * are met:
  56. * 1. Redistributions of source code must retain the above copyright
  57. * notice, this list of conditions and the following disclaimer.
  58. * 2. Redistributions in binary form must reproduce the above copyright
  59. * notice, this list of conditions and the following disclaimer in the
  60. * documentation and/or other materials provided with the distribution.
  61. * 3. Neither the name of the University nor the names of its contributors
  62. * may be used to endorse or promote products derived from this software
  63. * without specific prior written permission.
  64. *
  65. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  66. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  67. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  68. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  69. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  70. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  71. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  72. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  73. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  74. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  75. * SUCH DAMAGE.
  76. */
  77. /*
  78. * $Log$
  79. * Revision 1.6 2008/08/11 07:00:23 haraldkipp
  80. * BSD types replaced by stdint types (feature request #1282721).
  81. *
  82. * Revision 1.5 2006/03/21 21:22:18 drsung
  83. * Enhancement made to TCP state machine. Now TCP options
  84. * are read from peer and at least the maximum segment size is stored.
  85. *
  86. * Revision 1.4 2005/08/02 17:46:49 haraldkipp
  87. * Major API documentation update.
  88. *
  89. * Revision 1.3 2005/04/05 17:38:45 haraldkipp
  90. * ARM7 memory alignment bugs fixed.
  91. *
  92. * Revision 1.2 2004/03/16 16:48:28 haraldkipp
  93. * Added Jan Dubiec's H8/300 port.
  94. *
  95. * Revision 1.1.1.1 2003/05/09 14:41:16 haraldkipp
  96. * Initial using 3.2.1
  97. *
  98. * Revision 1.7 2003/02/04 18:00:46 harald
  99. * Version 3 released
  100. *
  101. * Revision 1.6 2002/09/03 17:49:58 harald
  102. * *** empty log message ***
  103. *
  104. * Revision 1.5 2002/08/16 17:53:36 harald
  105. * Larger window size for better MP3 stream results
  106. *
  107. * Revision 1.4 2002/06/26 17:29:22 harald
  108. * First pre-release with 2.4 stack
  109. *
  110. */
  111. #include <sys/types.h>
  112. #include <stdint.h>
  113. /*!
  114. * \file netinet/tcp.h
  115. * \brief TCP protocol definitions.
  116. */
  117. #ifdef __cplusplus
  118. extern "C" {
  119. #endif
  120. #define TH_FIN 0x01 /*!< \brief Finishing transmission. */
  121. #define TH_SYN 0x02 /*!< \brief Synchronizing sequence numbers. */
  122. #define TH_RST 0x04 /*!< \brief Reset connection. */
  123. #define TH_PUSH 0x08 /*!< \brief Push data to application level. */
  124. #define TH_ACK 0x10 /*!< \brief Acknowledge field is valid. */
  125. #define TH_URG 0x20 /*!< \brief Urgent data present. */
  126. /*! \brief TCP flag mask. */
  127. #define TH_FLAGS (TH_FIN | TH_SYN | TH_RST | TH_ACK | TH_URG)
  128. /*!
  129. * \struct tcphdr tcp.h netinet/tcp.h
  130. * \brief TCP protocol header structure.
  131. */
  132. /*!
  133. * \typedef TCPHDR
  134. * \brief TCP protocol header type.
  135. */
  136. typedef struct NUT_PACKED_TYPE tcphdr {
  137. uint16_t th_sport; /*!< \brief Source port. */
  138. uint16_t th_dport; /*!< \brief Destination port. */
  139. uint32_t th_seq; /*!< \brief Sequence number of first octet in this segment. */
  140. uint32_t th_ack; /*!< \brief Expected sequence number of next octet. */
  141. #ifndef __BIG_ENDIAN__
  142. #ifdef __IMAGECRAFT__
  143. unsigned th_x2:4,
  144. th_off:4;
  145. #else /* #ifndef __BIG_ENDIAN__ */
  146. uint8_t th_x2:4, /*!< \brief Unused. */
  147. th_off:4; /*!< \brief Data offset. */
  148. #endif
  149. #else /* #ifndef __BIG_ENDIAN__ */
  150. uint8_t th_off:4, /*!< \brief Data offset. */
  151. th_x2:4; /*!< \brief Unused. */
  152. #endif
  153. uint8_t th_flags; /*!< \brief Control flags. */
  154. uint16_t th_win; /*!< \brief Number of acceptable octects. */
  155. uint16_t th_sum; /*!< \brief 96 byte pseudo header checksum. */
  156. uint16_t th_urp; /*!< \brief Urgent data pointer. */
  157. } TCPHDR;
  158. #define TCPOPT_EOL 0 /*!< \brief End of options. */
  159. #define TCPOPT_NOP 1 /*!< \brief Nothing. */
  160. #define TCPOPT_MAXSEG 2 /*!< \brief Maximum segment size. */
  161. #define TCPOLEN_MAXSEG 4 /*!< \brief Maximum segment size length. */
  162. #define TCPOPT_WINDOW 3 /*!< \brief Receive window. */
  163. #define TCPOLEN_WINDOW 3 /*!< \brief Receive window length. */
  164. /*!
  165. * \struct _TCPPSEUDOHDR tcp.h netinet/tcp.h
  166. * \brief TCP pseudo header structure.
  167. */
  168. /*!
  169. * \typedef TCPPSEUDOHDR
  170. * \brief TCP pseudo header type.
  171. */
  172. typedef struct _TCPPSEUDOHDR {
  173. uint32_t tph_src; /*!< \brief IP address of sender. */
  174. uint32_t tph_dst; /*!< \brief IP address of target. */
  175. uint8_t tph_mbz; /*!< \brief mbz */
  176. uint8_t tph_p; /*!< \brief p */
  177. uint16_t tph_len; /*!< \brief len */
  178. uint16_t tph_sum; /*!< \brief Checksum */
  179. } TCPPSEUDOHDR;
  180. #define TCP_MSS 536 /*!< \brief Default maximum segment size.
  181. The maximum size of an IP datagram, that will
  182. not become fragmented, is 576. The maximum
  183. IP datagram for Ethernet is 1500. Reduce this
  184. number by 40, 20 bytes TCP header and 20 bytes
  185. IP header.
  186. \showinitializer
  187. */
  188. #define TCP_WINSIZE 3216 /*!< \brief Default window size.
  189. It's recommended to set this 6 times the maximum
  190. segment size.
  191. \showinitializer
  192. */
  193. #define TCP_MAXWIN 65535 /*!< \brief Largest value for (unscaled) window. \showinitializer */
  194. #define TTCP_CLIENT_SND_WND 4096 /*!< \brief Default send window for T/TCP client. \showinitializer */
  195. #define TCP_MAX_WINSHIFT 14 /*!< \brief Maximum window shift. \showinitializer */
  196. #define TCP_MAXHLEN (0xf<<2) /*!< \brief Maximum length of header in bytes. */
  197. #define TCP_MAXOLEN (TCP_MAXHLEN - sizeof(struct tcphdr)) /*!< \brief Maximum space left for options. */
  198. /*
  199. * User-settable options.
  200. */
  201. #define TCP_NODELAY 0x01 /*!< \brief Don't delay send to coalesce segments. */
  202. #define TCP_MAXSEG 0x02 /*!< \brief Set maximum segment size. */
  203. #define TCP_NOPUSH 0x04 /*!< \brief Don't push last block of write. */
  204. #define TCP_NOOPT 0x08 /*!< \brief Don't use TCP options. */
  205. #ifdef __cplusplus
  206. }
  207. #endif
  208. #endif