summaryrefslogtreecommitdiffstats
path: root/lib/test_bpf.c
diff options
context:
space:
mode:
authorNicolas Schichan <nschichan@freebox.fr>2015-08-04 09:19:11 -0400
committerDavid S. Miller <davem@davemloft.net>2015-08-07 01:02:32 -0400
commit08fcb08fc06758411d099bcd6a60d6cdee2d50a7 (patch)
treef9b883989277c8321b2064c653d95148dc8cba47 /lib/test_bpf.c
parentd2648d4e268cee60c9c917a04c3fbc4e8c3bbc7e (diff)
test_bpf: add more tests for LD_ABS and LD_IND.
This exerces the LD_ABS and LD_IND instructions for various sizes and alignments. This also checks that X when used as an offset to a BPF_IND instruction first in a filter is correctly set to 0. Signed-off-by: Nicolas Schichan <nschichan@freebox.fr> Acked-by: Alexei Starovoitov <ast@plumgrid.com> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'lib/test_bpf.c')
-rw-r--r--lib/test_bpf.c296
1 files changed, 296 insertions, 0 deletions
diff --git a/lib/test_bpf.c b/lib/test_bpf.c
index 820098004481..e6ef56df0dfe 100644
--- a/lib/test_bpf.c
+++ b/lib/test_bpf.c
@@ -4635,6 +4635,302 @@ static struct bpf_test tests[] = {
4635 { {0x40, 0x25051982} }, 4635 { {0x40, 0x25051982} },
4636 .frag_data = { 0x19, 0x82 }, 4636 .frag_data = { 0x19, 0x82 },
4637 }, 4637 },
4638 /*
4639 * LD_IND / LD_ABS on non fragmented SKBs
4640 */
4641 {
4642 /*
4643 * this tests that the JIT/interpreter correctly resets X
4644 * before using it in an LD_IND instruction.
4645 */
4646 "LD_IND byte default X",
4647 .u.insns = {
4648 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
4649 BPF_STMT(BPF_RET | BPF_A, 0x0),
4650 },
4651 CLASSIC,
4652 { [0x1] = 0x42 },
4653 { {0x40, 0x42 } },
4654 },
4655 {
4656 "LD_IND byte positive offset",
4657 .u.insns = {
4658 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
4659 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
4660 BPF_STMT(BPF_RET | BPF_A, 0x0),
4661 },
4662 CLASSIC,
4663 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
4664 { {0x40, 0x82 } },
4665 },
4666 {
4667 "LD_IND byte negative offset",
4668 .u.insns = {
4669 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
4670 BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
4671 BPF_STMT(BPF_RET | BPF_A, 0x0),
4672 },
4673 CLASSIC,
4674 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 },
4675 { {0x40, 0x05 } },
4676 },
4677 {
4678 "LD_IND halfword positive offset",
4679 .u.insns = {
4680 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4681 BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
4682 BPF_STMT(BPF_RET | BPF_A, 0x0),
4683 },
4684 CLASSIC,
4685 {
4686 [0x1c] = 0xaa, [0x1d] = 0x55,
4687 [0x1e] = 0xbb, [0x1f] = 0x66,
4688 [0x20] = 0xcc, [0x21] = 0x77,
4689 [0x22] = 0xdd, [0x23] = 0x88,
4690 },
4691 { {0x40, 0xdd88 } },
4692 },
4693 {
4694 "LD_IND halfword negative offset",
4695 .u.insns = {
4696 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4697 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
4698 BPF_STMT(BPF_RET | BPF_A, 0x0),
4699 },
4700 CLASSIC,
4701 {
4702 [0x1c] = 0xaa, [0x1d] = 0x55,
4703 [0x1e] = 0xbb, [0x1f] = 0x66,
4704 [0x20] = 0xcc, [0x21] = 0x77,
4705 [0x22] = 0xdd, [0x23] = 0x88,
4706 },
4707 { {0x40, 0xbb66 } },
4708 },
4709 {
4710 "LD_IND halfword unaligned",
4711 .u.insns = {
4712 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4713 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
4714 BPF_STMT(BPF_RET | BPF_A, 0x0),
4715 },
4716 CLASSIC,
4717 {
4718 [0x1c] = 0xaa, [0x1d] = 0x55,
4719 [0x1e] = 0xbb, [0x1f] = 0x66,
4720 [0x20] = 0xcc, [0x21] = 0x77,
4721 [0x22] = 0xdd, [0x23] = 0x88,
4722 },
4723 { {0x40, 0x66cc } },
4724 },
4725 {
4726 "LD_IND word positive offset",
4727 .u.insns = {
4728 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4729 BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
4730 BPF_STMT(BPF_RET | BPF_A, 0x0),
4731 },
4732 CLASSIC,
4733 {
4734 [0x1c] = 0xaa, [0x1d] = 0x55,
4735 [0x1e] = 0xbb, [0x1f] = 0x66,
4736 [0x20] = 0xcc, [0x21] = 0x77,
4737 [0x22] = 0xdd, [0x23] = 0x88,
4738 [0x24] = 0xee, [0x25] = 0x99,
4739 [0x26] = 0xff, [0x27] = 0xaa,
4740 },
4741 { {0x40, 0xee99ffaa } },
4742 },
4743 {
4744 "LD_IND word negative offset",
4745 .u.insns = {
4746 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4747 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
4748 BPF_STMT(BPF_RET | BPF_A, 0x0),
4749 },
4750 CLASSIC,
4751 {
4752 [0x1c] = 0xaa, [0x1d] = 0x55,
4753 [0x1e] = 0xbb, [0x1f] = 0x66,
4754 [0x20] = 0xcc, [0x21] = 0x77,
4755 [0x22] = 0xdd, [0x23] = 0x88,
4756 [0x24] = 0xee, [0x25] = 0x99,
4757 [0x26] = 0xff, [0x27] = 0xaa,
4758 },
4759 { {0x40, 0xaa55bb66 } },
4760 },
4761 {
4762 "LD_IND word unaligned (addr & 3 == 2)",
4763 .u.insns = {
4764 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4765 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
4766 BPF_STMT(BPF_RET | BPF_A, 0x0),
4767 },
4768 CLASSIC,
4769 {
4770 [0x1c] = 0xaa, [0x1d] = 0x55,
4771 [0x1e] = 0xbb, [0x1f] = 0x66,
4772 [0x20] = 0xcc, [0x21] = 0x77,
4773 [0x22] = 0xdd, [0x23] = 0x88,
4774 [0x24] = 0xee, [0x25] = 0x99,
4775 [0x26] = 0xff, [0x27] = 0xaa,
4776 },
4777 { {0x40, 0xbb66cc77 } },
4778 },
4779 {
4780 "LD_IND word unaligned (addr & 3 == 1)",
4781 .u.insns = {
4782 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4783 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
4784 BPF_STMT(BPF_RET | BPF_A, 0x0),
4785 },
4786 CLASSIC,
4787 {
4788 [0x1c] = 0xaa, [0x1d] = 0x55,
4789 [0x1e] = 0xbb, [0x1f] = 0x66,
4790 [0x20] = 0xcc, [0x21] = 0x77,
4791 [0x22] = 0xdd, [0x23] = 0x88,
4792 [0x24] = 0xee, [0x25] = 0x99,
4793 [0x26] = 0xff, [0x27] = 0xaa,
4794 },
4795 { {0x40, 0x55bb66cc } },
4796 },
4797 {
4798 "LD_IND word unaligned (addr & 3 == 3)",
4799 .u.insns = {
4800 BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
4801 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
4802 BPF_STMT(BPF_RET | BPF_A, 0x0),
4803 },
4804 CLASSIC,
4805 {
4806 [0x1c] = 0xaa, [0x1d] = 0x55,
4807 [0x1e] = 0xbb, [0x1f] = 0x66,
4808 [0x20] = 0xcc, [0x21] = 0x77,
4809 [0x22] = 0xdd, [0x23] = 0x88,
4810 [0x24] = 0xee, [0x25] = 0x99,
4811 [0x26] = 0xff, [0x27] = 0xaa,
4812 },
4813 { {0x40, 0x66cc77dd } },
4814 },
4815 {
4816 "LD_ABS byte",
4817 .u.insns = {
4818 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
4819 BPF_STMT(BPF_RET | BPF_A, 0x0),
4820 },
4821 CLASSIC,
4822 {
4823 [0x1c] = 0xaa, [0x1d] = 0x55,
4824 [0x1e] = 0xbb, [0x1f] = 0x66,
4825 [0x20] = 0xcc, [0x21] = 0x77,
4826 [0x22] = 0xdd, [0x23] = 0x88,
4827 [0x24] = 0xee, [0x25] = 0x99,
4828 [0x26] = 0xff, [0x27] = 0xaa,
4829 },
4830 { {0x40, 0xcc } },
4831 },
4832 {
4833 "LD_ABS halfword",
4834 .u.insns = {
4835 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
4836 BPF_STMT(BPF_RET | BPF_A, 0x0),
4837 },
4838 CLASSIC,
4839 {
4840 [0x1c] = 0xaa, [0x1d] = 0x55,
4841 [0x1e] = 0xbb, [0x1f] = 0x66,
4842 [0x20] = 0xcc, [0x21] = 0x77,
4843 [0x22] = 0xdd, [0x23] = 0x88,
4844 [0x24] = 0xee, [0x25] = 0x99,
4845 [0x26] = 0xff, [0x27] = 0xaa,
4846 },
4847 { {0x40, 0xdd88 } },
4848 },
4849 {
4850 "LD_ABS halfword unaligned",
4851 .u.insns = {
4852 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
4853 BPF_STMT(BPF_RET | BPF_A, 0x0),
4854 },
4855 CLASSIC,
4856 {
4857 [0x1c] = 0xaa, [0x1d] = 0x55,
4858 [0x1e] = 0xbb, [0x1f] = 0x66,
4859 [0x20] = 0xcc, [0x21] = 0x77,
4860 [0x22] = 0xdd, [0x23] = 0x88,
4861 [0x24] = 0xee, [0x25] = 0x99,
4862 [0x26] = 0xff, [0x27] = 0xaa,
4863 },
4864 { {0x40, 0x99ff } },
4865 },
4866 {
4867 "LD_ABS word",
4868 .u.insns = {
4869 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
4870 BPF_STMT(BPF_RET | BPF_A, 0x0),
4871 },
4872 CLASSIC,
4873 {
4874 [0x1c] = 0xaa, [0x1d] = 0x55,
4875 [0x1e] = 0xbb, [0x1f] = 0x66,
4876 [0x20] = 0xcc, [0x21] = 0x77,
4877 [0x22] = 0xdd, [0x23] = 0x88,
4878 [0x24] = 0xee, [0x25] = 0x99,
4879 [0x26] = 0xff, [0x27] = 0xaa,
4880 },
4881 { {0x40, 0xaa55bb66 } },
4882 },
4883 {
4884 "LD_ABS word unaligned (addr & 3 == 2)",
4885 .u.insns = {
4886 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
4887 BPF_STMT(BPF_RET | BPF_A, 0x0),
4888 },
4889 CLASSIC,
4890 {
4891 [0x1c] = 0xaa, [0x1d] = 0x55,
4892 [0x1e] = 0xbb, [0x1f] = 0x66,
4893 [0x20] = 0xcc, [0x21] = 0x77,
4894 [0x22] = 0xdd, [0x23] = 0x88,
4895 [0x24] = 0xee, [0x25] = 0x99,
4896 [0x26] = 0xff, [0x27] = 0xaa,
4897 },
4898 { {0x40, 0xdd88ee99 } },
4899 },
4900 {
4901 "LD_ABS word unaligned (addr & 3 == 1)",
4902 .u.insns = {
4903 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
4904 BPF_STMT(BPF_RET | BPF_A, 0x0),
4905 },
4906 CLASSIC,
4907 {
4908 [0x1c] = 0xaa, [0x1d] = 0x55,
4909 [0x1e] = 0xbb, [0x1f] = 0x66,
4910 [0x20] = 0xcc, [0x21] = 0x77,
4911 [0x22] = 0xdd, [0x23] = 0x88,
4912 [0x24] = 0xee, [0x25] = 0x99,
4913 [0x26] = 0xff, [0x27] = 0xaa,
4914 },
4915 { {0x40, 0x77dd88ee } },
4916 },
4917 {
4918 "LD_ABS word unaligned (addr & 3 == 3)",
4919 .u.insns = {
4920 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
4921 BPF_STMT(BPF_RET | BPF_A, 0x0),
4922 },
4923 CLASSIC,
4924 {
4925 [0x1c] = 0xaa, [0x1d] = 0x55,
4926 [0x1e] = 0xbb, [0x1f] = 0x66,
4927 [0x20] = 0xcc, [0x21] = 0x77,
4928 [0x22] = 0xdd, [0x23] = 0x88,
4929 [0x24] = 0xee, [0x25] = 0x99,
4930 [0x26] = 0xff, [0x27] = 0xaa,
4931 },
4932 { {0x40, 0x88ee99ff } },
4933 },
4638}; 4934};
4639 4935
4640static struct net_device dev; 4936static struct net_device dev;