summaryrefslogtreecommitdiffstats
path: root/src/common/Network/Packet/TCPOptions.h
blob: 2133db5a83deb2f9aa8629ce0dded5946851d8bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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_