1 /** @file 2 Tcp option's routine header file. 3 4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> 5 6 This program and the accompanying materials 7 are licensed and made available under the terms and conditions of the BSD License 8 which accompanies this distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php. 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 #ifndef _TCP_OPTION_H_ 17 #define _TCP_OPTION_H_ 18 19 // 20 // Supported TCP option types and their length. 21 // 22 #define TCP_OPTION_EOP 0 ///< End Of oPtion 23 #define TCP_OPTION_NOP 1 ///< No-Option. 24 #define TCP_OPTION_MSS 2 ///< Maximum Segment Size 25 #define TCP_OPTION_WS 3 ///< Window scale 26 #define TCP_OPTION_TS 8 ///< Timestamp 27 #define TCP_OPTION_MSS_LEN 4 ///< Length of MSS option 28 #define TCP_OPTION_WS_LEN 3 ///< Length of window scale option 29 #define TCP_OPTION_TS_LEN 10 ///< Length of timestamp option 30 #define TCP_OPTION_WS_ALIGNED_LEN 4 ///< Length of window scale option, aligned 31 #define TCP_OPTION_TS_ALIGNED_LEN 12 ///< Length of timestamp option, aligned 32 33 // 34 // recommend format of timestamp window scale 35 // option for fast process. 36 // 37 #define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \ 38 (TCP_OPTION_NOP << 16) | \ 39 (TCP_OPTION_TS << 8) | \ 40 (TCP_OPTION_TS_LEN)) 41 42 #define TCP_OPTION_WS_FAST ((TCP_OPTION_NOP << 24) | \ 43 (TCP_OPTION_WS << 16) | \ 44 (TCP_OPTION_WS_LEN << 8)) 45 46 #define TCP_OPTION_MSS_FAST ((TCP_OPTION_MSS << 24) | (TCP_OPTION_MSS_LEN << 16)) 47 48 // 49 // Other misc definations 50 // 51 #define TCP_OPTION_RCVD_MSS 0x01 52 #define TCP_OPTION_RCVD_WS 0x02 53 #define TCP_OPTION_RCVD_TS 0x04 54 #define TCP_OPTION_MAX_WS 14 ///< Maxium window scale value 55 #define TCP_OPTION_MAX_WIN 0xffff ///< Max window size in TCP header 56 57 /// 58 /// The structure to store the parse option value. 59 /// ParseOption only parses the options, doesn't process them. 60 /// 61 typedef struct _TCP_OPTION { 62 UINT8 Flag; ///< Flag such as TCP_OPTION_RCVD_MSS 63 UINT8 WndScale; ///< The WndScale received 64 UINT16 Mss; ///< The Mss received 65 UINT32 TSVal; ///< The TSVal field in a timestamp option 66 UINT32 TSEcr; ///< The TSEcr field in a timestamp option 67 } TCP_OPTION; 68 69 /** 70 Compute the window scale value according to the given buffer size. 71 72 @param[in] Tcb Pointer to the TCP_CB of this TCP instance. 73 74 @return The scale value. 75 76 **/ 77 UINT8 78 TcpComputeScale ( 79 IN TCP_CB *Tcb 80 ); 81 82 /** 83 Build the TCP option in three-way handshake. 84 85 @param[in] Tcb Pointer to the TCP_CB of this TCP instance. 86 @param[in] Nbuf Pointer to the buffer to store the options. 87 88 @return The total length of the TCP option field. 89 90 **/ 91 UINT16 92 TcpSynBuildOption ( 93 IN TCP_CB *Tcb, 94 IN NET_BUF *Nbuf 95 ); 96 97 /** 98 Build the TCP option in synchronized states. 99 100 @param[in] Tcb Pointer to the TCP_CB of this TCP instance. 101 @param[in] Nbuf Pointer to the buffer to store the options. 102 103 @return The total length of the TCP option field. 104 105 **/ 106 UINT16 107 TcpBuildOption ( 108 IN TCP_CB *Tcb, 109 IN NET_BUF *Nbuf 110 ); 111 112 /** 113 Parse the supported options. 114 115 @param[in] Tcp Pointer to the TCP_CB of this TCP instance. 116 @param[in, out] Option Pointer to the TCP_OPTION used to store the 117 successfully pasrsed options. 118 119 @retval 0 The options successfully pasrsed. 120 @retval -1 Ilegal option was found. 121 122 **/ 123 INTN 124 TcpParseOption ( 125 IN TCP_HEAD *Tcp, 126 IN OUT TCP_OPTION *Option 127 ); 128 129 /** 130 Check the segment against PAWS. 131 132 @param[in] Tcb Pointer to the TCP_CB of this TCP instance. 133 @param[in] TSVal The timestamp value. 134 135 @retval 1 The segment passed the PAWS check. 136 @retval 0 The segment failed to pass the PAWS check. 137 138 **/ 139 UINT32 140 TcpPawsOK ( 141 IN TCP_CB *Tcb, 142 IN UINT32 TSVal 143 ); 144 145 #endif 146