diff options
author | Nicolas Schichan <nschichan@freebox.fr> | 2015-08-04 09:19:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-08-07 01:02:32 -0400 |
commit | 08fcb08fc06758411d099bcd6a60d6cdee2d50a7 (patch) | |
tree | f9b883989277c8321b2064c653d95148dc8cba47 /lib/test_bpf.c | |
parent | d2648d4e268cee60c9c917a04c3fbc4e8c3bbc7e (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.c | 296 |
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 | ||
4640 | static struct net_device dev; | 4936 | static struct net_device dev; |