# Copyright 2024 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.

# This file contains definitions that can no longer be generated from latest Linux revisions.
meta noextract

# TODO: remove the filters that were removed from the kernel
# once they are removed from relevant LTS kernels:
#
# 265b4da82dbf5 net/sched: Retire rsvp classifier
# 8c710f75256bb net/sched: Retire tcindex classifier
# bbe77c14ee618 net/sched: Retire dsmark qdisc
# fb38306ceb9e7 net/sched: Retire ATM qdisc
# 051d442098421 net/sched: Retire CBQ qdisc
# ba24ea1291263 net/sched: Retire ipt action

sendmsg$nl_route_sched_retired(fd sock_nl_route, msg ptr[in, msghdr_netlink[netlink_msg_route_sched_retired]], f flags[send_flags])

netlink_msg_route_sched_retired [
	newqdisc	netlink_msg[RTM_NEWQDISC, tcmsg[AF_UNSPEC], rtm_tca_policy_retired]
	delqdisc	netlink_msg[RTM_DELQDISC, tcmsg[AF_UNSPEC], rtm_tca_policy_retired]
	newtfilter	netlink_msg[RTM_NEWTFILTER, tcmsg[AF_UNSPEC], filter_policy_retired]
	deltfilter	netlink_msg[RTM_DELTFILTER, tcmsg[AF_UNSPEC], filter_policy_retired]
	newchain	netlink_msg[RTM_NEWCHAIN, tcmsg[AF_UNSPEC], filter_policy_retired]
	delchain	netlink_msg[RTM_DELCHAIN, tcmsg[AF_UNSPEC], filter_policy_retired]
	newtaction	netlink_msg[RTM_NEWACTION, tcamsg[AF_UNSPEC], nlattr[TCA_ACT_TAB, array[tca_actions_retired]]]
	newtclass	netlink_msg[RTM_NEWTCLASS, tcmsg[AF_UNSPEC], rtm_tca_policy$tclass_retired]
	deltclass	netlink_msg[RTM_DELTCLASS, tcmsg[AF_UNSPEC], rtm_tca_policy$tclass_retired]
] [varlen]

rtm_tca_policy$tclass_retired [
	c_atm		tca_kind_options_t["atm", array[atm_policy]]
	c_cbq		tca_kind_options_t["cbq", array[cbq_policy]]
	c_dsmark	tca_kind_options_t["dsmark", dsmark_policy$class]
] [varlen]

filter_policy_retired [
	f_rsvp		tca_kind_options_t["rsvp", array[rsvp_policy]]
	f_rsvp6		tca_kind_options_t["rsvp6", array[rsvp_policy$ipv6]]
	f_tcindex	tca_kind_options_t["tcindex", array[tcindex_policy]]
] [varlen]

tca_actions_retired [
	m_ipt	nlattr_tca_actions[tcf_action_policy["ipt", ipt_policy]]
] [varlen]

rtm_tca_policy_retired [
	q_dsmark	tca_kind_options_t["dsmark", array[dsmark_policy]]
] [varlen]

## atm

atm_policy [
	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]

## CBQ

cbq_policy [
	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]

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
}

## dsmark

dsmark_policy$class [
	TCA_DSMARK_MASK		nlattr[TCA_DSMARK_MASK, int8]
	TCA_DSMARK_VALUE	nlattr[TCA_DSMARK_VALUE, int8]
] [varlen]

dsmark_policy [
	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]

## rsvp

rsvp_policy [
	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, array[police_policy]]
	TCA_RSVP_ACT		nlattr[TCA_RSVP_ACT, array[tca_actions]]
] [varlen]

rsvp_policy$ipv6 [
	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, array[police_policy]]
	TCA_RSVP_ACT		nlattr[TCA_RSVP_ACT, array[tca_actions]]
] [varlen]

## tcindex

tcindex_policy [
	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, array[police_policy]]
	TCA_TCINDEX_ACT			nlattr[TCA_TCINDEX_ACT, array[tca_actions]]
] [varlen]

## ipt

ipt_policy [
	TCA_IPT_TABLE	nlattr[TCA_IPT_TABLE, string[ipt_tables, XT_TABLE_MAXNAMELEN]]
	TCA_IPT_HOOK	nlattr[TCA_IPT_HOOK, flags[nf_inet_hooks, int32]]
	TCA_IPT_INDEX	nlattr[TCA_IPT_INDEX, int32]
	TCA_IPT_TARG	nlattr[TCA_IPT_TARG, xt_entry_target]
] [varlen]
