0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef _VIRTCHNL_H_
0014 #define _VIRTCHNL_H_
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 enum virtchnl_status_code {
0050 VIRTCHNL_STATUS_SUCCESS = 0,
0051 VIRTCHNL_STATUS_ERR_PARAM = -5,
0052 VIRTCHNL_STATUS_ERR_NO_MEMORY = -18,
0053 VIRTCHNL_STATUS_ERR_OPCODE_MISMATCH = -38,
0054 VIRTCHNL_STATUS_ERR_CQP_COMPL_ERROR = -39,
0055 VIRTCHNL_STATUS_ERR_INVALID_VF_ID = -40,
0056 VIRTCHNL_STATUS_ERR_ADMIN_QUEUE_ERROR = -53,
0057 VIRTCHNL_STATUS_ERR_NOT_SUPPORTED = -64,
0058 };
0059
0060
0061 #define VIRTCHNL_ERR_PARAM VIRTCHNL_STATUS_ERR_PARAM
0062 #define VIRTCHNL_STATUS_NOT_SUPPORTED VIRTCHNL_STATUS_ERR_NOT_SUPPORTED
0063
0064 #define VIRTCHNL_LINK_SPEED_2_5GB_SHIFT 0x0
0065 #define VIRTCHNL_LINK_SPEED_100MB_SHIFT 0x1
0066 #define VIRTCHNL_LINK_SPEED_1000MB_SHIFT 0x2
0067 #define VIRTCHNL_LINK_SPEED_10GB_SHIFT 0x3
0068 #define VIRTCHNL_LINK_SPEED_40GB_SHIFT 0x4
0069 #define VIRTCHNL_LINK_SPEED_20GB_SHIFT 0x5
0070 #define VIRTCHNL_LINK_SPEED_25GB_SHIFT 0x6
0071 #define VIRTCHNL_LINK_SPEED_5GB_SHIFT 0x7
0072
0073 enum virtchnl_link_speed {
0074 VIRTCHNL_LINK_SPEED_UNKNOWN = 0,
0075 VIRTCHNL_LINK_SPEED_100MB = BIT(VIRTCHNL_LINK_SPEED_100MB_SHIFT),
0076 VIRTCHNL_LINK_SPEED_1GB = BIT(VIRTCHNL_LINK_SPEED_1000MB_SHIFT),
0077 VIRTCHNL_LINK_SPEED_10GB = BIT(VIRTCHNL_LINK_SPEED_10GB_SHIFT),
0078 VIRTCHNL_LINK_SPEED_40GB = BIT(VIRTCHNL_LINK_SPEED_40GB_SHIFT),
0079 VIRTCHNL_LINK_SPEED_20GB = BIT(VIRTCHNL_LINK_SPEED_20GB_SHIFT),
0080 VIRTCHNL_LINK_SPEED_25GB = BIT(VIRTCHNL_LINK_SPEED_25GB_SHIFT),
0081 VIRTCHNL_LINK_SPEED_2_5GB = BIT(VIRTCHNL_LINK_SPEED_2_5GB_SHIFT),
0082 VIRTCHNL_LINK_SPEED_5GB = BIT(VIRTCHNL_LINK_SPEED_5GB_SHIFT),
0083 };
0084
0085
0086
0087 enum virtchnl_rx_hsplit {
0088 VIRTCHNL_RX_HSPLIT_NO_SPLIT = 0,
0089 VIRTCHNL_RX_HSPLIT_SPLIT_L2 = 1,
0090 VIRTCHNL_RX_HSPLIT_SPLIT_IP = 2,
0091 VIRTCHNL_RX_HSPLIT_SPLIT_TCP_UDP = 4,
0092 VIRTCHNL_RX_HSPLIT_SPLIT_SCTP = 8,
0093 };
0094
0095
0096
0097
0098
0099
0100 enum virtchnl_ops {
0101
0102
0103
0104
0105
0106
0107 VIRTCHNL_OP_UNKNOWN = 0,
0108 VIRTCHNL_OP_VERSION = 1,
0109 VIRTCHNL_OP_RESET_VF = 2,
0110 VIRTCHNL_OP_GET_VF_RESOURCES = 3,
0111 VIRTCHNL_OP_CONFIG_TX_QUEUE = 4,
0112 VIRTCHNL_OP_CONFIG_RX_QUEUE = 5,
0113 VIRTCHNL_OP_CONFIG_VSI_QUEUES = 6,
0114 VIRTCHNL_OP_CONFIG_IRQ_MAP = 7,
0115 VIRTCHNL_OP_ENABLE_QUEUES = 8,
0116 VIRTCHNL_OP_DISABLE_QUEUES = 9,
0117 VIRTCHNL_OP_ADD_ETH_ADDR = 10,
0118 VIRTCHNL_OP_DEL_ETH_ADDR = 11,
0119 VIRTCHNL_OP_ADD_VLAN = 12,
0120 VIRTCHNL_OP_DEL_VLAN = 13,
0121 VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE = 14,
0122 VIRTCHNL_OP_GET_STATS = 15,
0123 VIRTCHNL_OP_RSVD = 16,
0124 VIRTCHNL_OP_EVENT = 17,
0125 VIRTCHNL_OP_IWARP = 20,
0126 VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP = 21,
0127 VIRTCHNL_OP_RELEASE_IWARP_IRQ_MAP = 22,
0128 VIRTCHNL_OP_CONFIG_RSS_KEY = 23,
0129 VIRTCHNL_OP_CONFIG_RSS_LUT = 24,
0130 VIRTCHNL_OP_GET_RSS_HENA_CAPS = 25,
0131 VIRTCHNL_OP_SET_RSS_HENA = 26,
0132 VIRTCHNL_OP_ENABLE_VLAN_STRIPPING = 27,
0133 VIRTCHNL_OP_DISABLE_VLAN_STRIPPING = 28,
0134 VIRTCHNL_OP_REQUEST_QUEUES = 29,
0135 VIRTCHNL_OP_ENABLE_CHANNELS = 30,
0136 VIRTCHNL_OP_DISABLE_CHANNELS = 31,
0137 VIRTCHNL_OP_ADD_CLOUD_FILTER = 32,
0138 VIRTCHNL_OP_DEL_CLOUD_FILTER = 33,
0139
0140 VIRTCHNL_OP_ADD_RSS_CFG = 45,
0141 VIRTCHNL_OP_DEL_RSS_CFG = 46,
0142 VIRTCHNL_OP_ADD_FDIR_FILTER = 47,
0143 VIRTCHNL_OP_DEL_FDIR_FILTER = 48,
0144 VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS = 51,
0145 VIRTCHNL_OP_ADD_VLAN_V2 = 52,
0146 VIRTCHNL_OP_DEL_VLAN_V2 = 53,
0147 VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2 = 54,
0148 VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2 = 55,
0149 VIRTCHNL_OP_ENABLE_VLAN_INSERTION_V2 = 56,
0150 VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2 = 57,
0151 VIRTCHNL_OP_MAX,
0152 };
0153
0154
0155
0156
0157
0158
0159 #define VIRTCHNL_CHECK_STRUCT_LEN(n, X) enum virtchnl_static_assert_enum_##X \
0160 { virtchnl_static_assert_##X = (n)/((sizeof(struct X) == (n)) ? 1 : 0) }
0161 #define VIRTCHNL_CHECK_UNION_LEN(n, X) enum virtchnl_static_asset_enum_##X \
0162 { virtchnl_static_assert_##X = (n)/((sizeof(union X) == (n)) ? 1 : 0) }
0163
0164
0165
0166
0167
0168 struct virtchnl_msg {
0169 u8 pad[8];
0170 enum virtchnl_ops v_opcode;
0171 enum virtchnl_status_code v_retval;
0172 u32 vfid;
0173 };
0174
0175 VIRTCHNL_CHECK_STRUCT_LEN(20, virtchnl_msg);
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191 #define VIRTCHNL_VERSION_MAJOR 1
0192 #define VIRTCHNL_VERSION_MINOR 1
0193 #define VIRTCHNL_VERSION_MINOR_NO_VF_CAPS 0
0194
0195 struct virtchnl_version_info {
0196 u32 major;
0197 u32 minor;
0198 };
0199
0200 VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_version_info);
0201
0202 #define VF_IS_V10(_v) (((_v)->major == 1) && ((_v)->minor == 0))
0203 #define VF_IS_V11(_ver) (((_ver)->major == 1) && ((_ver)->minor == 1))
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221 enum virtchnl_vsi_type {
0222 VIRTCHNL_VSI_TYPE_INVALID = 0,
0223 VIRTCHNL_VSI_SRIOV = 6,
0224 };
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234 struct virtchnl_vsi_resource {
0235 u16 vsi_id;
0236 u16 num_queue_pairs;
0237 enum virtchnl_vsi_type vsi_type;
0238 u16 qset_handle;
0239 u8 default_mac_addr[ETH_ALEN];
0240 };
0241
0242 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vsi_resource);
0243
0244
0245
0246
0247
0248 #define VIRTCHNL_VF_OFFLOAD_L2 BIT(0)
0249 #define VIRTCHNL_VF_OFFLOAD_IWARP BIT(1)
0250 #define VIRTCHNL_VF_OFFLOAD_RSS_AQ BIT(3)
0251 #define VIRTCHNL_VF_OFFLOAD_RSS_REG BIT(4)
0252 #define VIRTCHNL_VF_OFFLOAD_WB_ON_ITR BIT(5)
0253 #define VIRTCHNL_VF_OFFLOAD_REQ_QUEUES BIT(6)
0254
0255 #define VIRTCHNL_VF_CAP_ADV_LINK_SPEED BIT(7)
0256 #define VIRTCHNL_VF_OFFLOAD_VLAN_V2 BIT(15)
0257 #define VIRTCHNL_VF_OFFLOAD_VLAN BIT(16)
0258 #define VIRTCHNL_VF_OFFLOAD_RX_POLLING BIT(17)
0259 #define VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 BIT(18)
0260 #define VIRTCHNL_VF_OFFLOAD_RSS_PF BIT(19)
0261 #define VIRTCHNL_VF_OFFLOAD_ENCAP BIT(20)
0262 #define VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM BIT(21)
0263 #define VIRTCHNL_VF_OFFLOAD_RX_ENCAP_CSUM BIT(22)
0264 #define VIRTCHNL_VF_OFFLOAD_ADQ BIT(23)
0265 #define VIRTCHNL_VF_OFFLOAD_USO BIT(25)
0266 #define VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF BIT(27)
0267 #define VIRTCHNL_VF_OFFLOAD_FDIR_PF BIT(28)
0268
0269 #define VF_BASE_MODE_OFFLOADS (VIRTCHNL_VF_OFFLOAD_L2 | \
0270 VIRTCHNL_VF_OFFLOAD_VLAN | \
0271 VIRTCHNL_VF_OFFLOAD_RSS_PF)
0272
0273 struct virtchnl_vf_resource {
0274 u16 num_vsis;
0275 u16 num_queue_pairs;
0276 u16 max_vectors;
0277 u16 max_mtu;
0278
0279 u32 vf_cap_flags;
0280 u32 rss_key_size;
0281 u32 rss_lut_size;
0282
0283 struct virtchnl_vsi_resource vsi_res[1];
0284 };
0285
0286 VIRTCHNL_CHECK_STRUCT_LEN(36, virtchnl_vf_resource);
0287
0288
0289
0290
0291
0292
0293
0294
0295 struct virtchnl_txq_info {
0296 u16 vsi_id;
0297 u16 queue_id;
0298 u16 ring_len;
0299 u16 headwb_enabled;
0300 u64 dma_ring_addr;
0301 u64 dma_headwb_addr;
0302 };
0303
0304 VIRTCHNL_CHECK_STRUCT_LEN(24, virtchnl_txq_info);
0305
0306
0307
0308
0309
0310
0311
0312
0313 struct virtchnl_rxq_info {
0314 u16 vsi_id;
0315 u16 queue_id;
0316 u32 ring_len;
0317 u16 hdr_size;
0318 u16 splithdr_enabled;
0319 u32 databuffer_size;
0320 u32 max_pkt_size;
0321 u32 pad1;
0322 u64 dma_ring_addr;
0323 enum virtchnl_rx_hsplit rx_split_pos;
0324 u32 pad2;
0325 };
0326
0327 VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_rxq_info);
0328
0329
0330
0331
0332
0333
0334
0335
0336 struct virtchnl_queue_pair_info {
0337
0338 struct virtchnl_txq_info txq;
0339 struct virtchnl_rxq_info rxq;
0340 };
0341
0342 VIRTCHNL_CHECK_STRUCT_LEN(64, virtchnl_queue_pair_info);
0343
0344 struct virtchnl_vsi_queue_config_info {
0345 u16 vsi_id;
0346 u16 num_queue_pairs;
0347 u32 pad;
0348 struct virtchnl_queue_pair_info qpair[1];
0349 };
0350
0351 VIRTCHNL_CHECK_STRUCT_LEN(72, virtchnl_vsi_queue_config_info);
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364 struct virtchnl_vf_res_request {
0365 u16 num_queue_pairs;
0366 };
0367
0368
0369
0370
0371
0372
0373
0374
0375 struct virtchnl_vector_map {
0376 u16 vsi_id;
0377 u16 vector_id;
0378 u16 rxq_map;
0379 u16 txq_map;
0380 u16 rxitr_idx;
0381 u16 txitr_idx;
0382 };
0383
0384 VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_vector_map);
0385
0386 struct virtchnl_irq_map_info {
0387 u16 num_vectors;
0388 struct virtchnl_vector_map vecmap[1];
0389 };
0390
0391 VIRTCHNL_CHECK_STRUCT_LEN(14, virtchnl_irq_map_info);
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401 struct virtchnl_queue_select {
0402 u16 vsi_id;
0403 u16 pad;
0404 u32 rx_queues;
0405 u32 tx_queues;
0406 };
0407
0408 VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_queue_select);
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444 struct virtchnl_ether_addr {
0445 u8 addr[ETH_ALEN];
0446 u8 type;
0447 #define VIRTCHNL_ETHER_ADDR_LEGACY 0
0448 #define VIRTCHNL_ETHER_ADDR_PRIMARY 1
0449 #define VIRTCHNL_ETHER_ADDR_EXTRA 2
0450 #define VIRTCHNL_ETHER_ADDR_TYPE_MASK 3
0451 u8 pad;
0452 };
0453
0454 VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_ether_addr);
0455
0456 struct virtchnl_ether_addr_list {
0457 u16 vsi_id;
0458 u16 num_elements;
0459 struct virtchnl_ether_addr list[1];
0460 };
0461
0462 VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_ether_addr_list);
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478 struct virtchnl_vlan_filter_list {
0479 u16 vsi_id;
0480 u16 num_elements;
0481 u16 vlan_id[1];
0482 };
0483
0484 VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_vlan_filter_list);
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539 enum virtchnl_vlan_support {
0540 VIRTCHNL_VLAN_UNSUPPORTED = 0,
0541 VIRTCHNL_VLAN_ETHERTYPE_8100 = BIT(0),
0542 VIRTCHNL_VLAN_ETHERTYPE_88A8 = BIT(1),
0543 VIRTCHNL_VLAN_ETHERTYPE_9100 = BIT(2),
0544 VIRTCHNL_VLAN_TAG_LOCATION_L2TAG1 = BIT(8),
0545 VIRTCHNL_VLAN_TAG_LOCATION_L2TAG2 = BIT(9),
0546 VIRTCHNL_VLAN_TAG_LOCATION_L2TAG2_2 = BIT(10),
0547 VIRTCHNL_VLAN_PRIO = BIT(24),
0548 VIRTCHNL_VLAN_FILTER_MASK = BIT(28),
0549 VIRTCHNL_VLAN_ETHERTYPE_AND = BIT(29),
0550 VIRTCHNL_VLAN_ETHERTYPE_XOR = BIT(30),
0551 VIRTCHNL_VLAN_TOGGLE = BIT(31),
0552 };
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574 struct virtchnl_vlan_supported_caps {
0575 u32 outer;
0576 u32 inner;
0577 };
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601 struct virtchnl_vlan_filtering_caps {
0602 struct virtchnl_vlan_supported_caps filtering_support;
0603 u32 ethertype_init;
0604 u16 max_filters;
0605 u8 pad[2];
0606 };
0607
0608 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vlan_filtering_caps);
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623 enum virtchnl_vlan_ethertype_match {
0624 VIRTCHNL_ETHERTYPE_STRIPPING_MATCHES_INSERTION = 0,
0625 VIRTCHNL_ETHERTYPE_MATCH_NOT_REQUIRED = 1,
0626 };
0627
0628
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644 struct virtchnl_vlan_offload_caps {
0645 struct virtchnl_vlan_supported_caps stripping_support;
0646 struct virtchnl_vlan_supported_caps insertion_support;
0647 u32 ethertype_init;
0648 u8 ethertype_match;
0649 u8 pad[3];
0650 };
0651
0652 VIRTCHNL_CHECK_STRUCT_LEN(24, virtchnl_vlan_offload_caps);
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666 struct virtchnl_vlan_caps {
0667 struct virtchnl_vlan_filtering_caps filtering;
0668 struct virtchnl_vlan_offload_caps offloads;
0669 };
0670
0671 VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_vlan_caps);
0672
0673 struct virtchnl_vlan {
0674 u16 tci;
0675 u16 tci_mask;
0676
0677
0678 u16 tpid;
0679
0680
0681
0682
0683 u8 pad[2];
0684 };
0685
0686 VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_vlan);
0687
0688 struct virtchnl_vlan_filter {
0689 struct virtchnl_vlan inner;
0690 struct virtchnl_vlan outer;
0691 u8 pad[16];
0692 };
0693
0694 VIRTCHNL_CHECK_STRUCT_LEN(32, virtchnl_vlan_filter);
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707 struct virtchnl_vlan_filter_list_v2 {
0708 u16 vport_id;
0709 u16 num_elements;
0710 u8 pad[4];
0711 struct virtchnl_vlan_filter filters[1];
0712 };
0713
0714 VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_vlan_filter_list_v2);
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822 struct virtchnl_vlan_setting {
0823 u32 outer_ethertype_setting;
0824 u32 inner_ethertype_setting;
0825 u16 vport_id;
0826 u8 pad[6];
0827 };
0828
0829 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vlan_setting);
0830
0831
0832
0833
0834
0835
0836 struct virtchnl_promisc_info {
0837 u16 vsi_id;
0838 u16 flags;
0839 };
0840
0841 VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_promisc_info);
0842
0843 #define FLAG_VF_UNICAST_PROMISC 0x00000001
0844 #define FLAG_VF_MULTICAST_PROMISC 0x00000002
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863 struct virtchnl_rss_key {
0864 u16 vsi_id;
0865 u16 key_len;
0866 u8 key[1];
0867 };
0868
0869 VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_key);
0870
0871 struct virtchnl_rss_lut {
0872 u16 vsi_id;
0873 u16 lut_entries;
0874 u8 lut[1];
0875 };
0876
0877 VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_lut);
0878
0879
0880
0881
0882
0883
0884
0885
0886 struct virtchnl_rss_hena {
0887 u64 hena;
0888 };
0889
0890 VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_rss_hena);
0891
0892
0893
0894
0895
0896
0897
0898
0899 struct virtchnl_channel_info {
0900 u16 count;
0901 u16 offset;
0902 u32 pad;
0903 u64 max_tx_rate;
0904 };
0905
0906 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_channel_info);
0907
0908 struct virtchnl_tc_info {
0909 u32 num_tc;
0910 u32 pad;
0911 struct virtchnl_channel_info list[1];
0912 };
0913
0914 VIRTCHNL_CHECK_STRUCT_LEN(24, virtchnl_tc_info);
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924 struct virtchnl_l4_spec {
0925 u8 src_mac[ETH_ALEN];
0926 u8 dst_mac[ETH_ALEN];
0927 __be16 vlan_id;
0928 __be16 pad;
0929 __be32 src_ip[4];
0930 __be32 dst_ip[4];
0931 __be16 src_port;
0932 __be16 dst_port;
0933 };
0934
0935 VIRTCHNL_CHECK_STRUCT_LEN(52, virtchnl_l4_spec);
0936
0937 union virtchnl_flow_spec {
0938 struct virtchnl_l4_spec tcp_spec;
0939 u8 buffer[128];
0940 };
0941
0942 VIRTCHNL_CHECK_UNION_LEN(128, virtchnl_flow_spec);
0943
0944 enum virtchnl_action {
0945
0946 VIRTCHNL_ACTION_DROP = 0,
0947 VIRTCHNL_ACTION_TC_REDIRECT,
0948 VIRTCHNL_ACTION_PASSTHRU,
0949 VIRTCHNL_ACTION_QUEUE,
0950 VIRTCHNL_ACTION_Q_REGION,
0951 VIRTCHNL_ACTION_MARK,
0952 VIRTCHNL_ACTION_COUNT,
0953 };
0954
0955 enum virtchnl_flow_type {
0956
0957 VIRTCHNL_TCP_V4_FLOW = 0,
0958 VIRTCHNL_TCP_V6_FLOW,
0959 };
0960
0961 struct virtchnl_filter {
0962 union virtchnl_flow_spec data;
0963 union virtchnl_flow_spec mask;
0964 enum virtchnl_flow_type flow_type;
0965 enum virtchnl_action action;
0966 u32 action_meta;
0967 u8 field_flags;
0968 u8 pad[3];
0969 };
0970
0971 VIRTCHNL_CHECK_STRUCT_LEN(272, virtchnl_filter);
0972
0973
0974
0975
0976
0977
0978 enum virtchnl_event_codes {
0979 VIRTCHNL_EVENT_UNKNOWN = 0,
0980 VIRTCHNL_EVENT_LINK_CHANGE,
0981 VIRTCHNL_EVENT_RESET_IMPENDING,
0982 VIRTCHNL_EVENT_PF_DRIVER_CLOSE,
0983 };
0984
0985 #define PF_EVENT_SEVERITY_INFO 0
0986 #define PF_EVENT_SEVERITY_CERTAIN_DOOM 255
0987
0988 struct virtchnl_pf_event {
0989 enum virtchnl_event_codes event;
0990 union {
0991
0992
0993
0994
0995
0996
0997
0998
0999 struct {
1000 enum virtchnl_link_speed link_speed;
1001 bool link_status;
1002 } link_event;
1003 struct {
1004
1005 u32 link_speed;
1006 u8 link_status;
1007 u8 pad[3];
1008 } link_event_adv;
1009 } event_data;
1010
1011 int severity;
1012 };
1013
1014 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_pf_event);
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028 struct virtchnl_iwarp_qv_info {
1029 u32 v_idx;
1030 u16 ceq_idx;
1031 u16 aeq_idx;
1032 u8 itr_idx;
1033 u8 pad[3];
1034 };
1035
1036 VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_iwarp_qv_info);
1037
1038 struct virtchnl_iwarp_qvlist_info {
1039 u32 num_vectors;
1040 struct virtchnl_iwarp_qv_info qv_info[1];
1041 };
1042
1043 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_iwarp_qvlist_info);
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056 enum virtchnl_vfr_states {
1057 VIRTCHNL_VFR_INPROGRESS = 0,
1058 VIRTCHNL_VFR_COMPLETED,
1059 VIRTCHNL_VFR_VFACTIVE,
1060 };
1061
1062
1063 enum virtchnl_rss_algorithm {
1064 VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC = 0,
1065 VIRTCHNL_RSS_ALG_R_ASYMMETRIC = 1,
1066 VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC = 2,
1067 VIRTCHNL_RSS_ALG_XOR_SYMMETRIC = 3,
1068 };
1069
1070 #define VIRTCHNL_MAX_NUM_PROTO_HDRS 32
1071 #define PROTO_HDR_SHIFT 5
1072 #define PROTO_HDR_FIELD_START(proto_hdr_type) ((proto_hdr_type) << PROTO_HDR_SHIFT)
1073 #define PROTO_HDR_FIELD_MASK ((1UL << PROTO_HDR_SHIFT) - 1)
1074
1075
1076
1077
1078
1079
1080
1081
1082 #define VIRTCHNL_ADD_PROTO_HDR_FIELD(hdr, field) \
1083 ((hdr)->field_selector |= BIT((field) & PROTO_HDR_FIELD_MASK))
1084 #define VIRTCHNL_DEL_PROTO_HDR_FIELD(hdr, field) \
1085 ((hdr)->field_selector &= ~BIT((field) & PROTO_HDR_FIELD_MASK))
1086 #define VIRTCHNL_TEST_PROTO_HDR_FIELD(hdr, val) \
1087 ((hdr)->field_selector & BIT((val) & PROTO_HDR_FIELD_MASK))
1088 #define VIRTCHNL_GET_PROTO_HDR_FIELD(hdr) ((hdr)->field_selector)
1089
1090 #define VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, hdr_type, field) \
1091 (VIRTCHNL_ADD_PROTO_HDR_FIELD(hdr, \
1092 VIRTCHNL_PROTO_HDR_ ## hdr_type ## _ ## field))
1093 #define VIRTCHNL_DEL_PROTO_HDR_FIELD_BIT(hdr, hdr_type, field) \
1094 (VIRTCHNL_DEL_PROTO_HDR_FIELD(hdr, \
1095 VIRTCHNL_PROTO_HDR_ ## hdr_type ## _ ## field))
1096
1097 #define VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, hdr_type) \
1098 ((hdr)->type = VIRTCHNL_PROTO_HDR_ ## hdr_type)
1099 #define VIRTCHNL_GET_PROTO_HDR_TYPE(hdr) \
1100 (((hdr)->type) >> PROTO_HDR_SHIFT)
1101 #define VIRTCHNL_TEST_PROTO_HDR_TYPE(hdr, val) \
1102 ((hdr)->type == ((val) >> PROTO_HDR_SHIFT))
1103 #define VIRTCHNL_TEST_PROTO_HDR(hdr, val) \
1104 (VIRTCHNL_TEST_PROTO_HDR_TYPE((hdr), (val)) && \
1105 VIRTCHNL_TEST_PROTO_HDR_FIELD((hdr), (val)))
1106
1107
1108
1109
1110
1111
1112 enum virtchnl_proto_hdr_type {
1113 VIRTCHNL_PROTO_HDR_NONE,
1114 VIRTCHNL_PROTO_HDR_ETH,
1115 VIRTCHNL_PROTO_HDR_S_VLAN,
1116 VIRTCHNL_PROTO_HDR_C_VLAN,
1117 VIRTCHNL_PROTO_HDR_IPV4,
1118 VIRTCHNL_PROTO_HDR_IPV6,
1119 VIRTCHNL_PROTO_HDR_TCP,
1120 VIRTCHNL_PROTO_HDR_UDP,
1121 VIRTCHNL_PROTO_HDR_SCTP,
1122 VIRTCHNL_PROTO_HDR_GTPU_IP,
1123 VIRTCHNL_PROTO_HDR_GTPU_EH,
1124 VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_DWN,
1125 VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP,
1126 VIRTCHNL_PROTO_HDR_PPPOE,
1127 VIRTCHNL_PROTO_HDR_L2TPV3,
1128 VIRTCHNL_PROTO_HDR_ESP,
1129 VIRTCHNL_PROTO_HDR_AH,
1130 VIRTCHNL_PROTO_HDR_PFCP,
1131 };
1132
1133
1134 enum virtchnl_proto_hdr_field {
1135
1136 VIRTCHNL_PROTO_HDR_ETH_SRC =
1137 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ETH),
1138 VIRTCHNL_PROTO_HDR_ETH_DST,
1139 VIRTCHNL_PROTO_HDR_ETH_ETHERTYPE,
1140
1141 VIRTCHNL_PROTO_HDR_S_VLAN_ID =
1142 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_S_VLAN),
1143
1144 VIRTCHNL_PROTO_HDR_C_VLAN_ID =
1145 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_C_VLAN),
1146
1147 VIRTCHNL_PROTO_HDR_IPV4_SRC =
1148 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4),
1149 VIRTCHNL_PROTO_HDR_IPV4_DST,
1150 VIRTCHNL_PROTO_HDR_IPV4_DSCP,
1151 VIRTCHNL_PROTO_HDR_IPV4_TTL,
1152 VIRTCHNL_PROTO_HDR_IPV4_PROT,
1153
1154 VIRTCHNL_PROTO_HDR_IPV6_SRC =
1155 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
1156 VIRTCHNL_PROTO_HDR_IPV6_DST,
1157 VIRTCHNL_PROTO_HDR_IPV6_TC,
1158 VIRTCHNL_PROTO_HDR_IPV6_HOP_LIMIT,
1159 VIRTCHNL_PROTO_HDR_IPV6_PROT,
1160
1161 VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
1162 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
1163 VIRTCHNL_PROTO_HDR_TCP_DST_PORT,
1164
1165 VIRTCHNL_PROTO_HDR_UDP_SRC_PORT =
1166 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_UDP),
1167 VIRTCHNL_PROTO_HDR_UDP_DST_PORT,
1168
1169 VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT =
1170 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_SCTP),
1171 VIRTCHNL_PROTO_HDR_SCTP_DST_PORT,
1172
1173 VIRTCHNL_PROTO_HDR_GTPU_IP_TEID =
1174 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GTPU_IP),
1175
1176 VIRTCHNL_PROTO_HDR_GTPU_EH_PDU =
1177 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GTPU_EH),
1178 VIRTCHNL_PROTO_HDR_GTPU_EH_QFI,
1179
1180 VIRTCHNL_PROTO_HDR_PPPOE_SESS_ID =
1181 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PPPOE),
1182
1183 VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID =
1184 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_L2TPV3),
1185
1186 VIRTCHNL_PROTO_HDR_ESP_SPI =
1187 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ESP),
1188
1189 VIRTCHNL_PROTO_HDR_AH_SPI =
1190 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_AH),
1191
1192 VIRTCHNL_PROTO_HDR_PFCP_S_FIELD =
1193 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PFCP),
1194 VIRTCHNL_PROTO_HDR_PFCP_SEID,
1195 };
1196
1197 struct virtchnl_proto_hdr {
1198 enum virtchnl_proto_hdr_type type;
1199 u32 field_selector;
1200 u8 buffer[64];
1201
1202
1203
1204
1205
1206 };
1207
1208 VIRTCHNL_CHECK_STRUCT_LEN(72, virtchnl_proto_hdr);
1209
1210 struct virtchnl_proto_hdrs {
1211 u8 tunnel_level;
1212 u8 pad[3];
1213
1214
1215
1216
1217
1218
1219
1220 int count;
1221 struct virtchnl_proto_hdr proto_hdr[VIRTCHNL_MAX_NUM_PROTO_HDRS];
1222 };
1223
1224 VIRTCHNL_CHECK_STRUCT_LEN(2312, virtchnl_proto_hdrs);
1225
1226 struct virtchnl_rss_cfg {
1227 struct virtchnl_proto_hdrs proto_hdrs;
1228 enum virtchnl_rss_algorithm rss_algorithm;
1229 u8 reserved[128];
1230 };
1231
1232 VIRTCHNL_CHECK_STRUCT_LEN(2444, virtchnl_rss_cfg);
1233
1234
1235 struct virtchnl_filter_action {
1236 enum virtchnl_action type;
1237 union {
1238
1239 struct {
1240 u16 index;
1241 u8 region;
1242 } queue;
1243
1244 struct {
1245
1246 u8 shared;
1247 u32 id;
1248 } count;
1249
1250 u32 mark_id;
1251 u8 reserve[32];
1252 } act_conf;
1253 };
1254
1255 VIRTCHNL_CHECK_STRUCT_LEN(36, virtchnl_filter_action);
1256
1257 #define VIRTCHNL_MAX_NUM_ACTIONS 8
1258
1259 struct virtchnl_filter_action_set {
1260
1261 int count;
1262 struct virtchnl_filter_action actions[VIRTCHNL_MAX_NUM_ACTIONS];
1263 };
1264
1265 VIRTCHNL_CHECK_STRUCT_LEN(292, virtchnl_filter_action_set);
1266
1267
1268 struct virtchnl_fdir_rule {
1269 struct virtchnl_proto_hdrs proto_hdrs;
1270 struct virtchnl_filter_action_set action_set;
1271 };
1272
1273 VIRTCHNL_CHECK_STRUCT_LEN(2604, virtchnl_fdir_rule);
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300 enum virtchnl_fdir_prgm_status {
1301 VIRTCHNL_FDIR_SUCCESS = 0,
1302 VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE,
1303 VIRTCHNL_FDIR_FAILURE_RULE_EXIST,
1304 VIRTCHNL_FDIR_FAILURE_RULE_CONFLICT,
1305 VIRTCHNL_FDIR_FAILURE_RULE_NONEXIST,
1306 VIRTCHNL_FDIR_FAILURE_RULE_INVALID,
1307 VIRTCHNL_FDIR_FAILURE_RULE_TIMEOUT,
1308 };
1309
1310
1311
1312
1313
1314
1315 struct virtchnl_fdir_add {
1316 u16 vsi_id;
1317
1318
1319
1320
1321 u16 validate_only;
1322 u32 flow_id;
1323 struct virtchnl_fdir_rule rule_cfg;
1324 enum virtchnl_fdir_prgm_status status;
1325 };
1326
1327 VIRTCHNL_CHECK_STRUCT_LEN(2616, virtchnl_fdir_add);
1328
1329
1330
1331
1332
1333 struct virtchnl_fdir_del {
1334 u16 vsi_id;
1335 u16 pad;
1336 u32 flow_id;
1337 enum virtchnl_fdir_prgm_status status;
1338 };
1339
1340 VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_fdir_del);
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351 static inline int
1352 virtchnl_vc_validate_vf_msg(struct virtchnl_version_info *ver, u32 v_opcode,
1353 u8 *msg, u16 msglen)
1354 {
1355 bool err_msg_format = false;
1356 int valid_len = 0;
1357
1358
1359 switch (v_opcode) {
1360 case VIRTCHNL_OP_VERSION:
1361 valid_len = sizeof(struct virtchnl_version_info);
1362 break;
1363 case VIRTCHNL_OP_RESET_VF:
1364 break;
1365 case VIRTCHNL_OP_GET_VF_RESOURCES:
1366 if (VF_IS_V11(ver))
1367 valid_len = sizeof(u32);
1368 break;
1369 case VIRTCHNL_OP_CONFIG_TX_QUEUE:
1370 valid_len = sizeof(struct virtchnl_txq_info);
1371 break;
1372 case VIRTCHNL_OP_CONFIG_RX_QUEUE:
1373 valid_len = sizeof(struct virtchnl_rxq_info);
1374 break;
1375 case VIRTCHNL_OP_CONFIG_VSI_QUEUES:
1376 valid_len = sizeof(struct virtchnl_vsi_queue_config_info);
1377 if (msglen >= valid_len) {
1378 struct virtchnl_vsi_queue_config_info *vqc =
1379 (struct virtchnl_vsi_queue_config_info *)msg;
1380 valid_len += (vqc->num_queue_pairs *
1381 sizeof(struct
1382 virtchnl_queue_pair_info));
1383 if (vqc->num_queue_pairs == 0)
1384 err_msg_format = true;
1385 }
1386 break;
1387 case VIRTCHNL_OP_CONFIG_IRQ_MAP:
1388 valid_len = sizeof(struct virtchnl_irq_map_info);
1389 if (msglen >= valid_len) {
1390 struct virtchnl_irq_map_info *vimi =
1391 (struct virtchnl_irq_map_info *)msg;
1392 valid_len += (vimi->num_vectors *
1393 sizeof(struct virtchnl_vector_map));
1394 if (vimi->num_vectors == 0)
1395 err_msg_format = true;
1396 }
1397 break;
1398 case VIRTCHNL_OP_ENABLE_QUEUES:
1399 case VIRTCHNL_OP_DISABLE_QUEUES:
1400 valid_len = sizeof(struct virtchnl_queue_select);
1401 break;
1402 case VIRTCHNL_OP_ADD_ETH_ADDR:
1403 case VIRTCHNL_OP_DEL_ETH_ADDR:
1404 valid_len = sizeof(struct virtchnl_ether_addr_list);
1405 if (msglen >= valid_len) {
1406 struct virtchnl_ether_addr_list *veal =
1407 (struct virtchnl_ether_addr_list *)msg;
1408 valid_len += veal->num_elements *
1409 sizeof(struct virtchnl_ether_addr);
1410 if (veal->num_elements == 0)
1411 err_msg_format = true;
1412 }
1413 break;
1414 case VIRTCHNL_OP_ADD_VLAN:
1415 case VIRTCHNL_OP_DEL_VLAN:
1416 valid_len = sizeof(struct virtchnl_vlan_filter_list);
1417 if (msglen >= valid_len) {
1418 struct virtchnl_vlan_filter_list *vfl =
1419 (struct virtchnl_vlan_filter_list *)msg;
1420 valid_len += vfl->num_elements * sizeof(u16);
1421 if (vfl->num_elements == 0)
1422 err_msg_format = true;
1423 }
1424 break;
1425 case VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE:
1426 valid_len = sizeof(struct virtchnl_promisc_info);
1427 break;
1428 case VIRTCHNL_OP_GET_STATS:
1429 valid_len = sizeof(struct virtchnl_queue_select);
1430 break;
1431 case VIRTCHNL_OP_IWARP:
1432
1433
1434
1435
1436 if (msglen)
1437 valid_len = msglen;
1438 else
1439 err_msg_format = true;
1440 break;
1441 case VIRTCHNL_OP_RELEASE_IWARP_IRQ_MAP:
1442 break;
1443 case VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP:
1444 valid_len = sizeof(struct virtchnl_iwarp_qvlist_info);
1445 if (msglen >= valid_len) {
1446 struct virtchnl_iwarp_qvlist_info *qv =
1447 (struct virtchnl_iwarp_qvlist_info *)msg;
1448 if (qv->num_vectors == 0) {
1449 err_msg_format = true;
1450 break;
1451 }
1452 valid_len += ((qv->num_vectors - 1) *
1453 sizeof(struct virtchnl_iwarp_qv_info));
1454 }
1455 break;
1456 case VIRTCHNL_OP_CONFIG_RSS_KEY:
1457 valid_len = sizeof(struct virtchnl_rss_key);
1458 if (msglen >= valid_len) {
1459 struct virtchnl_rss_key *vrk =
1460 (struct virtchnl_rss_key *)msg;
1461 valid_len += vrk->key_len - 1;
1462 }
1463 break;
1464 case VIRTCHNL_OP_CONFIG_RSS_LUT:
1465 valid_len = sizeof(struct virtchnl_rss_lut);
1466 if (msglen >= valid_len) {
1467 struct virtchnl_rss_lut *vrl =
1468 (struct virtchnl_rss_lut *)msg;
1469 valid_len += vrl->lut_entries - 1;
1470 }
1471 break;
1472 case VIRTCHNL_OP_GET_RSS_HENA_CAPS:
1473 break;
1474 case VIRTCHNL_OP_SET_RSS_HENA:
1475 valid_len = sizeof(struct virtchnl_rss_hena);
1476 break;
1477 case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING:
1478 case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING:
1479 break;
1480 case VIRTCHNL_OP_REQUEST_QUEUES:
1481 valid_len = sizeof(struct virtchnl_vf_res_request);
1482 break;
1483 case VIRTCHNL_OP_ENABLE_CHANNELS:
1484 valid_len = sizeof(struct virtchnl_tc_info);
1485 if (msglen >= valid_len) {
1486 struct virtchnl_tc_info *vti =
1487 (struct virtchnl_tc_info *)msg;
1488 valid_len += (vti->num_tc - 1) *
1489 sizeof(struct virtchnl_channel_info);
1490 if (vti->num_tc == 0)
1491 err_msg_format = true;
1492 }
1493 break;
1494 case VIRTCHNL_OP_DISABLE_CHANNELS:
1495 break;
1496 case VIRTCHNL_OP_ADD_CLOUD_FILTER:
1497 valid_len = sizeof(struct virtchnl_filter);
1498 break;
1499 case VIRTCHNL_OP_DEL_CLOUD_FILTER:
1500 valid_len = sizeof(struct virtchnl_filter);
1501 break;
1502 case VIRTCHNL_OP_ADD_RSS_CFG:
1503 case VIRTCHNL_OP_DEL_RSS_CFG:
1504 valid_len = sizeof(struct virtchnl_rss_cfg);
1505 break;
1506 case VIRTCHNL_OP_ADD_FDIR_FILTER:
1507 valid_len = sizeof(struct virtchnl_fdir_add);
1508 break;
1509 case VIRTCHNL_OP_DEL_FDIR_FILTER:
1510 valid_len = sizeof(struct virtchnl_fdir_del);
1511 break;
1512 case VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS:
1513 break;
1514 case VIRTCHNL_OP_ADD_VLAN_V2:
1515 case VIRTCHNL_OP_DEL_VLAN_V2:
1516 valid_len = sizeof(struct virtchnl_vlan_filter_list_v2);
1517 if (msglen >= valid_len) {
1518 struct virtchnl_vlan_filter_list_v2 *vfl =
1519 (struct virtchnl_vlan_filter_list_v2 *)msg;
1520
1521 valid_len += (vfl->num_elements - 1) *
1522 sizeof(struct virtchnl_vlan_filter);
1523
1524 if (vfl->num_elements == 0) {
1525 err_msg_format = true;
1526 break;
1527 }
1528 }
1529 break;
1530 case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2:
1531 case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2:
1532 case VIRTCHNL_OP_ENABLE_VLAN_INSERTION_V2:
1533 case VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2:
1534 valid_len = sizeof(struct virtchnl_vlan_setting);
1535 break;
1536
1537 case VIRTCHNL_OP_EVENT:
1538 case VIRTCHNL_OP_UNKNOWN:
1539 default:
1540 return VIRTCHNL_STATUS_ERR_PARAM;
1541 }
1542
1543 if (err_msg_format || valid_len != msglen)
1544 return VIRTCHNL_STATUS_ERR_OPCODE_MISMATCH;
1545
1546 return 0;
1547 }
1548 #endif