# Copyright 2018 syzkaller project authors. All rights reserved. # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. # AF_NETLINK/NETLINK_ROUTE SCHED support. include <linux/net.h> include <uapi/linux/if.h> include <uapi/linux/netlink.h> include <uapi/linux/rtnetlink.h> include <uapi/linux/netfilter.h> include <uapi/linux/if_packet.h> include <uapi/linux/can.h> include <uapi/linux/pkt_cls.h> include <uapi/linux/pkt_sched.h> include <uapi/linux/tc_act/tc_bpf.h> include <uapi/linux/tc_act/tc_connmark.h> include <uapi/linux/tc_act/tc_csum.h> include <uapi/linux/tc_act/tc_defact.h> include <uapi/linux/tc_act/tc_gact.h> include <uapi/linux/tc_act/tc_ife.h> include <uapi/linux/tc_act/tc_ipt.h> include <uapi/linux/tc_act/tc_mirred.h> include <uapi/linux/tc_act/tc_nat.h> include <uapi/linux/tc_act/tc_pedit.h> include <uapi/linux/tc_act/tc_sample.h> include <uapi/linux/tc_act/tc_skbedit.h> include <uapi/linux/tc_act/tc_skbmod.h> include <uapi/linux/tc_act/tc_tunnel_key.h> include <uapi/linux/tc_act/tc_vlan.h> include <uapi/linux/tc_ematch/tc_em_cmp.h> include <uapi/linux/tc_ematch/tc_em_ipt.h> include <uapi/linux/tc_ematch/tc_em_meta.h> sendmsg$nl_route_sched(fd sock_nl_route, msg ptr[in, msghdr_netlink[netlink_msg_route_sched]], f flags[send_flags]) netlink_msg_route_sched [ newqdisc netlink_msg[RTM_NEWQDISC, tcmsg[AF_UNSPEC], qdisc_policy] delqdisc netlink_msg[RTM_DELQDISC, tcmsg[AF_UNSPEC], qdisc_policy] getqdisc netlink_msg[RTM_GETQDISC, tcmsg[AF_UNSPEC], nlattr[TCA_DUMP_INVISIBLE, void]] newtclass netlink_msg[RTM_NEWTCLASS, tcmsg[AF_UNSPEC], tclass_policy] deltclass netlink_msg[RTM_DELTCLASS, tcmsg[AF_UNSPEC], tclass_policy] gettclass netlink_msg[RTM_GETTCLASS, tcmsg[AF_UNSPEC], void] newtfilter netlink_msg[RTM_NEWTFILTER, tcmsg[AF_UNSPEC], filter_policy] deltfilter netlink_msg[RTM_DELTFILTER, tcmsg[AF_UNSPEC], filter_policy] gettfilter netlink_msg[RTM_GETTFILTER, tcmsg[AF_UNSPEC], nlattr[TCA_CHAIN, int32]] newtaction netlink_msg[RTM_NEWACTION, tcamsg[AF_UNSPEC], nlattr[TCA_ACT_TAB, tca_actions]] deltaction netlink_msg[RTM_DELACTION, tcamsg[AF_UNSPEC], action_gd_policy] gettaction netlink_msg[RTM_GETACTION, tcamsg[AF_UNSPEC], action_dump_policy] ] [varlen] type tcmsg[FAMILY] { family const[FAMILY, int8] ifindex ifindex tcm_handle tcm_handle tcm_parent tcm_handle tcm_info tcm_handle } tcm_handle { minor flags[tcm_handle_offsets, int16] major flags[tcm_handle_offsets, int16] } type tcamsg[FAMILY] { family const[FAMILY, int8] tca__pad1 int8 tca__pad2 int16 } qdisc_policy [ qdisc_kind_options qdisc_kind_options TCA_RATE nlattr[TCA_RATE, tc_estimator] TCA_STAB nlattr[TCA_STAB, array[stab_policy]] TCA_INGRESS_BLOCK nlattr[TCA_INGRESS_BLOCK, int32] TCA_EGRESS_BLOCK nlattr[TCA_EGRESS_BLOCK, int32] ] [varlen] tclass_policy [ tclass_kind_options tclass_kind_options TCA_RATE nlattr[TCA_RATE, tc_estimator] ] [varlen] filter_policy [ filter_kind_options filter_kind_options TCA_RATE nlattr[TCA_RATE, tc_estimator] TCA_CHAIN nlattr[TCA_CHAIN, int32] ] [varlen] type tca_kind_options_t[NAME, VALUES] { TCA_KIND nlattr[TCA_KIND, string[NAME]] TCA_OPTIONS nlattr[TCA_OPTIONS, VALUES] } # ------------------------------ tc qdisc ------------------------------ qdisc_kind_options [ q_cbq tca_kind_options_t["cbq", array[q_cbq_options]] q_cbs tca_kind_options_t["cbs", q_cbs_options] q_choke tca_kind_options_t["choke", array[q_choke_options]] q_codel tca_kind_options_t["codel", array[q_codel_options]] q_dsmark tca_kind_options_t["dsmark", array[q_dsmark_options]] q_bfifo tca_kind_options_t["bfifo", int32] q_pfifo tca_kind_options_t["pfifo", int32] q_pfifo_head_drop tca_kind_options_t["pfifo_head_drop", int32] q_fq tca_kind_options_t["fq", array[q_fq_options]] q_fq_codel tca_kind_options_t["fq_codel", array[q_fq_codel_options]] q_gred tca_kind_options_t["gred", array[q_gred_options]] q_hfsc tca_kind_options_t["hfsc", int16] q_hhf tca_kind_options_t["hhf", array[q_hhf_options]] q_htb tca_kind_options_t["htb", array[q_htb_options]] q_mqprio tca_kind_options_t["mqprio", tc_mqprio_message] q_multiq tca_kind_options_t["multiq", tc_multiq_qopt] q_netem tca_kind_options_t["netem", tc_netem_message] q_pie tca_kind_options_t["pie", array[q_pie_options]] q_prio tca_kind_options_t["prio", tc_prio_qopt] q_red tca_kind_options_t["red", array[q_red_options]] q_sfb tca_kind_options_t["sfb", q_sfb_options] q_sfq tca_kind_options_t["sfq", tc_sfq_qopt_v1] q_tbf tca_kind_options_t["tbf", array[q_tbf_options]] ] [varlen] q_cbq_options [ TCA_CBQ_LSSOPT nlattr[TCA_CBQ_LSSOPT, tc_cbq_lssopt] TCA_CBQ_WRROPT nlattr[TCA_CBQ_WRROPT, tc_cbq_wrropt] TCA_CBQ_FOPT nlattr[TCA_CBQ_FOPT, tc_cbq_fopt] TCA_CBQ_RATE nlattr[TCA_CBQ_RATE, tc_ratespec] TCA_CBQ_RTAB nlattr[TCA_CBQ_RTAB, array[int32, 256]] ] [varlen] q_cbs_options [ TCA_CBS_PARMS nlattr[TCA_CBS_PARMS, tc_cbs_qopt] ] [varlen] q_choke_options [ TCA_CHOKE_PARMS nlattr[TCA_CHOKE_PARMS, tc_red_qopt] TCA_CHOKE_STAB nlattr[TCA_CHOKE_STAB, array[int8, 256]] TCA_CHOKE_MAX_P nlattr[TCA_CHOKE_MAX_P, int32] ] [varlen] q_codel_options [ TCA_CODEL_TARGET nlattr[TCA_CODEL_TARGET, int32] TCA_CODEL_LIMIT nlattr[TCA_CODEL_LIMIT, int32] TCA_CODEL_INTERVAL nlattr[TCA_CODEL_INTERVAL, int32] TCA_CODEL_ECN nlattr[TCA_CODEL_ECN, int32[0:1]] TCA_CODEL_CE_THRESHOLD nlattr[TCA_CODEL_CE_THRESHOLD, int32] ] [varlen] q_dsmark_options [ TCA_DSMARK_INDICES nlattr[TCA_DSMARK_INDICES, flags[tca_dsmark_ind, int16]] TCA_DSMARK_DEFAULT_INDEX nlattr[TCA_DSMARK_DEFAULT_INDEX, int16] TCA_DSMARK_SET_TC_INDEX nlattr[TCA_DSMARK_SET_TC_INDEX, void] ] [varlen] q_fq_options [ TCA_FQ_PLIMIT nlattr[TCA_FQ_PLIMIT, int32] TCA_FQ_FLOW_PLIMIT nlattr[TCA_FQ_FLOW_PLIMIT, int32] TCA_FQ_QUANTUM nlattr[TCA_FQ_QUANTUM, int32] TCA_FQ_INITIAL_QUANTUM nlattr[TCA_FQ_INITIAL_QUANTUM, int32] TCA_FQ_RATE_ENABLE nlattr[TCA_FQ_RATE_ENABLE, int32[0:1]] TCA_FQ_FLOW_DEFAULT_RATE nlattr[TCA_FQ_FLOW_DEFAULT_RATE, int32] TCA_FQ_FLOW_MAX_RATE nlattr[TCA_FQ_FLOW_MAX_RATE, int32] TCA_FQ_BUCKETS_LOG nlattr[TCA_FQ_BUCKETS_LOG, int32[0:32]] TCA_FQ_FLOW_REFILL_DELAY nlattr[TCA_FQ_FLOW_REFILL_DELAY, int32] TCA_FQ_ORPHAN_MASK nlattr[TCA_FQ_ORPHAN_MASK, int32] TCA_FQ_LOW_RATE_THRESHOLD nlattr[TCA_FQ_LOW_RATE_THRESHOLD, int32] ] [varlen] q_fq_codel_options [ TCA_FQ_CODEL_TARGET nlattr[TCA_FQ_CODEL_TARGET, int32] TCA_FQ_CODEL_LIMIT nlattr[TCA_FQ_CODEL_LIMIT, int32] TCA_FQ_CODEL_INTERVAL nlattr[TCA_FQ_CODEL_INTERVAL, int32] TCA_FQ_CODEL_ECN nlattr[TCA_FQ_CODEL_ECN, int32[0:1]] TCA_FQ_CODEL_FLOWS nlattr[TCA_FQ_CODEL_FLOWS, int32] TCA_FQ_CODEL_QUANTUM nlattr[TCA_FQ_CODEL_QUANTUM, int32] TCA_FQ_CODEL_CE_THRESHOLD nlattr[TCA_FQ_CODEL_CE_THRESHOLD, int32] TCA_FQ_CODEL_DROP_BATCH_SIZE nlattr[TCA_FQ_CODEL_DROP_BATCH_SIZE, int32] TCA_FQ_CODEL_MEMORY_LIMIT nlattr[TCA_FQ_CODEL_MEMORY_LIMIT, int32] ] [varlen] # TODO: we should not have TCA_GRED_PARMS and TCA_GRED_STAB when do init q_gred_options [ TCA_GRED_PARMS nlattr[TCA_GRED_PARMS, tc_gred_qopt] TCA_GRED_STAB nlattr[TCA_GRED_STAB, array[int8, 256]] TCA_GRED_DPS nlattr[TCA_GRED_DPS, tc_gred_sopt] TCA_GRED_MAX_P nlattr[TCA_GRED_MAX_P, int32] TCA_GRED_LIMIT nlattr[TCA_GRED_LIMIT, int32] ] [varlen] q_hhf_options [ TCA_HHF_BACKLOG_LIMIT nlattr[TCA_HHF_BACKLOG_LIMIT, int32] TCA_HHF_QUANTUM nlattr[TCA_HHF_QUANTUM, int32] TCA_HHF_HH_FLOWS_LIMIT nlattr[TCA_HHF_HH_FLOWS_LIMIT, int32] TCA_HHF_RESET_TIMEOUT nlattr[TCA_HHF_RESET_TIMEOUT, int32] TCA_HHF_ADMIT_BYTES nlattr[TCA_HHF_ADMIT_BYTES, int32] TCA_HHF_EVICT_TIMEOUT nlattr[TCA_HHF_EVICT_TIMEOUT, int32] TCA_HHF_NON_HH_WEIGHT nlattr[TCA_HHF_NON_HH_WEIGHT, int32] ] [varlen] q_htb_options [ TCA_HTB_INIT nlattr[TCA_HTB_INIT, tc_htb_glob] TCA_HTB_DIRECT_QLEN nlattr[TCA_HTB_DIRECT_QLEN, int32] ] [varlen] tc_mqprio_message { qopt tc_mqprio_qopt attrs array[q_mqprio_options] } q_mqprio_options [ TCA_MQPRIO_MODE nlattr[TCA_MQPRIO_MODE, flags[tc_mqprio_modes, int32]] TCA_MQPRIO_SHAPER nlattr[TCA_MQPRIO_SHAPER, flags[tc_mqprio_shapers, int32]] TCA_MQPRIO_MIN_RATE64 nlattr[TCA_MQPRIO_MIN_RATE64, array[nlattr[TCA_MQPRIO_MIN_RATE64, int64], 0:16]] TCA_MQPRIO_MAX_RATE64 nlattr[TCA_MQPRIO_MAX_RATE64, array[nlattr[TCA_MQPRIO_MAX_RATE64, int64], 0:16]] ] [varlen] tc_netem_message { qopt tc_netem_qopt attrs array[q_netem_options] } q_netem_options [ TCA_NETEM_CORR nlattr[TCA_NETEM_CORR, tc_netem_corr] TCA_NETEM_DELAY_DIST nlattr[TCA_NETEM_DELAY_DIST, array[int8, 0:100]] TCA_NETEM_REORDER nlattr[TCA_NETEM_REORDER, tc_netem_reorder] TCA_NETEM_CORRUPT nlattr[TCA_NETEM_CORRUPT, tc_netem_corrupt] TCA_NETEM_LOSS nlattr[TCA_NETEM_LOSS, array[netem_loss_policy]] TCA_NETEM_RATE nlattr[TCA_NETEM_RATE, tc_netem_rate] TCA_NETEM_ECN nlattr[TCA_NETEM_ECN, int32[0:1]] TCA_NETEM_RATE64 nlattr[TCA_NETEM_RATE64, int64[0x100000000:0xffffffffffffffff]] TCA_NETEM_LATENCY64 nlattr[TCA_NETEM_LATENCY64, int64] TCA_NETEM_JITTER64 nlattr[TCA_NETEM_JITTER64, int64] TCA_NETEM_SLOT nlattr[TCA_NETEM_SLOT, tc_netem_slot] ] [varlen] netem_loss_policy [ NETEM_LOSS_GI nlattr[NETEM_LOSS_GI, tc_netem_gimodel] NETEM_LOSS_GE nlattr[NETEM_LOSS_GE, tc_netem_gemodel] ] [varlen] q_pie_options [ TCA_PIE_TARGET nlattr[TCA_PIE_TARGET, int32] TCA_PIE_LIMIT nlattr[TCA_PIE_LIMIT, int32] TCA_PIE_TUPDATE nlattr[TCA_PIE_TUPDATE, int32] TCA_PIE_ALPHA nlattr[TCA_PIE_ALPHA, int32[0:32]] TCA_PIE_BETA nlattr[TCA_PIE_BETA, int32[0:32]] TCA_PIE_ECN nlattr[TCA_PIE_ECN, int32[0:1]] TCA_PIE_BYTEMODE nlattr[TCA_PIE_BYTEMODE, int32[0:1]] ] [varlen] q_red_options [ TCA_RED_PARMS nlattr[TCA_RED_PARMS, tc_red_qopt] TCA_RED_STAB nlattr[TCA_RED_STAB, array[int8, 256]] TCA_RED_MAX_P nlattr[TCA_RED_MAX_P, int32] ] [varlen] q_sfb_options [ TCA_SFB_PARMS nlattr[TCA_SFB_PARMS, tc_sfb_qopt] ] [varlen] q_tbf_options [ TCA_TBF_PARMS nlattr[TCA_TBF_PARMS, tc_tbf_qopt] TCA_TBF_RTAB nlattr[TCA_TBF_RTAB, array[int32, 256]] TCA_TBF_PTAB nlattr[TCA_TBF_PTAB, array[int32, 256]] TCA_TBF_RATE64 nlattr[TCA_TBF_RATE64, int64[0x100000000:0xffffffffffffffff]] TCA_TBF_PRATE64 nlattr[TCA_TBF_PRATE64, int64[0x100000000:0xffffffffffffffff]] TCA_TBF_BURST nlattr[TCA_TBF_BURST, int32] TCA_TBF_PBURST nlattr[TCA_TBF_PBURST, int32[0:9000]] ] [varlen] tc_cbq_lssopt { change int8[0:64] flags int8[0:3] ewma_log int8[0:32] level int8 maxidle int32 minidle int32 offtime int32 avpkt int32 } tc_cbq_wrropt { flags int8 priority int8[0:TC_CBQ_MAXPRIO] cpriority int8 __reserved int8 allot int32 weight int32 } tc_cbq_fopt { split tcm_handle defmap int32 defchange int32 } tc_cbs_qopt { offload int8 _pad array[int8, 3] hicredit int32 locredit int32 idleslope int32 sendslope int32 } # TODO: limit >= qth_max >= qth_min tc_red_qopt { limit int32 qth_min int32 qth_max int32 Wlog int8[0:32] Plog int8[0:32] Scell_log int8[0:32] flag int8[0:8] } tc_gred_sopt { DPs int32[0:16] def_DP int32[0:16] grio int8[0:1] flags int8[0:8] pad1 int16 } tc_gred_qopt { limit int32 qth_min int32 qth_max int32 DP int32[0:16] backlog int32 qave int32 forced int32 early int32 other int32 pdrop int32 Wlog int8[0:32] Plog int8[0:32] Scell_log int8[0:32] prio int8 packets int32 bytesin int32 } tc_htb_glob { version const[3, int32] rate2quantum int32 defcls int32 debug const[0, int32] direct_pkts const[0, int32] } tc_mqprio_qopt { num_tc int8 prio_tc_map array[int8, 16] hw int8 count array[int16, TC_QOPT_MAX_QUEUE] offset array[int16, TC_QOPT_MAX_QUEUE] } tc_multiq_qopt { bands int16 max_bands int16 } tc_netem_qopt { latency int32 limit int32 loss int32 gap int32 duplicate int32 jitter int32 } tc_netem_corr { delay_corr int32 loss_corr int32 dup_corr int32 } tc_netem_reorder { probability int32 correlation int32 } tc_netem_corrupt { probability int32 correlation int32 } tc_netem_rate { rate int32 packet_overhead int32 cell_size int32 cell_overhead int32 } tc_netem_slot { min_delay int64 max_delay int64 max_packets int32 max_bytes int32 } tc_netem_gimodel { p13 int32 p31 int32 p32 int32 p14 int32 p23 int32 } tc_netem_gemodel { p int32 r int32 h int32 k1 int32 } tc_prio_qopt { bands int32 priomap array[int8, 16] } tc_sfb_qopt { rehash_interval int32 warmup_time int32 max int32 bin_size int32 increment int32 decrement int32 limit int32 penalty_rate int32 penalty_burst int32 } tc_sfq_qopt_v1 { v0 tc_sfq_qopt depth int32 headdrop int32[0:1] limit int32 qth_min int32 qth_max int32 Wlog int8[0:32] Plog int8[0:32] Scell_log int8[0:32] flag int8[0:8] stats tc_sfqred_stats } tc_sfq_qopt { quantum int32 perturb_period int32 limit int32 divisor int32 flows int32 } tc_sfqred_stats { prob_drop int32 forced_drop int32 prob_mark int32 forced_mark int32 prob_mark_head int32 forced_mark_head int32 } tc_tbf_qopt [ rate tc_ratespec peakrate tc_ratespec limit int32 buffer int32 mtu int32[0:9000] ] # ------------------------------ tc class ------------------------------ tclass_kind_options [ c_atm tca_kind_options_t["atm", array[c_atm_options]] c_cbq tca_kind_options_t["cbq", array[c_cbq_options]] c_drr tca_kind_options_t["drr", c_drr_options] c_dsmark tca_kind_options_t["dsmark", c_dsmark_options] c_hfsc tca_kind_options_t["hfsc", array[c_hfsc_options]] c_htb tca_kind_options_t["htb", array[c_htb_options]] c_qfq tca_kind_options_t["qfq", array[c_qfq_options]] ] [varlen] c_atm_options [ TCA_ATM_FD nlattr[TCA_ATM_FD, sock] TCA_ATM_HDR nlattr[TCA_ATM_HDR, array[int8, 0:64]] TCA_ATM_EXCESS nlattr[TCA_ATM_EXCESS, tcm_handle] ] [varlen] type c_cbq_options q_cbq_options c_drr_options [ TCA_DRR_QUANTUM nlattr[TCA_DRR_QUANTUM, int32] ] [varlen] c_dsmark_options [ TCA_DSMARK_MASK nlattr[TCA_DSMARK_MASK, int8] TCA_DSMARK_VALUE nlattr[TCA_DSMARK_VALUE, int8] ] [varlen] c_hfsc_options [ TCA_HFSC_RSC nlattr[TCA_HFSC_RSC, tc_service_curve] TCA_HFSC_FSC nlattr[TCA_HFSC_FSC, tc_service_curve] TCA_HFSC_USC nlattr[TCA_HFSC_USC, tc_service_curve] ] [varlen] c_htb_options [ TCA_HTB_PARMS nlattr[TCA_HTB_PARMS, tc_htb_opt] TCA_HTB_CTAB nlattr[TCA_HTB_CTAB, array[int32, 256]] TCA_HTB_RTAB nlattr[TCA_HTB_RTAB, array[int32, 256]] TCA_HTB_RATE64 nlattr[TCA_HTB_RATE64, int64] TCA_HTB_CEIL64 nlattr[TCA_HTB_CEIL64, int64] ] [varlen] c_qfq_options [ TCA_QFQ_WEIGHT nlattr[TCA_QFQ_WEIGHT, int32] TCA_QFQ_LMAX nlattr[TCA_QFQ_LMAX, int32] ] [varlen] tc_service_curve { m1 int32 d int32 m2 int32 } tc_htb_opt { rate tc_ratespec ceil tc_ratespec buffer int32 cbuffer int32 quantum int32 level int32 prio int32 } # ------------------------------ tc filter ------------------------------ filter_kind_options [ f_basic tca_kind_options_t["basic", array[f_basic_options]] f_bpf tca_kind_options_t["bpf", array[f_bpf_options]] f_cgroup tca_kind_options_t["cgroup", array[f_cgroup_options]] f_flow tca_kind_options_t["flow", array[f_flow_options]] f_fw tca_kind_options_t["fw", array[f_fw_options]] f_matchall tca_kind_options_t["matchall", array[f_matchall_options]] f_route tca_kind_options_t["route", array[f_route_options]] f_rsvp tca_kind_options_t["rsvp", array[f_rfvp_options]] f_rsvp6 tca_kind_options_t["rsvp6", array[f_rfvp6_options]] f_tcindex tca_kind_options_t["tcindex", array[f_tcindex_options]] f_u32 tca_kind_options_t["u32", array[f_u32_options]] ] [varlen] f_basic_options [ TCA_BASIC_CLASSID nlattr[TCA_BASIC_CLASSID, tcm_handle] TCA_BASIC_EMATCHES nlattr[TCA_BASIC_EMATCHES, array[tca_ematches]] TCA_BASIC_ACT nlattr[TCA_BASIC_ACT, tca_actions] TCA_BASIC_POLICE nlattr[TCA_BASIC_POLICE, tca_polices] ] [varlen] f_bpf_options [ TCA_BPF_ACT nlattr[TCA_BPF_ACT, tca_actions] TCA_BPF_POLICE nlattr[TCA_BPF_POLICE, tca_polices] TCA_BPF_CLASSID nlattr[TCA_BPF_CLASSID, tcm_handle] # TODO: TCA_BPF_OPS should equal to TCA_BPF_OPS_LEN * sizeof(struct sock_filter) TCA_BPF_OPS_LEN nlattr[TCA_BPF_OPS_LEN, int16[0:10]] TCA_BPF_OPS nlattr[TCA_BPF_OPS, array[sock_filter]] TCA_BPF_FD nlattr[TCA_BPF_FD, fd] TCA_BPF_NAME nlattr[TCA_BPF_NAME, string[filename]] TCA_BPF_FLAGS nlattr[TCA_BPF_FLAGS, int32[0:1]] TCA_BPF_FLAGS_GEN nlattr[TCA_BPF_FLAGS_GEN, int32[0:8]] ] [varlen] f_cgroup_options [ TCA_CGROUP_ACT nlattr[TCA_CGROUP_ACT, tca_actions] TCA_CGROUP_POLICE nlattr[TCA_CGROUP_POLICE, tca_polices] TCA_CGROUP_EMATCHES nlattr[TCA_CGROUP_EMATCHES, array[tca_ematches]] ] [varlen] f_flow_options [ TCA_FLOW_KEYS nlattr[TCA_FLOW_KEYS, int32[0:0x1ffff]] TCA_FLOW_MODE nlattr[TCA_FLOW_MODE, flags[tc_flow_modes, int32]] TCA_FLOW_BASECLASS nlattr[TCA_FLOW_BASECLASS, tcm_handle] TCA_FLOW_RSHIFT nlattr[TCA_FLOW_RSHIFT, int32] TCA_FLOW_ADDEND nlattr[TCA_FLOW_ADDEND, int32] TCA_FLOW_MASK nlattr[TCA_FLOW_MASK, int32] TCA_FLOW_XOR nlattr[TCA_FLOW_XOR, int32] TCA_FLOW_DIVISOR nlattr[TCA_FLOW_DIVISOR, int32] TCA_FLOW_ACT nlattr[TCA_FLOW_ACT, tca_actions] TCA_FLOW_POLICE nlattr[TCA_FLOW_POLICE, tca_polices] TCA_FLOW_EMATCHES nlattr[TCA_FLOW_EMATCHES, array[tca_ematches]] TCA_FLOW_PERTURB nlattr[TCA_FLOW_PERTURB, int32] ] [varlen] f_fw_options [ TCA_FW_CLASSID nlattr[TCA_FW_CLASSID, tcm_handle] TCA_FW_POLICE nlattr[TCA_FW_POLICE, tca_polices] TCA_FW_INDEV nlattr[TCA_FW_INDEV, devname] TCA_FW_ACT nlattr[TCA_FW_ACT, tca_actions] TCA_FW_MASK nlattr[TCA_FW_MASK, int32] ] [varlen] f_matchall_options [ TCA_MATCHALL_CLASSID nlattr[TCA_MATCHALL_CLASSID, tcm_handle] TCA_MATCHALL_ACT nlattr[TCA_MATCHALL_ACT, tca_actions] TCA_MATCHALL_FLAGS nlattr[TCA_MATCHALL_FLAGS, int32[0:8]] ] [varlen] f_route_options [ TCA_ROUTE4_CLASSID nlattr[TCA_ROUTE4_CLASSID, tcm_handle] TCA_ROUTE4_TO nlattr[TCA_ROUTE4_TO, int32[0:256]] TCA_ROUTE4_FROM nlattr[TCA_ROUTE4_FROM, int32[0:256]] TCA_ROUTE4_IIF nlattr[TCA_ROUTE4_IIF, devname] TCA_ROUTE4_POLICE nlattr[TCA_ROUTE4_POLICE, tca_polices] TCA_ROUTE4_ACT nlattr[TCA_ROUTE4_ACT, tca_actions] ] [varlen] f_rfvp_options [ TCA_RSVP_CLASSID nlattr[TCA_RSVP_CLASSID, tcm_handle] TCA_RSVP_DST nlattr[TCA_RSVP_DST, ipv4_addr] TCA_RSVP_SRC nlattr[TCA_RSVP_SRC, ipv4_addr] TCA_RSVP_PINFO nlattr[TCA_RSVP_PINFO, tc_rsvp_pinfo] TCA_RSVP_POLICE nlattr[TCA_RSVP_POLICE, tca_polices] TCA_RSVP_ACT nlattr[TCA_RSVP_ACT, tca_actions] ] [varlen] f_rfvp6_options [ TCA_RSVP_CLASSID nlattr[TCA_RSVP_CLASSID, tcm_handle] TCA_RSVP_DST nlattr[TCA_RSVP_DST, ipv6_addr] TCA_RSVP_SRC nlattr[TCA_RSVP_SRC, ipv6_addr] TCA_RSVP_PINFO nlattr[TCA_RSVP_PINFO, tc_rsvp_pinfo] TCA_RSVP_POLICE nlattr[TCA_RSVP_POLICE, tca_polices] TCA_RSVP_ACT nlattr[TCA_RSVP_ACT, tca_actions] ] [varlen] f_tcindex_options [ TCA_TCINDEX_HASH nlattr[TCA_TCINDEX_HASH, int32[0:0x10000]] TCA_TCINDEX_MASK nlattr[TCA_TCINDEX_MASK, int16] TCA_TCINDEX_SHIFT nlattr[TCA_TCINDEX_SHIFT, int32] TCA_TCINDEX_FALL_THROUGH nlattr[TCA_TCINDEX_FALL_THROUGH, int32[0:1]] TCA_TCINDEX_CLASSID nlattr[TCA_TCINDEX_CLASSID, tcm_handle] TCA_TCINDEX_POLICE nlattr[TCA_TCINDEX_POLICE, tca_polices] TCA_TCINDEX_ACT nlattr[TCA_TCINDEX_ACT, tca_actions] ] [varlen] f_u32_options [ TCA_U32_CLASSID nlattr[TCA_U32_CLASSID, tcm_handle] TCA_U32_HASH nlattr[TCA_U32_HASH, int32] TCA_U32_LINK nlattr[TCA_U32_LINK, int32] TCA_U32_DIVISOR nlattr[TCA_U32_DIVISOR, int32[0:0x100]] TCA_U32_SEL nlattr[TCA_U32_SEL, tc_u32_sel] TCA_U32_POLICE nlattr[TCA_U32_POLICE, tca_polices] TCA_U32_ACT nlattr[TCA_U32_ACT, tca_actions] TCA_U32_INDEV nlattr[TCA_U32_INDEV, devname] TCA_U32_MARK nlattr[TCA_U32_MARK, tc_u32_mark] TCA_U32_FLAGS nlattr[TCA_U32_FLAGS, int32[0:8]] ] [varlen] tc_rsvp_gpi { key int32 mask int32 offset int32 } tc_rsvp_pinfo { dpi tc_rsvp_gpi spi tc_rsvp_gpi protocol flags[ipv4_types, int8] tunnelid int8 tunnelhdr int8 pad int8 } tc_u32_sel { flags int8[0:16] offshift int8 nkeys int8 offmast int16be off int16 offoff int16 hoff int16 hmast int32be keys array[tc_u32_key, 0:128] } # TODO: (mark.val & mark.mask) should equal to mark.val tc_u32_mark { val int32 mask int32 success const[0, int32] } # ------------------------------ tc action ------------------------------ tca_actions [ m_bpf nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["bpf", array[m_bpf_options]]] m_connmark nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["connmark", m_connmark_options]] m_csum nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["csum", m_csum_options]] m_gact nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["gact", array[m_gact_options]]] m_ife nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["ife", array[m_ife_options]]] m_ipt nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["ipt", array[m_ipt_options]]] m_mirred nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["mirred", m_mirred_options]] m_nat nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["nat", m_nat_options]] m_pedit nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["pedit", array[m_pedit_options]]] m_police nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["police", array[m_police_options]]] m_sample nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["sample", array[m_sample_options]]] m_simple nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["simple", array[m_simple_options]]] m_skbedit nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["skbedit", array[m_skbedit_options]]] m_skbmod nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["skbmod", array[m_skbmod_options]]] m_tunnel_key nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["tunnel_key", array[m_tunnel_key_options]]] m_vlan nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_t["vlan", array[m_vlan_options]]] ] [varlen] type tca_actions_t[NAME, VALUES] { TCA_ACT_KIND nlattr[TCA_ACT_KIND, string[NAME]] TCA_ACT_OPTIONS nlattr[TCA_ACT_OPTIONS, VALUES] TCA_ACT_COOKIE nlattr[TCA_ACT_COOKIE, array[int8]] } [packed, align_4] m_bpf_options [ TCA_ACT_BPF_PARMS nlattr[TCA_ACT_BPF_PARMS, tc_act_bpf] TCA_ACT_BPF_OPS_LEN nlattr[TCA_ACT_BPF_OPS_LEN, int16[0:10]] TCA_ACT_BPF_OPS nlattr[TCA_ACT_BPF_OPS, array[sock_filter]] TCA_ACT_BPF_FD nlattr[TCA_ACT_BPF_FD, fd] TCA_ACT_BPF_NAME nlattr[TCA_ACT_BPF_NAME, string[filename]] ] [varlen] m_connmark_options [ TCA_CONNMARK_PARMS nlattr[TCA_CONNMARK_PARMS, tc_connmark] ] [varlen] m_csum_options [ TCA_CSUM_PARMS nlattr[TCA_CSUM_PARMS, tc_csum] ] [varlen] m_gact_options [ TCA_GACT_PARMS nlattr[TCA_GACT_PARMS, tc_gen] TCA_GACT_PROB nlattr[TCA_GACT_PROB, tc_gact_p] ] [varlen] m_ife_options [ TCA_IFE_PARMS nlattr[TCA_IFE_PARMS, tc_ife] TCA_IFE_DMAC nlattr[TCA_IFE_DMAC, mac_addr] TCA_IFE_SMAC nlattr[TCA_IFE_SMAC, mac_addr] TCA_IFE_TYPE nlattr[TCA_IFE_TYPE, int16] TCA_IFE_METALST nlattr[TCA_IFE_METALST, array[tca_ife_meta_policy]] ] [varlen] tca_ife_meta_policy [ IFE_META_SKBMARK nlattr[IFE_META_SKBMARK, optional[int32]] IFE_META_PRIO nlattr[IFE_META_PRIO, optional[int32]] IFE_META_TCINDEX nlattr[IFE_META_TCINDEX, optional[int16]] ] [varlen] #TODO: add TCA_IPT_TARG support m_ipt_options [ TCA_IPT_TABLE nlattr[TCA_IPT_TABLE, string[ipt_tables, IFNAMSIZ]] TCA_IPT_HOOK nlattr[TCA_IPT_HOOK, flags[nf_inet_hooks, int32]] TCA_IPT_INDEX nlattr[TCA_IPT_INDEX, int32] ] [varlen] m_mirred_options [ TCA_MIRRED_PARMS nlattr[TCA_MIRRED_PARMS, tc_mirred] ] [varlen] m_nat_options [ TCA_NAT_PARMS nlattr[TCA_NAT_PARMS, tc_nat] ] [varlen] m_pedit_options [ TCA_PEDIT_PARMS nlattr[TCA_PEDIT_PARMS, m_pedit_sel] TCA_PEDIT_PARMS_EX nlattr[TCA_PEDIT_PARMS_EX, m_pedit_sel] TCA_PEDIT_KEYS_EX nlattr[TCA_PEDIT_KEYS_EX, array[tca_pedit_keys_ex_policy]] ] [varlen] tca_pedit_keys_ex_policy [ TCA_PEDIT_KEY_EX nlattr[TCA_PEDIT_KEY_EX, array[tca_pedit_key_ex_policy]] ] [varlen] tca_pedit_key_ex_policy [ TCA_PEDIT_KEY_EX_HTYPE nlattr[TCA_PEDIT_KEY_EX_HTYPE, flags[pedit_header_type, int16]] TCA_PEDIT_KEY_EX_CMD nlattr[TCA_PEDIT_KEY_EX_CMD, flags[pedit_cmd, int16]] ] [varlen] m_police_options [ TCA_POLICE_TBF nlattr[TCA_POLICE_TBF, tc_police] TCA_POLICE_RATE nlattr[TCA_POLICE_RATE, array[int32, 256]] TCA_POLICE_PEAKRATE nlattr[TCA_POLICE_PEAKRATE, array[int32, 256]] TCA_POLICE_AVRATE nlattr[TCA_POLICE_AVRATE, int32] TCA_POLICE_RESULT nlattr[TCA_POLICE_RESULT, int32] ] [varlen] m_sample_options [ TCA_SAMPLE_PARMS nlattr[TCA_SAMPLE_PARMS, tc_gen] TCA_SAMPLE_RATE nlattr[TCA_SAMPLE_RATE, int32] TCA_SAMPLE_TRUNC_SIZE nlattr[TCA_SAMPLE_TRUNC_SIZE, int32] TCA_SAMPLE_PSAMPLE_GROUP nlattr[TCA_SAMPLE_PSAMPLE_GROUP, int32] ] [varlen] m_simple_options [ TCA_DEF_PARMS nlattr[TCA_DEF_PARMS, tc_gen] TCA_DEF_DATA nlattr[TCA_DEF_DATA, string] ] [varlen] m_skbedit_options [ TCA_SKBEDIT_PARMS nlattr[TCA_SKBEDIT_PARMS, tc_gen] TCA_SKBEDIT_QUEUE_MAPPING nlattr[TCA_SKBEDIT_QUEUE_MAPPING, int16] TCA_SKBEDIT_PRIORITY nlattr[TCA_SKBEDIT_PRIORITY, tcm_handle] TCA_SKBEDIT_MARK nlattr[TCA_SKBEDIT_MARK, int32] TCA_SKBEDIT_PTYPE nlattr[TCA_SKBEDIT_PTYPE, flags[packet_types, int16]] ] [varlen] m_skbmod_options [ TCA_SKBMOD_PARMS nlattr[TCA_SKBMOD_PARMS, tc_skbmod] TCA_SKBMOD_DMAC nlattr[TCA_SKBMOD_DMAC, mac_addr] TCA_SKBMOD_SMAC nlattr[TCA_SKBMOD_SMAC, mac_addr] TCA_SKBMOD_ETYPE nlattr[TCA_SKBMOD_ETYPE, int16] ] [varlen] m_tunnel_key_options [ TCA_TUNNEL_KEY_PARMS nlattr[TCA_TUNNEL_KEY_PARMS, tc_tunnel_key] TCA_TUNNEL_KEY_ENC_IPV4_SRC nlattr[TCA_TUNNEL_KEY_ENC_IPV4_SRC, ipv4_addr] TCA_TUNNEL_KEY_ENC_IPV4_DST nlattr[TCA_TUNNEL_KEY_ENC_IPV4_DST, ipv4_addr] TCA_TUNNEL_KEY_ENC_IPV6_SRC nlattr[TCA_TUNNEL_KEY_ENC_IPV6_SRC, ipv6_addr] TCA_TUNNEL_KEY_ENC_IPV6_DST nlattr[TCA_TUNNEL_KEY_ENC_IPV6_DST, ipv6_addr] TCA_TUNNEL_KEY_ENC_KEY_ID nlattr[TCA_TUNNEL_KEY_ENC_KEY_ID, int32] TCA_TUNNEL_KEY_ENC_DST_PORT nlattr[TCA_TUNNEL_KEY_ENC_DST_PORT, sock_port] TCA_TUNNEL_KEY_NO_CSUM nlattr[TCA_TUNNEL_KEY_NO_CSUM, int8[0:1]] ] [varlen] m_vlan_options [ TCA_VLAN_PARMS nlattr[TCA_VLAN_PARMS, tc_vlan] TCA_VLAN_PUSH_VLAN_ID nlattr[TCA_VLAN_PUSH_VLAN_ID, int16[0:0xfff]] TCA_VLAN_PUSH_VLAN_PROTOCOL nlattr[TCA_VLAN_PUSH_VLAN_PROTOCOL, flags[vlan_proto, int16be]] TCA_VLAN_PUSH_VLAN_PRIORITY nlattr[TCA_VLAN_PUSH_VLAN_PRIORITY, int8[0:7]] ] [varlen] action_gd_policy [ TCA_ACT_TAB nlattr[TCA_ACT_TAB, array[nlattr_t[int32[0:TCA_ACT_MAX_PRIO], tca_actions_kind_index]]] ] [varlen] tca_actions_kind_index [ TCA_ACT_KIND nlattr[TCA_ACT_KIND, string[tca_actions_kinds]] TCA_ACT_INDEX nlattr[TCA_ACT_INDEX, int32] ] [varlen] action_dump_flags [ TCA_ROOT_FLAGS nlattr[TCA_ROOT_FLAGS, nla_bitfield32] TCA_ROOT_TIME_DELTA nlattr[TCA_ROOT_TIME_DELTA, int32] ] [varlen] action_dump_policy [ action_gd action_gd_policy action_dump_flags action_dump_flags ] [varlen] tc_gen { index int32 capab int32 action flags[tc_actions, int32] refcnt int32 bindcnt int32 } type tc_act_bpf tc_gen tc_connmark { tc_gen tc_gen zone int16 } nla_bitfield32 { value int32[0:1] selector int32[0:1] } tc_csum { tc_gen tc_gen update_flags int32[0:128] } tc_gact_p { ptype flags[tc_pgact_flags, int16] pval int16[0:10000] paction flags[tc_actions, int32] } tc_ife { tc_gen tc_gen flags int16[0:1] } tc_mirred { tc_gen tc_gen eaction flags[tc_mirred_eactions, int32] ifindex ifindex } tc_nat { tc_gen tc_gen old_addr ipv4_addr new_addr ipv4_addr mask ipv4_addr_mask flags int32[0:1] } m_pedit_sel { sel tc_pedit_sel keys array[tc_pedit_key, 128] keys_ex array[m_pedit_key_ex, 128] extended bool8 } [packed, align_4] tc_pedit_sel { tc_gen tc_gen nkeys int8 flags int8 keys array[tc_pedit_key] } tc_pedit_key { mask int32 val int32 off int32 at int32 offmask int32 shift int32 } m_pedit_key_ex { htype flags[pedit_header_type, int16] cmd flags[pedit_cmd, int16] } tc_skbmod { tc_gen tc_gen flags int64[0:16] } tc_tunnel_key { tc_gen tc_gen t_action int32[1:2] } tc_vlan { tc_gen tc_gen v_action int32[1:3] } # ------------------------------ tc police ------------------------------ tca_polices [ TCA_POLICE_TBF nlattr[TCA_POLICE_TBF, tc_police] TCA_POLICE_RATE nlattr[TCA_POLICE_RATE, array[int32, 256]] TCA_POLICE_PEAKRATE nlattr[TCA_POLICE_PEAKRATE, array[int32, 256]] TCA_POLICE_AVRATE nlattr[TCA_POLICE_AVRATE, int32] TCA_POLICE_RESULT nlattr[TCA_POLICE_RESULT, int32] ] [varlen] tc_police { index int32 action flags[tc_actions, int32] limit int32 burst int32 mtu int32 rate tc_ratespec peakrate tc_ratespec refcnt int32 bindcnt int32 capab int32 } tc_ratespec { cell_log int8 linklayer flags[linklayer, int8] overhead int16 cell_align int16 mpu int16 rate int32 } # ------------------------------ tc ematch ------------------------------ tca_ematches [ TCA_EMATCH_TREE_HDR nlattr[TCA_EMATCH_TREE_HDR, tcf_ematch_tree_hdr] TCA_EMATCH_TREE_LIST nlattr[TCA_EMATCH_TREE_LIST, tca_ematch_tree_list] ] [varlen] tcf_ematch_tree_hdr { nmatches int16 progid const[TCF_EM_PROG_TC, int16] } tca_ematch_tree_list [ TCF_EM_CONTAINER nlattr_t[int32, tcf_ematch_hdr[TCF_EM_CONTAINER, array[int8]]] TCF_EM_CMP nlattr_t[int32, tcf_ematch_hdr[TCF_EM_CMP, tcf_em_cmp]] TCF_EM_NBYTE nlattr_t[int32, tcf_ematch_hdr[TCF_EM_NBYTE, tcf_em_nbyte]] TCF_EM_U32 nlattr_t[int32, tcf_ematch_hdr[TCF_EM_U32, tc_u32_key]] TCF_EM_META nlattr_t[int32, tcf_ematch_hdr[TCF_EM_META, array[tcf_em_meta_policy]]] TCF_EM_CANID nlattr_t[int32, tcf_ematch_hdr[TCF_EM_CANID, can_filter]] TCF_EM_IPSET nlattr_t[int32, tcf_ematch_hdr[TCF_EM_IPSET, xt_set_info]] TCF_EM_IPT nlattr_t[int32, tcf_ematch_hdr[TCF_EM_IPT, array[tcf_em_ipt_policy]]] ] [varlen] type tcf_ematch_hdr[KIND, PAYLOAD] { matchid int16 kind const[KIND, int16] flags int16 pad int16 payload PAYLOAD } [align_4] tcf_em_cmp { val int32 mask int32 off int16 align flags[tcf_em_aligns, int8:4] flags int8:4 layer flags[tcf_layers, int8:4] opnd flags[tcf_em_opnds, int8:4] } tcf_em_nbyte { off int32 len int16:12[0:10] layer flags[tcf_layers, int8:4] # TODO: The payload data len should be equal to tcf_em_nbyte.len payload array[int8, 0:10] } [align_4] tc_u32_key { mask int32be val int32be off int32 offmask int32 } tcf_em_meta_policy [ TCA_EM_META_HDR nlattr[TCA_EM_META_HDR, tcf_meta_hdr] TCA_EM_META_LVALUE nlattr[TCA_EM_META_LVALUE, array[tcf_em_meta_int_var]] TCA_EM_META_RVALUE nlattr[TCA_EM_META_RVALUE, array[tcf_em_meta_int_var]] ] [varlen] tcf_meta_hdr { left tcf_meta_val right tcf_meta_val } tcf_meta_val { # TODO: kind value should be TCF_META_TYPE_VAR << 12 or TCF_META_TYPE_INT << 12 kind int16 shift int8 op flags[tcf_em_opnds, int8] } tcf_em_meta_int_var [ TCF_META_TYPE_INT int32[0:10] TCF_META_TYPE_VAR array[int8, 0:10] ] [varlen] can_filter { can_id int32 can_mask int32 } tcf_em_ipt_policy [ TCA_EM_IPT_HOOK nlattr[TCA_EM_IPT_HOOK, flags[nf_inet_hooks, int32]] TCA_EM_IPT_MATCH_NAME nlattr[TCA_EM_IPT_MATCH_NAME, string["policy"]] TCA_EM_IPT_MATCH_REVISION nlattr[TCA_EM_IPT_MATCH_REVISION, int8] TCA_EM_IPT_NFPROTO nlattr[TCA_EM_IPT_NFPROTO, flags[nfproto, int8]] TCA_EM_IPT_MATCH_DATA nlattr[TCA_EM_IPT_MATCH_DATA, array[int8]] ] [varlen] # ------------------------------ tc others ------------------------------ tc_estimator { interval int8 ewma_log int8 } stab_policy [ TCA_STAB_BASE nlattr[TCA_STAB_BASE, tc_sizespec] # TODO: stab data should be tc_sizespec.tsize * sizeof(__u16) TCA_STAB_DATA nlattr[TCA_STAB_DATA, array[int16, 0:10]] ] [varlen] tc_sizespec { cell_log int8 size_log int8 cell_align int16 overhead int32 linklayer flags[linklayer, int32] mpu int32 mtu int32 tsize int32[0:10] } tcm_handle_offsets = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0xffe0, 0xfff1, 0xfff2, 0xfff3, 0xffff tcf_em_aligns = TCF_EM_ALIGN_U8, TCF_EM_ALIGN_U16, TCF_EM_ALIGN_U32 tcf_layers = TCF_LAYER_LINK, TCF_LAYER_NETWORK, TCF_LAYER_TRANSPORT tcf_em_opnds = TCF_EM_OPND_EQ, TCF_EM_OPND_GT, TCF_EM_OPND_LT nf_inet_hooks = NF_INET_PRE_ROUTING, NF_INET_LOCAL_IN, NF_INET_FORWARD, NF_INET_LOCAL_OUT, NF_INET_POST_ROUTING linklayer = TC_LINKLAYER_UNAWARE, TC_LINKLAYER_ETHERNET, TC_LINKLAYER_ATM tc_actions = TC_ACT_UNSPEC, TC_ACT_OK, TC_ACT_RECLASSIFY, TC_ACT_SHOT, TC_ACT_PIPE, TC_ACT_STOLEN, TC_ACT_QUEUED, TC_ACT_REPEAT, TC_ACT_REDIRECT, TC_ACT_TRAP, TC_ACT_JUMP, TC_ACT_GOTO_CHAIN tca_actions_kinds = "bpf", "connmark", "csum", "gact", "ife", "ipt", "mirred", "nat", "pedit", "police", "sample", "skbedit", "skbmod", "tunnel_key", "vlan", "xt" tc_flow_modes = FLOW_MODE_MAP, FLOW_MODE_HASH tca_dsmark_ind = 1, 2, 4, 8, 16, 32 tc_mqprio_modes = TC_MQPRIO_MODE_DCB, TC_MQPRIO_MODE_CHANNEL tc_mqprio_shapers = TC_MQPRIO_SHAPER_DCB, TC_MQPRIO_SHAPER_BW_RATE tc_pgact_flags = PGACT_NONE, PGACT_NETRAND, PGACT_DETERM tc_mirred_eactions = TCA_EGRESS_REDIR, TCA_EGRESS_MIRROR, TCA_INGRESS_REDIR, TCA_INGRESS_MIRROR pedit_header_type = TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK, TCA_PEDIT_KEY_EX_HDR_TYPE_ETH, TCA_PEDIT_KEY_EX_HDR_TYPE_IP4, TCA_PEDIT_KEY_EX_HDR_TYPE_IP6, TCA_PEDIT_KEY_EX_HDR_TYPE_TCP, TCA_PEDIT_KEY_EX_HDR_TYPE_UDP pedit_cmd = TCA_PEDIT_KEY_EX_CMD_SET, TCA_PEDIT_KEY_EX_CMD_ADD packet_types = PACKET_HOST, PACKET_BROADCAST, PACKET_MULTICAST, PACKET_OTHERHOST, PACKET_OUTGOING, PACKET_LOOPBACK, PACKET_USER, PACKET_KERNEL vlan_proto = ETH_P_8021Q, ETH_P_8021AD