Revised OpenFlow Library  v0.6.0dev
 All Classes Files Functions Variables Friends Groups Pages
cofmatch.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 COFMATCH_H
6 #define COFMATCH_H 1
7 
8 #include <string>
9 #include <endian.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <endian.h>
13 #ifndef be32toh
14  #include "../endian_conversion.h"
15 #endif
16 
17 #include "rofl/common/openflow/openflow.h"
18 #include "rofl/common/cmemory.h"
19 #include "rofl/common/caddress.h"
20 #include "rofl/common/croflexception.h"
21 #include "rofl/common/caddress.h"
22 #include "rofl/common/openflow/openflow_rofl_exceptions.h"
23 #include "rofl/common/openflow/coxmatches.h"
24 
25 namespace rofl {
26 namespace openflow {
27 
28 class eOFmatchBase : public RoflException {};
29 class eOFmatchType : public eOFmatchBase {};
30 class eOFmatchInval : public eOFmatchBase {};
31 class eOFmatchNotFound : public eOFmatchBase {};
33 
34 
35 class cofmatch
36 {
37  uint8_t of_version;
38  coxmatches matches;
39  uint16_t type;
40 
41 public:
42 
46  cofmatch(
47  uint8_t of_version = rofl::openflow::OFP_VERSION_UNKNOWN,
48  uint16_t type = rofl::openflow::OFPMT_OXM);
49 
53  cofmatch(
54  const cofmatch &match);
55 
59  virtual
60  ~cofmatch();
61 
65  cofmatch&
66  operator= (
67  const cofmatch& match);
68 
72  bool
73  operator== (const cofmatch& m) const;
74 
75 
76 
77 public:
78 
82  virtual size_t
83  length() const;
84 
88  virtual void
89  pack(
90  uint8_t* buf, size_t buflen);
91 
95  virtual void
96  unpack(
97  uint8_t* buf, size_t buflen);
98 
99 public:
100 
104  void
105  check_prerequisites() const;
106 
110  void
111  clear() { matches.clear(); };
112 
116  bool
117  contains(
118  cofmatch const& match,
119  bool strict = false) {
120  return matches.contains(match.get_matches(), strict);
121  };
122 
126  bool
127  is_part_of(
128  cofmatch const& match,
129  uint16_t& exact_hits,
130  uint16_t& wildcard_hits,
131  uint16_t& missed) {
132  return matches.is_part_of(match.get_matches(), exact_hits, wildcard_hits, missed);
133  };
134 
135 public:
136 
140  void
141  set_version(uint8_t ofp_version) { this->of_version = ofp_version; };
142 
146  uint8_t
147  get_version() const { return of_version; };
148 
152  void
153  set_type(uint16_t type) { this->type = type; };
154 
158  uint16_t
159  get_type() const { return type; };
160 
164  coxmatches&
165  set_matches() { return matches; };
166 
170  coxmatches const&
171  get_matches() const { return matches; };
172 
173 private:
174 
178  void
179  pack_of10(
180  uint8_t* buf, size_t buflen);
181 
185  void
186  unpack_of10(
187  uint8_t* buf, size_t buflen);
188 
189 
193  void
194  pack_of13(
195  uint8_t* buf, size_t buflen);
196 
197 
201  void
202  unpack_of13(
203  uint8_t* m,
204  size_t mlen);
205 
206 
207 public:
208 
209  friend std::ostream&
210  operator<< (std::ostream& os, cofmatch const& m) {
211  os << rofl::indent(0) << "<cofmatch ofp-version:" << (int)m.get_version() << " >" << std::endl;
212  switch (m.of_version) {
213  case rofl::openflow12::OFP_VERSION:
214  case rofl::openflow13::OFP_VERSION: {
215  os << rofl::indent(2) << "<type: " << m.type << " >" << std::endl;
216  } break;
217  }
218  rofl::indent i(2);
219  os << m.matches;
220  return os;
221  };
222 
223 
224 public:
225 
226  /*
227  * old API: to be or not to be ... deprecated (???)
228  */
229 
230  // OF10
231  uint8_t get_nw_proto() const {
232  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_PROTO).get_u8value();
233  };
234  uint8_t get_nw_tos() const {
235  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_TOS).get_u8value();
236  };
237  caddress_in4 get_nw_src() const {
238  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_SRC_MASK).get_u32masked_value_as_addr();
239  };
240  caddress_in4 get_nw_src_value() const {
241  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_SRC_MASK).get_u32value_as_addr();
242  };
243  caddress_in4 get_nw_src_mask() const {
244  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_SRC_MASK).get_u32mask_as_addr();
245  };
246  caddress_in4 get_nw_dst() const {
247  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_DST_MASK).get_u32masked_value_as_addr();
248  };
249  caddress_in4 get_nw_dst_value() const {
250  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_DST_MASK).get_u32value_as_addr();
251  };
252  caddress_in4 get_nw_dst_mask() const {
253  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_DST_MASK).get_u32mask_as_addr();
254  };
255  uint16_t get_tp_src() const {
256  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_TP_SRC).get_u16value();
257  };
258  uint16_t get_tp_dst() const {
259  return matches.get_match(rofl::openflow::experimental::OXM_TLV_EXPR_TP_DST).get_u16value();
260  };
261 
262  // OF12
263  uint32_t get_in_port() const {
264  return matches.get_match(OXM_TLV_BASIC_IN_PORT).get_u32value();
265  };
266  uint32_t get_in_phy_port() const {
267  return matches.get_match(OXM_TLV_BASIC_IN_PHY_PORT).get_u32value();
268  };
269  uint64_t get_metadata() const {
270  return matches.get_match(OXM_TLV_BASIC_METADATA).get_u64masked_value();
271  };
272  uint64_t get_metadata_value() const {
273  return matches.get_match(OXM_TLV_BASIC_METADATA).get_u64value();
274  };
275  uint64_t get_metadata_mask() const {
276  return matches.get_match(OXM_TLV_BASIC_METADATA).get_u64mask();
277  };
278  cmacaddr get_eth_dst() const {
279  return matches.get_match(OXM_TLV_BASIC_ETH_DST).get_u48masked_value();
280  };
281  cmacaddr get_eth_dst_addr() const {
282  return matches.get_match(OXM_TLV_BASIC_ETH_DST).get_u48value();
283  };
284  cmacaddr get_eth_dst_mask() const {
285  return matches.get_match(OXM_TLV_BASIC_ETH_DST).get_u48mask();
286  };
287  cmacaddr get_eth_src() const {
288  return matches.get_match(OXM_TLV_BASIC_ETH_SRC).get_u48masked_value();
289  };
290  cmacaddr get_eth_src_addr() const {
291  return matches.get_match(OXM_TLV_BASIC_ETH_SRC).get_u48value();
292  };
293  cmacaddr get_eth_src_mask() const {
294  return matches.get_match(OXM_TLV_BASIC_ETH_SRC).get_u48mask();
295  };
296  uint16_t get_eth_type() const {
297  return matches.get_match(OXM_TLV_BASIC_ETH_TYPE).get_u16value();
298  };
299  uint16_t get_vlan_vid() const {
300  return matches.get_match(OXM_TLV_BASIC_VLAN_VID).get_u16masked_value();
301  };
302  uint16_t get_vlan_vid_value() const {
303  return matches.get_match(OXM_TLV_BASIC_VLAN_VID).get_u16value();
304  };
305  uint16_t get_vlan_vid_mask() const {
306  return matches.get_match(OXM_TLV_BASIC_VLAN_VID).get_u16mask();
307  };
308  uint8_t get_vlan_pcp() const {
309  return matches.get_match(OXM_TLV_BASIC_VLAN_PCP).get_u8value();
310  };
311  uint32_t get_mpls_label() const {
312  return matches.get_match(OXM_TLV_BASIC_MPLS_LABEL).get_u32value();
313  };
314  uint8_t get_mpls_tc() const {
315  return matches.get_match(OXM_TLV_BASIC_MPLS_TC).get_u8value();
316  };
317  caddress_in4 get_ipv4_src() const {
318  return matches.get_match(OXM_TLV_BASIC_IPV4_SRC).get_u32masked_value_as_addr();
319  };
320  caddress_in4 get_ipv4_src_value() const {
321  return matches.get_match(OXM_TLV_BASIC_IPV4_SRC).get_u32value_as_addr();
322  };
323  caddress_in4 get_ipv4_src_mask() const {
324  return matches.get_match(OXM_TLV_BASIC_IPV4_SRC).get_u32mask_as_addr();
325  };
326  caddress_in4 get_ipv4_dst() const {
327  return matches.get_match(OXM_TLV_BASIC_IPV4_DST).get_u32masked_value_as_addr();
328  };
329  caddress_in4 get_ipv4_dst_value() const {
330  return matches.get_match(OXM_TLV_BASIC_IPV4_DST).get_u32value_as_addr();
331  };
332  caddress_in4 get_ipv4_dst_mask() const {
333  return matches.get_match(OXM_TLV_BASIC_IPV4_DST).get_u32mask_as_addr();
334  };
335  uint16_t get_arp_opcode() const {
336  return matches.get_match(OXM_TLV_BASIC_ARP_OP).get_u16value();
337  };
338  cmacaddr get_arp_sha() const {
339  return matches.get_match(OXM_TLV_BASIC_ARP_SHA).get_u48masked_value();
340  };
341  cmacaddr get_arp_sha_addr() const {
342  return matches.get_match(OXM_TLV_BASIC_ARP_SHA).get_u48value();
343  };
344  cmacaddr get_arp_sha_mask() const {
345  return matches.get_match(OXM_TLV_BASIC_ARP_SHA).get_u48mask();
346  };
347  cmacaddr get_arp_tha() const {
348  return matches.get_match(OXM_TLV_BASIC_ARP_THA).get_u48masked_value();
349  };
350  cmacaddr get_arp_tha_addr() const {
351  return matches.get_match(OXM_TLV_BASIC_ARP_THA).get_u48value();
352  };
353  cmacaddr get_arp_tha_mask() const {
354  return matches.get_match(OXM_TLV_BASIC_ARP_THA).get_u48mask();
355  };
356  caddress_in4 get_arp_spa() const {
357  return matches.get_match(OXM_TLV_BASIC_ARP_SPA).get_u32masked_value_as_addr();
358  };
359  caddress_in4 get_arp_spa_value() const {
360  return matches.get_match(OXM_TLV_BASIC_ARP_SPA).get_u32value_as_addr();
361  };
362  caddress_in4 get_arp_spa_mask() const {
363  return matches.get_match(OXM_TLV_BASIC_ARP_SPA).get_u32mask_as_addr();
364  };
365  caddress_in4 get_arp_tpa() const {
366  return matches.get_match(OXM_TLV_BASIC_ARP_TPA).get_u32masked_value_as_addr();
367  };
368  caddress_in4 get_arp_tpa_value() const {
369  return matches.get_match(OXM_TLV_BASIC_ARP_TPA).get_u32value_as_addr();
370  };
371  caddress_in4 get_arp_tpa_mask() const {
372  return matches.get_match(OXM_TLV_BASIC_ARP_TPA).get_u32mask_as_addr();
373  };
374  caddress_in6 get_ipv6_src() const {
375  return matches.get_match(OXM_TLV_BASIC_IPV6_SRC).get_u128masked_value();
376  };
377  caddress_in6 get_ipv6_src_value() const {
378  return matches.get_match(OXM_TLV_BASIC_IPV6_SRC).get_u128value();
379  };
380  caddress_in6 get_ipv6_src_mask() const {
381  return matches.get_match(OXM_TLV_BASIC_IPV6_SRC).get_u128mask();
382  };
383  caddress_in6 get_ipv6_dst() const {
384  return matches.get_match(OXM_TLV_BASIC_IPV6_DST).get_u128masked_value();
385  };
386  caddress_in6 get_ipv6_dst_value() const {
387  return matches.get_match(OXM_TLV_BASIC_IPV6_DST).get_u128value();
388  };
389  caddress_in6 get_ipv6_dst_mask() const {
390  return matches.get_match(OXM_TLV_BASIC_IPV6_DST).get_u128mask();
391  };
392  uint8_t get_ip_proto() const {
393  return matches.get_match(OXM_TLV_BASIC_IP_PROTO).get_u8value();
394  };
395  uint8_t get_ip_dscp() const {
396  return matches.get_match(OXM_TLV_BASIC_IP_DSCP).get_u8value();
397  };
398  uint8_t get_ip_ecn() const {
399  return matches.get_match(OXM_TLV_BASIC_IP_ECN).get_u8value();
400  };
401  uint8_t get_icmpv4_type() const {
402  return matches.get_match(OXM_TLV_BASIC_ICMPV4_TYPE).get_u8value();
403  };
404  uint8_t get_icmpv4_code() const {
405  return matches.get_match(OXM_TLV_BASIC_ICMPV4_CODE).get_u8value();
406  };
407  uint8_t get_icmpv6_type() const {
408  return matches.get_match(OXM_TLV_BASIC_ICMPV6_TYPE).get_u8value();
409  };
410  uint8_t get_icmpv6_code() const {
411  return matches.get_match(OXM_TLV_BASIC_ICMPV6_CODE).get_u8value();
412  };
413  uint32_t get_ipv6_flabel() const {
414  return matches.get_match(OXM_TLV_BASIC_IPV6_FLABEL).get_u32masked_value();
415  };
416  uint32_t get_ipv6_flabel_value() const {
417  return matches.get_match(OXM_TLV_BASIC_IPV6_FLABEL).get_u32value();
418  };
419  uint32_t get_ipv6_flabel_mask() const {
420  return matches.get_match(OXM_TLV_BASIC_IPV6_FLABEL).get_u32mask();
421  };
422  cmacaddr get_ipv6_nd_sll() const {
423  return matches.get_match(OXM_TLV_BASIC_IPV6_ND_SLL).get_u48masked_value();
424  };
425  cmacaddr get_ipv6_nd_tll() const {
426  return matches.get_match(OXM_TLV_BASIC_IPV6_ND_TLL).get_u48masked_value();
427  };
428  caddress_in6 get_ipv6_nd_target() const {
429  return matches.get_match(OXM_TLV_BASIC_IPV6_ND_TARGET).get_u128masked_value();
430  };
431  uint16_t get_udp_src() const {
432  return matches.get_match(OXM_TLV_BASIC_UDP_SRC).get_u16value();
433  };
434  uint16_t get_udp_dst() const {
435  return matches.get_match(OXM_TLV_BASIC_UDP_DST).get_u16value();
436  };
437  uint16_t get_tcp_src() const {
438  return matches.get_match(OXM_TLV_BASIC_TCP_SRC).get_u16value();
439  };
440  uint16_t get_tcp_dst() const {
441  return matches.get_match(OXM_TLV_BASIC_TCP_DST).get_u16value();
442  };
443  uint16_t get_sctp_src() const {
444  return matches.get_match(OXM_TLV_BASIC_SCTP_SRC).get_u16value();
445  };
446  uint16_t get_sctp_dst() const {
447  return matches.get_match(OXM_TLV_BASIC_SCTP_DST).get_u16value();
448  };
449 
450  // OF13
451  bool get_mpls_bos() const {
452  return matches.get_match(OXM_TLV_BASIC_MPLS_BOS).get_u8value();
453  };
454  uint64_t get_tunnel_id() const {
455  return matches.get_match(OXM_TLV_BASIC_TUNNEL_ID).get_u64masked_value();
456  };
457  uint64_t get_tunnel_id_value() const {
458  return matches.get_match(OXM_TLV_BASIC_TUNNEL_ID).get_u64value();
459  };
460  uint64_t get_tunnel_id_mask() const {
461  return matches.get_match(OXM_TLV_BASIC_TUNNEL_ID).get_u64mask();
462  };
463  uint32_t get_pbb_isid() const {
464  return matches.get_match(OXM_TLV_BASIC_PBB_ISID).get_u32masked_value();
465  };
466  uint32_t get_pbb_isid_value() const {
467  return matches.get_match(OXM_TLV_BASIC_PBB_ISID).get_u32value();
468  };
469  uint32_t get_pbb_isid_mask() const {
470  return matches.get_match(OXM_TLV_BASIC_PBB_ISID).get_u32mask();
471  };
472  uint16_t get_ipv6_exthdr() const {
473  return matches.get_match(OXM_TLV_BASIC_IPV6_EXTHDR).get_u16masked_value();
474  };
475  uint16_t get_ipv6_exthdr_value() const {
476  return matches.get_match(OXM_TLV_BASIC_IPV6_EXTHDR).get_u16value();
477  };
478  uint16_t get_ipv6_exthdr_mask() const {
479  return matches.get_match(OXM_TLV_BASIC_IPV6_EXTHDR).get_u16mask();
480  };
481 
482  // OF10
483  void set_nw_proto(uint8_t proto) {
484  matches.add_match(coxmatch_ofx_nw_proto(proto));
485  };
486  void set_nw_tos(uint8_t tos) {
487  matches.add_match(coxmatch_ofx_nw_tos(tos));
488  };
489  void set_nw_src(caddress_in4 const& src) {
490  matches.add_match(coxmatch_ofx_nw_src(src));
491  };
492  void set_nw_src(caddress_in4 const& src, caddress_in4 const& mask) {
493  matches.add_match(coxmatch_ofx_nw_src(src, mask));
494  };
495  void set_nw_dst(caddress_in4 const& dst) {
496  matches.add_match(coxmatch_ofx_nw_dst(dst));
497  };
498  void set_nw_dst(caddress_in4 const& dst, caddress_in4 const& mask) {
499  matches.add_match(coxmatch_ofx_nw_dst(dst, mask));
500  };
501  void set_tp_src(uint16_t src_port) {
502  matches.add_match(coxmatch_ofx_tp_src(src_port));
503  };
504  void set_tp_dst(uint16_t dst_port) {
505  matches.add_match(coxmatch_ofx_tp_dst(dst_port));
506  };
507 
508  // OF12
509  void set_in_port(uint32_t in_port) {
510  matches.add_match(coxmatch_ofb_in_port(in_port));
511  };
512  void set_in_phy_port(uint32_t in_phy_port) {
513  matches.add_match(coxmatch_ofb_in_phy_port(in_phy_port));
514  };
515  void set_metadata(uint64_t metadata) {
516  matches.add_match(coxmatch_ofb_metadata(metadata));
517  };
518  void set_metadata(uint64_t metadata, uint64_t mask) {
519  matches.add_match(coxmatch_ofb_metadata(metadata, mask));
520  };
521  void set_eth_dst(cmacaddr const& maddr) {
522  matches.add_match(coxmatch_ofb_eth_dst(maddr));
523  };
524  void set_eth_dst(cmacaddr const& maddr, cmacaddr const& mmask) {
525  matches.add_match(coxmatch_ofb_eth_dst(maddr, mmask));
526  };
527  void set_eth_src(cmacaddr const& maddr) {
528  matches.add_match(coxmatch_ofb_eth_src(maddr));
529  };
530  void set_eth_src(cmacaddr const& maddr, cmacaddr const& mmask) {
531  matches.add_match(coxmatch_ofb_eth_src(maddr, mmask));
532  };
533  void set_eth_type( uint16_t dl_type) {
534  matches.add_match(coxmatch_ofb_eth_type(dl_type));
535  };
536  void set_vlan_vid(uint16_t vid) {
537  matches.add_match(coxmatch_ofb_vlan_vid(vid));
538  };
539  void set_vlan_vid(uint16_t vid, uint16_t mask) {
540  matches.add_match(coxmatch_ofb_vlan_vid(vid, mask));
541  };
542  void set_vlan_present() {
543  matches.add_match(coxmatch_ofb_vlan_present());
544  };
545  void set_vlan_untagged() {
546  matches.add_match(coxmatch_ofb_vlan_untagged());
547  };
548  void set_vlan_pcp(uint8_t pcp) {
549  matches.add_match(coxmatch_ofb_vlan_pcp(pcp));
550  };
551  void set_ip_dscp(uint8_t dscp) {
552  matches.add_match(coxmatch_ofb_ip_dscp(dscp));
553  };
554  void set_ip_ecn(uint8_t ecn) {
555  matches.add_match(coxmatch_ofb_ip_ecn(ecn));
556  };
557  void set_ip_proto(uint8_t proto) {
558  matches.add_match(coxmatch_ofb_ip_proto(proto));
559  };
560  void set_ipv4_src(caddress_in4 const& src) {
561  matches.add_match(coxmatch_ofb_ipv4_src(src));
562  };
563  void set_ipv4_src(caddress_in4 const& src, caddress_in4 const& mask) {
564  matches.add_match(coxmatch_ofb_ipv4_src(src, mask));
565  };
566  void set_ipv4_dst(caddress_in4 const& dst) {
567  matches.add_match(coxmatch_ofb_ipv4_dst(dst));
568  };
569  void set_ipv4_dst(caddress_in4 const& dst, caddress_in4 const& mask) {
570  matches.add_match(coxmatch_ofb_ipv4_dst(dst, mask));
571  };
572  void set_tcp_src(uint16_t src_port) {
573  matches.add_match(coxmatch_ofb_tcp_src(src_port));
574  };
575  void set_tcp_dst(uint16_t dst_port) {
576  matches.add_match(coxmatch_ofb_tcp_dst(dst_port));
577  };
578  void set_udp_src(uint16_t src_port) {
579  matches.add_match(coxmatch_ofb_udp_src(src_port));
580  };
581  void set_udp_dst(uint16_t dst_port) {
582  matches.add_match(coxmatch_ofb_udp_dst(dst_port));
583  };
584  void set_sctp_src(uint16_t src_port) {
585  matches.add_match(coxmatch_ofb_sctp_src(src_port));
586  };
587  void set_sctp_dst(uint16_t dst_port) {
588  matches.add_match(coxmatch_ofb_sctp_dst(dst_port));
589  };
590  void set_icmpv4_type(uint8_t type) {
591  matches.add_match(coxmatch_ofb_icmpv4_type(type));
592  };
593  void set_icmpv4_code(uint8_t code) {
594  matches.add_match(coxmatch_ofb_icmpv4_code(code));
595  };
596  void set_arp_opcode(uint16_t opcode) {
597  matches.add_match(coxmatch_ofb_arp_opcode(opcode));
598  };
599  void set_arp_spa(caddress_in4 const& spa) {
600  matches.add_match(coxmatch_ofb_arp_spa(spa));
601  };
602  void set_arp_spa(caddress_in4 const& spa, caddress_in4 const& mask) {
603  matches.add_match(coxmatch_ofb_arp_spa(spa, mask));
604  };
605  void set_arp_tpa(caddress_in4 const& tpa) {
606  matches.add_match(coxmatch_ofb_arp_tpa(tpa));
607  };
608  void set_arp_tpa(caddress_in4 const& tpa, caddress_in4 const& mask) {
609  matches.add_match(coxmatch_ofb_arp_tpa(tpa, mask));
610  };
611  void set_arp_sha(cmacaddr const& sha) {
612  matches.add_match(coxmatch_ofb_arp_sha(sha));
613  };
614  void set_arp_sha(cmacaddr const& sha, cmacaddr const& mmask) {
615  matches.add_match(coxmatch_ofb_arp_sha(sha, mmask));
616  };
617  void set_arp_tha(cmacaddr const& tha) {
618  matches.add_match(coxmatch_ofb_arp_tha(tha));
619  };
620  void set_arp_tha(cmacaddr const& tha, cmacaddr const& mmask) {
621  matches.add_match(coxmatch_ofb_arp_tha(tha, mmask));
622  };
623  void set_ipv6_src(caddress_in6 const& addr) {
624  matches.add_match(coxmatch_ofb_ipv6_src(addr));
625  };
626  void set_ipv6_src(caddress_in6 const& addr, caddress_in6 const& mask) {
627  matches.add_match(coxmatch_ofb_ipv6_src(addr, mask));
628  };
629  void set_ipv6_dst(caddress_in6 const& addr) {
630  matches.add_match(coxmatch_ofb_ipv6_dst(addr));
631  };
632  void set_ipv6_dst(caddress_in6 const& addr, caddress_in6 const& mask) {
633  matches.add_match(coxmatch_ofb_ipv6_dst(addr, mask));
634  };
635  void set_ipv6_flabel(uint32_t flabel) {
636  matches.add_match(coxmatch_ofb_ipv6_flabel(flabel));
637  };
638  void set_ipv6_flabel(uint32_t flabel, uint32_t mask) {
639  matches.add_match(coxmatch_ofb_ipv6_flabel(flabel, mask));
640  };
641  void set_icmpv6_type(uint8_t type) {
642  matches.add_match(coxmatch_ofb_icmpv6_type(type));
643  };
644  void set_icmpv6_code(uint8_t code) {
645  matches.add_match(coxmatch_ofb_icmpv6_code(code));
646  };
647  void set_ipv6_nd_target(caddress_in6 const& addr) {
648  matches.add_match(coxmatch_ofb_ipv6_nd_target(addr));
649  };
650  void set_ipv6_nd_sll(cmacaddr const& maddr) {
651  matches.add_match(coxmatch_ofb_ipv6_nd_sll(maddr));
652  };
653  void set_ipv6_nd_tll(cmacaddr const& maddr) {
654  matches.add_match(coxmatch_ofb_ipv6_nd_tll(maddr));
655  };
656  void set_mpls_label(uint32_t label) {
657  matches.add_match(coxmatch_ofb_mpls_label(label));
658  };
659  void set_mpls_tc(uint8_t tc) {
660  matches.add_match(coxmatch_ofb_mpls_tc(tc));
661  };
662 
663  // OF13
664  void set_mpls_bos(bool bos) {
665  matches.add_match(coxmatch_ofb_mpls_bos(bos));
666  };
667  void set_tunnel_id(uint64_t tunnel_id) {
668  matches.add_match(coxmatch_ofb_tunnel_id(tunnel_id));
669  };
670  void set_tunnel_id(uint64_t tunnel_id, uint64_t mask) {
671  matches.add_match(coxmatch_ofb_tunnel_id(tunnel_id, mask));
672  };
673  void set_pbb_isid(uint32_t pbb_isid) {
674  matches.add_match(coxmatch_ofb_pbb_isid(pbb_isid));
675  };
676  void set_pbb_isid(uint32_t pbb_isid, uint32_t mask) {
677  matches.add_match(coxmatch_ofb_pbb_isid(pbb_isid, mask));
678  };
679  void set_ipv6_exthdr(uint16_t ipv6_exthdr) {
680  matches.add_match(coxmatch_ofb_ipv6_exthdr(ipv6_exthdr));
681  };
682  void set_ipv6_exthdr(uint16_t ipv6_exthdr, uint16_t mask) {
683  matches.add_match(coxmatch_ofb_ipv6_exthdr(ipv6_exthdr, mask));
684  };
685 
686 public:
687 
688  /*
689  * old API: to be or not to be ... deprecated (???)
690  */
691 
692  // OF10
693  bool has_nw_proto() const {
694  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_PROTO);
695  };
696  bool has_nw_tos() const {
697  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_TOS);
698  };
699  bool has_nw_src() const {
700  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_SRC_MASK);
701  };
702  bool has_nw_src_value() const {
703  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_SRC_MASK);
704  };
705  bool has_nw_src_mask() const {
706  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_SRC_MASK);
707  };
708  bool has_nw_dst() const {
709  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_DST_MASK);
710  };
711  bool has_nw_dst_value() const {
712  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_DST_MASK);
713  };
714  bool has_nw_dst_mask() const {
715  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_NW_DST_MASK);
716  };
717  bool has_tp_src() const {
718  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_TP_SRC);
719  };
720  bool has_tp_dst() const {
721  return matches.has_match(rofl::openflow::experimental::OXM_TLV_EXPR_TP_DST);
722  };
723 
724  // OF12
725  bool has_in_port() const {
726  return matches.has_match(OXM_TLV_BASIC_IN_PORT);
727  };
728  bool has_in_phy_port() const {
729  return matches.has_match(OXM_TLV_BASIC_IN_PHY_PORT);
730  };
731  bool has_metadata() const {
732  return matches.has_match(OXM_TLV_BASIC_METADATA);
733  };
734  bool has_metadata_value() const {
735  return matches.has_match(OXM_TLV_BASIC_METADATA);
736  };
737  bool has_metadata_mask() const {
738  return matches.has_match(OXM_TLV_BASIC_METADATA);
739  };
740  bool has_eth_dst() const {
741  return matches.has_match(OXM_TLV_BASIC_ETH_DST);
742  };
743  bool has_eth_dst_addr() const {
744  return matches.has_match(OXM_TLV_BASIC_ETH_DST);
745  };
746  bool has_eth_dst_mask() const {
747  return matches.has_match(OXM_TLV_BASIC_ETH_DST);
748  };
749  bool has_eth_src() const {
750  return matches.has_match(OXM_TLV_BASIC_ETH_SRC);
751  };
752  bool has_eth_src_addr() const {
753  return matches.has_match(OXM_TLV_BASIC_ETH_SRC);
754  };
755  bool has_eth_src_mask() const {
756  return matches.has_match(OXM_TLV_BASIC_ETH_SRC);
757  };
758  bool has_eth_type() const {
759  return matches.has_match(OXM_TLV_BASIC_ETH_TYPE);
760  };
761  bool has_vlan_vid() const {
762  return matches.has_match(OXM_TLV_BASIC_VLAN_VID);
763  };
764  bool has_vlan_vid_value() const {
765  return matches.has_match(OXM_TLV_BASIC_VLAN_VID);
766  };
767  bool has_vlan_vid_mask() const {
768  return matches.has_match(OXM_TLV_BASIC_VLAN_VID);
769  };
770  bool has_vlan_pcp() const {
771  return matches.has_match(OXM_TLV_BASIC_VLAN_PCP);
772  };
773  bool has_mpls_label() const {
774  return matches.has_match(OXM_TLV_BASIC_MPLS_LABEL);
775  };
776  bool has_mpls_tc() const {
777  return matches.has_match(OXM_TLV_BASIC_MPLS_TC);
778  };
779  bool has_ipv4_src() const {
780  return matches.has_match(OXM_TLV_BASIC_IPV4_SRC);
781  };
782  bool has_ipv4_src_value() const {
783  return matches.has_match(OXM_TLV_BASIC_IPV4_SRC);
784  };
785  bool has_ipv4_src_mask() const {
786  return matches.has_match(OXM_TLV_BASIC_IPV4_SRC);
787  };
788  bool has_ipv4_dst() const {
789  return matches.has_match(OXM_TLV_BASIC_IPV4_DST);
790  };
791  bool has_ipv4_dst_value() const {
792  return matches.has_match(OXM_TLV_BASIC_IPV4_DST);
793  };
794  bool has_ipv4_dst_mask() const {
795  return matches.has_match(OXM_TLV_BASIC_IPV4_DST);
796  };
797  bool has_arp_opcode() const {
798  return matches.has_match(OXM_TLV_BASIC_ARP_OP);
799  };
800  bool has_arp_sha() const {
801  return matches.has_match(OXM_TLV_BASIC_ARP_SHA);
802  };
803  bool has_arp_sha_addr() const {
804  return matches.has_match(OXM_TLV_BASIC_ARP_SHA);
805  };
806  bool has_arp_sha_mask() const {
807  return matches.has_match(OXM_TLV_BASIC_ARP_SHA);
808  };
809  bool has_arp_tha() const {
810  return matches.has_match(OXM_TLV_BASIC_ARP_THA);
811  };
812  bool has_arp_tha_addr() const {
813  return matches.has_match(OXM_TLV_BASIC_ARP_THA);
814  };
815  bool has_arp_tha_mask() const {
816  return matches.has_match(OXM_TLV_BASIC_ARP_THA);
817  };
818  bool has_arp_spa() const {
819  return matches.has_match(OXM_TLV_BASIC_ARP_SPA);
820  };
821  bool has_arp_spa_value() const {
822  return matches.has_match(OXM_TLV_BASIC_ARP_SPA);
823  };
824  bool has_arp_spa_mask() const {
825  return matches.has_match(OXM_TLV_BASIC_ARP_SPA);
826  };
827  bool has_arp_tpa() const {
828  return matches.has_match(OXM_TLV_BASIC_ARP_TPA);
829  };
830  bool has_arp_tpa_value() const {
831  return matches.has_match(OXM_TLV_BASIC_ARP_TPA);
832  };
833  bool has_arp_tpa_mask() const {
834  return matches.has_match(OXM_TLV_BASIC_ARP_TPA);
835  };
836  bool has_ipv6_src() const {
837  return matches.has_match(OXM_TLV_BASIC_IPV6_SRC);
838  };
839  bool has_ipv6_src_value() const {
840  return matches.has_match(OXM_TLV_BASIC_IPV6_SRC);
841  };
842  bool has_ipv6_src_mask() const {
843  return matches.has_match(OXM_TLV_BASIC_IPV6_SRC);
844  };
845  bool has_ipv6_dst() const {
846  return matches.has_match(OXM_TLV_BASIC_IPV6_DST);
847  };
848  bool has_ipv6_dst_value() const {
849  return matches.has_match(OXM_TLV_BASIC_IPV6_DST);
850  };
851  bool has_ipv6_dst_mask() const {
852  return matches.has_match(OXM_TLV_BASIC_IPV6_DST);
853  };
854  bool has_ip_proto() const {
855  return matches.has_match(OXM_TLV_BASIC_IP_PROTO);
856  };
857  bool has_ip_dscp() const {
858  return matches.has_match(OXM_TLV_BASIC_IP_DSCP);
859  };
860  bool has_ip_ecn() const {
861  return matches.has_match(OXM_TLV_BASIC_IP_ECN);
862  };
863  bool has_icmpv4_type() const {
864  return matches.has_match(OXM_TLV_BASIC_ICMPV4_TYPE);
865  };
866  bool has_icmpv4_code() const {
867  return matches.has_match(OXM_TLV_BASIC_ICMPV4_CODE);
868  };
869  bool has_icmpv6_type() const {
870  return matches.has_match(OXM_TLV_BASIC_ICMPV6_TYPE);
871  };
872  bool has_icmpv6_code() const {
873  return matches.has_match(OXM_TLV_BASIC_ICMPV6_CODE);
874  };
875  bool has_ipv6_flabel() const {
876  return matches.has_match(OXM_TLV_BASIC_IPV6_FLABEL);
877  };
878  bool has_ipv6_flabel_value() const {
879  return matches.has_match(OXM_TLV_BASIC_IPV6_FLABEL);
880  };
881  bool has_ipv6_flabel_mask() const {
882  return matches.has_match(OXM_TLV_BASIC_IPV6_FLABEL);
883  };
884  bool has_ipv6_nd_sll() const {
885  return matches.has_match(OXM_TLV_BASIC_IPV6_ND_SLL);
886  };
887  bool has_ipv6_nd_tll() const {
888  return matches.has_match(OXM_TLV_BASIC_IPV6_ND_TLL);
889  };
890  bool has_ipv6_nd_target() const {
891  return matches.has_match(OXM_TLV_BASIC_IPV6_ND_TARGET);
892  };
893  bool has_udp_src() const {
894  return matches.has_match(OXM_TLV_BASIC_UDP_SRC);
895  };
896  bool has_udp_dst() const {
897  return matches.has_match(OXM_TLV_BASIC_UDP_DST);
898  };
899  bool has_tcp_src() const {
900  return matches.has_match(OXM_TLV_BASIC_TCP_SRC);
901  };
902  bool has_tcp_dst() const {
903  return matches.has_match(OXM_TLV_BASIC_TCP_DST);
904  };
905  bool has_sctp_src() const {
906  return matches.has_match(OXM_TLV_BASIC_SCTP_SRC);
907  };
908  bool has_sctp_dst() const {
909  return matches.has_match(OXM_TLV_BASIC_SCTP_DST);
910  };
911 
912  // OF13
913  bool has_mpls_bos() const {
914  return matches.has_match(OXM_TLV_BASIC_MPLS_BOS);
915  };
916  bool has_tunnel_id() const {
917  return matches.has_match(OXM_TLV_BASIC_TUNNEL_ID);
918  };
919  bool has_tunnel_id_value() const {
920  return matches.has_match(OXM_TLV_BASIC_TUNNEL_ID);
921  };
922  bool has_tunnel_id_mask() const {
923  return matches.has_match(OXM_TLV_BASIC_TUNNEL_ID);
924  };
925  bool has_pbb_isid() const {
926  return matches.has_match(OXM_TLV_BASIC_PBB_ISID);
927  };
928  bool has_pbb_isid_value() const {
929  return matches.has_match(OXM_TLV_BASIC_PBB_ISID);
930  };
931  bool has_pbb_isid_mask() const {
932  return matches.has_match(OXM_TLV_BASIC_PBB_ISID);
933  };
934  bool has_ipv6_exthdr() const {
935  return matches.has_match(OXM_TLV_BASIC_IPV6_EXTHDR);
936  };
937  bool has_ipv6_exthdr_value() const {
938  return matches.has_match(OXM_TLV_BASIC_IPV6_EXTHDR);
939  };
940  bool has_ipv6_exthdr_mask() const {
941  return matches.has_match(OXM_TLV_BASIC_IPV6_EXTHDR);
942  };
943 };
944 
945 }; // end of namespace openflow
946 }; // end of namespace rofl
947 
948 #endif
Definition: coxmatch.h:684
Definition: coxmatch.h:640
Definition: coxmatch.h:1200
Definition: caddress.h:152
Definition: coxmatch.h:548
Definition: cofmatch.h:29
Definition: coxmatch.h:1328
Definition: caddress.h:589
Definition: coxmatch.h:1048
Definition: coxmatch.h:1024
Definition: cofmatch.h:30
Definition: coxmatch.h:526
Definition: coxmatch.h:442
Definition: coxmatch.h:1510
Definition: coxmatch.h:662
Definition: coxmatch.h:618
Definition: coxmatch.h:880
Definition: coxmatch.h:1303
Definition: coxmatch.h:803
Definition: coxmatch.h:1461
Definition: coxmatch.h:976
Definition: cofmatch.h:35
Definition: coxmatch.h:499
Definition: coxmatch.h:740
Definition: coxmatch.h:1565
Definition: coxmatch.h:1253
Definition: cofmatch.h:31
Definition: coxmatch.h:1000
Definition: coxmatch.h:1142
Definition: coxmatch.h:1171
Definition: coxmatch.h:928
Definition: caddress.h:415
Definition: cofmatch.h:32
Definition: coxmatch.h:904
Definition: coxmatch.h:1278
Definition: coxmatch.h:1624
Definition: coxmatch.h:471
Definition: coxmatches.h:47
Definition: coxmatch.h:1401
Definition: coxmatch.h:952
Definition: coxmatch.h:1432
Definition: coxmatch.h:1376
Definition: coxmatch.h:1600
Definition: logging.h:76
Definition: cofmatch.h:28
Definition: coxmatch.h:774
Definition: coxmatch.h:1352
Definition: coxmatch.h:1531
Definition: coxmatch.h:1229
Definition: coxmatch.h:1488
Definition: coxmatch.h:706
Definition: coxmatch.h:398
Definition: croflexception.h:27
Definition: coxmatch.h:1108
Definition: coxmatch.h:856
Definition: coxmatch.h:1073