DPDK  19.08.0
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
rte_flow.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2016 6WIND S.A.
3  * Copyright 2016 Mellanox Technologies, Ltd
4  */
5 
6 #ifndef RTE_FLOW_H_
7 #define RTE_FLOW_H_
8 
17 #include <stddef.h>
18 #include <stdint.h>
19 
20 #include <rte_arp.h>
21 #include <rte_common.h>
22 #include <rte_ether.h>
23 #include <rte_icmp.h>
24 #include <rte_ip.h>
25 #include <rte_sctp.h>
26 #include <rte_tcp.h>
27 #include <rte_udp.h>
28 #include <rte_byteorder.h>
29 #include <rte_esp.h>
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
72 struct rte_flow_attr {
73  uint32_t group;
74  uint32_t priority;
75  uint32_t ingress:1;
76  uint32_t egress:1;
95  uint32_t transfer:1;
96  uint32_t reserved:29;
97 };
98 
125 
135 
145 
153 
163 
173 
183 
193 
200 
207 
214 
221 
228 
235 
242 
249 
256 
263 
270 
277 
284 
291 
303 
312 
321 
330 
337 
344 
351 
358 
365 
372 
379 
386 
393 
401 
409 
416 
424 
437 };
438 
451  uint32_t num;
452 };
453 
455 #ifndef __cplusplus
457  .num = 0x00000000,
458 };
459 #endif
460 
480  uint32_t id;
481 };
482 
484 #ifndef __cplusplus
486  .id = 0x00000000,
487 };
488 #endif
489 
511  uint32_t index;
512 };
513 
515 #ifndef __cplusplus
517  .index = 0x00000000,
518 };
519 #endif
520 
537  uint32_t id;
538 };
539 
541 #ifndef __cplusplus
543  .id = 0xffffffff,
544 };
545 #endif
546 
566  uint32_t relative:1;
567  uint32_t search:1;
568  uint32_t reserved:30;
569  int32_t offset;
570  uint16_t limit;
571  uint16_t length;
572  const uint8_t *pattern;
573 };
574 
576 #ifndef __cplusplus
578  .relative = 1,
579  .search = 1,
580  .reserved = 0x3fffffff,
581  .offset = 0xffffffff,
582  .limit = 0xffff,
583  .length = 0xffff,
584  .pattern = NULL,
585 };
586 #endif
587 
603 };
604 
606 #ifndef __cplusplus
608  .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
609  .src.addr_bytes = "\xff\xff\xff\xff\xff\xff",
610  .type = RTE_BE16(0x0000),
611 };
612 #endif
613 
626 };
627 
629 #ifndef __cplusplus
631  .tci = RTE_BE16(0x0fff),
632  .inner_type = RTE_BE16(0x0000),
633 };
634 #endif
635 
644  struct rte_ipv4_hdr hdr;
645 };
646 
648 #ifndef __cplusplus
650  .hdr = {
651  .src_addr = RTE_BE32(0xffffffff),
652  .dst_addr = RTE_BE32(0xffffffff),
653  },
654 };
655 #endif
656 
666  struct rte_ipv6_hdr hdr;
667 };
668 
670 #ifndef __cplusplus
672  .hdr = {
673  .src_addr =
674  "\xff\xff\xff\xff\xff\xff\xff\xff"
675  "\xff\xff\xff\xff\xff\xff\xff\xff",
676  .dst_addr =
677  "\xff\xff\xff\xff\xff\xff\xff\xff"
678  "\xff\xff\xff\xff\xff\xff\xff\xff",
679  },
680 };
681 #endif
682 
689  struct rte_icmp_hdr hdr;
690 };
691 
693 #ifndef __cplusplus
695  .hdr = {
696  .icmp_type = 0xff,
697  .icmp_code = 0xff,
698  },
699 };
700 #endif
701 
708  struct rte_udp_hdr hdr;
709 };
710 
712 #ifndef __cplusplus
714  .hdr = {
715  .src_port = RTE_BE16(0xffff),
716  .dst_port = RTE_BE16(0xffff),
717  },
718 };
719 #endif
720 
727  struct rte_tcp_hdr hdr;
728 };
729 
731 #ifndef __cplusplus
733  .hdr = {
734  .src_port = RTE_BE16(0xffff),
735  .dst_port = RTE_BE16(0xffff),
736  },
737 };
738 #endif
739 
746  struct rte_sctp_hdr hdr;
747 };
748 
750 #ifndef __cplusplus
752  .hdr = {
753  .src_port = RTE_BE16(0xffff),
754  .dst_port = RTE_BE16(0xffff),
755  },
756 };
757 #endif
758 
765  uint8_t flags;
766  uint8_t rsvd0[3];
767  uint8_t vni[3];
768  uint8_t rsvd1;
769 };
770 
772 #ifndef __cplusplus
774  .vni = "\xff\xff\xff",
775 };
776 #endif
777 
794  uint8_t in_ecid_e;
795  uint8_t ecid_e;
797 };
798 
800 #ifndef __cplusplus
802  .rsvd_grp_ecid_b = RTE_BE16(0x3fff),
803 };
804 #endif
805 
820  uint8_t tni[3];
821  uint8_t flow_id;
822 };
823 
825 #ifndef __cplusplus
827  .tni = "\xff\xff\xff",
828 };
829 #endif
830 
840  uint8_t label_tc_s[3];
841  uint8_t ttl;
842 };
843 
845 #ifndef __cplusplus
847  .label_tc_s = "\xff\xff\xf0",
848 };
849 #endif
850 
863 };
864 
866 #ifndef __cplusplus
868  .protocol = RTE_BE16(0xffff),
869 };
870 #endif
871 
890  uint32_t thresh;
891 };
892 
894 #ifndef __cplusplus
896  .thresh = 0xffffffff,
897 };
898 #endif
899 
912  uint8_t v_pt_rsv_flags;
913  uint8_t msg_type;
916 };
917 
919 #ifndef __cplusplus
921  .teid = RTE_BE32(0xffffffff),
922 };
923 #endif
924 
931  struct rte_esp_hdr hdr;
932 };
933 
935 #ifndef __cplusplus
937  .hdr = {
938  .spi = 0xffffffff,
939  },
940 };
941 #endif
942 
955  uint8_t vni[3];
956  uint8_t rsvd1;
957 };
958 
960 #ifndef __cplusplus
962  .vni = "\xff\xff\xff",
963 };
964 #endif
965 
972  uint8_t flags;
973  uint8_t rsvd0[2];
974  uint8_t protocol;
975  uint8_t vni[3];
976  uint8_t rsvd1;
977 };
978 
980 #ifndef __cplusplus
982  .vni = "\xff\xff\xff",
983 };
984 #endif
985 
994  uint8_t hln;
995  uint8_t pln;
1001 };
1002 
1004 #ifndef __cplusplus
1005 static const struct rte_flow_item_arp_eth_ipv4
1007  .sha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1008  .spa = RTE_BE32(0xffffffff),
1009  .tha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1010  .tpa = RTE_BE32(0xffffffff),
1011 };
1012 #endif
1013 
1025  uint8_t next_hdr;
1026 };
1027 
1029 #ifndef __cplusplus
1030 static const
1032  .next_hdr = 0xff,
1033 };
1034 #endif
1035 
1042  uint8_t type;
1043  uint8_t code;
1044  uint16_t checksum;
1045 };
1046 
1048 #ifndef __cplusplus
1050  .type = 0xff,
1051  .code = 0xff,
1052 };
1053 #endif
1054 
1061  uint8_t type;
1062  uint8_t code;
1065  uint8_t target_addr[16];
1066 };
1067 
1069 #ifndef __cplusplus
1070 static const
1072  .target_addr =
1073  "\xff\xff\xff\xff\xff\xff\xff\xff"
1074  "\xff\xff\xff\xff\xff\xff\xff\xff",
1075 };
1076 #endif
1077 
1084  uint8_t type;
1085  uint8_t code;
1092  uint8_t target_addr[16];
1093 };
1094 
1096 #ifndef __cplusplus
1097 static const
1099  .target_addr =
1100  "\xff\xff\xff\xff\xff\xff\xff\xff"
1101  "\xff\xff\xff\xff\xff\xff\xff\xff",
1102 };
1103 #endif
1104 
1117  uint8_t type;
1118  uint8_t length;
1119 };
1120 
1122 #ifndef __cplusplus
1123 static const struct rte_flow_item_icmp6_nd_opt
1125  .type = 0xff,
1126 };
1127 #endif
1128 
1141  uint8_t type;
1142  uint8_t length;
1144 };
1145 
1147 #ifndef __cplusplus
1148 static const struct rte_flow_item_icmp6_nd_opt_sla_eth
1150  .sla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1151 };
1152 #endif
1153 
1166  uint8_t type;
1167  uint8_t length;
1169 };
1170 
1172 #ifndef __cplusplus
1173 static const struct rte_flow_item_icmp6_nd_opt_tla_eth
1175  .tla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1176 };
1177 #endif
1178 
1185  rte_be32_t data;
1186 };
1187 
1189 #ifndef __cplusplus
1191  .data = RTE_BE32(UINT32_MAX),
1192 };
1193 #endif
1194 
1214  uint32_t id;
1215 };
1216 
1252  const void *spec;
1253  const void *last;
1254  const void *mask;
1255 };
1256 
1291 
1299 
1307 
1316 
1324 
1332 
1339 
1348 
1358 
1367 
1375 
1383 
1391 
1398 
1406 
1414 
1422 
1430 
1438 
1446 
1455 
1464 
1472 
1480 
1488 
1496 
1504 
1512 
1520 
1529 
1537 
1546 
1553 
1560 
1570 
1580 
1590 
1600 
1611 
1622 
1633 
1640 
1647 
1657 
1667 
1681 
1695 
1709 
1723 };
1724 
1736  uint32_t id;
1737 };
1738 
1752  uint32_t group;
1753 };
1754 
1761  uint16_t index;
1762 };
1763 
1764 
1791  uint32_t shared:1;
1792  uint32_t reserved:31;
1793  uint32_t id;
1794 };
1795 
1802  uint32_t reset:1;
1803  uint32_t hits_set:1;
1804  uint32_t bytes_set:1;
1805  uint32_t reserved:29;
1806  uint64_t hits;
1807  uint64_t bytes;
1808 };
1809 
1814  RTE_ETH_HASH_FUNCTION_DEFAULT = 0,
1817  RTE_ETH_HASH_FUNCTION_MAX,
1818 };
1819 
1863  uint32_t level;
1864  uint64_t types;
1865  uint32_t key_len;
1866  uint32_t queue_num;
1867  const uint8_t *key;
1868  const uint16_t *queue;
1869 };
1870 
1884  uint32_t original:1;
1885  uint32_t reserved:31;
1886  uint32_t id;
1887 };
1888 
1898  uint32_t original:1;
1899  uint32_t reserved:31;
1900  uint32_t index;
1901 };
1902 
1911  uint32_t original:1;
1912  uint32_t reserved:31;
1913  uint32_t id;
1914 };
1915 
1925  uint32_t mtr_id;
1926 };
1927 
1955 };
1956 
1964  uint8_t mpls_ttl;
1965 };
1966 
1974  uint8_t nw_ttl;
1975 };
1976 
1985 };
1986 
1995 };
1996 
2004  uint8_t vlan_pcp;
2005 };
2006 
2015 };
2016 
2025 };
2026 
2060 };
2061 
2094 };
2095 
2116  uint8_t *data;
2117  uint8_t *preserve;
2118  size_t size;
2119 };
2120 
2137  uint8_t *data;
2138  size_t size;
2139 };
2140 
2153  rte_be32_t ipv4_addr;
2154 };
2155 
2168  uint8_t ipv6_addr[16];
2169 };
2170 
2183  rte_be16_t port;
2184 };
2185 
2192  uint8_t ttl_value;
2193 };
2194 
2201  uint8_t mac_addr[RTE_ETHER_ADDR_LEN];
2202 };
2203 
2204 /*
2205  * Definition of a single action.
2206  *
2207  * A list of actions is terminated by a END action.
2208  *
2209  * For simple actions without a configuration object, conf remains NULL.
2210  */
2211 struct rte_flow_action {
2212  enum rte_flow_action_type type;
2213  const void *conf;
2214 };
2215 
2222 struct rte_flow;
2223 
2248 };
2249 
2263  const void *cause;
2264  const char *message;
2265 };
2266 
2277  union {
2278  const struct rte_flow_attr *attr_ro;
2280  };
2281  union {
2282  const struct rte_flow_item *pattern_ro;
2284  };
2285  union {
2286  const struct rte_flow_action *actions_ro;
2287  struct rte_flow_action *actions;
2288  };
2289 };
2290 
2303 
2315 
2327 
2339 
2352 
2365 
2378 
2392 
2406 
2420 
2434 };
2435 
2488 int
2489 rte_flow_validate(uint16_t port_id,
2490  const struct rte_flow_attr *attr,
2491  const struct rte_flow_item pattern[],
2492  const struct rte_flow_action actions[],
2493  struct rte_flow_error *error);
2494 
2515 struct rte_flow *
2516 rte_flow_create(uint16_t port_id,
2517  const struct rte_flow_attr *attr,
2518  const struct rte_flow_item pattern[],
2519  const struct rte_flow_action actions[],
2520  struct rte_flow_error *error);
2521 
2542 int
2543 rte_flow_destroy(uint16_t port_id,
2544  struct rte_flow *flow,
2545  struct rte_flow_error *error);
2546 
2563 int
2564 rte_flow_flush(uint16_t port_id,
2565  struct rte_flow_error *error);
2566 
2591 int
2592 rte_flow_query(uint16_t port_id,
2593  struct rte_flow *flow,
2594  const struct rte_flow_action *action,
2595  void *data,
2596  struct rte_flow_error *error);
2597 
2639 int
2640 rte_flow_isolate(uint16_t port_id, int set, struct rte_flow_error *error);
2641 
2659 int
2660 rte_flow_error_set(struct rte_flow_error *error,
2661  int code,
2662  enum rte_flow_error_type type,
2663  const void *cause,
2664  const char *message);
2665 
2671  size_t size;
2674  struct rte_flow_action *actions;
2675  uint8_t data[];
2676 };
2677 
2704 __rte_deprecated
2705 size_t
2706 rte_flow_copy(struct rte_flow_desc *fd, size_t len,
2707  const struct rte_flow_attr *attr,
2708  const struct rte_flow_item *items,
2709  const struct rte_flow_action *actions);
2710 
2751 __rte_experimental
2752 int
2754  void *dst,
2755  size_t size,
2756  const void *src,
2757  struct rte_flow_error *error);
2758 
2759 #ifdef __cplusplus
2760 }
2761 #endif
2762 
2763 #endif /* RTE_FLOW_H_ */