libfluid
The ONF OpenFlow driver
of13match.hh
1 #ifndef OPENFLOW_MATCH_H
2 #define OPENFLOW_MATCH_H 1
3 
4 #include <string>
5 #include <stdint.h>
6 #include "fluid/util/ethaddr.hh"
7 #include "fluid/util/ipaddr.hh"
8 #include "openflow-13.h"
9 #include <list>
10 #include <map>
11 #include <vector>
12 
13 namespace fluid_msg {
14 
15 namespace of13 {
16 
17 class MatchHeader {
18 protected:
19  uint16_t type_;
20  uint16_t length_;
21 public:
22  MatchHeader();
23  MatchHeader(uint16_t type, uint16_t length);
24  virtual ~MatchHeader() {
25  }
26  bool operator==(const MatchHeader &other) const;
27  bool operator!=(const MatchHeader &other) const;
28  virtual size_t pack(uint8_t *buffer);
29  virtual of_error unpack(uint8_t *buffer);
30  uint16_t type() {
31  return this->type_;
32  }
33  uint16_t length() {
34  return this->length_;
35  }
36  void type(uint16_t type) {
37  this->type_ = type;
38  }
39  void length(uint16_t length) {
40  this->length_ = length;
41  }
42 };
43 
44 struct oxm_req {
45  uint16_t eth_type_req[2];
46  uint8_t ip_proto_req;
47  uint8_t icmp_req;
48 };
49 
50 class OXMTLV {
51 protected:
52  uint16_t class__;
53  uint8_t field_;
54  bool has_mask_;
55  uint8_t length_;
56  struct oxm_req reqs;
57  void create_oxm_req(uint16_t eth_type1, uint16_t eth_type2,
58  uint8_t ip_proto, uint8_t icmp);
59 public:
60  OXMTLV();
61  OXMTLV(uint16_t class_, uint8_t field, bool has_mask, uint8_t length);
62  virtual ~OXMTLV() {
63  }
64  virtual bool equals(const OXMTLV & other);
65  virtual bool operator==(const OXMTLV &other) const;
66  virtual bool operator!=(const OXMTLV &other) const;
67  virtual OXMTLV& operator=(const OXMTLV& field);
68  virtual OXMTLV* clone() {
69  return new OXMTLV(*this);
70  }
71  virtual size_t pack(uint8_t *buffer);
72  virtual of_error unpack(uint8_t *buffer);
73  uint16_t class_() {
74  return this->class__;
75  }
76  uint8_t field() {
77  return this->field_;
78  }
79  bool has_mask() {
80  return this->has_mask_;
81  }
82  uint8_t length() {
83  return this->length_;
84  }
85  struct oxm_req oxm_reqs() {
86  return this->reqs;
87  }
88 
89  void class_(uint16_t class_) {
90  this->class__ = class_;
91  }
92  void field(uint8_t field) {
93  this->field_ = field;
94  }
95  void has_mask(bool has_mask) {
96  this->has_mask_ = has_mask;
97  }
98  void length(uint8_t length) {
99  this->length_ = length;
100  }
101  static uint32_t make_header(uint16_t class_, uint8_t field, bool has_mask,
102  uint8_t length);
103  static uint16_t oxm_class(uint32_t header);
104  static uint8_t oxm_field(uint32_t header);
105  static bool oxm_has_mask(uint32_t header);
106  static uint8_t oxm_length(uint32_t header);
107 };
108 
109 class InPort: public OXMTLV {
110 private:
111  uint32_t value_;
112 public:
113  InPort() {
114  create_oxm_req(0, 0, 0, 0);
115  }
116  InPort(uint32_t value);
117  ~InPort() {
118  }
119  virtual bool equals(const OXMTLV & other);
120  OXMTLV& operator=(const OXMTLV& field);
121  virtual InPort* clone() {
122  return new InPort(*this);
123  }
124  size_t pack(uint8_t *buffer);
125  of_error unpack(uint8_t *buffer);
126  uint32_t value() {
127  return this->value_;
128  }
129  void value(uint32_t value) {
130  this->value_ = value;
131  }
132 };
133 
134 class InPhyPort: public OXMTLV {
135 private:
136  uint32_t value_;
137 public:
138  InPhyPort() {
139  create_oxm_req(0, 0, 0, 0);
140  }
141  InPhyPort(uint32_t value);
142  ~InPhyPort() {
143  }
144  virtual bool equals(const OXMTLV & other);
145  OXMTLV& operator=(const OXMTLV& field);
146  virtual InPhyPort* clone() {
147  return new InPhyPort(*this);
148  }
149  size_t pack(uint8_t *buffer);
150  of_error unpack(uint8_t *buffer);
151  uint32_t value() {
152  return this->value_;
153  }
154  void value(uint32_t value) {
155  this->value_ = value;
156  }
157 };
158 
159 class Metadata: public OXMTLV {
160 private:
161  uint64_t value_;
162  uint64_t mask_;
163 public:
164  Metadata() {
165  create_oxm_req(0, 0, 0, 0);
166  }
167  Metadata(uint64_t value);
168  Metadata(uint64_t value, uint64_t mask);
169  ~Metadata() {
170  }
171  virtual bool equals(const OXMTLV & other);
172  OXMTLV& operator=(const OXMTLV& field);
173  virtual Metadata* clone() {
174  return new Metadata(*this);
175  }
176  size_t pack(uint8_t *buffer);
177  of_error unpack(uint8_t *buffer);
178  uint64_t value() {
179  return this->value_;
180  }
181  uint64_t mask() {
182  return this->mask_;
183  }
184  void value(uint64_t value) {
185  this->value_ = value;
186  }
187  void mask(uint64_t mask) {
188  this->mask_ = mask;
189  }
190 };
191 
192 class EthDst: public OXMTLV {
193 private:
194  EthAddress value_;
195  EthAddress mask_;
196 public:
197  EthDst() {
198  create_oxm_req(0, 0, 0, 0);
199  }
200  EthDst(EthAddress value);
201  EthDst(EthAddress value, EthAddress mask);
202  ~EthDst() {
203  }
204  virtual bool equals(const OXMTLV & other);
205  OXMTLV& operator=(const OXMTLV& field);
206  virtual EthDst* clone() {
207  return new EthDst(*this);
208  }
209  size_t pack(uint8_t *buffer);
210  of_error unpack(uint8_t *buffer);
211  EthAddress value() {
212  return this->value_;
213  }
214  EthAddress mask() {
215  return this->mask_;
216  }
217  void value(EthAddress value) {
218  this->value_ = value;
219  }
220  void mask(EthAddress mask) {
221  this->mask_ = mask;
222  }
223 };
224 
225 class EthSrc: public OXMTLV {
226 private:
227  EthAddress value_;
228  EthAddress mask_;
229 public:
230  EthSrc() {
231  create_oxm_req(0, 0, 0, 0);
232  }
233  EthSrc(EthAddress value);
234  EthSrc(EthAddress value, EthAddress mask);
235  ~EthSrc() {
236  }
237  virtual bool equals(const OXMTLV & other);
238  OXMTLV& operator=(const OXMTLV& field);
239  virtual EthSrc* clone() {
240  return new EthSrc(*this);
241  }
242  size_t pack(uint8_t *buffer);
243  of_error unpack(uint8_t *buffer);
244  EthAddress value() {
245  return this->value_;
246  }
247  EthAddress mask() {
248  return this->mask_;
249  }
250  void value(EthAddress value) {
251  this->value_ = value;
252  }
253  void mask(EthAddress mask) {
254  this->mask_ = mask;
255  }
256 };
257 
258 class EthType: public OXMTLV {
259 private:
260  uint16_t value_;
261 public:
262  EthType() {
263  create_oxm_req(0, 0, 0, 0);
264  }
265  EthType(uint16_t value);
266  ~EthType() {
267  }
268  virtual bool equals(const OXMTLV & other);
269  OXMTLV& operator=(const OXMTLV& field);
270  virtual EthType* clone() {
271  return new EthType(*this);
272  }
273  size_t pack(uint8_t *buffer);
274  of_error unpack(uint8_t *buffer);
275  uint16_t value() {
276  return this->value_;
277  }
278  void value(uint16_t value) {
279  this->value_ = value;
280  }
281 };
282 
283 class VLANVid: public OXMTLV {
284 private:
285  uint16_t value_;
286  uint16_t mask_;
287 public:
288  VLANVid() {
289  create_oxm_req(0, 0, 0, 0);
290  }
291  VLANVid(uint16_t value);
292  VLANVid(uint16_t value, uint16_t mask);
293  ~VLANVid() {
294  }
295  virtual bool equals(const OXMTLV & other);
296  OXMTLV& operator=(const OXMTLV& field);
297  virtual VLANVid* clone() {
298  return new VLANVid(*this);
299  }
300  size_t pack(uint8_t *buffer);
301  of_error unpack(uint8_t *buffer);
302  uint16_t value() {
303  return this->value_;
304  }
305  uint16_t mask() {
306  return this->mask_;
307  }
308  void value(uint16_t value) {
309  this->value_ = value;
310  }
311  void mask(uint16_t mask) {
312  this->mask_ = mask;
313  }
314 };
315 
316 class VLANPcp: public OXMTLV {
317 private:
318  uint8_t value_;
319 public:
320  VLANPcp() {
321  create_oxm_req(0, 0, 0, 0);
322  }
323  VLANPcp(uint8_t value);
324  ~VLANPcp() {
325  }
326  virtual bool equals(const OXMTLV & other);
327  OXMTLV& operator=(const OXMTLV& field);
328  virtual VLANPcp* clone() {
329  return new VLANPcp(*this);
330  }
331  size_t pack(uint8_t *buffer);
332  of_error unpack(uint8_t *buffer);
333  uint8_t value() {
334  return this->value_;
335  }
336  void value(uint8_t value) {
337  this->value_ = value;
338  }
339 };
340 
341 class IPDSCP: public OXMTLV {
342 private:
343  uint8_t value_;
344 public:
345  IPDSCP() {
346  create_oxm_req(0x0800, 0x86dd, 0, 0);
347  }
348  IPDSCP(uint8_t value);
349  ~IPDSCP() {
350  }
351  virtual bool equals(const OXMTLV & other);
352  OXMTLV& operator=(const OXMTLV& field);
353  virtual IPDSCP* clone() {
354  return new IPDSCP(*this);
355  }
356  size_t pack(uint8_t *buffer);
357  of_error unpack(uint8_t *buffer);
358  uint8_t value() {
359  return this->value_;
360  }
361  void value(uint8_t value) {
362  this->value_ = value;
363  }
364 };
365 
366 class IPECN: public OXMTLV {
367 private:
368  uint8_t value_;
369 public:
370  IPECN() {
371  create_oxm_req(0x0800, 0x86dd, 0, 0);
372  }
373  IPECN(uint8_t value);
374  ~IPECN() {
375  }
376  virtual bool equals(const OXMTLV & other);
377  OXMTLV& operator=(const OXMTLV& field);
378  virtual IPECN* clone() {
379  return new IPECN(*this);
380  }
381  size_t pack(uint8_t *buffer);
382  of_error unpack(uint8_t *buffer);
383  uint8_t value() {
384  return this->value_;
385  }
386  void value(uint8_t value) {
387  this->value_ = value;
388  }
389 };
390 
391 class IPProto: public OXMTLV {
392 private:
393  uint8_t value_;
394 public:
395  IPProto() {
396  create_oxm_req(0x0800, 0x86dd, 0, 0);
397  }
398  IPProto(uint8_t value);
399  ~IPProto() {
400  }
401  virtual bool equals(const OXMTLV & other);
402  OXMTLV& operator=(const OXMTLV& field);
403  virtual IPProto* clone() {
404  return new IPProto(*this);
405  }
406  size_t pack(uint8_t *buffer);
407  of_error unpack(uint8_t *buffer);
408  uint8_t value() {
409  return this->value_;
410  }
411  void value(uint8_t value) {
412  this->value_ = value;
413  }
414 };
415 
416 class IPv4Src: public OXMTLV {
417 private:
418  IPAddress value_;
419  IPAddress mask_;
420 public:
421  IPv4Src()
422  : value_((uint32_t) 0),
423  mask_((uint32_t) 0) {
424  create_oxm_req(0x0800, 0, 0, 0);
425  }
426  IPv4Src(IPAddress value);
427  IPv4Src(IPAddress value, IPAddress mask);
428  ~IPv4Src() {
429  }
430  virtual bool equals(const OXMTLV & other);
431  OXMTLV& operator=(const OXMTLV& field);
432  virtual IPv4Src* clone() {
433  return new IPv4Src(*this);
434  }
435  size_t pack(uint8_t *buffer);
436  of_error unpack(uint8_t *buffer);
437  IPAddress value() {
438  return this->value_;
439  }
440  IPAddress mask() {
441  return this->mask_;
442  }
443  void value(uint32_t value) {
444  this->value_ = value;
445  }
446  void mask(uint32_t mask) {
447  this->mask_ = mask;
448  }
449 };
450 
451 class IPv4Dst: public OXMTLV {
452 private:
453  IPAddress value_;
454  IPAddress mask_;
455 public:
456  IPv4Dst()
457  : value_((uint32_t) 0),
458  mask_((uint32_t) 0) {
459  create_oxm_req(0x0800, 0, 0, 0);
460  }
461  IPv4Dst(IPAddress value);
462  IPv4Dst(IPAddress value, IPAddress mask);
463  ~IPv4Dst() {
464  }
465  virtual bool equals(const OXMTLV & other);
466  OXMTLV& operator=(const OXMTLV& field);
467  virtual IPv4Dst* clone() {
468  return new IPv4Dst(*this);
469  }
470  size_t pack(uint8_t *buffer);
471  of_error unpack(uint8_t *buffer);
472  IPAddress value() {
473  return this->value_;
474  }
475  IPAddress mask() {
476  return this->mask_;
477  }
478  void value(IPAddress value) {
479  this->value_ = value;
480  }
481  void mask(IPAddress mask) {
482  this->mask_ = mask;
483  }
484 };
485 
486 class TCPSrc: public OXMTLV {
487 private:
488  uint16_t value_;
489 public:
490  TCPSrc() {
491  create_oxm_req(0x0800, 0x86dd, 6, 0);
492  }
493  TCPSrc(uint16_t value);
494  ~TCPSrc() {
495  }
496  virtual bool equals(const OXMTLV & other);
497  OXMTLV& operator=(const OXMTLV& field);
498  virtual TCPSrc* clone() {
499  return new TCPSrc(*this);
500  }
501  size_t pack(uint8_t *buffer);
502  of_error unpack(uint8_t *buffer);
503  uint16_t value() {
504  return this->value_;
505  }
506  void value(uint16_t value) {
507  this->value_ = value;
508  }
509 
510 };
511 
512 class TCPDst: public OXMTLV {
513 private:
514  uint16_t value_;
515 public:
516  TCPDst() {
517  create_oxm_req(0x0800, 0x86dd, 6, 0);
518  }
519  TCPDst(uint16_t value);
520  ~TCPDst() {
521  }
522  virtual bool equals(const OXMTLV & other);
523  OXMTLV& operator=(const OXMTLV& field);
524  virtual TCPDst* clone() {
525  return new TCPDst(*this);
526  }
527  size_t pack(uint8_t *buffer);
528  of_error unpack(uint8_t *buffer);
529  uint16_t value() {
530  return this->value_;
531  }
532  void value(uint16_t value) {
533  this->value_ = value;
534  }
535 };
536 
537 class UDPSrc: public OXMTLV {
538 private:
539  uint16_t value_;
540 public:
541  UDPSrc() {
542  create_oxm_req(0x0800, 0x86dd, 17, 0);
543  }
544  UDPSrc(uint16_t value);
545  ~UDPSrc() {
546  }
547  virtual bool equals(const OXMTLV & other);
548  OXMTLV& operator=(const OXMTLV& field);
549  virtual UDPSrc* clone() {
550  return new UDPSrc(*this);
551  }
552  size_t pack(uint8_t *buffer);
553  of_error unpack(uint8_t *buffer);
554  uint16_t value() {
555  return this->value_;
556  }
557  void value(uint16_t value) {
558  this->value_ = value;
559  }
560 };
561 
562 class UDPDst: public OXMTLV {
563 private:
564  uint16_t value_;
565 public:
566  UDPDst() {
567  create_oxm_req(0x0800, 0x86dd, 17, 0);
568  }
569  UDPDst(uint16_t value);
570  ~UDPDst() {
571  }
572  virtual bool equals(const OXMTLV & other);
573  OXMTLV& operator=(const OXMTLV& field);
574  virtual UDPDst* clone() {
575  return new UDPDst(*this);
576  }
577  size_t pack(uint8_t *buffer);
578  of_error unpack(uint8_t *buffer);
579  uint16_t value() {
580  return this->value_;
581  }
582  void value(uint16_t value) {
583  this->value_ = value;
584  }
585 };
586 
587 class SCTPSrc: public OXMTLV {
588 private:
589  uint16_t value_;
590 public:
591  SCTPSrc() {
592  create_oxm_req(0x0800, 0x86dd, 132, 0);
593  }
594  SCTPSrc(uint16_t value);
595  ~SCTPSrc() {
596  }
597  virtual bool equals(const OXMTLV & other);
598  OXMTLV& operator=(const OXMTLV& field);
599  virtual SCTPSrc* clone() {
600  return new SCTPSrc(*this);
601  }
602  size_t pack(uint8_t *buffer);
603  of_error unpack(uint8_t *buffer);
604  uint16_t value() {
605  return this->value_;
606  }
607  void value(uint16_t value) {
608  this->value_ = value;
609  }
610 
611 };
612 
613 class SCTPDst: public OXMTLV {
614 private:
615  uint16_t value_;
616 public:
617  SCTPDst() {
618  create_oxm_req(0x0800, 0x86dd, 132, 0);
619  }
620  SCTPDst(uint16_t value);
621  ~SCTPDst() {
622  }
623  virtual bool equals(const OXMTLV & other);
624  OXMTLV& operator=(const OXMTLV& field);
625  virtual SCTPDst* clone() {
626  return new SCTPDst(*this);
627  }
628  size_t pack(uint8_t *buffer);
629  of_error unpack(uint8_t *buffer);
630  uint16_t value() {
631  return this->value_;
632  }
633  void value(uint16_t value) {
634  this->value_ = value;
635  }
636 };
637 
638 class ICMPv4Code: public OXMTLV {
639 private:
640  uint8_t value_;
641 public:
642  ICMPv4Code() {
643  create_oxm_req(0x0800, 0, 1, 0);
644  }
645  ICMPv4Code(uint8_t value);
646  ~ICMPv4Code() {
647  }
648  virtual bool equals(const OXMTLV & other);
649  OXMTLV& operator=(const OXMTLV& field);
650  virtual ICMPv4Code* clone() {
651  return new ICMPv4Code(*this);
652  }
653  size_t pack(uint8_t *buffer);
654  of_error unpack(uint8_t *buffer);
655  uint8_t value() {
656  return this->value_;
657  }
658  void value(uint8_t value) {
659  this->value_ = value;
660  }
661 };
662 
663 class ICMPv4Type: public OXMTLV {
664 private:
665  uint8_t value_;
666 public:
667  ICMPv4Type() {
668  create_oxm_req(0x0800, 0, 1, 0);
669  }
670  ICMPv4Type(uint8_t value);
671  ~ICMPv4Type() {
672  }
673  virtual bool equals(const OXMTLV & other);
674  OXMTLV& operator=(const OXMTLV& field);
675  virtual ICMPv4Type* clone() {
676  return new ICMPv4Type(*this);
677  }
678  size_t pack(uint8_t *buffer);
679  of_error unpack(uint8_t *buffer);
680  uint8_t value() {
681  return this->value_;
682  }
683  void value(uint8_t value) {
684  this->value_ = value;
685  }
686 };
687 
688 class ARPOp: public OXMTLV {
689 private:
690  uint16_t value_;
691 public:
692  ARPOp() {
693  create_oxm_req(0x0806, 0, 0, 0);
694  }
695  ARPOp(uint16_t value);
696  ~ARPOp() {
697  }
698  virtual bool equals(const OXMTLV & other);
699  OXMTLV& operator=(const OXMTLV& field);
700  virtual ARPOp* clone() {
701  return new ARPOp(*this);
702  }
703  size_t pack(uint8_t *buffer);
704  of_error unpack(uint8_t *buffer);
705  uint16_t value() {
706  return this->value_;
707  }
708  void value(uint16_t value) {
709  this->value_ = value;
710  }
711 };
712 
713 class ARPSPA: public OXMTLV {
714 private:
715  IPAddress value_;
716  IPAddress mask_;
717 public:
718  ARPSPA() {
719  create_oxm_req(0x0806, 0, 0, 0);
720  }
721  ARPSPA(IPAddress value);
722  ARPSPA(IPAddress value, IPAddress mask);
723  ~ARPSPA() {
724  }
725  virtual bool equals(const OXMTLV & other);
726  OXMTLV& operator=(const OXMTLV& field);
727  virtual ARPSPA* clone() {
728  return new ARPSPA(*this);
729  }
730  size_t pack(uint8_t *buffer);
731  of_error unpack(uint8_t *buffer);
732  IPAddress value() {
733  return this->value_;
734  }
735  IPAddress mask() {
736  return this->mask_;
737  }
738  void value(IPAddress value) {
739  this->value_ = value;
740  }
741  void mask(IPAddress mask) {
742  this->mask_ = mask;
743  }
744 
745 };
746 
747 class ARPTPA: public OXMTLV {
748 private:
749  IPAddress value_;
750  IPAddress mask_;
751 public:
752  ARPTPA() {
753  create_oxm_req(0x0806, 0, 0, 0);
754  }
755  ARPTPA(IPAddress value);
756  ARPTPA(IPAddress value, IPAddress mask);
757  ~ARPTPA() {
758  }
759  virtual bool equals(const OXMTLV & other);
760  OXMTLV& operator=(const OXMTLV& field);
761  virtual ARPTPA* clone() {
762  return new ARPTPA(*this);
763  }
764  size_t pack(uint8_t *buffer);
765  of_error unpack(uint8_t *buffer);
766  IPAddress value() {
767  return this->value_;
768  }
769  IPAddress mask() {
770  return this->mask_;
771  }
772  void value(IPAddress value) {
773  this->value_ = value;
774  }
775  void mask(IPAddress mask) {
776  this->mask_ = mask;
777  }
778 };
779 
780 class ARPSHA: public OXMTLV {
781 private:
782  EthAddress value_;
783  EthAddress mask_;
784 public:
785  ARPSHA() {
786  create_oxm_req(0x0806, 0, 0, 0);
787  }
788  ARPSHA(EthAddress value);
789  ARPSHA(EthAddress value, EthAddress mask);
790  ~ARPSHA() {
791  }
792  virtual bool equals(const OXMTLV & other);
793  OXMTLV& operator=(const OXMTLV& field);
794  virtual ARPSHA* clone() {
795  return new ARPSHA(*this);
796  }
797  size_t pack(uint8_t *buffer);
798  of_error unpack(uint8_t *buffer);
799  EthAddress value() {
800  return this->value_;
801  }
802  EthAddress mask() {
803  return this->mask_;
804  }
805  void value(EthAddress value) {
806  this->value_ = value;
807  }
808 };
809 
810 class ARPTHA: public OXMTLV {
811 private:
812  EthAddress value_;
813  EthAddress mask_;
814 public:
815  ARPTHA() {
816  create_oxm_req(0x0806, 0, 0, 0);
817  }
818  ARPTHA(EthAddress value);
819  ARPTHA(EthAddress value, EthAddress mask);
820  ~ARPTHA() {
821  }
822  virtual bool equals(const OXMTLV & other);
823  OXMTLV& operator=(const OXMTLV& field);
824  virtual ARPTHA* clone() {
825  return new ARPTHA(*this);
826  }
827  size_t pack(uint8_t *buffer);
828  of_error unpack(uint8_t *buffer);
829  EthAddress value() {
830  return this->value_;
831  }
832  EthAddress mask() {
833  return this->mask_;
834  }
835  void value(EthAddress value) {
836  this->value_ = value;
837  }
838  //void value(std::string value);
839 };
840 
841 class IPv6Src: public OXMTLV {
842 private:
843  IPAddress value_;
844  IPAddress mask_;
845 public:
846  IPv6Src() {
847  create_oxm_req(0, 0x86dd, 0, 0);
848  }
849  IPv6Src(IPAddress value);
850  IPv6Src(IPAddress value, IPAddress mask);
851  ~IPv6Src() {
852  }
853  virtual bool equals(const OXMTLV & other);
854  OXMTLV& operator=(const OXMTLV& field);
855  virtual IPv6Src* clone() {
856  return new IPv6Src(*this);
857  }
858  size_t pack(uint8_t *buffer);
859  of_error unpack(uint8_t *buffer);
860  IPAddress value() {
861  return this->value_;
862  }
863  IPAddress mask() {
864  return this->mask_;
865  }
866  void value(IPAddress value) {
867  this->value_ = value;
868  }
869  void mask(IPAddress mask) {
870  this->mask_ = mask;
871  }
872 };
873 
874 class IPv6Dst: public OXMTLV {
875 private:
876  IPAddress value_;
877  IPAddress mask_;
878 public:
879  IPv6Dst() {
880  create_oxm_req(0, 0x86dd, 0, 0);
881  }
882  IPv6Dst(IPAddress value);
883  IPv6Dst(IPAddress value, IPAddress mask);
884  ~IPv6Dst() {
885  }
886  virtual bool equals(const OXMTLV & other);
887  OXMTLV& operator=(const OXMTLV& field);
888  virtual IPv6Dst* clone() {
889  return new IPv6Dst(*this);
890  }
891  size_t pack(uint8_t *buffer);
892  of_error unpack(uint8_t *buffer);
893  IPAddress value() {
894  return this->value_;
895  }
896  IPAddress mask() {
897  return this->mask_;
898  }
899  void value(IPAddress value) {
900  this->value_ = value;
901  }
902  void mask(IPAddress mask) {
903  this->mask_ = mask;
904  }
905 };
906 
907 class IPV6Flabel: public OXMTLV {
908 private:
909  uint32_t value_;
910  uint32_t mask_;
911 public:
912  IPV6Flabel() {
913  create_oxm_req(0, 0x86dd, 0, 0);
914  }
915  IPV6Flabel(uint32_t value);
916  IPV6Flabel(uint32_t value, uint32_t mask);
917  ~IPV6Flabel() {
918  }
919  virtual bool equals(const OXMTLV & other);
920  OXMTLV& operator=(const OXMTLV& field);
921  virtual IPV6Flabel* clone() {
922  return new IPV6Flabel(*this);
923  }
924  size_t pack(uint8_t *buffer);
925  of_error unpack(uint8_t *buffer);
926  uint32_t value() {
927  return this->value_;
928  }
929  uint32_t mask() {
930  return this->mask_;
931  }
932  void value(uint32_t value) {
933  this->value_ = value;
934  }
935  void mask(uint32_t mask) {
936  this->mask_ = mask;
937  }
938 };
939 
940 class ICMPv6Type: public OXMTLV {
941 private:
942  uint8_t value_;
943 public:
944  ICMPv6Type() {
945  create_oxm_req(0, 0x86dd, 58, 0);
946  }
947  ICMPv6Type(uint8_t value);
948  ~ICMPv6Type() {
949  }
950  virtual bool equals(const OXMTLV & other);
951  OXMTLV& operator=(const OXMTLV& field);
952  virtual ICMPv6Type* clone() {
953  return new ICMPv6Type(*this);
954  }
955  size_t pack(uint8_t *buffer);
956  of_error unpack(uint8_t *buffer);
957  uint8_t value() {
958  return this->value_;
959  }
960  void value(uint8_t value) {
961  this->value_ = value;
962  }
963 };
964 
965 class ICMPv6Code: public OXMTLV {
966 private:
967  uint8_t value_;
968 public:
969  ICMPv6Code() {
970  create_oxm_req(0, 0x86dd, 58, 0);
971  }
972  ICMPv6Code(uint8_t value);
973  ~ICMPv6Code() {
974  }
975  virtual bool equals(const OXMTLV & other);
976  OXMTLV& operator=(const OXMTLV& field);
977  virtual ICMPv6Code* clone() {
978  return new ICMPv6Code(*this);
979  }
980  size_t pack(uint8_t *buffer);
981  of_error unpack(uint8_t *buffer);
982  uint8_t value() {
983  return this->value_;
984  }
985  void value(uint8_t value) {
986  this->value_ = value;
987  }
988 };
989 
990 class IPv6NDTarget: public OXMTLV {
991 private:
992  IPAddress value_;
993 public:
994  IPv6NDTarget() {
995  create_oxm_req(0, 0x86dd, 58, 135);
996  }
997  IPv6NDTarget(IPAddress value);
998  ~IPv6NDTarget() {
999  }
1000  virtual bool equals(const OXMTLV & other);
1001  OXMTLV& operator=(const OXMTLV& field);
1002  virtual IPv6NDTarget* clone() {
1003  return new IPv6NDTarget(*this);
1004  }
1005  size_t pack(uint8_t *buffer);
1006  of_error unpack(uint8_t *buffer);
1007  IPAddress value() {
1008  return this->value_;
1009  }
1010  void value(IPAddress value) {
1011  this->value_ = value;
1012  }
1013 };
1014 
1015 class IPv6NDSLL: public OXMTLV {
1016 private:
1017  EthAddress value_;
1018 public:
1019  IPv6NDSLL() {
1020  create_oxm_req(0, 0x86dd, 58, 136);
1021  }
1022  IPv6NDSLL(EthAddress value);
1023  ~IPv6NDSLL() {
1024  }
1025  virtual bool equals(const OXMTLV & other);
1026  OXMTLV& operator=(const OXMTLV& field);
1027  virtual IPv6NDSLL* clone() {
1028  return new IPv6NDSLL(*this);
1029  }
1030  size_t pack(uint8_t *buffer);
1031  of_error unpack(uint8_t *buffer);
1032  EthAddress value() {
1033  return this->value_;
1034  }
1035  void value(EthAddress value) {
1036  this->value_ = value;
1037  }
1038 };
1039 
1040 class IPv6NDTLL: public OXMTLV {
1041 private:
1042  EthAddress value_;
1043 public:
1044  IPv6NDTLL() {
1045  create_oxm_req(0, 0x86dd, 58, 136);
1046  }
1047  IPv6NDTLL(EthAddress value);
1048  ~IPv6NDTLL() {
1049  }
1050  virtual bool equals(const OXMTLV & other);
1051  OXMTLV& operator=(const OXMTLV& field);
1052  virtual IPv6NDTLL* clone() {
1053  return new IPv6NDTLL(*this);
1054  }
1055  size_t pack(uint8_t *buffer);
1056  of_error unpack(uint8_t *buffer);
1057  EthAddress value() {
1058  return this->value_;
1059  }
1060  void value(EthAddress value) {
1061  this->value_ = value;
1062  }
1063 };
1064 
1065 class MPLSLabel: public OXMTLV {
1066 private:
1067  uint32_t value_;
1068 public:
1069  MPLSLabel() {
1070  create_oxm_req(0x8847, 0x8848, 0, 0);
1071  }
1072  MPLSLabel(uint32_t value);
1073  ~MPLSLabel() {
1074  }
1075  virtual bool equals(const OXMTLV & other);
1076  OXMTLV& operator=(const OXMTLV& field);
1077  virtual MPLSLabel* clone() {
1078  return new MPLSLabel(*this);
1079  }
1080  size_t pack(uint8_t *buffer);
1081  of_error unpack(uint8_t *buffer);
1082  uint32_t value() {
1083  return this->value_;
1084  }
1085  void value(uint32_t value) {
1086  this->value_ = value;
1087  }
1088 };
1089 
1090 class MPLSTC: public OXMTLV {
1091 private:
1092  uint8_t value_;
1093 public:
1094  MPLSTC() {
1095  create_oxm_req(0x8847, 0x8848, 0, 0);
1096  }
1097  MPLSTC(uint8_t value);
1098  ~MPLSTC() {
1099  }
1100  virtual bool equals(const OXMTLV & other);
1101  OXMTLV& operator=(const OXMTLV& field);
1102  virtual MPLSTC* clone() {
1103  return new MPLSTC(*this);
1104  }
1105  size_t pack(uint8_t *buffer);
1106  of_error unpack(uint8_t *buffer);
1107  uint8_t value() {
1108  return this->value_;
1109  }
1110  void value(uint8_t value) {
1111  this->value_ = value;
1112  }
1113 };
1114 
1115 class MPLSBOS: public OXMTLV {
1116 private:
1117  uint8_t value_;
1118 public:
1119  MPLSBOS() {
1120  create_oxm_req(0x8847, 0x8848, 0, 0);
1121  }
1122  MPLSBOS(uint8_t value);
1123  ~MPLSBOS() {
1124  }
1125  virtual bool equals(const OXMTLV & other);
1126  OXMTLV& operator=(const OXMTLV& field);
1127  virtual MPLSBOS* clone() {
1128  return new MPLSBOS(*this);
1129  }
1130  size_t pack(uint8_t *buffer);
1131  of_error unpack(uint8_t *buffer);
1132  uint8_t value() {
1133  return this->value_;
1134  }
1135  void value(uint8_t value) {
1136  this->value_ = value;
1137  }
1138 };
1139 
1140 class PBBIsid: public OXMTLV {
1141 private:
1142  uint32_t value_;
1143  uint32_t mask_;
1144 public:
1145  PBBIsid() {
1146  create_oxm_req(0x88E7, 0, 0, 0);
1147  }
1148  PBBIsid(uint32_t value);
1149  PBBIsid(uint32_t value, uint32_t mask);
1150  ~PBBIsid() {
1151  }
1152  virtual bool equals(const OXMTLV & other);
1153  OXMTLV& operator=(const OXMTLV& field);
1154  virtual PBBIsid* clone() {
1155  return new PBBIsid(*this);
1156  }
1157  size_t pack(uint8_t *buffer);
1158  of_error unpack(uint8_t *buffer);
1159  uint32_t value() {
1160  return this->value_;
1161  }
1162  uint32_t mask() {
1163  return this->mask_;
1164  }
1165  void value(uint32_t value) {
1166  this->value_ = value;
1167  }
1168  void mask(uint32_t mask) {
1169  this->mask_ = mask;
1170  }
1171 };
1172 
1173 class TUNNELId: public OXMTLV {
1174 private:
1175  uint64_t value_;
1176  uint64_t mask_;
1177 public:
1178  TUNNELId() {
1179  create_oxm_req(0, 0, 0, 0);
1180  }
1181  TUNNELId(uint64_t value);
1182  TUNNELId(uint64_t value, uint64_t mask);
1183  ~TUNNELId() {
1184  }
1185  virtual bool equals(const OXMTLV & other);
1186  OXMTLV& operator=(const OXMTLV& field);
1187  virtual TUNNELId* clone() {
1188  return new TUNNELId(*this);
1189  }
1190  size_t pack(uint8_t *buffer);
1191  of_error unpack(uint8_t *buffer);
1192  uint64_t value() {
1193  return this->value_;
1194  }
1195  void value(uint64_t value) {
1196  this->value_ = value;
1197  }
1198 };
1199 
1200 class IPv6Exthdr: public OXMTLV {
1201 private:
1202  uint16_t value_;
1203  uint16_t mask_;
1204 public:
1205  IPv6Exthdr() {
1206  create_oxm_req(0, 0x86dd, 0, 0);
1207  }
1208  IPv6Exthdr(uint16_t value);
1209  IPv6Exthdr(uint16_t value, uint16_t mask);
1210  ~IPv6Exthdr() {
1211  }
1212  virtual bool equals(const OXMTLV & other);
1213  OXMTLV& operator=(const OXMTLV& field);
1214  virtual IPv6Exthdr* clone() {
1215  return new IPv6Exthdr(*this);
1216  }
1217  size_t pack(uint8_t *buffer);
1218  of_error unpack(uint8_t *buffer);
1219  uint16_t value() {
1220  return this->value_;
1221  }
1222  uint16_t mask() {
1223  return this->mask_;
1224  }
1225  void value(uint16_t value) {
1226  this->value_ = value;
1227  }
1228  void mask(uint16_t mask) {
1229  this->mask_ = mask;
1230  }
1231 };
1232 
1233 class Match: public MatchHeader {
1234 private:
1235  /*Current tlvs present by field*/
1236  std::vector<uint8_t> curr_tlvs_;
1237  /*Vector of OXM TLVs*/
1238  std::vector<OXMTLV*> oxm_tlvs_;
1239 public:
1240  Match();
1241  Match(const Match &match);
1242  Match& operator=(Match other);
1243  ~Match();
1244  bool operator==(const Match &other) const;
1245  bool operator!=(const Match &other) const;
1246  void swap(Match& first, Match& second);
1247  size_t pack(uint8_t *buffer);
1248  of_error unpack(uint8_t *buffer);
1249  OXMTLV *oxm_field(uint8_t field);
1250  bool check_pre_req(OXMTLV *tlv);
1251  bool check_dup(OXMTLV *tlv);
1252  void add_oxm_field(OXMTLV &tlv);
1253  void add_oxm_field(OXMTLV* tlv);
1254  uint16_t oxm_fields_len();
1255  static OXMTLV * make_oxm_tlv(uint8_t field);
1256  InPort* in_port();
1257  InPhyPort* in_phy_port();
1258  Metadata* metadata();
1259  EthSrc* eth_src();
1260  EthDst* eth_dst();
1261  EthType* eth_type();
1262  VLANVid* vlan_vid();
1263  VLANPcp* vlan_pcp();
1264  IPDSCP* ip_dscp();
1265  IPECN* ip_ecn();
1266  IPProto* ip_proto();
1267  IPv4Src* ipv4_src();
1268  IPv4Dst* ipv4_dst();
1269  TCPSrc* tcp_src();
1270  TCPDst* tcp_dst();
1271  UDPSrc* udp_src();
1272  UDPDst* udp_dst();
1273  SCTPSrc* sctp_src();
1274  SCTPDst* sctp_dst();
1275  ICMPv4Type* icmpv4_type();
1276  ICMPv4Code* icmpv4_code();
1277  ARPOp* arp_op();
1278  ARPSPA* arp_spa();
1279  ARPTPA* arp_tpa();
1280  ARPSHA* arp_sha();
1281  ARPTHA* arp_tha();
1282  IPv6Src* ipv6_src();
1283  IPv6Dst* ipv6_dst();
1284  IPV6Flabel* ipv6_flabel();
1285  ICMPv6Type* icmpv6_type();
1286  ICMPv6Code* icmpv6_code();
1287  IPv6NDTarget* ipv6_nd_target();
1288  IPv6NDSLL* ipv6_nd_sll();
1289  IPv6NDTLL* ipv6_nd_tll();
1290  MPLSLabel* mpls_label();
1291  MPLSTC* mpls_tc();
1292  MPLSBOS* mpls_bos();
1293  PBBIsid* pbb_isid();
1294  TUNNELId* tunnel_id();
1295  IPv6Exthdr* ipv6_exthdr();
1296 };
1297 
1298 } //End of namespace of13
1299 
1300 } //End of namespace fluid_msg
1301 #endif
1302