Revised OpenFlow Library  v0.6.0dev
 All Classes Files Functions Variables Friends Groups Pages
fl2tpv3frame.h
1 /*
2  * fl2tpframe.h
3  *
4  * Created on: 21.11.2013
5  * Author: andreas
6  */
7 
8 #ifndef FL2TPV3FRAME_H_
9 #define FL2TPV3FRAME_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 "../croflexception.h"
20 
21 
22 namespace rofl
23 {
24 
25 class eL2tpFrameBase : public eFrameBase {}; // base error class for L2TP related errors
26 class eL2tpFrameNoCtlMsg : public eL2tpFrameBase {}; // method cannot be applied, as L2TP message is no control message
27 class eL2tpFrameNoDataMsg : public eL2tpFrameBase {}; // method cannot be applied, as L2TP message is no data message
28 class eL2tpFrameInval : public eL2tpFrameBase {}; // invalid parameter
29 class eL2tpFrameInComplete : public eL2tpFrameBase {}; // message is incomplete
30 
34 class fl2tpv3frame :
35  public fframe
36 {
37  std::string info; // used for method c_str()
38 
39 public:
40 
41  enum l2tpv3_ip_proto_t {
42  L2TPV3_IP_PROTO = 115, // for IP encapsulation
43  };
44 
45  enum l2tp_version_t {
46  L2TP_VERSION_2 = 2, // not supported
47  L2TP_VERSION_3 = 3,
48  };
49 
50  enum l2tp_encap_t {
51  L2TP_ENCAP_IP = 1,
52  L2TP_ENCAP_UDP = 2,
53  };
54 
55  #define TBIT_FLAG (1 << 15)
56  #define LBIT_FLAG (1 << 14)
57  #define SBIT_FLAG (1 << 11)
58  #define VERS_MASK (0x000f)
59 
60  /* L2TPv3 control message header as defined in RFC3931 for IP encapsulation */
62  uint32_t pseudo_session_id; // not really a session ID => for control connections always all bits 0 to indicate a control header
63  uint16_t ctlfield;
64  uint16_t len;
65  uint32_t ccid; // control connection ID
66  uint16_t ns; // sequence number for this control message sent
67  uint16_t nr; // sequence number for next control message expected
68  };
69 
70  /* L2TPv3 data message header as defined in RFC3931 for IP encapsulation */
72  uint32_t session_id;
73  uint8_t data[0]; // cookie or data
74  };
75 
76  /* L2TPv3 control message header as defined in RFC3931 for UDP encapsulation */
78  uint16_t ctlfield;
79  uint16_t len;
80  uint32_t ccid; // control connection ID
81  uint16_t ns; // sequence number for this control message sent
82  uint16_t nr; // sequence number for next control message expected
83  } __attribute__((packed));
84 
85  /* L2TPv3 data message header as defined in RFC3931 for UDP encapsulation */
87  uint16_t ctlfield;
88  uint16_t reserved;
89  uint32_t session_id;
90  uint8_t data[0]; // cookie or data
91  } __attribute__((packed));
92 
93  /* default layer2 specific sublayer for L2TPv3 as defined in RFC 3931 section 4.6 */
95  uint8_t flags;
96  uint8_t seqno[3];
97  } __attribute__((packed));
98 
99 private:
100 
101  enum l2tp_encap_t encap_type; // encapsulation type of L2TPv3: IP or UDP
102 
103  // attention! L2TP over IP defines a totally different header than L2TP over UDP, so do not rely on the control bit fields to be available!
104  union {
105  uint8_t* l2tpv3u_hdr;
106  struct l2tpv3_ctl_hdr_ip_encap_t* l2tpv3u_ctl_hdr_ip_encap;
107  struct l2tpv3_data_hdr_ip_encap_t* l2tpv3u_data_hdr_ip_encap;
108  struct l2tpv3_ctl_hdr_udp_encap_t* l2tpv3u_ctl_hdr_udp_encap;
109  struct l2tpv3_data_hdr_udp_encap_t* l2tpv3u_data_hdr_udp_encap;
110  } l2tpv3u;
111 
112  #define l2tpv3_hdr l2tpv3u.l2tpv3u_hdr
113  #define l2tpv3_ctl_hdr_ip_encap l2tpv3u.l2tpv3u_ctl_hdr_ip_encap
114  #define l2tpv3_data_hdr_ip_encap l2tpv3u.l2tpv3u_data_hdr_ip_encap
115  #define l2tpv3_ctl_hdr_udp_encap l2tpv3u.l2tpv3u_ctl_hdr_udp_encap
116  #define l2tpv3_data_hdr_udp_encap l2tpv3u.l2tpv3u_data_hdr_udp_encap
117 
118 public:
119 
123  fl2tpv3frame(
124  enum l2tp_encap_t encap_type,
125  uint8_t *data,
126  size_t datalen);
127 
131  fl2tpv3frame(
132  enum l2tp_encap_t encap_type,
133  size_t len);
134 
138  virtual
139  ~fl2tpv3frame();
140 
144  virtual void
145  reset2(
146  enum l2tp_encap_t encap_type,
147  uint8_t* data,
148  size_t datalen);
149 
154  virtual uint8_t*
155  sopdu() const;
156 
157 
162  virtual size_t
163  pdulen() const;
164 
165 
169  virtual uint8_t*
170  sosdu() const;
171 
176  virtual size_t
177  sdulen() const;
178 
179 public:
180 
184  std::string
185  get_encap() const;
186 
190  bool
191  is_ctl_msg() const;
192 
196  bool
197  get_Tbit() const;
198 
202  void
203  set_Tbit(bool Tbit = true);
204 
208  bool
209  get_Lbit() const;
210 
214  void
215  set_Lbit(bool Lbit = true);
216 
220  bool
221  get_Sbit() const;
222 
226  void
227  set_Sbit(bool Sbit = true);
228 
232  uint8_t
233  get_version() const;
234 
238  void
239  set_version(uint8_t version = L2TP_VERSION_3);
240 
245  uint32_t
246  get_session_id() const;
247 
252  void
253  set_session_id(uint32_t sid);
254 
255 
256  /*
257  * control message specific
258  */
259 
264  uint16_t
265  get_length() const;
266 
271  void
272  set_length(uint16_t len);
273 
278  uint32_t
279  get_ccid() const;
280 
285  void
286  set_ccid(uint32_t ccid);
287 
292  uint16_t
293  get_Ns() const;
294 
299  void
300  set_Ns(uint16_t Ns);
301 
306  uint16_t
307  get_Nr() const;
308 
313  void
314  set_Nr(uint16_t Nr);
315 
316 #if 0
317  /*
318  * data message specific
319  */
320 
321 
326  uint64_t
327  get_cookie() const;
328 
333  void
334  set_cookie(uint64_t cookie);
335 #endif
336 
337 public: // overloaded from fframe
338 
339 
343  virtual bool
344  complete() const;
345 
346 
350  virtual size_t
351  need_bytes() const;
352 
353 
357  virtual void
358  validate(
359  uint16_t total_len = 0) const;
360 
361 
365  virtual void
366  initialize();
367 
368 
372  virtual void
374  uint8_t *data, size_t datalen) throw (eFrameOutOfRange);
375 
376 
380  virtual uint8_t*
381  payload() const throw (eFrameNoPayload);
382 
383 
387  virtual size_t
388  payloadlen() const throw (eFrameNoPayload);
389 
390 
394  virtual const char*
395  c_str();
396 
397 public:
398 
399  friend std::ostream&
400  operator<< (std::ostream& os, fl2tpv3frame const& f) {
401  os << "<fl2tpv3frame: ";
402  os << "vers:" << (int)f.get_version() << " ";
403  os << "type:" << ((f.get_Tbit() == true) ? "control " : "data ");
404  os << "encap:" << f.get_encap() << " ";
405  if (f.get_Tbit() == true/*:control*/) {
406  os <<"T:" << (f.get_Tbit() == true ? "1":"0") << " ";
407  os <<"L:" << (f.get_Lbit() == true ? "1":"0") << " ";
408  os <<"S:" << (f.get_Sbit() == true ? "1":"0") << " ";
409  os << "len:" << (int)f.get_length() << " ";
410  os << "ccid:" << (int)f.get_ccid() << " ";
411  os << "Ns:" << (int)f.get_Ns() << " ";
412  os << "Nr:" << (int)f.get_Nr() << " ";
413  } else /*false:data*/ {
414  os <<"T:" << (f.get_Tbit() == true ? "1":"0") << " ";
415  os << "sid:" << (int)f.get_session_id() << " ";
416  }
417  os << ">";
418  return os;
419  };
420 };
421 
422 }; // end of namespace
423 
424 #endif /* FL2TPFRAME_H_ */
void set_version(uint8_t version=L2TP_VERSION_3)
Set version of L2TP frame: currently only L2TPv3 is supported.
Definition: fl2tpv3frame.cc:466
virtual bool complete() const
Definition: fl2tpv3frame.cc:154
bool get_Sbit() const
Returns L2TPv3 S-bit indicating presence of the message fields Ns and Nr (only valid for control mess...
Definition: fl2tpv3frame.cc:399
virtual size_t pdulen() const
Returns length of this PDU.
Definition: fl2tpv3frame.cc:80
virtual uint8_t * sopdu() const
Returns pointer to begin of this PDU.
Definition: fl2tpv3frame.cc:73
virtual void payload_insert(uint8_t *data, size_t datalen)
Definition: fl2tpv3frame.cc:254
virtual size_t sdulen() const
Returns length of this SDU.
Definition: fl2tpv3frame.cc:120
virtual uint8_t * payload() const
Definition: fl2tpv3frame.cc:262
bool get_Lbit() const
Returns L2TPv3 L-bit indicating presence of the message length field (only valid for control messages...
Definition: fl2tpv3frame.cc:358
bool is_ctl_msg() const
Returns true, when the message is a control message.
Definition: fl2tpv3frame.cc:299
Definition: fl2tpv3frame.h:29
virtual void initialize()
Definition: fl2tpv3frame.cc:247
Definition: fframe.h:21
bool get_Tbit() const
Returns L2TPv3 T-bit indicating the message type, true:control packet, false:data packet...
Definition: fl2tpv3frame.cc:316
uint32_t get_session_id() const
Return L2TPv3 session ID. The session ID is also present in a control message as a pseudo session id ...
Definition: fl2tpv3frame.cc:491
Definition: fframe.h:19
virtual size_t payloadlen() const
Definition: fl2tpv3frame.cc:270
void set_Nr(uint16_t Nr)
Set Nr field in L2TPv3 control message header.
Definition: fl2tpv3frame.cc:676
Definition: fl2tpv3frame.h:26
virtual uint8_t * sosdu() const
Returns pointer to begin of SDU encapsulated in this PDU (if any).
Definition: fl2tpv3frame.cc:87
void set_Tbit(bool Tbit=true)
Set L2TPv3 T-bit indicating the message type, true: control packet, false:data packet (default)...
Definition: fl2tpv3frame.cc:334
uint16_t get_Nr() const
Returns Nr field from L2TPv3 control message header.
Definition: fl2tpv3frame.cc:655
virtual void validate(uint16_t total_len=0) const
Definition: fl2tpv3frame.cc:238
virtual size_t need_bytes() const
Definition: fl2tpv3frame.cc:186
Definition: fl2tpv3frame.h:34
void set_Sbit(bool Sbit=true)
Set L2TPv3 L-bit indicating presence of the message fields Ns and Nr (only valid for control messages...
Definition: fl2tpv3frame.cc:417
void set_session_id(uint32_t sid)
Set L2TPv3 session ID. The session ID is also present in a control message as a pseudo session id for...
Definition: fl2tpv3frame.cc:511
uint8_t get_version() const
Returns version of L2TP frame: currently only L2TPv3 is supported.
Definition: fl2tpv3frame.cc:440
uint32_t get_ccid() const
Return control connection ID field from L2TPv3 control message header.
Definition: fl2tpv3frame.cc:573
Definition: fframe.h:20
uint16_t get_Ns() const
Returns Ns field from L2TPv3 control message header.
Definition: fl2tpv3frame.cc:614
std::string get_encap() const
Return L2TPv3 encapsulation mode.
Definition: fl2tpv3frame.cc:287
Definition: fl2tpv3frame.h:27
void set_Lbit(bool Lbit=true)
Set L2TPv3 L-bit indicating presence of the message length field (only valid for control messages) ...
Definition: fl2tpv3frame.cc:376
void set_length(uint16_t len)
Set length field in L2TPv3 control message header.
Definition: fl2tpv3frame.cc:553
Definition: fl2tpv3frame.h:25
Definition: fframe.h:31
Definition: fl2tpv3frame.h:28
void set_ccid(uint32_t ccid)
Set control connection ID field in L2TPv3 control message header.
Definition: fl2tpv3frame.cc:594
void set_Ns(uint16_t Ns)
Set Ns field in L2TPv3 control message header.
Definition: fl2tpv3frame.cc:635
uint16_t get_length() const
Returns length field from L2TPv3 control message header.
Definition: fl2tpv3frame.cc:531