Revised OpenFlow Library  v0.6.0dev
 All Classes Files Functions Variables Friends Groups Pages
fvlanframe.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 FVLANFRAME_H
6 #define FVLANFRAME_H 1
7 
8 #include <endian.h>
9 #ifndef htobe16
10  #include "../endian_conversion.h"
11 #endif
12 
13 #include "../fframe.h"
14 #include "../caddress.h"
15 
16 namespace rofl
17 {
18 
19 class eVlanFrameBase : public eFrameBase {};
20 class eVlanFrameInvalidSyntax : public eVlanFrameBase, public eFrameInvalidSyntax {}; // invalid syntax
22 
27 class fvlanframe : public fframe {
28 public: // static
29 
30  /* Ethernet constants and definitions */
31 
32  // VLAN ethernet types
33  enum vlan_ether_t {
34  VLAN_CTAG_ETHER = 0x8100,
35  VLAN_STAG_ETHER = 0x88a8,
36  VLAN_ITAG_ETHER = 0x88e7,
37  };
38 
39  // VLAN header
40  struct vlan_hdr_t {
41  // tag control identifier (TCI)
42  uint8_t byte0;
43  uint8_t byte1;
44  //uint16_t hdr; // vid + cfi + pcp
45  uint16_t dl_type; // ethernet type
46  } __attribute__((packed));
47 
48 #if 0
49 #if __BYTE_ORDER == __LITTLE_ENDIAN
50  uint16_t vid : 12; // VLAN ID
51  uint16_t cfi : 1; // TODO: handle canonical order appropriately
52  uint16_t pcp : 3; // VLAN priority code point
53 #elif __BYTE_ORDER == __BIG_ENDIAN
54  uint16_t pcp : 3; // TCI: PCP (priority code point)
55  uint16_t cfi : 1; // TCI: CFI (canonical format indicator)
56  uint16_t vid : 12; // TCI: VID (VLAN identifier)
57 #endif
58 #endif
59 
60 
61 public: // methods
62 
66  fvlanframe(
67  uint8_t* data,
68  size_t datalen);
69 
70 
74  fvlanframe(
75  size_t len = sizeof(struct fvlanframe::vlan_hdr_t));
76 
77 
81  virtual
82  ~fvlanframe();
83 
84 
85 public: // overloaded from fframe
86 
87 
91  virtual void
92  reset(
93  uint8_t *data, size_t datalen);
94 
95 
98  virtual bool
99  complete() const;
100 
103  virtual size_t
104  need_bytes() const;
105 
109  virtual void
110  validate(uint16_t total_len = 0) const;
111 
115  virtual void
116  initialize();
117 
121  virtual void
123  uint8_t *data, size_t datalen) throw (eFrameOutOfRange);
124 
128  virtual uint8_t*
129  payload() const throw (eFrameNoPayload);
130 
134  virtual size_t
135  payloadlen() const throw (eFrameNoPayload);
136 
137 public:
138 
142  void
143  set_dl_vlan_id(uint16_t vid);
144 
148  uint16_t
149  get_dl_vlan_id() const;
150 
154  void
155  set_dl_vlan_pcp(uint8_t pcp);
156 
160  uint8_t
161  get_dl_vlan_pcp() const;
162 
166  void
167  set_dl_vlan_cfi(bool cfi);
168 
172  bool
173  get_dl_vlan_cfi() const;
174 
178  void
179  set_dl_type(uint16_t dl_type) throw (eFrameInval);
180 
184  uint16_t
185  get_dl_type() const;
186 
187 public: // data structures
188 
189  // pointer to vlan header
190  struct vlan_hdr_t *vlan_hdr;
191 
192 public:
193 
194  friend std::ostream&
195  operator<< (std::ostream& os, fvlanframe const& frame) {
196  os << dynamic_cast<fframe const&>( frame ) << std::endl;
197  os << indent(2) << "<fvlanframe ";
198  os << "vid:" << (int)frame.get_dl_vlan_id() << " ";
199  os << "pcp:" << (int)frame.get_dl_vlan_pcp() << " ";
200  os << "cfi:" << (int)frame.get_dl_vlan_cfi() << " ";
201  os << "inner-dl-type:" << (int)frame.get_dl_type() << " ";
202  os << ">" << std::endl;
203  return os;
204  };
205 };
206 
207 }; // end of namespace
208 
209 #endif
virtual void initialize()
Definition: fvlanframe.cc:44
Definition: fframe.h:23
virtual size_t need_bytes() const
Definition: fvlanframe.cc:63
uint16_t get_dl_type() const
Definition: fvlanframe.cc:191
Definition: fvlanframe.h:27
virtual void payload_insert(uint8_t *data, size_t datalen)
Definition: fvlanframe.cc:75
Definition: fframe.h:21
void set_dl_type(uint16_t dl_type)
Definition: fvlanframe.cc:177
uint16_t get_dl_vlan_id() const
Definition: fvlanframe.cc:134
virtual void validate(uint16_t total_len=0) const
Definition: fvlanframe.cc:112
Definition: fframe.h:19
virtual ~fvlanframe()
Definition: fvlanframe.cc:28
virtual size_t payloadlen() const
Definition: fvlanframe.cc:100
virtual uint8_t * payload() const
Definition: fvlanframe.cc:88
Definition: fframe.h:20
virtual void reset(uint8_t *data, size_t datalen)
Definition: fvlanframe.cc:35
fvlanframe(uint8_t *data, size_t datalen)
Definition: fvlanframe.cc:9
Definition: fframe.h:22
Definition: logging.h:76
Definition: fvlanframe.h:21
virtual bool complete() const
Definition: fvlanframe.cc:51
Definition: fframe.h:31
Definition: fvlanframe.h:19
Definition: fvlanframe.h:40
Definition: fvlanframe.h:20