18c2ecf20Sopenharmony_ci{
28c2ecf20Sopenharmony_ci	"invalid direct packet write for LWT_IN",
38c2ecf20Sopenharmony_ci	.insns = {
48c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
58c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
68c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
78c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
88c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
98c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
108c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
118c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
128c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
138c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
148c2ecf20Sopenharmony_ci	},
158c2ecf20Sopenharmony_ci	.errstr = "cannot write into packet",
168c2ecf20Sopenharmony_ci	.result = REJECT,
178c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_IN,
188c2ecf20Sopenharmony_ci},
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	"invalid direct packet write for LWT_OUT",
218c2ecf20Sopenharmony_ci	.insns = {
228c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
238c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
248c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
258c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
268c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
278c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
288c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
298c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
308c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
318c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
328c2ecf20Sopenharmony_ci	},
338c2ecf20Sopenharmony_ci	.errstr = "cannot write into packet",
348c2ecf20Sopenharmony_ci	.result = REJECT,
358c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_OUT,
368c2ecf20Sopenharmony_ci},
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	"direct packet write for LWT_XMIT",
398c2ecf20Sopenharmony_ci	.insns = {
408c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
418c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
428c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
438c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
448c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
458c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
468c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
478c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_B, BPF_REG_2, BPF_REG_2, 0),
488c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
498c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
508c2ecf20Sopenharmony_ci	},
518c2ecf20Sopenharmony_ci	.result = ACCEPT,
528c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_XMIT,
538c2ecf20Sopenharmony_ci},
548c2ecf20Sopenharmony_ci{
558c2ecf20Sopenharmony_ci	"direct packet read for LWT_IN",
568c2ecf20Sopenharmony_ci	.insns = {
578c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
588c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
598c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
608c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
618c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
628c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
638c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
648c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
658c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
668c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
678c2ecf20Sopenharmony_ci	},
688c2ecf20Sopenharmony_ci	.result = ACCEPT,
698c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_IN,
708c2ecf20Sopenharmony_ci},
718c2ecf20Sopenharmony_ci{
728c2ecf20Sopenharmony_ci	"direct packet read for LWT_OUT",
738c2ecf20Sopenharmony_ci	.insns = {
748c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
758c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
768c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
778c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
788c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
798c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
808c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
818c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
828c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
838c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
848c2ecf20Sopenharmony_ci	},
858c2ecf20Sopenharmony_ci	.result = ACCEPT,
868c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_OUT,
878c2ecf20Sopenharmony_ci},
888c2ecf20Sopenharmony_ci{
898c2ecf20Sopenharmony_ci	"direct packet read for LWT_XMIT",
908c2ecf20Sopenharmony_ci	.insns = {
918c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
928c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
938c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
948c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
958c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
968c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
978c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 1),
988c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_2, 0),
998c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
1008c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1018c2ecf20Sopenharmony_ci	},
1028c2ecf20Sopenharmony_ci	.result = ACCEPT,
1038c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_XMIT,
1048c2ecf20Sopenharmony_ci},
1058c2ecf20Sopenharmony_ci{
1068c2ecf20Sopenharmony_ci	"overlapping checks for direct packet access",
1078c2ecf20Sopenharmony_ci	.insns = {
1088c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
1098c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
1108c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
1118c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
1128c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
1138c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
1148c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 4),
1158c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
1168c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 6),
1178c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_1, BPF_REG_3, 1),
1188c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_2, 6),
1198c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
1208c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1218c2ecf20Sopenharmony_ci	},
1228c2ecf20Sopenharmony_ci	.result = ACCEPT,
1238c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_XMIT,
1248c2ecf20Sopenharmony_ci},
1258c2ecf20Sopenharmony_ci{
1268c2ecf20Sopenharmony_ci	"make headroom for LWT_XMIT",
1278c2ecf20Sopenharmony_ci	.insns = {
1288c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
1298c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 34),
1308c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_3, 0),
1318c2ecf20Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_skb_change_head),
1328c2ecf20Sopenharmony_ci	/* split for s390 to succeed */
1338c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
1348c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 42),
1358c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_3, 0),
1368c2ecf20Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_skb_change_head),
1378c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
1388c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1398c2ecf20Sopenharmony_ci	},
1408c2ecf20Sopenharmony_ci	.result = ACCEPT,
1418c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_XMIT,
1428c2ecf20Sopenharmony_ci},
1438c2ecf20Sopenharmony_ci{
1448c2ecf20Sopenharmony_ci	"invalid access of tc_classid for LWT_IN",
1458c2ecf20Sopenharmony_ci	.insns = {
1468c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1478c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, tc_classid)),
1488c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1498c2ecf20Sopenharmony_ci	},
1508c2ecf20Sopenharmony_ci	.result = REJECT,
1518c2ecf20Sopenharmony_ci	.errstr = "invalid bpf_context access",
1528c2ecf20Sopenharmony_ci},
1538c2ecf20Sopenharmony_ci{
1548c2ecf20Sopenharmony_ci	"invalid access of tc_classid for LWT_OUT",
1558c2ecf20Sopenharmony_ci	.insns = {
1568c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1578c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, tc_classid)),
1588c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1598c2ecf20Sopenharmony_ci	},
1608c2ecf20Sopenharmony_ci	.result = REJECT,
1618c2ecf20Sopenharmony_ci	.errstr = "invalid bpf_context access",
1628c2ecf20Sopenharmony_ci},
1638c2ecf20Sopenharmony_ci{
1648c2ecf20Sopenharmony_ci	"invalid access of tc_classid for LWT_XMIT",
1658c2ecf20Sopenharmony_ci	.insns = {
1668c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1678c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, tc_classid)),
1688c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1698c2ecf20Sopenharmony_ci	},
1708c2ecf20Sopenharmony_ci	.result = REJECT,
1718c2ecf20Sopenharmony_ci	.errstr = "invalid bpf_context access",
1728c2ecf20Sopenharmony_ci},
1738c2ecf20Sopenharmony_ci{
1748c2ecf20Sopenharmony_ci	"check skb->tc_classid half load not permitted for lwt prog",
1758c2ecf20Sopenharmony_ci	.insns = {
1768c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
1778c2ecf20Sopenharmony_ci#if __BYTE_ORDER == __LITTLE_ENDIAN
1788c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1798c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, tc_classid)),
1808c2ecf20Sopenharmony_ci#else
1818c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_1,
1828c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, tc_classid) + 2),
1838c2ecf20Sopenharmony_ci#endif
1848c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1858c2ecf20Sopenharmony_ci	},
1868c2ecf20Sopenharmony_ci	.result = REJECT,
1878c2ecf20Sopenharmony_ci	.errstr = "invalid bpf_context access",
1888c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_LWT_IN,
1898c2ecf20Sopenharmony_ci},
190