diff options
Diffstat (limited to 'src/common/Network/Packet/TCPOptions.h')
-rwxr-xr-x | src/common/Network/Packet/TCPOptions.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/common/Network/Packet/TCPOptions.h b/src/common/Network/Packet/TCPOptions.h new file mode 100755 index 00000000..2133db5a --- /dev/null +++ b/src/common/Network/Packet/TCPOptions.h @@ -0,0 +1,163 @@ +/* +Copyright (c) 2015-2015 Cisco Systems, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +#ifndef _TCP_OPTIONS_H_ +#define _TCP_OPTIONS_H_ + +#include "PacketHeaderBase.h" + + +class TCPOptions +{ + +public: + +//-------------------------------------------------------------------------------------------------- +// Typedef & Enum +//-------------------------------------------------------------------------------------------------- + + struct Kind + { + enum Val + { + EOL = 0, + NO_OP = 1, + MSS = 2, + WIN_SCL = 3, + SACK_PER = 4, + SACK = 5, + TIME_STAMP = 8 + }; + }; + + enum + { + TimeStampSize = 12 + }; + + enum + { + MaxOptionsInPacket = 64 + }; + + struct Option + { + uint8_t theKind; + uint8_t theLength; //Not always valid, depends on theKind + uint8_t theData[1];//variable. [1] only for compilation + }; + + struct Counters + { + uint32_t itsOptionsSizeMismatch; + uint32_t itsZeroLengthOptions; + uint32_t itsPossibleEndlessLoop; + }; + + +//-------------------------------------------------------------------------------------------------- +// Constructor & Destructor +//-------------------------------------------------------------------------------------------------- + + TCPOptions(uint8_t* argOptionsP, uint16_t argOptionsSize); + +//-------------------------------------------------------------------------------------------------- +// Utility methods +//-------------------------------------------------------------------------------------------------- + + /** + * This method allows the user of this class to query whether + * the options in hand contains a specific type of its + * interest. + * + * @return true if the specified option exist. + */ + bool doesContain(Kind::Val); + +//-------------------------------------------------------------------------------------------------- +// Get methods +//-------------------------------------------------------------------------------------------------- + + + /** + * Returns a pointer to the current option. + * With the kind and length of it. + * + * @param argKind + * @param argLength + * @return + */ + uint8_t* getCurrentOption (Kind::Val& argKind, uint8_t& argLength); + + /** + * This method gives the length of the current option. + * Can vary since there are two options that are exception to + * the usual TLV definition. + * + * @return + */ + uint8_t getCurrentOptionLength(); + + /** + * This is an internal method that verifies based on the current + * pointer, the total options length and the current options length, + * whether this is the last option. + * + * @return + */ + bool isLastOption (); + +//-------------------------------------------------------------------------------------------------- +// Set methods +//-------------------------------------------------------------------------------------------------- + + /** + * This method tells the object to advance one option ahead. + * i.e. to the next option. + * + * @return True if next option exist. + * False if we are at the last option. + */ + bool nextOption (); + + +//-------------------------------------------------------------------------------------------------- +// Miscellaneous Operations +//-------------------------------------------------------------------------------------------------- + + static void get (Counters&); + + void dump(FILE* argOutputFile); + + +private: + +//-------------------------------------------------------------------------------------------------- +// Data members +//-------------------------------------------------------------------------------------------------- + + uint8_t* myOptionsP; + uint16_t myOptionsSize; + + Option* myCurrentOptionP; + + static Counters ourCounters; + + static bool ourOneShotDump; +}; + + +#endif // _TCP_OPTIONS_H_ + |