summaryrefslogtreecommitdiffstats
path: root/src/common/Network/Packet/TcpHeader.h
blob: 38732998c00008649a0e0cf37032cfe4b093c869 (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
/*
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_HEADER_H_
#define _TCP_HEADER_H_

#include "PacketHeaderBase.h"
#define TCP_HEADER_LEN 20
                 
class TCPHeader
{

public:
    enum TCPHeader_enum_t
    {
        TCP_INVALID_PORT = 0
    };

    TCPHeader(){}

    TCPHeader(uint16_t    argSourcePort,
              uint16_t    argDestinationPort,
              uint8_t     argFlags,
              uint32_t    argSeqNum,
              uint32_t    argAckNum);

    struct Flag
    {
        enum Type
        {
            FIN =          0x01,
            SYN =          0x02,
            RST =          0x04,
            PSH =          0x08,
            ACK =          0x10,
            URG =          0x20
        };
    };

    void    setSourcePort   (uint16_t);
    uint16_t  getSourcePort   ();

    void    setDestPort     (uint16_t);
    uint16_t  getDestPort     ();

    void    setSeqNumber    (uint32_t);
    uint32_t  getSeqNumber    ();

    void    setAckNumber    (uint32_t);
    uint32_t  getAckNumber    ();

    //this is factor 4
    void    setHeaderLength (uint8_t);
    uint8_t   getHeaderLength ();

    void    setFlag         (uint8_t);
    uint8_t   getFlags        ();

    void    setFinFlag      (bool);
    bool    getFinFlag      ();

    void    setSynFlag      (bool);
    bool    getSynFlag      ();

    void    setResetFlag    (bool);
    bool    getResetFlag    ();

    void    setPushFlag     (bool);
    bool    getPushFlag     ();

    void    setAckFlag      (bool);
    bool    getAckFlag      ();

    void    setUrgentFlag   (bool);
    bool    getUrgentFlag   ();

    void    setWindowSize   (uint16_t);
    uint16_t  getWindowSize   ();

    void    setChecksum     (uint16_t);
    uint16_t  getChecksum     ();

    inline void    setChecksumRaw     (uint16_t data){
        myChecksum = data;
    }

    void    setUrgentOffset (uint16_t);
    uint16_t  getUrgentOffset ();

    uint32_t* getOptionPtr    ();


////////////////////////////////////////////////////////////////////////////////////////
// Common Header Interface
////////////////////////////////////////////////////////////////////////////////////////

public: 
    uint8_t*  getPointer      (){return (uint8_t*)this;}
    uint32_t  getSize         (){return  getHeaderLength();}

    uint16_t  getNextProtocol ();
    void    setNextProtocol (uint16_t);

    void    dump            (FILE*  fd);

private:
    uint16_t mySourcePort;
    uint16_t myDestinationPort;
    uint32_t mySeqNum;
    uint32_t myAckNum;
    uint8_t  myHeaderLength;
    uint8_t  myFlags;
    uint16_t myWindowSize;
    uint16_t myChecksum;
    uint16_t myUrgentPtr;
    uint32_t myOption[1];
};

#include "TcpHeader.inl"

#endif //_TCP_HEADER_H_