/** @file
  Tcp option's routine header file.
    
Copyright (c) 2005 - 2006, Intel Corporation<BR>
All rights reserved. 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<BR>

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 _TCP4_OPTION_H_
#define _TCP4_OPTION_H_

///
/// The structure to store the parse option value.
/// ParseOption only parse the options, don'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;

typedef enum {

  //
  // supported TCP option type and their length
  //
  TCP_OPTION_EOP            = 0,  ///< End Of oPtion
  TCP_OPTION_NOP            = 1,  ///< No-Option.
  TCP_OPTION_MSS            = 2,  ///< Maximum Segment Size
  TCP_OPTION_WS             = 3,  ///< Window scale
  TCP_OPTION_TS             = 8,  ///< Timestamp
  TCP_OPTION_MSS_LEN        = 4,  ///< Length of MSS option
  TCP_OPTION_WS_LEN         = 3,  ///< Length of window scale option
  TCP_OPTION_TS_LEN         = 10, ///< Length of timestamp option
  TCP_OPTION_WS_ALIGNED_LEN = 4,  ///< Length of window scale option, aligned
  TCP_OPTION_TS_ALIGNED_LEN = 12, ///< Length of timestamp option, aligned

  //
  // recommend format of timestamp window scale
  // option for fast process.
  //
  TCP_OPTION_TS_FAST = ((TCP_OPTION_NOP << 24) |
                        (TCP_OPTION_NOP << 16) |
                        (TCP_OPTION_TS << 8) |
                        TCP_OPTION_TS_LEN),

  TCP_OPTION_WS_FAST = ((TCP_OPTION_NOP << 24) |
                        (TCP_OPTION_WS << 16) |
                        (TCP_OPTION_WS_LEN << 8)),

  TCP_OPTION_MSS_FAST = ((TCP_OPTION_MSS << 24) |
                         (TCP_OPTION_MSS_LEN << 16)),

  //
  // Other misc definations
  //
  TCP_OPTION_RCVD_MSS       = 0x01,
  TCP_OPTION_RCVD_WS        = 0x02,
  TCP_OPTION_RCVD_TS        = 0x04,
  TCP_OPTION_MAX_WS         = 14,     ///< Maxium window scale value
  TCP_OPTION_MAX_WIN        = 0xffff  ///< Max window size in TCP header
} TCP_OPTION_TYPE;

/**
  Compute the window scale value according to the given buffer size.

  @param  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  Tcb     Pointer to the TCP_CB of this TCP instance.
  @param  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  Tcb     Pointer to the TCP_CB of this TCP instance.
  @param  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  Tcp     Pointer to the TCP_CB of this TCP instance.
  @param  Option  Pointer to the TCP_OPTION used to store the successfully pasrsed
                  options.

  @retval 0       The options are 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  Tcb     Pointer to the TCP_CB of this TCP instance.
  @param  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
