@@ -6645,6 +6645,253 @@ static struct bpf_test tests[] = {
6645
6645
.errstr = "BPF_END uses reserved fields" ,
6646
6646
.result = REJECT ,
6647
6647
},
6648
+ {
6649
+ "meta access, test1" ,
6650
+ .insns = {
6651
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6652
+ offsetof(struct xdp_md , data_meta )),
6653
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6654
+ offsetof(struct xdp_md , data )),
6655
+ BPF_MOV64_REG (BPF_REG_0 , BPF_REG_2 ),
6656
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_0 , 8 ),
6657
+ BPF_JMP_REG (BPF_JGT , BPF_REG_0 , BPF_REG_3 , 1 ),
6658
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6659
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6660
+ BPF_EXIT_INSN (),
6661
+ },
6662
+ .result = ACCEPT ,
6663
+ .prog_type = BPF_PROG_TYPE_XDP ,
6664
+ },
6665
+ {
6666
+ "meta access, test2" ,
6667
+ .insns = {
6668
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6669
+ offsetof(struct xdp_md , data_meta )),
6670
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6671
+ offsetof(struct xdp_md , data )),
6672
+ BPF_MOV64_REG (BPF_REG_0 , BPF_REG_2 ),
6673
+ BPF_ALU64_IMM (BPF_SUB , BPF_REG_0 , 8 ),
6674
+ BPF_MOV64_REG (BPF_REG_4 , BPF_REG_2 ),
6675
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_4 , 8 ),
6676
+ BPF_JMP_REG (BPF_JGT , BPF_REG_4 , BPF_REG_3 , 1 ),
6677
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_0 , 0 ),
6678
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6679
+ BPF_EXIT_INSN (),
6680
+ },
6681
+ .result = REJECT ,
6682
+ .errstr = "invalid access to packet, off=-8" ,
6683
+ .prog_type = BPF_PROG_TYPE_XDP ,
6684
+ },
6685
+ {
6686
+ "meta access, test3" ,
6687
+ .insns = {
6688
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6689
+ offsetof(struct xdp_md , data_meta )),
6690
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6691
+ offsetof(struct xdp_md , data_end )),
6692
+ BPF_MOV64_REG (BPF_REG_0 , BPF_REG_2 ),
6693
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_0 , 8 ),
6694
+ BPF_JMP_REG (BPF_JGT , BPF_REG_0 , BPF_REG_3 , 1 ),
6695
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6696
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6697
+ BPF_EXIT_INSN (),
6698
+ },
6699
+ .result = REJECT ,
6700
+ .errstr = "invalid access to packet" ,
6701
+ .prog_type = BPF_PROG_TYPE_XDP ,
6702
+ },
6703
+ {
6704
+ "meta access, test4" ,
6705
+ .insns = {
6706
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6707
+ offsetof(struct xdp_md , data_meta )),
6708
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6709
+ offsetof(struct xdp_md , data_end )),
6710
+ BPF_LDX_MEM (BPF_W , BPF_REG_4 , BPF_REG_1 ,
6711
+ offsetof(struct xdp_md , data )),
6712
+ BPF_MOV64_REG (BPF_REG_0 , BPF_REG_4 ),
6713
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_0 , 8 ),
6714
+ BPF_JMP_REG (BPF_JGT , BPF_REG_0 , BPF_REG_3 , 1 ),
6715
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6716
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6717
+ BPF_EXIT_INSN (),
6718
+ },
6719
+ .result = REJECT ,
6720
+ .errstr = "invalid access to packet" ,
6721
+ .prog_type = BPF_PROG_TYPE_XDP ,
6722
+ },
6723
+ {
6724
+ "meta access, test5" ,
6725
+ .insns = {
6726
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6727
+ offsetof(struct xdp_md , data_meta )),
6728
+ BPF_LDX_MEM (BPF_W , BPF_REG_4 , BPF_REG_1 ,
6729
+ offsetof(struct xdp_md , data )),
6730
+ BPF_MOV64_REG (BPF_REG_0 , BPF_REG_3 ),
6731
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_0 , 8 ),
6732
+ BPF_JMP_REG (BPF_JGT , BPF_REG_0 , BPF_REG_4 , 3 ),
6733
+ BPF_MOV64_IMM (BPF_REG_2 , -8 ),
6734
+ BPF_RAW_INSN (BPF_JMP | BPF_CALL , 0 , 0 , 0 ,
6735
+ BPF_FUNC_xdp_adjust_meta ),
6736
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_3 , 0 ),
6737
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6738
+ BPF_EXIT_INSN (),
6739
+ },
6740
+ .result = REJECT ,
6741
+ .errstr = "R3 !read_ok" ,
6742
+ .prog_type = BPF_PROG_TYPE_XDP ,
6743
+ },
6744
+ {
6745
+ "meta access, test6" ,
6746
+ .insns = {
6747
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6748
+ offsetof(struct xdp_md , data_meta )),
6749
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6750
+ offsetof(struct xdp_md , data )),
6751
+ BPF_MOV64_REG (BPF_REG_0 , BPF_REG_3 ),
6752
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_0 , 8 ),
6753
+ BPF_MOV64_REG (BPF_REG_4 , BPF_REG_2 ),
6754
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_4 , 8 ),
6755
+ BPF_JMP_REG (BPF_JGT , BPF_REG_4 , BPF_REG_0 , 1 ),
6756
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6757
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6758
+ BPF_EXIT_INSN (),
6759
+ },
6760
+ .result = REJECT ,
6761
+ .errstr = "invalid access to packet" ,
6762
+ .prog_type = BPF_PROG_TYPE_XDP ,
6763
+ },
6764
+ {
6765
+ "meta access, test7" ,
6766
+ .insns = {
6767
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6768
+ offsetof(struct xdp_md , data_meta )),
6769
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6770
+ offsetof(struct xdp_md , data )),
6771
+ BPF_MOV64_REG (BPF_REG_0 , BPF_REG_3 ),
6772
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_0 , 8 ),
6773
+ BPF_MOV64_REG (BPF_REG_4 , BPF_REG_2 ),
6774
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_4 , 8 ),
6775
+ BPF_JMP_REG (BPF_JGT , BPF_REG_4 , BPF_REG_3 , 1 ),
6776
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6777
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6778
+ BPF_EXIT_INSN (),
6779
+ },
6780
+ .result = ACCEPT ,
6781
+ .prog_type = BPF_PROG_TYPE_XDP ,
6782
+ },
6783
+ {
6784
+ "meta access, test8" ,
6785
+ .insns = {
6786
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6787
+ offsetof(struct xdp_md , data_meta )),
6788
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6789
+ offsetof(struct xdp_md , data )),
6790
+ BPF_MOV64_REG (BPF_REG_4 , BPF_REG_2 ),
6791
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_4 , 0xFFFF ),
6792
+ BPF_JMP_REG (BPF_JGT , BPF_REG_4 , BPF_REG_3 , 1 ),
6793
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6794
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6795
+ BPF_EXIT_INSN (),
6796
+ },
6797
+ .result = ACCEPT ,
6798
+ .prog_type = BPF_PROG_TYPE_XDP ,
6799
+ },
6800
+ {
6801
+ "meta access, test9" ,
6802
+ .insns = {
6803
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6804
+ offsetof(struct xdp_md , data_meta )),
6805
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6806
+ offsetof(struct xdp_md , data )),
6807
+ BPF_MOV64_REG (BPF_REG_4 , BPF_REG_2 ),
6808
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_4 , 0xFFFF ),
6809
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_4 , 1 ),
6810
+ BPF_JMP_REG (BPF_JGT , BPF_REG_4 , BPF_REG_3 , 1 ),
6811
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6812
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6813
+ BPF_EXIT_INSN (),
6814
+ },
6815
+ .result = REJECT ,
6816
+ .errstr = "invalid access to packet" ,
6817
+ .prog_type = BPF_PROG_TYPE_XDP ,
6818
+ },
6819
+ {
6820
+ "meta access, test10" ,
6821
+ .insns = {
6822
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6823
+ offsetof(struct xdp_md , data_meta )),
6824
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6825
+ offsetof(struct xdp_md , data )),
6826
+ BPF_LDX_MEM (BPF_W , BPF_REG_4 , BPF_REG_1 ,
6827
+ offsetof(struct xdp_md , data_end )),
6828
+ BPF_MOV64_IMM (BPF_REG_5 , 42 ),
6829
+ BPF_MOV64_IMM (BPF_REG_6 , 24 ),
6830
+ BPF_STX_MEM (BPF_DW , BPF_REG_10 , BPF_REG_5 , -8 ),
6831
+ BPF_STX_XADD (BPF_DW , BPF_REG_10 , BPF_REG_6 , -8 ),
6832
+ BPF_LDX_MEM (BPF_DW , BPF_REG_5 , BPF_REG_10 , -8 ),
6833
+ BPF_JMP_IMM (BPF_JGT , BPF_REG_5 , 100 , 6 ),
6834
+ BPF_ALU64_REG (BPF_ADD , BPF_REG_3 , BPF_REG_5 ),
6835
+ BPF_MOV64_REG (BPF_REG_5 , BPF_REG_3 ),
6836
+ BPF_MOV64_REG (BPF_REG_6 , BPF_REG_2 ),
6837
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_6 , 8 ),
6838
+ BPF_JMP_REG (BPF_JGT , BPF_REG_6 , BPF_REG_5 , 1 ),
6839
+ BPF_LDX_MEM (BPF_B , BPF_REG_2 , BPF_REG_2 , 0 ),
6840
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6841
+ BPF_EXIT_INSN (),
6842
+ },
6843
+ .result = REJECT ,
6844
+ .errstr = "invalid access to packet" ,
6845
+ .prog_type = BPF_PROG_TYPE_XDP ,
6846
+ },
6847
+ {
6848
+ "meta access, test11" ,
6849
+ .insns = {
6850
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6851
+ offsetof(struct xdp_md , data_meta )),
6852
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6853
+ offsetof(struct xdp_md , data )),
6854
+ BPF_MOV64_IMM (BPF_REG_5 , 42 ),
6855
+ BPF_MOV64_IMM (BPF_REG_6 , 24 ),
6856
+ BPF_STX_MEM (BPF_DW , BPF_REG_10 , BPF_REG_5 , -8 ),
6857
+ BPF_STX_XADD (BPF_DW , BPF_REG_10 , BPF_REG_6 , -8 ),
6858
+ BPF_LDX_MEM (BPF_DW , BPF_REG_5 , BPF_REG_10 , -8 ),
6859
+ BPF_JMP_IMM (BPF_JGT , BPF_REG_5 , 100 , 6 ),
6860
+ BPF_ALU64_REG (BPF_ADD , BPF_REG_2 , BPF_REG_5 ),
6861
+ BPF_MOV64_REG (BPF_REG_5 , BPF_REG_2 ),
6862
+ BPF_MOV64_REG (BPF_REG_6 , BPF_REG_2 ),
6863
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_6 , 8 ),
6864
+ BPF_JMP_REG (BPF_JGT , BPF_REG_6 , BPF_REG_3 , 1 ),
6865
+ BPF_LDX_MEM (BPF_B , BPF_REG_5 , BPF_REG_5 , 0 ),
6866
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6867
+ BPF_EXIT_INSN (),
6868
+ },
6869
+ .result = ACCEPT ,
6870
+ .prog_type = BPF_PROG_TYPE_XDP ,
6871
+ },
6872
+ {
6873
+ "meta access, test12" ,
6874
+ .insns = {
6875
+ BPF_LDX_MEM (BPF_W , BPF_REG_2 , BPF_REG_1 ,
6876
+ offsetof(struct xdp_md , data_meta )),
6877
+ BPF_LDX_MEM (BPF_W , BPF_REG_3 , BPF_REG_1 ,
6878
+ offsetof(struct xdp_md , data )),
6879
+ BPF_LDX_MEM (BPF_W , BPF_REG_4 , BPF_REG_1 ,
6880
+ offsetof(struct xdp_md , data_end )),
6881
+ BPF_MOV64_REG (BPF_REG_5 , BPF_REG_3 ),
6882
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_5 , 16 ),
6883
+ BPF_JMP_REG (BPF_JGT , BPF_REG_5 , BPF_REG_4 , 5 ),
6884
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_3 , 0 ),
6885
+ BPF_MOV64_REG (BPF_REG_5 , BPF_REG_2 ),
6886
+ BPF_ALU64_IMM (BPF_ADD , BPF_REG_5 , 16 ),
6887
+ BPF_JMP_REG (BPF_JGT , BPF_REG_5 , BPF_REG_3 , 1 ),
6888
+ BPF_LDX_MEM (BPF_B , BPF_REG_0 , BPF_REG_2 , 0 ),
6889
+ BPF_MOV64_IMM (BPF_REG_0 , 0 ),
6890
+ BPF_EXIT_INSN (),
6891
+ },
6892
+ .result = ACCEPT ,
6893
+ .prog_type = BPF_PROG_TYPE_XDP ,
6894
+ },
6648
6895
};
6649
6896
6650
6897
static int probe_filter_length (const struct bpf_insn * fp )
0 commit comments