/** @file
Tcp option's routine header file.
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _TCP_OPTION_H_
#define _TCP_OPTION_H_
//
// Supported TCP option types and their length.
//
#define TCP_OPTION_EOP 0 ///< End Of oPtion
#define TCP_OPTION_NOP 1 ///< No-Option.
#define TCP_OPTION_MSS 2 ///< Maximum Segment Size
#define TCP_OPTION_WS 3 ///< Window scale
#define TCP_OPTION_TS 8 ///< Timestamp
#define TCP_OPTION_MSS_LEN 4 ///< Length of MSS option
#define TCP_OPTION_WS_LEN 3 ///< Length of window scale option
#define TCP_OPTION_TS_LEN 10 ///< Length of timestamp option
#define TCP_OPTION_WS_ALIGNED_LEN 4 ///< Length of window scale option, aligned
#define TCP_OPTION_TS_ALIGNED_LEN 12 ///< Length of timestamp option, aligned
//
// recommend format of timestamp window scale
// option for fast process.
//
#define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \
(TCP_OPTION_NOP << 16) | \
(TCP_OPTION_TS << 8) | \
(TCP_OPTION_TS_LEN))
#define TCP_OPTION_WS_FAST ((TCP_OPTION_NOP << 24) | \
(TCP_OPTION_WS << 16) | \
(TCP_OPTION_WS_LEN << 8))
#define TCP_OPTION_MSS_FAST ((TCP_OPTION_MSS << 24) | (TCP_OPTION_MSS_LEN << 16))
//
// Other misc definations
//
#define TCP_OPTION_RCVD_MSS 0x01
#define TCP_OPTION_RCVD_WS 0x02
#define TCP_OPTION_RCVD_TS 0x04
#define TCP_OPTION_MAX_WS 14 ///< Maxium window scale value
#define TCP_OPTION_MAX_WIN 0xffff ///< Max window size in TCP header
///
/// The structure to store the parse option value.
/// ParseOption only parses the options, doesn't process them.
///
typedef struct _TCP_OPTION {
UINT8 Flag; ///< Flag such as TCP_OPTION_RCVD_MSS
UINT8 WndScale; ///< The WndScale received
UINT16 Mss; ///< The Mss received
UINT32 TSVal; ///< The TSVal field in a timestamp option
UINT32 TSEcr; ///< The TSEcr field in a timestamp option
} TCP_OPTION;
/**
Compute the window scale value according to the given buffer size.
@param[in] Tcb Pointer to the TCP_CB of this TCP instance.
@return The scale value.
**/
UINT8
TcpComputeScale (
IN TCP_CB *Tcb
);
/**
Build the TCP option in three-way handshake.
@param[in] Tcb Pointer to the TCP_CB of this TCP instance.
@param[in] Nbuf Pointer to the buffer to store the options.
@return The total length of the TCP option field.
**/
UINT16
TcpSynBuildOption (
IN TCP_CB *Tcb,
IN NET_BUF *Nbuf
);
/**
Build the TCP option in synchronized states.
@param[in] Tcb Pointer to the TCP_CB of this TCP instance.
@param[in] Nbuf Pointer to the buffer to store the options.
@return The total length of the TCP option field.
**/
UINT16
TcpBuildOption (
IN TCP_CB *Tcb,
IN NET_BUF *Nbuf
);
/**
Parse the supported options.
@param[in] Tcp Pointer to the TCP_CB of this TCP instance.
@param[in, out] Option Pointer to the TCP_OPTION used to store the
successfully pasrsed options.
@retval 0 The options successfully pasrsed.
@retval -1 Ilegal option was found.
**/
INTN
TcpParseOption (
IN TCP_HEAD *Tcp,
IN OUT TCP_OPTION *Option
);
/**
Check the segment against PAWS.
@param[in] Tcb Pointer to the TCP_CB of this TCP instance.
@param[in] TSVal The timestamp value.
@retval 1 The segment passed the PAWS check.
@retval 0 The segment failed to pass the PAWS check.
**/
UINT32
TcpPawsOK (
IN TCP_CB *Tcb,
IN UINT32 TSVal
);
#endif