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