566 lines · c
1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */2#ifndef __LINUX_PKT_CLS_H3#define __LINUX_PKT_CLS_H4 5#include <linux/types.h>6#include <linux/pkt_sched.h>7 8#define TC_COOKIE_MAX_SIZE 169 10/* Action attributes */11enum {12 TCA_ACT_UNSPEC,13 TCA_ACT_KIND,14 TCA_ACT_OPTIONS,15 TCA_ACT_INDEX,16 TCA_ACT_STATS,17 TCA_ACT_PAD,18 TCA_ACT_COOKIE,19 __TCA_ACT_MAX20};21 22#define TCA_ACT_MAX __TCA_ACT_MAX23#define TCA_OLD_COMPAT (TCA_ACT_MAX+1)24#define TCA_ACT_MAX_PRIO 3225#define TCA_ACT_BIND 126#define TCA_ACT_NOBIND 027#define TCA_ACT_UNBIND 128#define TCA_ACT_NOUNBIND 029#define TCA_ACT_REPLACE 130#define TCA_ACT_NOREPLACE 031 32#define TC_ACT_UNSPEC (-1)33#define TC_ACT_OK 034#define TC_ACT_RECLASSIFY 135#define TC_ACT_SHOT 236#define TC_ACT_PIPE 337#define TC_ACT_STOLEN 438#define TC_ACT_QUEUED 539#define TC_ACT_REPEAT 640#define TC_ACT_REDIRECT 741#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu"42 * and don't further process the frame43 * in hardware. For sw path, this is44 * equivalent of TC_ACT_STOLEN - drop45 * the skb and act like everything46 * is alright.47 */48#define TC_ACT_VALUE_MAX TC_ACT_TRAP49 50/* There is a special kind of actions called "extended actions",51 * which need a value parameter. These have a local opcode located in52 * the highest nibble, starting from 1. The rest of the bits53 * are used to carry the value. These two parts together make54 * a combined opcode.55 */56#define __TC_ACT_EXT_SHIFT 2857#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT)58#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1)59#define TC_ACT_EXT_OPCODE(combined) ((combined) & (~TC_ACT_EXT_VAL_MASK))60#define TC_ACT_EXT_CMP(combined, opcode) (TC_ACT_EXT_OPCODE(combined) == opcode)61 62#define TC_ACT_JUMP __TC_ACT_EXT(1)63#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2)64#define TC_ACT_EXT_OPCODE_MAX TC_ACT_GOTO_CHAIN65 66/* Action type identifiers*/67enum {68 TCA_ID_UNSPEC=0,69 TCA_ID_POLICE=1,70 /* other actions go here */71 __TCA_ID_MAX=25572};73 74#define TCA_ID_MAX __TCA_ID_MAX75 76struct tc_police {77 __u32 index;78 int action;79#define TC_POLICE_UNSPEC TC_ACT_UNSPEC80#define TC_POLICE_OK TC_ACT_OK81#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY82#define TC_POLICE_SHOT TC_ACT_SHOT83#define TC_POLICE_PIPE TC_ACT_PIPE84 85 __u32 limit;86 __u32 burst;87 __u32 mtu;88 struct tc_ratespec rate;89 struct tc_ratespec peakrate;90 int refcnt;91 int bindcnt;92 __u32 capab;93};94 95struct tcf_t {96 __u64 install;97 __u64 lastuse;98 __u64 expires;99 __u64 firstuse;100};101 102struct tc_cnt {103 int refcnt;104 int bindcnt;105};106 107#define tc_gen \108 __u32 index; \109 __u32 capab; \110 int action; \111 int refcnt; \112 int bindcnt113 114enum {115 TCA_POLICE_UNSPEC,116 TCA_POLICE_TBF,117 TCA_POLICE_RATE,118 TCA_POLICE_PEAKRATE,119 TCA_POLICE_AVRATE,120 TCA_POLICE_RESULT,121 TCA_POLICE_TM,122 TCA_POLICE_PAD,123 __TCA_POLICE_MAX124#define TCA_POLICE_RESULT TCA_POLICE_RESULT125};126 127#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)128 129/* tca flags definitions */130#define TCA_CLS_FLAGS_SKIP_HW (1 << 0) /* don't offload filter to HW */131#define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */132#define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */133#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */134#define TCA_CLS_FLAGS_VERBOSE (1 << 4) /* verbose logging */135 136/* U32 filters */137 138#define TC_U32_HTID(h) ((h)&0xFFF00000)139#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20)140#define TC_U32_HASH(h) (((h)>>12)&0xFF)141#define TC_U32_NODE(h) ((h)&0xFFF)142#define TC_U32_KEY(h) ((h)&0xFFFFF)143#define TC_U32_UNSPEC 0144#define TC_U32_ROOT (0xFFF00000)145 146enum {147 TCA_U32_UNSPEC,148 TCA_U32_CLASSID,149 TCA_U32_HASH,150 TCA_U32_LINK,151 TCA_U32_DIVISOR,152 TCA_U32_SEL,153 TCA_U32_POLICE,154 TCA_U32_ACT,155 TCA_U32_INDEV,156 TCA_U32_PCNT,157 TCA_U32_MARK,158 TCA_U32_FLAGS,159 TCA_U32_PAD,160 __TCA_U32_MAX161};162 163#define TCA_U32_MAX (__TCA_U32_MAX - 1)164 165struct tc_u32_key {166 __be32 mask;167 __be32 val;168 int off;169 int offmask;170};171 172struct tc_u32_sel {173 unsigned char flags;174 unsigned char offshift;175 unsigned char nkeys;176 177 __be16 offmask;178 __u16 off;179 short offoff;180 181 short hoff;182 __be32 hmask;183 struct tc_u32_key keys[];184};185 186struct tc_u32_mark {187 __u32 val;188 __u32 mask;189 __u32 success;190};191 192struct tc_u32_pcnt {193 __u64 rcnt;194 __u64 rhit;195 __u64 kcnts[];196};197 198/* Flags */199 200#define TC_U32_TERMINAL 1201#define TC_U32_OFFSET 2202#define TC_U32_VAROFFSET 4203#define TC_U32_EAT 8204 205#define TC_U32_MAXDEPTH 8206 207/* ROUTE filter */208 209enum {210 TCA_ROUTE4_UNSPEC,211 TCA_ROUTE4_CLASSID,212 TCA_ROUTE4_TO,213 TCA_ROUTE4_FROM,214 TCA_ROUTE4_IIF,215 TCA_ROUTE4_POLICE,216 TCA_ROUTE4_ACT,217 __TCA_ROUTE4_MAX218};219 220#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1)221 222 223/* FW filter */224 225enum {226 TCA_FW_UNSPEC,227 TCA_FW_CLASSID,228 TCA_FW_POLICE,229 TCA_FW_INDEV,230 TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */231 TCA_FW_MASK,232 __TCA_FW_MAX233};234 235#define TCA_FW_MAX (__TCA_FW_MAX - 1)236 237/* Flow filter */238 239enum {240 FLOW_KEY_SRC,241 FLOW_KEY_DST,242 FLOW_KEY_PROTO,243 FLOW_KEY_PROTO_SRC,244 FLOW_KEY_PROTO_DST,245 FLOW_KEY_IIF,246 FLOW_KEY_PRIORITY,247 FLOW_KEY_MARK,248 FLOW_KEY_NFCT,249 FLOW_KEY_NFCT_SRC,250 FLOW_KEY_NFCT_DST,251 FLOW_KEY_NFCT_PROTO_SRC,252 FLOW_KEY_NFCT_PROTO_DST,253 FLOW_KEY_RTCLASSID,254 FLOW_KEY_SKUID,255 FLOW_KEY_SKGID,256 FLOW_KEY_VLAN_TAG,257 FLOW_KEY_RXHASH,258 __FLOW_KEY_MAX,259};260 261#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1)262 263enum {264 FLOW_MODE_MAP,265 FLOW_MODE_HASH,266};267 268enum {269 TCA_FLOW_UNSPEC,270 TCA_FLOW_KEYS,271 TCA_FLOW_MODE,272 TCA_FLOW_BASECLASS,273 TCA_FLOW_RSHIFT,274 TCA_FLOW_ADDEND,275 TCA_FLOW_MASK,276 TCA_FLOW_XOR,277 TCA_FLOW_DIVISOR,278 TCA_FLOW_ACT,279 TCA_FLOW_POLICE,280 TCA_FLOW_EMATCHES,281 TCA_FLOW_PERTURB,282 __TCA_FLOW_MAX283};284 285#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1)286 287/* Basic filter */288 289enum {290 TCA_BASIC_UNSPEC,291 TCA_BASIC_CLASSID,292 TCA_BASIC_EMATCHES,293 TCA_BASIC_ACT,294 TCA_BASIC_POLICE,295 __TCA_BASIC_MAX296};297 298#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1)299 300 301/* Cgroup classifier */302 303enum {304 TCA_CGROUP_UNSPEC,305 TCA_CGROUP_ACT,306 TCA_CGROUP_POLICE,307 TCA_CGROUP_EMATCHES,308 __TCA_CGROUP_MAX,309};310 311#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1)312 313/* BPF classifier */314 315#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0)316 317enum {318 TCA_BPF_UNSPEC,319 TCA_BPF_ACT,320 TCA_BPF_POLICE,321 TCA_BPF_CLASSID,322 TCA_BPF_OPS_LEN,323 TCA_BPF_OPS,324 TCA_BPF_FD,325 TCA_BPF_NAME,326 TCA_BPF_FLAGS,327 TCA_BPF_FLAGS_GEN,328 TCA_BPF_TAG,329 TCA_BPF_ID,330 __TCA_BPF_MAX,331};332 333#define TCA_BPF_MAX (__TCA_BPF_MAX - 1)334 335/* Flower classifier */336 337enum {338 TCA_FLOWER_UNSPEC,339 TCA_FLOWER_CLASSID,340 TCA_FLOWER_INDEV,341 TCA_FLOWER_ACT,342 TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */343 TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */344 TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */345 TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */346 TCA_FLOWER_KEY_ETH_TYPE, /* be16 */347 TCA_FLOWER_KEY_IP_PROTO, /* u8 */348 TCA_FLOWER_KEY_IPV4_SRC, /* be32 */349 TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */350 TCA_FLOWER_KEY_IPV4_DST, /* be32 */351 TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */352 TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */353 TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */354 TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */355 TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */356 TCA_FLOWER_KEY_TCP_SRC, /* be16 */357 TCA_FLOWER_KEY_TCP_DST, /* be16 */358 TCA_FLOWER_KEY_UDP_SRC, /* be16 */359 TCA_FLOWER_KEY_UDP_DST, /* be16 */360 361 TCA_FLOWER_FLAGS,362 TCA_FLOWER_KEY_VLAN_ID, /* be16 */363 TCA_FLOWER_KEY_VLAN_PRIO, /* u8 */364 TCA_FLOWER_KEY_VLAN_ETH_TYPE, /* be16 */365 366 TCA_FLOWER_KEY_ENC_KEY_ID, /* be32 */367 TCA_FLOWER_KEY_ENC_IPV4_SRC, /* be32 */368 TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */369 TCA_FLOWER_KEY_ENC_IPV4_DST, /* be32 */370 TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */371 TCA_FLOWER_KEY_ENC_IPV6_SRC, /* struct in6_addr */372 TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */373 TCA_FLOWER_KEY_ENC_IPV6_DST, /* struct in6_addr */374 TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */375 376 TCA_FLOWER_KEY_TCP_SRC_MASK, /* be16 */377 TCA_FLOWER_KEY_TCP_DST_MASK, /* be16 */378 TCA_FLOWER_KEY_UDP_SRC_MASK, /* be16 */379 TCA_FLOWER_KEY_UDP_DST_MASK, /* be16 */380 TCA_FLOWER_KEY_SCTP_SRC_MASK, /* be16 */381 TCA_FLOWER_KEY_SCTP_DST_MASK, /* be16 */382 383 TCA_FLOWER_KEY_SCTP_SRC, /* be16 */384 TCA_FLOWER_KEY_SCTP_DST, /* be16 */385 386 TCA_FLOWER_KEY_ENC_UDP_SRC_PORT, /* be16 */387 TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */388 TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */389 TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */390 391 TCA_FLOWER_KEY_FLAGS, /* be32 */392 TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */393 394 TCA_FLOWER_KEY_ICMPV4_CODE, /* u8 */395 TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */396 TCA_FLOWER_KEY_ICMPV4_TYPE, /* u8 */397 TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */398 TCA_FLOWER_KEY_ICMPV6_CODE, /* u8 */399 TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */400 TCA_FLOWER_KEY_ICMPV6_TYPE, /* u8 */401 TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */402 403 TCA_FLOWER_KEY_ARP_SIP, /* be32 */404 TCA_FLOWER_KEY_ARP_SIP_MASK, /* be32 */405 TCA_FLOWER_KEY_ARP_TIP, /* be32 */406 TCA_FLOWER_KEY_ARP_TIP_MASK, /* be32 */407 TCA_FLOWER_KEY_ARP_OP, /* u8 */408 TCA_FLOWER_KEY_ARP_OP_MASK, /* u8 */409 TCA_FLOWER_KEY_ARP_SHA, /* ETH_ALEN */410 TCA_FLOWER_KEY_ARP_SHA_MASK, /* ETH_ALEN */411 TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */412 TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */413 414 TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */415 TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */416 TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */417 TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */418 419 TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */420 TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */421 422 TCA_FLOWER_KEY_IP_TOS, /* u8 */423 TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */424 TCA_FLOWER_KEY_IP_TTL, /* u8 */425 TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */426 427 TCA_FLOWER_KEY_CVLAN_ID, /* be16 */428 TCA_FLOWER_KEY_CVLAN_PRIO, /* u8 */429 TCA_FLOWER_KEY_CVLAN_ETH_TYPE, /* be16 */430 431 TCA_FLOWER_KEY_ENC_IP_TOS, /* u8 */432 TCA_FLOWER_KEY_ENC_IP_TOS_MASK, /* u8 */433 TCA_FLOWER_KEY_ENC_IP_TTL, /* u8 */434 TCA_FLOWER_KEY_ENC_IP_TTL_MASK, /* u8 */435 436 TCA_FLOWER_KEY_ENC_OPTS,437 TCA_FLOWER_KEY_ENC_OPTS_MASK,438 439 TCA_FLOWER_IN_HW_COUNT,440 441 __TCA_FLOWER_MAX,442};443 444#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)445 446enum {447 TCA_FLOWER_KEY_ENC_OPTS_UNSPEC,448 TCA_FLOWER_KEY_ENC_OPTS_GENEVE, /* Nested449 * TCA_FLOWER_KEY_ENC_OPT_GENEVE_450 * attributes451 */452 __TCA_FLOWER_KEY_ENC_OPTS_MAX,453};454 455#define TCA_FLOWER_KEY_ENC_OPTS_MAX (__TCA_FLOWER_KEY_ENC_OPTS_MAX - 1)456 457enum {458 TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC,459 TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS, /* u16 */460 TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE, /* u8 */461 TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA, /* 4 to 128 bytes */462 463 __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX,464};465 466#define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \467 (__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1)468 469enum {470 TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),471 TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1),472};473 474/* Match-all classifier */475 476enum {477 TCA_MATCHALL_UNSPEC,478 TCA_MATCHALL_CLASSID,479 TCA_MATCHALL_ACT,480 TCA_MATCHALL_FLAGS,481 __TCA_MATCHALL_MAX,482};483 484#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1)485 486/* Extended Matches */487 488struct tcf_ematch_tree_hdr {489 __u16 nmatches;490 __u16 progid;491};492 493enum {494 TCA_EMATCH_TREE_UNSPEC,495 TCA_EMATCH_TREE_HDR,496 TCA_EMATCH_TREE_LIST,497 __TCA_EMATCH_TREE_MAX498};499#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1)500 501struct tcf_ematch_hdr {502 __u16 matchid;503 __u16 kind;504 __u16 flags;505 __u16 pad; /* currently unused */506};507 508/* 0 1509 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 510 * +-----------------------+-+-+---+511 * | Unused |S|I| R |512 * +-----------------------+-+-+---+513 *514 * R(2) ::= relation to next ematch515 * where: 0 0 END (last ematch)516 * 0 1 AND517 * 1 0 OR518 * 1 1 Unused (invalid)519 * I(1) ::= invert result520 * S(1) ::= simple payload521 */522#define TCF_EM_REL_END 0523#define TCF_EM_REL_AND (1<<0)524#define TCF_EM_REL_OR (1<<1)525#define TCF_EM_INVERT (1<<2)526#define TCF_EM_SIMPLE (1<<3)527 528#define TCF_EM_REL_MASK 3529#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK)530 531enum {532 TCF_LAYER_LINK,533 TCF_LAYER_NETWORK,534 TCF_LAYER_TRANSPORT,535 __TCF_LAYER_MAX536};537#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1)538 539/* Ematch type assignments540 * 1..32767 Reserved for ematches inside kernel tree541 * 32768..65535 Free to use, not reliable542 */543#define TCF_EM_CONTAINER 0544#define TCF_EM_CMP 1545#define TCF_EM_NBYTE 2546#define TCF_EM_U32 3547#define TCF_EM_META 4548#define TCF_EM_TEXT 5549#define TCF_EM_VLAN 6550#define TCF_EM_CANID 7551#define TCF_EM_IPSET 8552#define TCF_EM_IPT 9553#define TCF_EM_MAX 9554 555enum {556 TCF_EM_PROG_TC557};558 559enum {560 TCF_EM_OPND_EQ,561 TCF_EM_OPND_GT,562 TCF_EM_OPND_LT563};564 565#endif566