DPDK  19.02.0
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_eth_ctrl.h>
24 #include <rte_icmp.h>
25 #include <rte_ip.h>
26 #include <rte_sctp.h>
27 #include <rte_tcp.h>
28 #include <rte_udp.h>
29 #include <rte_byteorder.h>
30 #include <rte_esp.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
73 struct rte_flow_attr {
74  uint32_t group;
75  uint32_t priority;
76  uint32_t ingress:1;
77  uint32_t egress:1;
96  uint32_t transfer:1;
97  uint32_t reserved:29;
98 };
99 
126 
136 
146 
154 
164 
174 
184 
194 
201 
208 
215 
222 
229 
236 
243 
250 
257 
264 
271 
278 
285 
292 
304 
313 
322 
331 
338 
345 
352 
359 
366 
373 
380 
387 
394 
402 
410 
417 
425 };
426 
439  uint32_t num;
440 };
441 
443 #ifndef __cplusplus
445  .num = 0x00000000,
446 };
447 #endif
448 
468  uint32_t id;
469 };
470 
472 #ifndef __cplusplus
474  .id = 0x00000000,
475 };
476 #endif
477 
499  uint32_t index;
500 };
501 
503 #ifndef __cplusplus
505  .index = 0x00000000,
506 };
507 #endif
508 
525  uint32_t id;
526 };
527 
529 #ifndef __cplusplus
531  .id = 0xffffffff,
532 };
533 #endif
534 
554  uint32_t relative:1;
555  uint32_t search:1;
556  uint32_t reserved:30;
557  int32_t offset;
558  uint16_t limit;
559  uint16_t length;
560  const uint8_t *pattern;
561 };
562 
564 #ifndef __cplusplus
566  .relative = 1,
567  .search = 1,
568  .reserved = 0x3fffffff,
569  .offset = 0xffffffff,
570  .limit = 0xffff,
571  .length = 0xffff,
572  .pattern = NULL,
573 };
574 #endif
575 
588  struct ether_addr dst;
589  struct ether_addr src;
591 };
592 
594 #ifndef __cplusplus
596  .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
597  .src.addr_bytes = "\xff\xff\xff\xff\xff\xff",
598  .type = RTE_BE16(0x0000),
599 };
600 #endif
601 
614 };
615 
617 #ifndef __cplusplus
619  .tci = RTE_BE16(0x0fff),
620  .inner_type = RTE_BE16(0x0000),
621 };
622 #endif
623 
632  struct ipv4_hdr hdr;
633 };
634 
636 #ifndef __cplusplus
638  .hdr = {
639  .src_addr = RTE_BE32(0xffffffff),
640  .dst_addr = RTE_BE32(0xffffffff),
641  },
642 };
643 #endif
644 
654  struct ipv6_hdr hdr;
655 };
656 
658 #ifndef __cplusplus
660  .hdr = {
661  .src_addr =
662  "\xff\xff\xff\xff\xff\xff\xff\xff"
663  "\xff\xff\xff\xff\xff\xff\xff\xff",
664  .dst_addr =
665  "\xff\xff\xff\xff\xff\xff\xff\xff"
666  "\xff\xff\xff\xff\xff\xff\xff\xff",
667  },
668 };
669 #endif
670 
677  struct icmp_hdr hdr;
678 };
679 
681 #ifndef __cplusplus
683  .hdr = {
684  .icmp_type = 0xff,
685  .icmp_code = 0xff,
686  },
687 };
688 #endif
689 
696  struct udp_hdr hdr;
697 };
698 
700 #ifndef __cplusplus
702  .hdr = {
703  .src_port = RTE_BE16(0xffff),
704  .dst_port = RTE_BE16(0xffff),
705  },
706 };
707 #endif
708 
715  struct tcp_hdr hdr;
716 };
717 
719 #ifndef __cplusplus
721  .hdr = {
722  .src_port = RTE_BE16(0xffff),
723  .dst_port = RTE_BE16(0xffff),
724  },
725 };
726 #endif
727 
734  struct sctp_hdr hdr;
735 };
736 
738 #ifndef __cplusplus
740  .hdr = {
741  .src_port = RTE_BE16(0xffff),
742  .dst_port = RTE_BE16(0xffff),
743  },
744 };
745 #endif
746 
753  uint8_t flags;
754  uint8_t rsvd0[3];
755  uint8_t vni[3];
756  uint8_t rsvd1;
757 };
758 
760 #ifndef __cplusplus
762  .vni = "\xff\xff\xff",
763 };
764 #endif
765 
782  uint8_t in_ecid_e;
783  uint8_t ecid_e;
785 };
786 
788 #ifndef __cplusplus
790  .rsvd_grp_ecid_b = RTE_BE16(0x3fff),
791 };
792 #endif
793 
808  uint8_t tni[3];
809  uint8_t flow_id;
810 };
811 
813 #ifndef __cplusplus
815  .tni = "\xff\xff\xff",
816 };
817 #endif
818 
828  uint8_t label_tc_s[3];
829  uint8_t ttl;
830 };
831 
833 #ifndef __cplusplus
835  .label_tc_s = "\xff\xff\xf0",
836 };
837 #endif
838 
851 };
852 
854 #ifndef __cplusplus
856  .protocol = RTE_BE16(0xffff),
857 };
858 #endif
859 
878  uint32_t thresh;
879 };
880 
882 #ifndef __cplusplus
884  .thresh = 0xffffffff,
885 };
886 #endif
887 
900  uint8_t v_pt_rsv_flags;
901  uint8_t msg_type;
904 };
905 
907 #ifndef __cplusplus
909  .teid = RTE_BE32(0xffffffff),
910 };
911 #endif
912 
919  struct esp_hdr hdr;
920 };
921 
923 #ifndef __cplusplus
925  .hdr = {
926  .spi = 0xffffffff,
927  },
928 };
929 #endif
930 
943  uint8_t vni[3];
944  uint8_t rsvd1;
945 };
946 
948 #ifndef __cplusplus
950  .vni = "\xff\xff\xff",
951 };
952 #endif
953 
960  uint8_t flags;
961  uint8_t rsvd0[2];
962  uint8_t protocol;
963  uint8_t vni[3];
964  uint8_t rsvd1;
965 };
966 
968 #ifndef __cplusplus
970  .vni = "\xff\xff\xff",
971 };
972 #endif
973 
982  uint8_t hln;
983  uint8_t pln;
985  struct ether_addr sha;
987  struct ether_addr tha;
989 };
990 
992 #ifndef __cplusplus
993 static const struct rte_flow_item_arp_eth_ipv4
995  .sha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
996  .spa = RTE_BE32(0xffffffff),
997  .tha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
998  .tpa = RTE_BE32(0xffffffff),
999 };
1000 #endif
1001 
1013  uint8_t next_hdr;
1014 };
1015 
1017 #ifndef __cplusplus
1018 static const
1020  .next_hdr = 0xff,
1021 };
1022 #endif
1023 
1030  uint8_t type;
1031  uint8_t code;
1032  uint16_t checksum;
1033 };
1034 
1036 #ifndef __cplusplus
1038  .type = 0xff,
1039  .code = 0xff,
1040 };
1041 #endif
1042 
1049  uint8_t type;
1050  uint8_t code;
1053  uint8_t target_addr[16];
1054 };
1055 
1057 #ifndef __cplusplus
1058 static const
1060  .target_addr =
1061  "\xff\xff\xff\xff\xff\xff\xff\xff"
1062  "\xff\xff\xff\xff\xff\xff\xff\xff",
1063 };
1064 #endif
1065 
1072  uint8_t type;
1073  uint8_t code;
1080  uint8_t target_addr[16];
1081 };
1082 
1084 #ifndef __cplusplus
1085 static const
1087  .target_addr =
1088  "\xff\xff\xff\xff\xff\xff\xff\xff"
1089  "\xff\xff\xff\xff\xff\xff\xff\xff",
1090 };
1091 #endif
1092 
1105  uint8_t type;
1106  uint8_t length;
1107 };
1108 
1110 #ifndef __cplusplus
1111 static const struct rte_flow_item_icmp6_nd_opt
1113  .type = 0xff,
1114 };
1115 #endif
1116 
1129  uint8_t type;
1130  uint8_t length;
1131  struct ether_addr sla;
1132 };
1133 
1135 #ifndef __cplusplus
1136 static const struct rte_flow_item_icmp6_nd_opt_sla_eth
1138  .sla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1139 };
1140 #endif
1141 
1154  uint8_t type;
1155  uint8_t length;
1156  struct ether_addr tla;
1157 };
1158 
1160 #ifndef __cplusplus
1161 static const struct rte_flow_item_icmp6_nd_opt_tla_eth
1163  .tla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1164 };
1165 #endif
1166 
1173  rte_be32_t data;
1174 };
1175 
1177 #ifndef __cplusplus
1179  .data = RTE_BE32(UINT32_MAX),
1180 };
1181 #endif
1182 
1202  uint32_t id;
1203 };
1204 
1240  const void *spec;
1241  const void *last;
1242  const void *mask;
1243 };
1244 
1278 
1286 
1294 
1303 
1311 
1319 
1326 
1335 
1345 
1354 
1362 
1370 
1378 
1385 
1393 
1401 
1409 
1417 
1425 
1433 
1442 
1451 
1459 
1467 
1475 
1483 
1491 
1499 
1507 
1516 
1524 
1533 
1540 
1547 
1557 
1567 
1577 
1587 
1598 
1609 
1620 
1627 
1634 
1644 
1654 };
1655 
1667  uint32_t id;
1668 };
1669 
1683  uint32_t group;
1684 };
1685 
1692  uint16_t index;
1693 };
1694 
1695 
1722  uint32_t shared:1;
1723  uint32_t reserved:31;
1724  uint32_t id;
1725 };
1726 
1733  uint32_t reset:1;
1734  uint32_t hits_set:1;
1735  uint32_t bytes_set:1;
1736  uint32_t reserved:29;
1737  uint64_t hits;
1738  uint64_t bytes;
1739 };
1740 
1784  uint32_t level;
1785  uint64_t types;
1786  uint32_t key_len;
1787  uint32_t queue_num;
1788  const uint8_t *key;
1789  const uint16_t *queue;
1790 };
1791 
1805  uint32_t original:1;
1806  uint32_t reserved:31;
1807  uint32_t id;
1808 };
1809 
1819  uint32_t original:1;
1820  uint32_t reserved:31;
1821  uint32_t index;
1822 };
1823 
1832  uint32_t original:1;
1833  uint32_t reserved:31;
1834  uint32_t id;
1835 };
1836 
1846  uint32_t mtr_id;
1847 };
1848 
1876 };
1877 
1885  uint8_t mpls_ttl;
1886 };
1887 
1895  uint8_t nw_ttl;
1896 };
1897 
1906 };
1907 
1916 };
1917 
1925  uint8_t vlan_pcp;
1926 };
1927 
1936 };
1937 
1946 };
1947 
1981 };
1982 
2015 };
2016 
2037  uint8_t *data;
2038  uint8_t *preserve;
2039  size_t size;
2040 };
2041 
2058  uint8_t *data;
2059  size_t size;
2060 };
2061 
2074  rte_be32_t ipv4_addr;
2075 };
2076 
2089  uint8_t ipv6_addr[16];
2090 };
2091 
2104  rte_be16_t port;
2105 };
2106 
2113  uint8_t ttl_value;
2114 };
2115 
2122  uint8_t mac_addr[ETHER_ADDR_LEN];
2123 };
2124 
2125 /*
2126  * Definition of a single action.
2127  *
2128  * A list of actions is terminated by a END action.
2129  *
2130  * For simple actions without a configuration structure, conf remains NULL.
2131  */
2132 struct rte_flow_action {
2133  enum rte_flow_action_type type;
2134  const void *conf;
2135 };
2136 
2143 struct rte_flow;
2144 
2169 };
2170 
2184  const void *cause;
2185  const char *message;
2186 };
2187 
2198  union {
2199  const struct rte_flow_attr *attr_ro;
2201  };
2202  union {
2203  const struct rte_flow_item *pattern_ro;
2205  };
2206  union {
2207  const struct rte_flow_action *actions_ro;
2208  struct rte_flow_action *actions;
2209  };
2210 };
2211 
2224 
2236 
2248 
2260 
2273 
2286 
2299 
2313 
2327 
2341 
2355 };
2356 
2409 int
2410 rte_flow_validate(uint16_t port_id,
2411  const struct rte_flow_attr *attr,
2412  const struct rte_flow_item pattern[],
2413  const struct rte_flow_action actions[],
2414  struct rte_flow_error *error);
2415 
2436 struct rte_flow *
2437 rte_flow_create(uint16_t port_id,
2438  const struct rte_flow_attr *attr,
2439  const struct rte_flow_item pattern[],
2440  const struct rte_flow_action actions[],
2441  struct rte_flow_error *error);
2442 
2463 int
2464 rte_flow_destroy(uint16_t port_id,
2465  struct rte_flow *flow,
2466  struct rte_flow_error *error);
2467 
2484 int
2485 rte_flow_flush(uint16_t port_id,
2486  struct rte_flow_error *error);
2487 
2512 int
2513 rte_flow_query(uint16_t port_id,
2514  struct rte_flow *flow,
2515  const struct rte_flow_action *action,
2516  void *data,
2517  struct rte_flow_error *error);
2518 
2560 int
2561 rte_flow_isolate(uint16_t port_id, int set, struct rte_flow_error *error);
2562 
2580 int
2581 rte_flow_error_set(struct rte_flow_error *error,
2582  int code,
2583  enum rte_flow_error_type type,
2584  const void *cause,
2585  const char *message);
2586 
2592  size_t size;
2595  struct rte_flow_action *actions;
2596  uint8_t data[];
2597 };
2598 
2625 __rte_deprecated
2626 size_t
2627 rte_flow_copy(struct rte_flow_desc *fd, size_t len,
2628  const struct rte_flow_attr *attr,
2629  const struct rte_flow_item *items,
2630  const struct rte_flow_action *actions);
2631 
2672 __rte_experimental
2673 int
2675  void *dst,
2676  size_t size,
2677  const void *src,
2678  struct rte_flow_error *error);
2679 
2680 #ifdef __cplusplus
2681 }
2682 #endif
2683 
2684 #endif /* RTE_FLOW_H_ */