4 #include "../../../common/datapacket.h"
5 #include "../../../common/protocol_constants.h"
6 #include "../../../platform/memory.h"
7 #include "../../../platform/likely.h"
8 #include "../../../util/logging.h"
14 #define OF1X_MIN_VERSION OF_VERSION_10
15 #define OF1X_MAX_VERSION OF_VERSION_13
21 if(unlikely(match == NULL))
24 match->type = OF1X_MATCH_IN_PORT;
25 match->__tern = __init_utern32(value,OF1X_4_BYTE_MASK);
28 match->ver_req.min_ver = OF_VERSION_10;
29 match->ver_req.max_ver = OF1X_MAX_VERSION;
30 match->has_wildcard =
false;
33 match->prev=match->next=NULL;
41 if(unlikely(match == NULL))
44 match->type = OF1X_MATCH_IN_PHY_PORT;
45 match->__tern = __init_utern32(value,OF1X_4_BYTE_MASK);
48 match->ver_req.min_ver = OF_VERSION_12;
49 match->ver_req.max_ver = OF1X_MAX_VERSION;
50 match->has_wildcard =
false;
53 match->prev=match->next=NULL;
62 if(unlikely(match == NULL))
65 match->type = OF1X_MATCH_METADATA;
66 match->__tern = __init_utern64(value, mask);
69 match->ver_req.min_ver = OF_VERSION_12;
70 match->ver_req.max_ver = OF1X_MAX_VERSION;
71 if( (mask&OF1X_8_BYTE_MASK) != OF1X_8_BYTE_MASK)
72 match->has_wildcard =
true;
74 match->has_wildcard =
false;
77 match->prev=match->next=NULL;
86 if(unlikely(match == NULL))
93 match->type = OF1X_MATCH_ETH_DST;
94 match->__tern = __init_utern64(value&OF1X_48_BITS_MASK, mask&OF1X_48_BITS_MASK);
98 match->ver_req.min_ver = OF_VERSION_10;
99 match->ver_req.max_ver = OF1X_MAX_VERSION;
100 if( (mask&OF1X_48_BITS_MASK) != OF1X_48_BITS_MASK)
101 match->has_wildcard =
true;
103 match->has_wildcard =
false;
106 match->prev=match->next=NULL;
113 if(unlikely(match == NULL))
120 match->type = OF1X_MATCH_ETH_SRC;
121 match->__tern = __init_utern64(value&OF1X_48_BITS_MASK, mask&OF1X_48_BITS_MASK);
124 match->ver_req.min_ver = OF_VERSION_10;
125 match->ver_req.max_ver = OF1X_MAX_VERSION;
126 if( (mask&OF1X_48_BITS_MASK) != OF1X_48_BITS_MASK )
127 match->has_wildcard =
true;
129 match->has_wildcard =
false;
132 match->prev=match->next=NULL;
139 if(unlikely(match == NULL))
142 value = HTONB16(value);
144 match->type = OF1X_MATCH_ETH_TYPE;
145 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
148 match->ver_req.min_ver = OF_VERSION_10;
149 match->ver_req.max_ver = OF1X_MAX_VERSION;
150 match->has_wildcard =
false;
153 match->prev=match->next=NULL;
162 if(unlikely(match == NULL))
166 value = HTONB16(value);
167 mask = HTONB16(mask);
169 match->type = OF1X_MATCH_VLAN_VID;
172 match->__tern = __init_utern16(value&OF1X_VLAN_ID_MASK,mask&OF1X_VLAN_ID_MASK);
173 match->vlan_present = vlan_present;
176 match->ver_req.min_ver = OF_VERSION_10;
177 match->ver_req.max_ver = OF1X_MAX_VERSION;
178 if( (mask&OF1X_VLAN_ID_MASK) != OF1X_VLAN_ID_MASK)
179 match->has_wildcard =
true;
181 match->has_wildcard =
false;
184 match->prev=match->next=NULL;
191 if(unlikely(match == NULL))
195 value = OF1X_VLAN_PCP_ALIGN(value);
197 match->type = OF1X_MATCH_VLAN_PCP;
198 match->__tern = __init_utern8(value&OF1X_3MSBITS_MASK,OF1X_3MSBITS_MASK);
201 match->ver_req.min_ver = OF_VERSION_10;
202 match->ver_req.max_ver = OF1X_MAX_VERSION;
203 match->has_wildcard =
false;
206 match->prev=match->next=NULL;
215 if(unlikely(match == NULL))
219 value = HTONB32(OF1X_MPLS_LABEL_ALIGN(value));
221 match->type = OF1X_MATCH_MPLS_LABEL;
222 match->__tern = __init_utern32(value&OF1X_20_BITS_MASK,OF1X_20_BITS_MASK);
225 match->ver_req.min_ver = OF_VERSION_12;
226 match->ver_req.max_ver = OF1X_MAX_VERSION;
227 match->has_wildcard =
false;
230 match->prev=match->next=NULL;
237 if(unlikely(match == NULL))
241 value = OF1X_MPLS_TC_ALIGN(value);
243 match->type = OF1X_MATCH_MPLS_TC;
244 match->__tern = __init_utern8(value&OF1X_BITS_12AND3_MASK,OF1X_BITS_12AND3_MASK);
247 match->ver_req.min_ver = OF_VERSION_12;
248 match->ver_req.max_ver = OF1X_MAX_VERSION;
249 match->has_wildcard =
false;
252 match->prev=match->next=NULL;
259 if(unlikely(match == NULL))
262 match->type = OF1X_MATCH_MPLS_BOS;
263 match->__tern = __init_utern8(value&OF1X_BIT0_MASK,OF1X_BIT0_MASK);
266 match->ver_req.min_ver = OF_VERSION_13;
267 match->ver_req.max_ver = OF1X_MAX_VERSION;
268 match->has_wildcard =
false;
271 match->prev=match->next=NULL;
280 if(unlikely(match == NULL))
284 value = HTONB16(value);
286 match->type = OF1X_MATCH_ARP_OP;
287 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
290 match->ver_req.min_ver = OF_VERSION_10;
291 match->ver_req.max_ver = OF1X_MAX_VERSION;
292 match->has_wildcard =
false;
295 match->prev=match->next=NULL;
302 if(unlikely(match == NULL))
309 match->type = OF1X_MATCH_ARP_THA;
310 match->__tern = __init_utern64(value&OF1X_48_BITS_MASK, mask&OF1X_48_BITS_MASK);
314 match->ver_req.min_ver = OF_VERSION_12;
315 match->ver_req.max_ver = OF1X_MAX_VERSION;
316 if( (mask&OF1X_48_BITS_MASK) != OF1X_48_BITS_MASK)
317 match->has_wildcard =
true;
319 match->has_wildcard =
false;
322 match->prev=match->next=NULL;
329 if(unlikely(match == NULL))
336 match->type = OF1X_MATCH_ARP_SHA;
337 match->__tern = __init_utern64(value&OF1X_48_BITS_MASK, mask&OF1X_48_BITS_MASK);
340 match->ver_req.min_ver = OF_VERSION_12;
341 match->ver_req.max_ver = OF1X_MAX_VERSION;
342 if( (mask&OF1X_48_BITS_MASK) != OF1X_48_BITS_MASK)
343 match->has_wildcard =
true;
345 match->has_wildcard =
false;
348 match->prev=match->next=NULL;
355 if(unlikely(match == NULL))
359 value = HTONB32(value);
360 mask = HTONB32(mask);
362 match->type = OF1X_MATCH_ARP_TPA;
363 match->__tern = __init_utern32(value,mask);
366 match->ver_req.min_ver = OF_VERSION_10;
367 match->ver_req.max_ver = OF1X_MAX_VERSION;
368 if( mask != OF1X_4_BYTE_MASK )
369 match->has_wildcard =
true;
371 match->has_wildcard =
false;
374 match->prev=match->next=NULL;
381 if(unlikely(match == NULL))
385 value = HTONB32(value);
386 mask = HTONB32(mask);
388 match->type = OF1X_MATCH_ARP_SPA;
389 match->__tern = __init_utern32(value,mask);
392 match->ver_req.min_ver = OF_VERSION_10;
393 match->ver_req.max_ver = OF1X_MAX_VERSION;
394 if( mask != OF1X_4_BYTE_MASK )
395 match->has_wildcard =
true;
397 match->has_wildcard =
false;
400 match->prev=match->next=NULL;
409 if(unlikely(match == NULL))
412 match->type = OF1X_MATCH_NW_PROTO;
413 match->__tern = __init_utern8(value,OF1X_1_BYTE_MASK);
416 match->ver_req.min_ver = OF_VERSION_10;
417 match->ver_req.max_ver = OF_VERSION_10;
418 match->has_wildcard =
false;
421 match->prev=match->next=NULL;
428 if(unlikely(match == NULL))
432 value = HTONB32(value);
433 mask = HTONB32(mask);
435 match->type = OF1X_MATCH_NW_SRC;
436 match->__tern = __init_utern32(value,mask);
439 match->ver_req.min_ver = OF_VERSION_10;
440 match->ver_req.max_ver = OF_VERSION_10;
441 if( (mask&OF1X_4_BYTE_MASK) != OF1X_4_BYTE_MASK)
442 match->has_wildcard =
true;
444 match->has_wildcard =
false;
447 match->prev=match->next=NULL;
454 if(unlikely(match == NULL))
458 value = HTONB32(value);
459 mask = HTONB32(mask);
461 match->type = OF1X_MATCH_NW_DST;
462 match->__tern = __init_utern32(value,mask);
465 match->ver_req.min_ver = OF_VERSION_10;
466 match->ver_req.max_ver = OF_VERSION_10;
467 if( (mask&OF1X_4_BYTE_MASK) != OF1X_4_BYTE_MASK)
468 match->has_wildcard =
true;
470 match->has_wildcard =
false;
473 match->prev=match->next=NULL;
482 if(unlikely(match == NULL))
486 value = HTONB32(value);
487 mask = HTONB32(mask);
489 match->type = OF1X_MATCH_IPV4_SRC;
490 match->__tern = __init_utern32(value,mask);
493 match->ver_req.min_ver = OF_VERSION_10;
494 match->ver_req.max_ver = OF1X_MAX_VERSION;
495 if( (mask&OF1X_4_BYTE_MASK) != OF1X_4_BYTE_MASK)
496 match->has_wildcard =
true;
498 match->has_wildcard =
false;
501 match->prev=match->next=NULL;
508 if(unlikely(match == NULL))
512 value = HTONB32(value);
513 mask = HTONB32(mask);
515 match->type = OF1X_MATCH_IPV4_DST;
516 match->__tern = __init_utern32(value,mask);
519 match->ver_req.min_ver = OF_VERSION_10;
520 match->ver_req.max_ver = OF1X_MAX_VERSION;
521 if( (mask&OF1X_4_BYTE_MASK) != OF1X_4_BYTE_MASK)
522 match->has_wildcard =
true;
524 match->has_wildcard =
false;
527 match->prev=match->next=NULL;
534 if(unlikely(match == NULL))
537 match->type = OF1X_MATCH_IP_PROTO;
538 match->__tern = __init_utern8(value,OF1X_1_BYTE_MASK);
541 match->ver_req.min_ver = OF_VERSION_10;
542 match->ver_req.max_ver = OF1X_MAX_VERSION;
543 match->has_wildcard =
false;
546 match->prev=match->next=NULL;
553 if(unlikely(match == NULL))
557 value = OF1X_IP_DSCP_ALIGN(value);
559 match->type = OF1X_MATCH_IP_DSCP;
560 match->__tern = __init_utern8(value&OF1X_6MSBITS_MASK,OF1X_6MSBITS_MASK);
563 match->ver_req.min_ver = OF_VERSION_10;
564 match->ver_req.max_ver = OF1X_MAX_VERSION;
565 match->has_wildcard =
false;
568 match->prev=match->next=NULL;
576 if(unlikely(match == NULL))
579 match->type = OF1X_MATCH_IP_ECN;
580 match->__tern = __init_utern8(value&OF1X_2LSBITS_MASK,OF1X_2LSBITS_MASK);
583 match->ver_req.min_ver = OF_VERSION_12;
584 match->ver_req.max_ver = OF1X_MAX_VERSION;
585 match->has_wildcard =
false;
588 match->prev=match->next=NULL;
597 if(unlikely(match == NULL))
604 uint128__t fixed_mask = {{0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff}};
605 match->type = OF1X_MATCH_IPV6_SRC;
606 match->__tern = __init_utern128(value,mask);
609 match->ver_req.min_ver = OF_VERSION_12;
610 match->ver_req.max_ver = OF1X_MAX_VERSION;
611 if(memcmp(&fixed_mask,&mask,
sizeof(mask)) != 0)
612 match->has_wildcard =
true;
614 match->has_wildcard =
false;
617 match->prev=match->next=NULL;
624 if(unlikely(match == NULL))
631 uint128__t fixed_mask = {{0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff}};
632 match->type = OF1X_MATCH_IPV6_DST;
633 match->__tern = __init_utern128(value,mask);
636 match->ver_req.min_ver = OF_VERSION_12;
637 match->ver_req.max_ver = OF1X_MAX_VERSION;
638 if(memcmp(&fixed_mask,&mask,
sizeof(mask)) != 0)
639 match->has_wildcard =
true;
641 match->has_wildcard =
false;
644 match->prev=match->next=NULL;
651 if(unlikely(match == NULL))
655 value = HTONB32(OF1X_IP6_FLABEL_ALIGN(value));
656 mask = HTONB32(OF1X_IP6_FLABEL_ALIGN(mask));
658 match->type = OF1X_MATCH_IPV6_FLABEL;
659 match->__tern = __init_utern32(value&OF1X_20_BITS_IPV6_FLABEL_MASK,mask&OF1X_20_BITS_IPV6_FLABEL_MASK);
662 match->ver_req.min_ver = OF_VERSION_12;
663 match->ver_req.max_ver = OF1X_MAX_VERSION;
664 match->has_wildcard =
false;
667 match->prev=match->next=NULL;
674 if(unlikely(match == NULL))
680 uint128__t mask = {{0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff}};
682 match->type = OF1X_MATCH_IPV6_ND_TARGET;
683 match->__tern = __init_utern128(value,mask);
686 match->ver_req.min_ver = OF_VERSION_12;
687 match->ver_req.max_ver = OF1X_MAX_VERSION;
688 match->has_wildcard =
false;
691 match->prev=match->next=NULL;
698 if(unlikely(match == NULL))
704 match->type = OF1X_MATCH_IPV6_ND_SLL;
705 match->__tern = __init_utern64(value & OF1X_48_BITS_MASK, OF1X_48_BITS_MASK);
708 match->ver_req.min_ver = OF_VERSION_12;
709 match->ver_req.max_ver = OF1X_MAX_VERSION;
710 match->has_wildcard =
false;
713 match->prev=match->next=NULL;
720 if(unlikely(match == NULL))
726 match->type = OF1X_MATCH_IPV6_ND_TLL;
727 match->__tern = __init_utern64(value & OF1X_48_BITS_MASK, OF1X_48_BITS_MASK);
730 match->ver_req.min_ver = OF_VERSION_12;
731 match->ver_req.max_ver = OF1X_MAX_VERSION;
732 match->has_wildcard =
false;
735 match->prev=match->next=NULL;
742 if(unlikely(match == NULL))
747 match->type = OF1X_MATCH_IPV6_EXTHDR;
748 match->__tern = __init_utern16(value&OF1X_9_BITS_MASK, mask & OF1X_9_BITS_MASK );
751 match->ver_req.min_ver = OF_VERSION_13;
752 match->ver_req.max_ver = OF1X_MAX_VERSION;
753 if( (mask&OF1X_9_BITS_MASK) != OF1X_9_BITS_MASK)
754 match->has_wildcard =
true;
756 match->has_wildcard =
false;
759 match->prev=match->next=NULL;
768 if(unlikely(match == NULL))
771 match->type = OF1X_MATCH_ICMPV6_TYPE;
772 match->__tern = __init_utern8(value,OF1X_1_BYTE_MASK);
775 match->ver_req.min_ver = OF_VERSION_12;
776 match->ver_req.max_ver = OF1X_MAX_VERSION;
777 match->has_wildcard =
false;
780 match->prev=match->next=NULL;
787 if(unlikely(match == NULL))
790 match->type = OF1X_MATCH_ICMPV6_CODE;
791 match->__tern = __init_utern8(value,OF1X_1_BYTE_MASK);
794 match->ver_req.min_ver = OF_VERSION_12;
795 match->ver_req.max_ver = OF1X_MAX_VERSION;
796 match->has_wildcard =
false;
799 match->prev=match->next=NULL;
808 if(unlikely(match == NULL))
812 value = HTONB16(value);
814 match->type = OF1X_MATCH_TCP_SRC;
815 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
818 match->ver_req.min_ver = OF_VERSION_12;
819 match->ver_req.max_ver = OF1X_MAX_VERSION;
820 match->has_wildcard =
false;
824 match->prev=match->next=NULL;
831 if(unlikely(match == NULL))
835 value = HTONB16(value);
837 match->type = OF1X_MATCH_TCP_DST;
838 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
841 match->ver_req.min_ver = OF_VERSION_12;
842 match->ver_req.max_ver = OF1X_MAX_VERSION;
843 match->has_wildcard =
false;
846 match->prev=match->next=NULL;
854 if(unlikely(match == NULL))
858 value = HTONB16(value);
860 match->type = OF1X_MATCH_UDP_SRC;
861 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
864 match->ver_req.min_ver = OF_VERSION_12;
865 match->ver_req.max_ver = OF1X_MAX_VERSION;
866 match->has_wildcard =
false;
869 match->prev=match->next=NULL;
876 if(unlikely(match == NULL))
880 value = HTONB16(value);
882 match->type = OF1X_MATCH_UDP_DST;
883 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
886 match->ver_req.min_ver = OF_VERSION_12;
887 match->ver_req.max_ver = OF1X_MAX_VERSION;
888 match->has_wildcard =
false;
891 match->prev=match->next=NULL;
900 if(unlikely(match == NULL))
904 value = HTONB16(value);
906 match->type = OF1X_MATCH_SCTP_SRC;
907 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
910 match->ver_req.min_ver = OF_VERSION_12;
911 match->ver_req.max_ver = OF1X_MAX_VERSION;
912 match->has_wildcard =
false;
916 match->prev=match->next=NULL;
923 if(unlikely(match == NULL))
927 value = HTONB16(value);
929 match->type = OF1X_MATCH_SCTP_DST;
930 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
933 match->ver_req.min_ver = OF_VERSION_12;
934 match->ver_req.max_ver = OF1X_MAX_VERSION;
935 match->has_wildcard =
false;
938 match->prev=match->next=NULL;
947 if(unlikely(match == NULL))
951 value = HTONB16(value);
953 match->type = OF1X_MATCH_TP_SRC;
954 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
957 match->ver_req.min_ver = OF_VERSION_10;
958 match->ver_req.max_ver = OF_VERSION_10;
959 match->has_wildcard =
false;
962 match->prev=match->next=NULL;
969 if(unlikely(match == NULL))
973 value = HTONB16(value);
975 match->type = OF1X_MATCH_TP_DST;
976 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
979 match->ver_req.min_ver = OF_VERSION_10;
980 match->ver_req.max_ver = OF_VERSION_10;
981 match->has_wildcard =
false;
984 match->prev=match->next=NULL;
992 if(unlikely(match == NULL))
995 match->type = OF1X_MATCH_ICMPV4_TYPE;
996 match->__tern = __init_utern8(value,OF1X_1_BYTE_MASK);
999 match->ver_req.min_ver = OF_VERSION_12;
1000 match->ver_req.max_ver = OF1X_MAX_VERSION;
1001 match->has_wildcard =
false;
1004 match->prev=match->next=NULL;
1011 if(unlikely(match == NULL))
1014 match->type = OF1X_MATCH_ICMPV4_CODE;
1015 match->__tern = __init_utern8(value,OF1X_1_BYTE_MASK);
1018 match->ver_req.min_ver = OF_VERSION_12;
1019 match->ver_req.max_ver = OF1X_MAX_VERSION;
1020 match->has_wildcard =
false;
1023 match->prev=match->next=NULL;
1029 of1x_match_t* of1x_init_pbb_isid_match(uint32_t value, uint32_t mask){
1032 if(unlikely(match == NULL))
1037 match->type = OF1X_MATCH_PBB_ISID;
1038 match->__tern = __init_utern32(value&OF1X_3_BYTE_MASK, mask&OF1X_3_BYTE_MASK);
1041 match->ver_req.min_ver = OF_VERSION_13;
1042 match->ver_req.max_ver = OF1X_MAX_VERSION;
1043 if( (mask&OF1X_3_BYTE_MASK) == OF1X_3_BYTE_MASK)
1044 match->has_wildcard =
false;
1046 match->has_wildcard =
false;
1049 match->prev=match->next=NULL;
1058 if(unlikely(match == NULL))
1063 match->type = OF1X_MATCH_TUNNEL_ID;
1064 match->__tern = __init_utern64(value, mask);
1067 match->ver_req.min_ver = OF_VERSION_13;
1068 match->ver_req.max_ver = OF1X_MAX_VERSION;
1069 if(mask != OF1X_8_BYTE_MASK)
1070 match->has_wildcard =
true;
1072 match->has_wildcard =
false;
1075 match->prev=match->next=NULL;
1088 if(unlikely(match == NULL))
1091 match->type = OF1X_MATCH_PPPOE_CODE;
1092 match->__tern = __init_utern8(value&OF1X_1_BYTE_MASK,OF1X_1_BYTE_MASK);
1095 match->ver_req.min_ver = OF_VERSION_12;
1096 match->ver_req.max_ver = OF1X_MAX_VERSION;
1097 match->has_wildcard =
false;
1100 match->prev=match->next=NULL;
1107 if(unlikely(match == NULL))
1110 match->type = OF1X_MATCH_PPPOE_TYPE;
1111 match->__tern = __init_utern8(value&OF1X_4_BITS_MASK,OF1X_4_BITS_MASK);
1114 match->ver_req.min_ver = OF_VERSION_12;
1115 match->ver_req.max_ver = OF1X_MAX_VERSION;
1116 match->has_wildcard =
false;
1119 match->prev=match->next=NULL;
1126 if(unlikely(match == NULL))
1130 value = HTONB16(value);
1132 match->type = OF1X_MATCH_PPPOE_SID;
1133 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
1136 match->ver_req.min_ver = OF_VERSION_12;
1137 match->ver_req.max_ver = OF1X_MAX_VERSION;
1138 match->has_wildcard =
false;
1140 match->prev=match->next=NULL;
1148 if(unlikely(match == NULL))
1152 value = HTONB16(value);
1154 match->type = OF1X_MATCH_PPP_PROT;
1155 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
1158 match->ver_req.min_ver = OF_VERSION_12;
1159 match->ver_req.max_ver = OF1X_MAX_VERSION;
1160 match->has_wildcard =
false;
1163 match->prev=match->next=NULL;
1171 if(unlikely(match == NULL))
1174 match->type = OF1X_MATCH_GTP_MSG_TYPE;
1175 match->__tern = __init_utern8(value,OF1X_1_BYTE_MASK);
1178 match->ver_req.min_ver = OF_VERSION_12;
1179 match->ver_req.max_ver = OF1X_MAX_VERSION;
1180 match->has_wildcard =
false;
1183 match->prev=match->next=NULL;
1190 if(unlikely(match == NULL))
1194 value = HTONB32(value);
1196 match->type = OF1X_MATCH_GTP_TEID;
1197 match->__tern = __init_utern32(value, mask);
1200 match->ver_req.min_ver = OF_VERSION_12;
1201 match->ver_req.max_ver = OF1X_MAX_VERSION;
1202 if( mask != OF1X_4_BYTE_MASK )
1203 match->has_wildcard =
true;
1205 match->has_wildcard =
false;
1208 match->prev=match->next=NULL;
1216 if(unlikely(match == NULL))
1219 match->type = OF1X_MATCH_CAPWAP_WBID;
1220 match->__tern = __init_utern8(value, mask);
1223 match->ver_req.min_ver = OF_VERSION_12;
1224 match->ver_req.max_ver = OF1X_MAX_VERSION;
1225 if( mask != OF1X_1_BYTE_MASK )
1226 match->has_wildcard =
true;
1228 match->has_wildcard =
false;
1231 match->prev=match->next=NULL;
1238 if(unlikely(match == NULL))
1241 match->type = OF1X_MATCH_CAPWAP_RID;
1242 match->__tern = __init_utern8(value, mask);
1245 match->ver_req.min_ver = OF_VERSION_12;
1246 match->ver_req.max_ver = OF1X_MAX_VERSION;
1247 if( mask != OF1X_1_BYTE_MASK )
1248 match->has_wildcard =
true;
1250 match->has_wildcard =
false;
1253 match->prev=match->next=NULL;
1260 if(unlikely(match == NULL))
1264 value = HTONB16(value);
1265 mask = HTONB16(mask);
1267 match->type = OF1X_MATCH_CAPWAP_FLAGS;
1268 match->__tern = __init_utern16(value, mask);
1271 match->ver_req.min_ver = OF_VERSION_12;
1272 match->ver_req.max_ver = OF1X_MAX_VERSION;
1273 if( mask != OF1X_2_BYTE_MASK )
1274 match->has_wildcard =
true;
1276 match->has_wildcard =
false;
1279 match->prev=match->next=NULL;
1287 if(unlikely(match == NULL))
1291 value = HTONB16(value);
1292 mask = HTONB16(mask);
1294 match->type = OF1X_MATCH_WLAN_FC;
1295 match->__tern = __init_utern16(value, mask);
1298 match->ver_req.min_ver = OF_VERSION_12;
1299 match->ver_req.max_ver = OF1X_MAX_VERSION;
1300 if( mask != OF1X_2_BYTE_MASK )
1301 match->has_wildcard =
true;
1303 match->has_wildcard =
false;
1306 match->prev=match->next=NULL;
1313 if(unlikely(match == NULL))
1316 match->type = OF1X_MATCH_WLAN_TYPE;
1317 match->__tern = __init_utern8(value, mask);
1320 match->ver_req.min_ver = OF_VERSION_12;
1321 match->ver_req.max_ver = OF1X_MAX_VERSION;
1322 if( mask != OF1X_1_BYTE_MASK )
1323 match->has_wildcard =
true;
1325 match->has_wildcard =
false;
1328 match->prev=match->next=NULL;
1335 if(unlikely(match == NULL))
1338 match->type = OF1X_MATCH_WLAN_SUBTYPE;
1339 match->__tern = __init_utern8(value, mask);
1342 match->ver_req.min_ver = OF_VERSION_12;
1343 match->ver_req.max_ver = OF1X_MAX_VERSION;
1344 if( mask != OF1X_1_BYTE_MASK )
1345 match->has_wildcard =
true;
1347 match->has_wildcard =
false;
1350 match->prev=match->next=NULL;
1357 if(unlikely(match == NULL))
1360 match->type = OF1X_MATCH_WLAN_DIRECTION;
1361 match->__tern = __init_utern8(value, mask);
1364 match->ver_req.min_ver = OF_VERSION_12;
1365 match->ver_req.max_ver = OF1X_MAX_VERSION;
1366 if( mask != OF1X_1_BYTE_MASK )
1367 match->has_wildcard =
true;
1369 match->has_wildcard =
false;
1372 match->prev=match->next=NULL;
1379 if(unlikely(match == NULL))
1386 match->type = OF1X_MATCH_WLAN_ADDRESS_1;
1387 match->__tern = __init_utern64(value&OF1X_48_BITS_MASK, mask&OF1X_48_BITS_MASK);
1390 match->ver_req.min_ver = OF_VERSION_12;
1391 match->ver_req.max_ver = OF1X_MAX_VERSION;
1392 if( (mask&OF1X_48_BITS_MASK) != OF1X_48_BITS_MASK)
1393 match->has_wildcard =
true;
1395 match->has_wildcard =
false;
1398 match->prev=match->next=NULL;
1405 if(unlikely(match == NULL))
1412 match->type = OF1X_MATCH_WLAN_ADDRESS_2;
1413 match->__tern = __init_utern64(value&OF1X_48_BITS_MASK, mask&OF1X_48_BITS_MASK);
1416 match->ver_req.min_ver = OF_VERSION_12;
1417 match->ver_req.max_ver = OF1X_MAX_VERSION;
1418 if( (mask&OF1X_48_BITS_MASK) != OF1X_48_BITS_MASK)
1419 match->has_wildcard =
true;
1421 match->has_wildcard =
false;
1424 match->prev=match->next=NULL;
1431 if(unlikely(match == NULL))
1438 match->type = OF1X_MATCH_WLAN_ADDRESS_3;
1439 match->__tern = __init_utern64(value&OF1X_48_BITS_MASK, mask&OF1X_48_BITS_MASK);
1442 match->ver_req.min_ver = OF_VERSION_12;
1443 match->ver_req.max_ver = OF1X_MAX_VERSION;
1444 if( (mask&OF1X_48_BITS_MASK) != OF1X_48_BITS_MASK)
1445 match->has_wildcard =
true;
1447 match->has_wildcard =
false;
1450 match->prev=match->next=NULL;
1458 if(unlikely(match == NULL))
1461 value = HTONB16(value);
1463 match->type = OF1X_MATCH_GRE_VERSION;
1464 match->__tern = __init_utern16(value&OF1X_3_BITS_MASK,OF1X_3_BITS_MASK);
1467 match->ver_req.min_ver = OF_VERSION_12;
1468 match->ver_req.max_ver = OF1X_MAX_VERSION;
1469 match->has_wildcard =
false;
1472 match->prev=match->next=NULL;
1479 if(unlikely(match == NULL))
1482 value = HTONB16(value);
1484 match->type = OF1X_MATCH_GRE_PROT_TYPE;
1485 match->__tern = __init_utern16(value,OF1X_2_BYTE_MASK);
1488 match->ver_req.min_ver = OF_VERSION_12;
1489 match->ver_req.max_ver = OF1X_MAX_VERSION;
1490 match->has_wildcard =
false;
1493 match->prev=match->next=NULL;
1500 if(unlikely(match == NULL))
1504 value = HTONB32(value);
1506 match->type = OF1X_MATCH_GRE_KEY;
1507 match->__tern = __init_utern32(value, OF1X_4_BYTE_MASK);
1510 match->ver_req.min_ver = OF_VERSION_12;
1511 match->ver_req.max_ver = OF1X_MAX_VERSION;
1512 match->has_wildcard =
false;
1515 match->prev=match->next=NULL;
1528 group->ver_req.min_ver = OF1X_MIN_VERSION;
1529 group->ver_req.max_ver = OF1X_MAX_VERSION;
1532 bitmap128_set(&group->of10_wildcard_bm, OF1X_MATCH_ETH_DST);
1533 bitmap128_set(&group->of10_wildcard_bm, OF1X_MATCH_ETH_SRC);
1541 if ( unlikely(group->head==NULL) )
1544 match = group->head;
1560 if ( unlikely(group==NULL) || unlikely(match==NULL) )
1563 match->next = match->prev = NULL;
1566 group->head = match;
1568 match->prev = group->tail;
1569 group->tail->next = match;
1575 if(group->ver_req.min_ver < match->ver_req.min_ver)
1576 group->ver_req.min_ver = match->ver_req.min_ver;
1577 if(group->ver_req.max_ver > match->ver_req.max_ver)
1578 group->ver_req.max_ver = match->ver_req.max_ver;
1583 if(!match->has_wildcard)
1588 group->num_elements++;
1590 if(match->next == NULL)
1593 match = match->next;
1597 group->tail = match;
1615 tmp->prev=tmp->next=NULL;
1618 tmp->__tern = __init_utern8(0x0, 0x0);
1623 *tmp->__tern = *match->__tern;
1635 if( unlikely(matches==NULL) )
1638 for(prev=NULL,copy=NULL, it=matches; it; it = it->next){
1640 curr = __of1x_copy_match(it);
1669 if( match1->type != match2->type )
1672 common_tern = __utern_get_alike(*match1->__tern,*match2->__tern);
1676 match->__tern = common_tern;
1677 match->type = match1->type;
1688 __destroy_utern(match->__tern);
1701 if( match1->type != match2->type )
1704 return __utern_equals(match1->__tern,match2->__tern);
1710 if( match->type != sub_match->type )
1713 return __utern_is_contained(sub_match->__tern,match->__tern);
1717 void __of1x_dump_matches(
of1x_match_t* matches,
bool raw_nbo){
1719 for(it=matches;it;it=it->next){
1721 case OF1X_MATCH_IN_PORT: ROFL_PIPELINE_INFO_NO_PREFIX(
"[PORT_IN:%u], ", __of1x_get_match_val32(it,
false, raw_nbo));
1723 case OF1X_MATCH_IN_PHY_PORT: ROFL_PIPELINE_INFO_NO_PREFIX(
"[PHY_PORT_IN:%u], ", __of1x_get_match_val32(it,
false, raw_nbo));
1726 case OF1X_MATCH_METADATA: ROFL_PIPELINE_INFO_NO_PREFIX(
"[METADATA:0x%"PRIx64
"|0x%"PRIx64
"], ", __of1x_get_match_val64(it,
false, raw_nbo), __of1x_get_match_val64(it,
true, raw_nbo));
1729 case OF1X_MATCH_ETH_DST: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ETH_DST:0x%"PRIx64
"|0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo),__of1x_get_match_val64(it,
true, raw_nbo));
1731 case OF1X_MATCH_ETH_SRC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ETH_SRC:0x%"PRIx64
"|0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo),__of1x_get_match_val64(it,
true, raw_nbo));
1733 case OF1X_MATCH_ETH_TYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ETH_TYPE:0x%x], ",__of1x_get_match_val16(it,
false, raw_nbo));
1736 case OF1X_MATCH_VLAN_VID:
if(it->vlan_present == OF1X_MATCH_VLAN_NONE)
1737 ROFL_PIPELINE_INFO_NO_PREFIX(
"[NO_VLAN], ");
1738 else if(it->vlan_present == OF1X_MATCH_VLAN_ANY)
1739 ROFL_PIPELINE_INFO_NO_PREFIX(
"[ANY_VLAN], ");
1741 ROFL_PIPELINE_INFO_NO_PREFIX(
"[VLAN_ID:%u|0x%x], ",__of1x_get_match_val16(it,
false, raw_nbo),__of1x_get_match_val16(it,
true, raw_nbo));
1743 case OF1X_MATCH_VLAN_PCP: ROFL_PIPELINE_INFO_NO_PREFIX(
"[VLAN_PCP:%u], ",__of1x_get_match_val8(it,
false, raw_nbo));
1746 case OF1X_MATCH_MPLS_LABEL: ROFL_PIPELINE_INFO_NO_PREFIX(
"[MPLS_LABEL:0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo));
1748 case OF1X_MATCH_MPLS_TC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[MPLS_TC:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1750 case OF1X_MATCH_MPLS_BOS: ROFL_PIPELINE_INFO_NO_PREFIX(
"[MPLS_BOS:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1753 case OF1X_MATCH_ARP_OP: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ARP_OPCODE:0x%x], ",__of1x_get_match_val16(it,
false, raw_nbo));
1755 case OF1X_MATCH_ARP_SHA: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ARP_SHA:0x%"PRIx64
"|0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo),__of1x_get_match_val64(it,
true, raw_nbo));
1757 case OF1X_MATCH_ARP_SPA: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ARP_SPA:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1759 case OF1X_MATCH_ARP_THA: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ARP_THA:0x%"PRIx64
"|0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo),__of1x_get_match_val64(it,
true, raw_nbo));
1761 case OF1X_MATCH_ARP_TPA: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ARP_TPA:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1764 case OF1X_MATCH_NW_PROTO: ROFL_PIPELINE_INFO_NO_PREFIX(
"[NW_PROTO:%u|0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo),__of1x_get_match_val8(it,
true, raw_nbo));
1766 case OF1X_MATCH_NW_SRC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[NW_SRC:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1768 case OF1X_MATCH_NW_DST: ROFL_PIPELINE_INFO_NO_PREFIX(
"[NW_DST:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1771 case OF1X_MATCH_IP_ECN: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IP_ECN:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1773 case OF1X_MATCH_IP_DSCP: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IP_DSCP:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1775 case OF1X_MATCH_IP_PROTO: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IP_PROTO:%u|0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo),__of1x_get_match_val8(it,
true, raw_nbo));
1778 case OF1X_MATCH_IPV4_SRC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IP4_SRC:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1780 case OF1X_MATCH_IPV4_DST: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IP4_DST:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1783 case OF1X_MATCH_TCP_SRC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[TCP_SRC:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1785 case OF1X_MATCH_TCP_DST: ROFL_PIPELINE_INFO_NO_PREFIX(
"[TCP_DST:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1788 case OF1X_MATCH_UDP_SRC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[UDP_SRC:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1790 case OF1X_MATCH_UDP_DST: ROFL_PIPELINE_INFO_NO_PREFIX(
"[UDP_DST:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1793 case OF1X_MATCH_SCTP_SRC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[SCTP_SRC:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1795 case OF1X_MATCH_SCTP_DST: ROFL_PIPELINE_INFO_NO_PREFIX(
"[SCTP_DST:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1799 case OF1X_MATCH_TP_SRC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[TP_SRC:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1801 case OF1X_MATCH_TP_DST: ROFL_PIPELINE_INFO_NO_PREFIX(
"[TP_DST:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1805 case OF1X_MATCH_ICMPV4_TYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ICMPV4_TYPE:%u], ",__of1x_get_match_val8(it,
false, raw_nbo));
1807 case OF1X_MATCH_ICMPV4_CODE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ICMPV4_CODE:%u], ",__of1x_get_match_val8(it,
false, raw_nbo));
1811 case OF1X_MATCH_IPV6_SRC:
1813 uint128__t value = __of1x_get_match_val128(it,
false, raw_nbo);
1814 uint128__t mask = __of1x_get_match_val128(it,
true, raw_nbo);
1817 ROFL_PIPELINE_INFO_NO_PREFIX(
"[IPV6_SRC:0x%lx:%lx|0x%lx:%lx], ",UINT128__T_HI(value),UINT128__T_LO(value),UINT128__T_HI(mask),UINT128__T_LO(mask));
1820 case OF1X_MATCH_IPV6_DST:
1822 uint128__t value = __of1x_get_match_val128(it,
false, raw_nbo);
1823 uint128__t mask = __of1x_get_match_val128(it,
true, raw_nbo);
1827 ROFL_PIPELINE_INFO_NO_PREFIX(
"[IPV6_DST:0x%lx:%lx|0x%lx:%lx], ",UINT128__T_HI(value),UINT128__T_LO(value),UINT128__T_HI(mask),UINT128__T_LO(mask));
1830 case OF1X_MATCH_IPV6_FLABEL: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IPV6_FLABEL:%lu], ",__of1x_get_match_val32(it,
false, raw_nbo));
1832 case OF1X_MATCH_IPV6_ND_TARGET: {
1833 uint128__t value = __of1x_get_match_val128(it,
false, raw_nbo);
1834 uint128__t mask = __of1x_get_match_val128(it,
true, raw_nbo);
1838 ROFL_PIPELINE_INFO_NO_PREFIX(
"[IPV6_ND_TARGET:0x%lx:%lx], ",UINT128__T_HI(value),UINT128__T_LO(mask));
1841 case OF1X_MATCH_IPV6_ND_SLL: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IPV6_ND_SLL:0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo));
1843 case OF1X_MATCH_IPV6_ND_TLL: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IPV6_ND_TLL:0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo));
1845 case OF1X_MATCH_IPV6_EXTHDR: ROFL_PIPELINE_INFO_NO_PREFIX(
"[IPV6_EXTHDR:%lu|0x%lx], ",__of1x_get_match_val16(it,
false, raw_nbo),__of1x_get_match_val16(it,
true, raw_nbo));
1848 case OF1X_MATCH_ICMPV6_TYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ICMPV6_TYPE:%lu], ",__of1x_get_match_val8(it,
false, raw_nbo));
1850 case OF1X_MATCH_ICMPV6_CODE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[ICMPV6_CODE:%lu], ",__of1x_get_match_val8(it,
false, raw_nbo));
1854 case OF1X_MATCH_PBB_ISID: ROFL_PIPELINE_INFO_NO_PREFIX(
"[PBB_ISID:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1857 case OF1X_MATCH_TUNNEL_ID: ROFL_PIPELINE_INFO_NO_PREFIX(
"[TUNNEL_ID:0x%"PRIx64
"|0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo),__of1x_get_match_val64(it,
true, raw_nbo));
1861 case OF1X_MATCH_PPPOE_CODE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[PPPOE_CODE:%u], ",__of1x_get_match_val8(it,
false, raw_nbo));
1863 case OF1X_MATCH_PPPOE_TYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[PPPOE_TYPE:%u], ",__of1x_get_match_val8(it,
false, raw_nbo));
1865 case OF1X_MATCH_PPPOE_SID: ROFL_PIPELINE_INFO_NO_PREFIX(
"[PPPOE_SID:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1868 case OF1X_MATCH_PPP_PROT: ROFL_PIPELINE_INFO_NO_PREFIX(
"[PPP_PROT:%u] ",__of1x_get_match_val16(it,
false, raw_nbo));
1872 case OF1X_MATCH_GTP_MSG_TYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[GTP_MSG_TYPE:%u], ",__of1x_get_match_val8(it,
false, raw_nbo));
1874 case OF1X_MATCH_GTP_TEID: ROFL_PIPELINE_INFO_NO_PREFIX(
"[GTP_TEID:0x%x|0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo),__of1x_get_match_val32(it,
true, raw_nbo));
1878 case OF1X_MATCH_CAPWAP_WBID: ROFL_PIPELINE_INFO_NO_PREFIX(
"[CAPWAP_WBID:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1880 case OF1X_MATCH_CAPWAP_RID: ROFL_PIPELINE_INFO_NO_PREFIX(
"[CAPWAP_RID:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1882 case OF1X_MATCH_CAPWAP_FLAGS: ROFL_PIPELINE_INFO_NO_PREFIX(
"[CAPWAP_FLAGS:%u], ",__of1x_get_match_val16(it,
false, raw_nbo));
1886 case OF1X_MATCH_WLAN_FC: ROFL_PIPELINE_INFO_NO_PREFIX(
"[WLAN_FC:0x%x], ",__of1x_get_match_val16(it,
false, raw_nbo));
1888 case OF1X_MATCH_WLAN_TYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[WLAN_TYPE:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1890 case OF1X_MATCH_WLAN_SUBTYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[WLAN_SUBTYPE:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1892 case OF1X_MATCH_WLAN_DIRECTION: ROFL_PIPELINE_INFO_NO_PREFIX(
"[WLAN_DIRECTION:0x%x], ",__of1x_get_match_val8(it,
false, raw_nbo));
1894 case OF1X_MATCH_WLAN_ADDRESS_1: ROFL_PIPELINE_INFO_NO_PREFIX(
"[WLAN_ADDRESS_1:0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo));
1896 case OF1X_MATCH_WLAN_ADDRESS_2: ROFL_PIPELINE_INFO_NO_PREFIX(
"[WLAN_ADDRESS_2:0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo));
1898 case OF1X_MATCH_WLAN_ADDRESS_3: ROFL_PIPELINE_INFO_NO_PREFIX(
"[WLAN_ADDRESS_3:0x%"PRIx64
"], ",__of1x_get_match_val64(it,
false, raw_nbo));
1902 case OF1X_MATCH_GRE_VERSION: ROFL_PIPELINE_INFO_NO_PREFIX(
"[GRE_VERSION:0x%x], ",__of1x_get_match_val16(it,
false, raw_nbo));
1904 case OF1X_MATCH_GRE_PROT_TYPE: ROFL_PIPELINE_INFO_NO_PREFIX(
"[GRE_PROT_TYPE:0x%x], ",__of1x_get_match_val16(it,
false, raw_nbo));
1906 case OF1X_MATCH_GRE_KEY: ROFL_PIPELINE_INFO_NO_PREFIX(
"[GRE_KEY:0x%x], ",__of1x_get_match_val32(it,
false, raw_nbo));
1909 case OF1X_MATCH_MAX: assert(0);
of1x_match_t * of1x_init_ip6_flabel_match(uint32_t value, uint32_t mask)
Create an IP6_FLABEL match.
of1x_match_t * of1x_init_tunnel_id_match(uint64_t value, uint64_t mask)
Create an TUNNEL_ID match.
of1x_match_t * of1x_init_tp_dst_match(uint16_t value)
Create an TP_DST match (TCP/UDP), OF1.0 ONLY!
of1x_match_t * of1x_init_arp_sha_match(uint64_t value, uint64_t mask)
Create an ARP_SHA match.
of1x_match_t * of1x_init_capwap_wbid_match(uint8_t value, uint8_t mask)
Create a CAPWAP_WBID match.
of1x_match_t * of1x_init_vlan_vid_match(uint16_t value, uint16_t mask, enum of1x_vlan_present vlan_present)
Create an VLAN_VID match according to 1.2 semantics (13th bit is a flag)
of1x_match_t * of1x_init_pppoe_code_match(uint8_t value)
Create an PPPOE_CODE match.
of1x_match_t * of1x_init_mpls_label_match(uint32_t value)
Create an MPLS_LABEL match.
of1x_match_t * of1x_init_ip4_dst_match(uint32_t value, uint32_t mask)
Create an IP4_DST match.
of1x_match_t * of1x_init_gre_version_match(uint16_t value)
Create a GRE_VERSION match.
of1x_match_t * of1x_init_wlan_address_2_match(uint64_t value, uint64_t mask)
Create an WLAN_ADDRESS_2 match.
of1x_match_t * of1x_init_capwap_rid_match(uint8_t value, uint8_t mask)
Create a CAPWAP_RID match.
of1x_match_t * of1x_init_port_in_phy_match(uint32_t value)
Create an PHY_PORT_IN match.
of1x_match_t * of1x_init_ip6_src_match(uint128__t value, uint128__t mask)
Create an IP6_SRC match.
of1x_match_t * of1x_init_eth_type_match(uint16_t value)
Create an ETH_TYPE match.
of1x_match_t * of1x_init_eth_dst_match(uint64_t value, uint64_t mask)
Create an ETH_DST match.
of1x_match_t * of1x_init_gtp_msg_type_match(uint8_t value)
Create an PPP_PROTO match.
of1x_match_t * of1x_init_gtp_teid_match(uint32_t value, uint32_t mask)
Create an PPP_PROTO match.
of1x_match_t * of1x_init_mpls_tc_match(uint8_t value)
Create an MPLS_TC match.
of1x_match_t * of1x_init_wlan_subtype_match(uint8_t value, uint8_t mask)
Create a WLAN_SUBTYPE match.
of1x_match_t * of1x_init_wlan_fc_match(uint16_t value, uint16_t mask)
Create a WLAN_FC match.
of1x_match_t * of1x_init_icmpv4_type_match(uint8_t value)
Create an ICMPv4_TYPE match.
of1x_match_t * of1x_init_vlan_pcp_match(uint8_t value)
Create an VLAN_PCP match.
of1x_match_t * of1x_init_icmpv6_code_match(uint8_t value)
Create an ICMPV6_CODE match.
of1x_match_t * of1x_init_mpls_bos_match(uint8_t value)
Create an MPLS_BOS match.
void of1x_destroy_match(of1x_match_t *match)
Destroys whichever match previously created using of1x_init_match_*()
of1x_match_t * of1x_init_capwap_flags_match(uint16_t value, uint16_t mask)
Create a CAPWAP_FLAGS match.
of1x_match_t * of1x_init_arp_tpa_match(uint32_t value, uint32_t mask)
Create an ARP_TPA match.
of1x_match_t * of1x_init_ip_ecn_match(uint8_t value)
Create an IPC_ECN match.
of1x_match_t * of1x_init_nw_dst_match(uint32_t value, uint32_t mask)
Create an NW_DST match (IP/ARP), OF1.0 ONLY!
of1x_match_t * of1x_init_port_in_match(uint32_t value)
Create an PORT_IN match.
of1x_match_t * of1x_init_arp_spa_match(uint32_t value, uint32_t mask)
Create an ARP_SPA match.
of1x_match_t * of1x_init_ip_dscp_match(uint8_t value)
Create an IP_DSCP match.
#define OF1X_MAC_ALIGN(x)
ALIGNING FUNCTIONS FOR THE PROTOCOL VALUES ///.
of1x_match_t * of1x_init_gre_prot_type_match(uint16_t value)
Create a GRE_PROT_TYPE match.
of1x_match_t * of1x_init_arp_tha_match(uint64_t value, uint64_t mask)
Create an ARP_THA match.
of1x_match_t * of1x_init_gre_key_match(uint32_t value)
Create a GRE_KEY match.
of1x_match_t * of1x_init_wlan_direction_match(uint8_t value, uint8_t mask)
Create a WLAN_DIRECTION match.
of1x_match_t * of1x_init_nw_proto_match(uint8_t value)
Create an NW_PROTO match, OF1.0 ONLY!
of1x_match_t * of1x_init_wlan_address_3_match(uint64_t value, uint64_t mask)
Create an WLAN_ADDRESS_3 match.
of1x_match_t * of1x_init_wlan_address_1_match(uint64_t value, uint64_t mask)
Create an WLAN_ADDRESS_1 match.
of1x_match_t * of1x_init_arp_opcode_match(uint16_t value)
Create an ARP_OPCODE match.
of1x_match_t * of1x_init_sctp_src_match(uint16_t value)
Create an SCTP_SRC match.
of1x_match_t * of1x_init_ip4_src_match(uint32_t value, uint32_t mask)
Create an IP4_SRC match.
of1x_match_t * of1x_init_ip6_dst_match(uint128__t value, uint128__t mask)
Create an IP6_DST match.
of1x_match_t * of1x_init_ip6_nd_tll_match(uint64_t value)
Create an IP6_ND_TLL match.
of1x_match_t * of1x_init_icmpv4_code_match(uint8_t value)
Create an ICMPv4_CODE match.
of1x_match_t * of1x_init_tp_src_match(uint16_t value)
Create an TP_SRC match (TCP/UDP), OF1.0 ONLY!
of1x_match_t * of1x_init_ip6_exthdr_match(uint16_t value, uint16_t mask)
Create an IP6_EXTHDR match.
of1x_match_t * of1x_init_tcp_dst_match(uint16_t value)
Create an TCP_DST match.
of1x_match_t * of1x_init_pppoe_type_match(uint8_t value)
Create an PPPOE_TYPE match.
OpenFlow v1.0, 1.2 and 1.3.2 matches.
of1x_match_t * of1x_init_ip6_nd_target_match(uint128__t value)
Create an IP6_ND_TARGET match.
of1x_match_t * of1x_init_sctp_dst_match(uint16_t value)
Create an SCTP_DST match.
of1x_match_t * of1x_init_metadata_match(uint64_t value, uint64_t mask)
Create an METADATA match.
of1x_match_t * of1x_init_udp_src_match(uint16_t value)
Create an UDP_SRC match.
of1x_match_t * of1x_init_wlan_type_match(uint8_t value, uint8_t mask)
Create a WLAN_TYPE match.
of1x_match_t * of1x_init_udp_dst_match(uint16_t value)
Create an UDP_DST match.
of1x_match_t * of1x_init_ip6_nd_sll_match(uint64_t value)
Create an IP6_ND_SLL match.
of1x_match_t * of1x_init_pppoe_session_match(uint16_t value)
Create an PPPOE_SESSION match.
of1x_match_t * of1x_init_nw_src_match(uint32_t value, uint32_t mask)
Create an NW_SRC match (IP/ARP), OF1.0 ONLY!
of1x_match_t * of1x_init_ip_proto_match(uint8_t value)
Create an IP_PROTO match.
of1x_match_t * of1x_init_ppp_prot_match(uint16_t value)
Create an PPP_PROTO match.
of1x_match_t * of1x_init_icmpv6_type_match(uint8_t value)
Create an ICMPV6_TYPE match.
of1x_match_t * of1x_init_tcp_src_match(uint16_t value)
Create an TCP_SRC match.
static void bitmap128_unset(bitmap128_t *bitmap, unsigned int pos)
Unset(zero) a bit in the 128bit bitmap.
static void bitmap128_set(bitmap128_t *bitmap, unsigned int pos)
Set a bit in the 128bit bitmap.
of1x_match_t * of1x_init_eth_src_match(uint64_t value, uint64_t mask)
Create an ETH_SRC match.