DPDK  19.05.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_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 };
425 
438  uint32_t num;
439 };
440 
442 #ifndef __cplusplus
444  .num = 0x00000000,
445 };
446 #endif
447 
467  uint32_t id;
468 };
469 
471 #ifndef __cplusplus
473  .id = 0x00000000,
474 };
475 #endif
476 
498  uint32_t index;
499 };
500 
502 #ifndef __cplusplus
504  .index = 0x00000000,
505 };
506 #endif
507 
524  uint32_t id;
525 };
526 
528 #ifndef __cplusplus
530  .id = 0xffffffff,
531 };
532 #endif
533 
553  uint32_t relative:1;
554  uint32_t search:1;
555  uint32_t reserved:30;
556  int32_t offset;
557  uint16_t limit;
558  uint16_t length;
559  const uint8_t *pattern;
560 };
561 
563 #ifndef __cplusplus
565  .relative = 1,
566  .search = 1,
567  .reserved = 0x3fffffff,
568  .offset = 0xffffffff,
569  .limit = 0xffff,
570  .length = 0xffff,
571  .pattern = NULL,
572 };
573 #endif
574 
587  struct ether_addr dst;
588  struct ether_addr src;
590 };
591 
593 #ifndef __cplusplus
595  .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff",
596  .src.addr_bytes = "\xff\xff\xff\xff\xff\xff",
597  .type = RTE_BE16(0x0000),
598 };
599 #endif
600 
613 };
614 
616 #ifndef __cplusplus
618  .tci = RTE_BE16(0x0fff),
619  .inner_type = RTE_BE16(0x0000),
620 };
621 #endif
622 
631  struct ipv4_hdr hdr;
632 };
633 
635 #ifndef __cplusplus
637  .hdr = {
638  .src_addr = RTE_BE32(0xffffffff),
639  .dst_addr = RTE_BE32(0xffffffff),
640  },
641 };
642 #endif
643 
653  struct ipv6_hdr hdr;
654 };
655 
657 #ifndef __cplusplus
659  .hdr = {
660  .src_addr =
661  "\xff\xff\xff\xff\xff\xff\xff\xff"
662  "\xff\xff\xff\xff\xff\xff\xff\xff",
663  .dst_addr =
664  "\xff\xff\xff\xff\xff\xff\xff\xff"
665  "\xff\xff\xff\xff\xff\xff\xff\xff",
666  },
667 };
668 #endif
669 
676  struct icmp_hdr hdr;
677 };
678 
680 #ifndef __cplusplus
682  .hdr = {
683  .icmp_type = 0xff,
684  .icmp_code = 0xff,
685  },
686 };
687 #endif
688 
695  struct udp_hdr hdr;
696 };
697 
699 #ifndef __cplusplus
701  .hdr = {
702  .src_port = RTE_BE16(0xffff),
703  .dst_port = RTE_BE16(0xffff),
704  },
705 };
706 #endif
707 
714  struct tcp_hdr hdr;
715 };
716 
718 #ifndef __cplusplus
720  .hdr = {
721  .src_port = RTE_BE16(0xffff),
722  .dst_port = RTE_BE16(0xffff),
723  },
724 };
725 #endif
726 
733  struct sctp_hdr hdr;
734 };
735 
737 #ifndef __cplusplus
739  .hdr = {
740  .src_port = RTE_BE16(0xffff),
741  .dst_port = RTE_BE16(0xffff),
742  },
743 };
744 #endif
745 
752  uint8_t flags;
753  uint8_t rsvd0[3];
754  uint8_t vni[3];
755  uint8_t rsvd1;
756 };
757 
759 #ifndef __cplusplus
761  .vni = "\xff\xff\xff",
762 };
763 #endif
764 
781  uint8_t in_ecid_e;
782  uint8_t ecid_e;
784 };
785 
787 #ifndef __cplusplus
789  .rsvd_grp_ecid_b = RTE_BE16(0x3fff),
790 };
791 #endif
792 
807  uint8_t tni[3];
808  uint8_t flow_id;
809 };
810 
812 #ifndef __cplusplus
814  .tni = "\xff\xff\xff",
815 };
816 #endif
817 
827  uint8_t label_tc_s[3];
828  uint8_t ttl;
829 };
830 
832 #ifndef __cplusplus
834  .label_tc_s = "\xff\xff\xf0",
835 };
836 #endif
837 
850 };
851 
853 #ifndef __cplusplus
855  .protocol = RTE_BE16(0xffff),
856 };
857 #endif
858 
877  uint32_t thresh;
878 };
879 
881 #ifndef __cplusplus
883  .thresh = 0xffffffff,
884 };
885 #endif
886 
899  uint8_t v_pt_rsv_flags;
900  uint8_t msg_type;
903 };
904 
906 #ifndef __cplusplus
908  .teid = RTE_BE32(0xffffffff),
909 };
910 #endif
911 
918  struct esp_hdr hdr;
919 };
920 
922 #ifndef __cplusplus
924  .hdr = {
925  .spi = 0xffffffff,
926  },
927 };
928 #endif
929 
942  uint8_t vni[3];
943  uint8_t rsvd1;
944 };
945 
947 #ifndef __cplusplus
949  .vni = "\xff\xff\xff",
950 };
951 #endif
952 
959  uint8_t flags;
960  uint8_t rsvd0[2];
961  uint8_t protocol;
962  uint8_t vni[3];
963  uint8_t rsvd1;
964 };
965 
967 #ifndef __cplusplus
969  .vni = "\xff\xff\xff",
970 };
971 #endif
972 
981  uint8_t hln;
982  uint8_t pln;
984  struct ether_addr sha;
986  struct ether_addr tha;
988 };
989 
991 #ifndef __cplusplus
992 static const struct rte_flow_item_arp_eth_ipv4
994  .sha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
995  .spa = RTE_BE32(0xffffffff),
996  .tha.addr_bytes = "\xff\xff\xff\xff\xff\xff",
997  .tpa = RTE_BE32(0xffffffff),
998 };
999 #endif
1000 
1012  uint8_t next_hdr;
1013 };
1014 
1016 #ifndef __cplusplus
1017 static const
1019  .next_hdr = 0xff,
1020 };
1021 #endif
1022 
1029  uint8_t type;
1030  uint8_t code;
1031  uint16_t checksum;
1032 };
1033 
1035 #ifndef __cplusplus
1037  .type = 0xff,
1038  .code = 0xff,
1039 };
1040 #endif
1041 
1048  uint8_t type;
1049  uint8_t code;
1052  uint8_t target_addr[16];
1053 };
1054 
1056 #ifndef __cplusplus
1057 static const
1059  .target_addr =
1060  "\xff\xff\xff\xff\xff\xff\xff\xff"
1061  "\xff\xff\xff\xff\xff\xff\xff\xff",
1062 };
1063 #endif
1064 
1071  uint8_t type;
1072  uint8_t code;
1079  uint8_t target_addr[16];
1080 };
1081 
1083 #ifndef __cplusplus
1084 static const
1086  .target_addr =
1087  "\xff\xff\xff\xff\xff\xff\xff\xff"
1088  "\xff\xff\xff\xff\xff\xff\xff\xff",
1089 };
1090 #endif
1091 
1104  uint8_t type;
1105  uint8_t length;
1106 };
1107 
1109 #ifndef __cplusplus
1110 static const struct rte_flow_item_icmp6_nd_opt
1112  .type = 0xff,
1113 };
1114 #endif
1115 
1128  uint8_t type;
1129  uint8_t length;
1130  struct ether_addr sla;
1131 };
1132 
1134 #ifndef __cplusplus
1135 static const struct rte_flow_item_icmp6_nd_opt_sla_eth
1137  .sla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1138 };
1139 #endif
1140 
1153  uint8_t type;
1154  uint8_t length;
1155  struct ether_addr tla;
1156 };
1157 
1159 #ifndef __cplusplus
1160 static const struct rte_flow_item_icmp6_nd_opt_tla_eth
1162  .tla.addr_bytes = "\xff\xff\xff\xff\xff\xff",
1163 };
1164 #endif
1165 
1172  rte_be32_t data;
1173 };
1174 
1176 #ifndef __cplusplus
1178  .data = RTE_BE32(UINT32_MAX),
1179 };
1180 #endif
1181 
1201  uint32_t id;
1202 };
1203 
1239  const void *spec;
1240  const void *last;
1241  const void *mask;
1242 };
1243 
1277 
1285 
1293 
1302 
1310 
1318 
1325 
1334 
1344 
1353 
1361 
1369 
1377 
1384 
1392 
1400 
1408 
1416 
1424 
1432 
1441 
1450 
1458 
1466 
1474 
1482 
1490 
1498 
1506 
1515 
1523 
1532 
1539 
1546 
1556 
1566 
1576 
1586 
1597 
1608 
1619 
1626 
1633 
1643 
1653 };
1654 
1666  uint32_t id;
1667 };
1668 
1682  uint32_t group;
1683 };
1684 
1691  uint16_t index;
1692 };
1693 
1694 
1721  uint32_t shared:1;
1722  uint32_t reserved:31;
1723  uint32_t id;
1724 };
1725 
1732  uint32_t reset:1;
1733  uint32_t hits_set:1;
1734  uint32_t bytes_set:1;
1735  uint32_t reserved:29;
1736  uint64_t hits;
1737  uint64_t bytes;
1738 };
1739 
1744  RTE_ETH_HASH_FUNCTION_DEFAULT = 0,
1747  RTE_ETH_HASH_FUNCTION_MAX,
1748 };
1749 
1793  uint32_t level;
1794  uint64_t types;
1795  uint32_t key_len;
1796  uint32_t queue_num;
1797  const uint8_t *key;
1798  const uint16_t *queue;
1799 };
1800 
1814  uint32_t original:1;
1815  uint32_t reserved:31;
1816  uint32_t id;
1817 };
1818 
1828  uint32_t original:1;
1829  uint32_t reserved:31;
1830  uint32_t index;
1831 };
1832 
1841  uint32_t original:1;
1842  uint32_t reserved:31;
1843  uint32_t id;
1844 };
1845 
1855  uint32_t mtr_id;
1856 };
1857 
1885 };
1886 
1894  uint8_t mpls_ttl;
1895 };
1896 
1904  uint8_t nw_ttl;
1905 };
1906 
1915 };
1916 
1925 };
1926 
1934  uint8_t vlan_pcp;
1935 };
1936 
1945 };
1946 
1955 };
1956 
1990 };
1991 
2024 };
2025 
2046  uint8_t *data;
2047  uint8_t *preserve;
2048  size_t size;
2049 };
2050 
2067  uint8_t *data;
2068  size_t size;
2069 };
2070 
2083  rte_be32_t ipv4_addr;
2084 };
2085 
2098  uint8_t ipv6_addr[16];
2099 };
2100 
2113  rte_be16_t port;
2114 };
2115 
2122  uint8_t ttl_value;
2123 };
2124 
2131  uint8_t mac_addr[ETHER_ADDR_LEN];
2132 };
2133 
2134 /*
2135  * Definition of a single action.
2136  *
2137  * A list of actions is terminated by a END action.
2138  *
2139  * For simple actions without a configuration structure, conf remains NULL.
2140  */
2141 struct rte_flow_action {
2142  enum rte_flow_action_type type;
2143  const void *conf;
2144 };
2145 
2152 struct rte_flow;
2153 
2178 };
2179 
2193  const void *cause;
2194  const char *message;
2195 };
2196 
2207  union {
2208  const struct rte_flow_attr *attr_ro;
2210  };
2211  union {
2212  const struct rte_flow_item *pattern_ro;
2214  };
2215  union {
2216  const struct rte_flow_action *actions_ro;
2217  struct rte_flow_action *actions;
2218  };
2219 };
2220 
2233 
2245 
2257 
2269 
2282 
2295 
2308 
2322 
2336 
2350 
2364 };
2365 
2418 int
2419 rte_flow_validate(uint16_t port_id,
2420  const struct rte_flow_attr *attr,
2421  const struct rte_flow_item pattern[],
2422  const struct rte_flow_action actions[],
2423  struct rte_flow_error *error);
2424 
2445 struct rte_flow *
2446 rte_flow_create(uint16_t port_id,
2447  const struct rte_flow_attr *attr,
2448  const struct rte_flow_item pattern[],
2449  const struct rte_flow_action actions[],
2450  struct rte_flow_error *error);
2451 
2472 int
2473 rte_flow_destroy(uint16_t port_id,
2474  struct rte_flow *flow,
2475  struct rte_flow_error *error);
2476 
2493 int
2494 rte_flow_flush(uint16_t port_id,
2495  struct rte_flow_error *error);
2496 
2521 int
2522 rte_flow_query(uint16_t port_id,
2523  struct rte_flow *flow,
2524  const struct rte_flow_action *action,
2525  void *data,
2526  struct rte_flow_error *error);
2527 
2569 int
2570 rte_flow_isolate(uint16_t port_id, int set, struct rte_flow_error *error);
2571 
2589 int
2590 rte_flow_error_set(struct rte_flow_error *error,
2591  int code,
2592  enum rte_flow_error_type type,
2593  const void *cause,
2594  const char *message);
2595 
2601  size_t size;
2604  struct rte_flow_action *actions;
2605  uint8_t data[];
2606 };
2607 
2634 __rte_deprecated
2635 size_t
2636 rte_flow_copy(struct rte_flow_desc *fd, size_t len,
2637  const struct rte_flow_attr *attr,
2638  const struct rte_flow_item *items,
2639  const struct rte_flow_action *actions);
2640 
2681 __rte_experimental
2682 int
2684  void *dst,
2685  size_t size,
2686  const void *src,
2687  struct rte_flow_error *error);
2688 
2689 #ifdef __cplusplus
2690 }
2691 #endif
2692 
2693 #endif /* RTE_FLOW_H_ */