Revised OpenFlow Library  v0.6.0dev
 All Classes Files Functions Variables Friends Groups Pages
fgtpuframe.h
1 /*
2  * fgtpframe.h
3  *
4  * Created on: 04.07.2013
5  * Author: andreas
6  */
7 
8 #ifndef FGTPUV1FRAME_H_
9 #define FGTPUV1FRAME_H_ 1
10 
11 #include <string>
12 #include <endian.h>
13 #ifndef htobe16
14  #include "../endian_conversion.h"
15 #endif
16 
17 #include "../openflow/openflow.h"
18 #include "../fframe.h"
19 #include "gtpuext.h"
20 
21 namespace rofl
22 {
23 
24 class eGTPuFrameBase : public eFrameBase {};
25 class eGTPuFrameInval : public eGTPuFrameBase, public eFrameInval {};
26 
27 
28 class fgtpuframe :
29  public fframe
30 {
31 public:
32 
33  enum gtpu_version_t {
34  GTPU_VERS_1 = 1,
35  };
36 
37  enum gtpu_udp_port_t {
38  GTPU_UDP_PORT = 2152,
39  };
40 
41  enum gtpu_flag_t {
42  GTPU_PT_FLAG = (1 << 4),
43  GTPU_E_FLAG = (1 << 2),
44  GTPU_S_FLAG = (1 << 1),
45  GTPU_PN_FLAG = (1 << 0),
46  };
47 
48  // full GTP-Uv1 header with E, S, PN flags set to 1
49  struct gtpu_e_hdr_t {
50  uint8_t flags; // version, PT, T, E, S, PN
51  uint8_t msgtype;
52  uint16_t len;
53  uint32_t teid;
54  uint16_t seqno;
55  uint8_t n_pdu_no; // N-PDU number
56  uint8_t exthdr; // next extension header type
57  uint8_t data[0]; // pointer to start of data
58  };
59 
60  // shortened GTP-Uv1 header with S and PN flags set to 1 only
61  struct gtpu_pn_hdr_t {
62  uint8_t flags; // version, PT, T, E, S, PN
63  uint8_t msgtype;
64  uint16_t len;
65  uint32_t teid;
66  uint16_t seqno;
67  uint8_t n_pdu_no; // N-PDU number
68  uint8_t data[0]; // pointer to start of data
69  };
70 
71  // shortened GTP-Uv1 header with S flag set to 1 only
72  struct gtpu_s_hdr_t {
73  uint8_t flags; // version, PT, T, E, S, PN
74  uint8_t msgtype;
75  uint16_t len;
76  uint32_t teid;
77  uint16_t seqno;
78  uint8_t data[0]; // pointer to start of data
79  };
80 
81  // shortened GTP-Uv1 header with S, PN, E flags set to 0
82  struct gtpu_base_hdr_t {
83  uint8_t flags; // version, PT, T, E, S, PN
84  uint8_t msgtype;
85  uint16_t len;
86  uint32_t teid;
87  uint8_t data[0]; // pointer to start of data
88  };
89 
90 
91 private:
92 
93  union {
94  uint8_t* gtphu_gtpu_hdr;
95  struct gtpu_e_hdr_t* gtphu_gtpu_e_hdr;
96  struct gtpu_pn_hdr_t* gtphu_gtpu_pn_hdr;
97  struct gtpu_s_hdr_t* gtphu_gtpu_s_hdr;
98  struct gtpu_base_hdr_t* gtphu_gtpu_short_hdr;
99  } gtphu;
100 
101 #define gtphu_hdr gtphu.gtphu_gtpu_hdr
102 #define gtphu_e_hdr gtphu.gtphu_gtpu_e_hdr
103 #define gtphu_pn_hdr gtphu.gtphu_gtpu_pn_hdr
104 #define gtphu_s_hdr gtphu.gtphu_gtpu_s_hdr
105 #define gtphu_short_hdr gtphu.gtphu_gtpu_short_hdr
106 
107  std::string info;
108 
109 public:
110 
111 
115  fgtpuframe(
116  uint8_t* data,
117  size_t datalen);
118 
119 
123  fgtpuframe(
124  size_t len = sizeof(struct gtpu_e_hdr_t));
125 
126 
130  virtual
131  ~fgtpuframe();
132 
133 
137  virtual void
138  reset(
139  uint8_t* data,
140  size_t datalen);
141 
142 
147  virtual uint8_t*
148  sopdu() const;
149 
150 
155  virtual size_t
156  pdulen() const;
157 
158 
162  virtual uint8_t*
163  sosdu() const;
164 
165 
166 
167 public:
168 
169 
173  uint8_t
174  get_version() const;
175 
176 
180  void
181  set_version(
182  uint8_t version = GTPU_VERS_1);
183 
184 
188  bool
189  get_pt_flag() const;
190 
191 
195  void
196  set_pt_flag(
197  bool pt = true);
198 
199 
203  bool
204  get_e_flag() const;
205 
206 
210  void
211  set_e_flag(
212  bool e = true);
213 
214 
218  bool
219  get_s_flag() const;
220 
221 
225  void
226  set_s_flag(
227  bool s = true);
228 
229 
233  bool
234  get_pn_flag() const;
235 
236 
240  void
241  set_pn_flag(
242  bool pn = true);
243 
244 
248  uint8_t
249  get_msg_type() const;
250 
251 
255  void
256  set_msg_type(
257  uint8_t msg_type);
258 
259 
263  uint16_t
264  get_length() const;
265 
266 
270  void
271  set_length(
272  uint16_t len);
273 
274 
278  uint32_t
279  get_teid() const;
280 
281 
285  void
286  set_teid(
287  uint32_t teid);
288 
289 
293  uint16_t
294  get_seq_no() const;
295 
296 
300  void
301  set_seq_no(
302  uint16_t seq_no);
303 
304 
308  uint8_t
309  get_npdu_no() const;
310 
311 
315  void
316  set_npdu_no(
317  uint8_t n_pdu_no);
318 
319 
323  uint8_t
324  get_ext_type() const;
325 
326 
330  void
331  set_ext_type(
332  uint8_t ext_type);
333 
334 
338  size_t
339  get_hdr_length() const;
340 
341 
342 public: // overloaded from fframe
343 
344 
348  virtual bool
349  complete() const;
350 
351 
355  virtual size_t
356  need_bytes() const;
357 
358 
362  virtual void
363  validate(
364  uint16_t total_len = 0) const;
365 
366 
370  virtual void
371  initialize();
372 
373 
377  virtual void
379  uint8_t *data, size_t datalen) throw (eFrameOutOfRange);
380 
381 
385  virtual uint8_t*
386  payload() const throw (eFrameNoPayload);
387 
388 
392  virtual size_t
393  payloadlen() const throw (eFrameNoPayload);
394 
395 
399  virtual const char*
400  c_str();
401 };
402 
403 }; // end of namespace
404 
405 #endif /* FGTPUV1FRAME_H_ */
Definition: fframe.h:23
virtual uint8_t * sopdu() const
Returns pointer to begin of this PDU.
Definition: fgtpuframe.cc:51
virtual size_t payloadlen() const
Definition: fgtpuframe.cc:383
Definition: fgtpuframe.h:25
virtual void validate(uint16_t total_len=0) const
Definition: fgtpuframe.cc:339
virtual size_t pdulen() const
Returns length of this PDU.
Definition: fgtpuframe.cc:76
Definition: fgtpuframe.h:61
Definition: fframe.h:21
virtual void initialize()
Definition: fgtpuframe.cc:349
virtual void payload_insert(uint8_t *data, size_t datalen)
Definition: fgtpuframe.cc:357
virtual void reset(uint8_t *data, size_t datalen)
Definition: fgtpuframe.cc:40
Definition: fframe.h:19
virtual bool complete() const
Definition: fgtpuframe.cc:307
virtual uint8_t * sosdu() const
Returns pointer to begin of SDU encapsulated in this PDU (if any).
Definition: fgtpuframe.cc:59
virtual uint8_t * payload() const
Definition: fgtpuframe.cc:366
Definition: fgtpuframe.h:82
Definition: fgtpuframe.h:28
virtual size_t need_bytes() const
Definition: fgtpuframe.cc:323
Definition: fgtpuframe.h:72
Definition: fframe.h:20
Definition: fgtpuframe.h:49
Definition: fgtpuframe.h:24
Definition: fframe.h:31