Revised OpenFlow Library  v0.6.0dev
 All Classes Files Functions Variables Friends Groups Pages
fframe.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef FFRAME_H
6 #define FFRAME_H 1
7 
8 #include <bitset>
9 #include <inttypes.h>
10 #include <string>
11 #include <iostream>
12 
13 #include "croflexception.h"
14 #include "cmemory.h"
15 
16 namespace rofl
17 {
18 
19 class eFrameBase : public RoflException {}; // error base class fframe
20 class eFrameNoPayload : public eFrameBase {}; // no payload in frame
21 class eFrameOutOfRange : public eFrameBase {}; // too many data to copy
22 class eFrameInvalidSyntax : public eFrameBase {}; // invalid syntax
23 class eFrameInval : public eFrameBase {}; // invalid parameter
24 
25 
31 class fframe {
32 /*
33  * data structure
34  */
35 private:
36 
37  enum fframe_flag_t {
38  FFRAME_FLAG_MEM = (1 << 0), // fframe is self-containing memory area for frame
39  };
40 
41  cmemory mem; // frame container, if none was specified in constructor => this is used for creating new frames from scratch uint8_t *data; // data area
42  uint8_t *data; // data area
43  size_t datalen; // data area length
44 // uint16_t total_len; // real length of packet
45  std::bitset<32> flags;
46 
47 
48 public:
49 
50 #define DEFAULT_FFRAME_SIZE 128
51 
52 
53  fframe *next; // next fframe in a list or 0
54  fframe *prev; // previous fframe in a list or 0
55 
56 
57 
58 
59 
60 /*
61  * methods
62  */
63 public:
64 
68  fframe(
69  uint8_t* _data = NULL,
70  size_t _datalen = 0);
71  // uint16_t total_len = 0);
72 
76  fframe(
77  size_t len = DEFAULT_FFRAME_SIZE);
78 
82  virtual
83  ~fframe();
84 
88  virtual void
89  reset(uint8_t *_data, size_t _datalen); //, uint16_t _total_len);
90 
94  fframe(const fframe& frame);
95 
99  fframe& operator= (const fframe& frame);
100 
105  virtual uint8_t*
106  sopdu() const { return soframe(); };
107 
112  virtual size_t
113  pdulen() const { return framelen(); };
114 
118  virtual uint8_t*
119  sosdu() const { return soframe(); };
120 
124  virtual uint8_t&
125  operator[] (
126  size_t index) throw (eFrameOutOfRange);
127 
130  virtual bool
131  complete() const { return true; };
132 
135  virtual size_t
136  need_bytes() const { return 0; };
137 
141  virtual void
142  validate(uint16_t total_len = 0) const {};
143 
147  virtual void
149 
153  virtual void
155  uint8_t *data, size_t datalen) {};
156 
157 
161  virtual uint8_t*
162  payload() const
163  {
164  return soframe();
165  };
166 
167 
171  virtual size_t
172  payloadlen() const
173  {
174  return framelen();
175  };
176 
177 #if 0
178 
181  virtual uint16_t
182  totalpayloadlen() const throw (eFrameNoPayload)
183  {
184  return total_len;
185  };
186 #endif
187 
191  virtual uint8_t*
192  soframe() const
193  {
194  return data;
195  };
196 
197 
201  virtual size_t
202  framelen() const
203  {
204  return datalen;
205  };
206 
207 
208 #if 0
209 
212  virtual uint16_t
213  totallen() const
214  {
215  return total_len;
216  };
217 #endif
218 
219 
223  bool
224  empty() const
225  {
226  return (0 == datalen);
227  };
228 
229 
233  void
234  shift_left(size_t bytes)
235  {
236  data -= bytes;
237  };
238 
239 
243  void
244  shift_right(size_t bytes)
245  {
246  data += bytes;
247  };
248 
249 public:
250 
251  friend std::ostream&
252  operator<< (std::ostream& os, fframe const& frame) {
253  os << indent(0) << "<fframe: ";
254  os << "data:" << (void*)frame.soframe() << " ";
255  os << "datalen:" << frame.framelen() << " ";
256  os << "self-contained-mem:" << (frame.flags.test(FFRAME_FLAG_MEM) ? "yes" : "no") << " ";
257  os << "next:" << (void*)frame.next << " ";
258  os << "prev:" << (void*)frame.prev << " ";
259  os << ">" << std::endl;
260  //indent i(2);
261  //os << frame.mem;
262  return os;
263  };
264 };
265 
266 }; // end of namespace
267 
268 #endif
virtual size_t need_bytes() const
Definition: fframe.h:136
virtual uint8_t & operator[](size_t index)
Definition: fframe.cc:100
virtual void payload_insert(uint8_t *data, size_t datalen)
Definition: fframe.h:154
Definition: fframe.h:23
virtual size_t pdulen() const
Returns length of this PDU.
Definition: fframe.h:113
virtual void initialize()
Definition: fframe.h:148
Definition: fframe.h:21
fframe & operator=(const fframe &frame)
Definition: fframe.cc:79
void shift_right(size_t bytes)
Definition: fframe.h:244
bool empty() const
Definition: fframe.h:224
void shift_left(size_t bytes)
Definition: fframe.h:234
Definition: fframe.h:19
fframe(uint8_t *_data=NULL, size_t _datalen=0)
Definition: fframe.cc:9
virtual ~fframe()
Definition: fframe.cc:35
virtual size_t framelen() const
Definition: fframe.h:202
virtual uint8_t * sosdu() const
Returns pointer to begin of SDU encapsulated in this PDU (if any).
Definition: fframe.h:119
C++ abstraction for malloc'ed memory areas.
Definition: cmemory.h:44
virtual uint8_t * sopdu() const
Returns pointer to begin of this PDU.
Definition: fframe.h:106
virtual uint8_t * soframe() const
Definition: fframe.h:192
Definition: fframe.h:20
virtual uint8_t * payload() const
Definition: fframe.h:162
Definition: fframe.h:22
Definition: logging.h:76
virtual size_t payloadlen() const
Definition: fframe.h:172
virtual bool complete() const
Definition: fframe.h:131
virtual void validate(uint16_t total_len=0) const
Definition: fframe.h:142
virtual void reset(uint8_t *_data, size_t _datalen)
Definition: fframe.cc:50
Definition: fframe.h:31
Definition: croflexception.h:27