1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ 2 /* 3 * Copyright (c) 2011 Adrian Sai-wah Tam 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation; 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 * 18 * Author: Adrian Sai-wah Tam <adrian.sw.tam@gmail.com> 19 * Documentation, test cases: Natale Patriciello <natale.patriciello@gmail.com> 20 */ 21 22 #ifndef TCP_OPTION_WINSCALE_H 23 #define TCP_OPTION_WINSCALE_H 24 25 #include "ns3/tcp-option.h" 26 27 namespace ns3 { 28 29 /** 30 * \ingroup tcp 31 * 32 * \brief Defines the TCP option of kind 3 (window scale option) as in \RFC{1323} 33 * 34 * For more efficient use of high bandwidth networks, a larger TCP window size 35 * may be used. The TCP window size field controls the flow of data and its 36 * value is limited to between 2 and 65,535 bytes. 37 * 38 * Since the size field cannot be expanded, a scaling factor is used. 39 * The TCP window scale option, as defined in \RFC{1323}, is an option used 40 * to increase the maximum window size from 65,535 bytes to 1 gigabyte. 41 * Scaling up to larger window sizes is a part of what is necessary for TCP Tuning. 42 * 43 * The window scale option is used only during the TCP 3-way handshake. 44 * The window scale value represents the number of bits to left-shift the 45 * 16-bit window size field. The window scale value can be set from 0 46 * (no shift) to 14 for each direction independently. Both sides must 47 * send the option in their SYN segments to enable window scaling in 48 * either direction. 49 */ 50 class TcpOptionWinScale : public TcpOption 51 { 52 public: 53 /** 54 * \brief Get the type ID. 55 * \return the object TypeId 56 */ 57 static TypeId GetTypeId (void); 58 virtual TypeId GetInstanceTypeId (void) const; 59 60 TcpOptionWinScale (); 61 virtual ~TcpOptionWinScale (); 62 63 virtual void Print (std::ostream &os) const; 64 virtual void Serialize (Buffer::Iterator start) const; 65 virtual uint32_t Deserialize (Buffer::Iterator start); 66 67 virtual uint8_t GetKind (void) const; 68 virtual uint32_t GetSerializedSize (void) const; 69 70 /** 71 * \brief Get the scale value (uint8_t) 72 * \return The scale value 73 */ 74 uint8_t GetScale (void) const; 75 76 /** 77 * \brief Set the scale option 78 * 79 * The scale option SHOULD be <= 14 (as \RFC{1323}). 80 * 81 * \param scale Scale factor 82 */ 83 void SetScale (uint8_t scale); 84 85 protected: 86 uint8_t m_scale; //!< Window scaling in number of bit shift 87 }; 88 89 } // namespace ns3 90 91 #endif /* TCP_OPTION_WINSCALE */ 92