1
2
3
4#ifndef _VIRTCHNL_H_
5#define _VIRTCHNL_H_
6
7#include <linux/bitops.h>
8#include <linux/bits.h>
9#include <linux/overflow.h>
10#include <uapi/linux/if_ether.h>
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46enum virtchnl_status_code {
47 VIRTCHNL_STATUS_SUCCESS = 0,
48 VIRTCHNL_STATUS_ERR_PARAM = -5,
49 VIRTCHNL_STATUS_ERR_NO_MEMORY = -18,
50 VIRTCHNL_STATUS_ERR_OPCODE_MISMATCH = -38,
51 VIRTCHNL_STATUS_ERR_CQP_COMPL_ERROR = -39,
52 VIRTCHNL_STATUS_ERR_INVALID_VF_ID = -40,
53 VIRTCHNL_STATUS_ERR_ADMIN_QUEUE_ERROR = -53,
54 VIRTCHNL_STATUS_ERR_NOT_SUPPORTED = -64,
55};
56
57
58#define VIRTCHNL_ERR_PARAM VIRTCHNL_STATUS_ERR_PARAM
59#define VIRTCHNL_STATUS_NOT_SUPPORTED VIRTCHNL_STATUS_ERR_NOT_SUPPORTED
60
61#define VIRTCHNL_LINK_SPEED_2_5GB_SHIFT 0x0
62#define VIRTCHNL_LINK_SPEED_100MB_SHIFT 0x1
63#define VIRTCHNL_LINK_SPEED_1000MB_SHIFT 0x2
64#define VIRTCHNL_LINK_SPEED_10GB_SHIFT 0x3
65#define VIRTCHNL_LINK_SPEED_40GB_SHIFT 0x4
66#define VIRTCHNL_LINK_SPEED_20GB_SHIFT 0x5
67#define VIRTCHNL_LINK_SPEED_25GB_SHIFT 0x6
68#define VIRTCHNL_LINK_SPEED_5GB_SHIFT 0x7
69
70enum virtchnl_link_speed {
71 VIRTCHNL_LINK_SPEED_UNKNOWN = 0,
72 VIRTCHNL_LINK_SPEED_100MB = BIT(VIRTCHNL_LINK_SPEED_100MB_SHIFT),
73 VIRTCHNL_LINK_SPEED_1GB = BIT(VIRTCHNL_LINK_SPEED_1000MB_SHIFT),
74 VIRTCHNL_LINK_SPEED_10GB = BIT(VIRTCHNL_LINK_SPEED_10GB_SHIFT),
75 VIRTCHNL_LINK_SPEED_40GB = BIT(VIRTCHNL_LINK_SPEED_40GB_SHIFT),
76 VIRTCHNL_LINK_SPEED_20GB = BIT(VIRTCHNL_LINK_SPEED_20GB_SHIFT),
77 VIRTCHNL_LINK_SPEED_25GB = BIT(VIRTCHNL_LINK_SPEED_25GB_SHIFT),
78 VIRTCHNL_LINK_SPEED_2_5GB = BIT(VIRTCHNL_LINK_SPEED_2_5GB_SHIFT),
79 VIRTCHNL_LINK_SPEED_5GB = BIT(VIRTCHNL_LINK_SPEED_5GB_SHIFT),
80};
81
82
83
84enum virtchnl_rx_hsplit {
85 VIRTCHNL_RX_HSPLIT_NO_SPLIT = 0,
86 VIRTCHNL_RX_HSPLIT_SPLIT_L2 = 1,
87 VIRTCHNL_RX_HSPLIT_SPLIT_IP = 2,
88 VIRTCHNL_RX_HSPLIT_SPLIT_TCP_UDP = 4,
89 VIRTCHNL_RX_HSPLIT_SPLIT_SCTP = 8,
90};
91
92enum virtchnl_bw_limit_type {
93 VIRTCHNL_BW_SHAPER = 0,
94};
95
96
97
98
99
100enum virtchnl_ops {
101
102
103
104
105
106
107 VIRTCHNL_OP_UNKNOWN = 0,
108 VIRTCHNL_OP_VERSION = 1,
109 VIRTCHNL_OP_RESET_VF = 2,
110 VIRTCHNL_OP_GET_VF_RESOURCES = 3,
111 VIRTCHNL_OP_CONFIG_TX_QUEUE = 4,
112 VIRTCHNL_OP_CONFIG_RX_QUEUE = 5,
113 VIRTCHNL_OP_CONFIG_VSI_QUEUES = 6,
114 VIRTCHNL_OP_CONFIG_IRQ_MAP = 7,
115 VIRTCHNL_OP_ENABLE_QUEUES = 8,
116 VIRTCHNL_OP_DISABLE_QUEUES = 9,
117 VIRTCHNL_OP_ADD_ETH_ADDR = 10,
118 VIRTCHNL_OP_DEL_ETH_ADDR = 11,
119 VIRTCHNL_OP_ADD_VLAN = 12,
120 VIRTCHNL_OP_DEL_VLAN = 13,
121 VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE = 14,
122 VIRTCHNL_OP_GET_STATS = 15,
123 VIRTCHNL_OP_RSVD = 16,
124 VIRTCHNL_OP_EVENT = 17,
125 VIRTCHNL_OP_CONFIG_RSS_HFUNC = 18,
126
127 VIRTCHNL_OP_IWARP = 20,
128 VIRTCHNL_OP_RDMA = VIRTCHNL_OP_IWARP,
129 VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP = 21,
130 VIRTCHNL_OP_CONFIG_RDMA_IRQ_MAP = VIRTCHNL_OP_CONFIG_IWARP_IRQ_MAP,
131 VIRTCHNL_OP_RELEASE_IWARP_IRQ_MAP = 22,
132 VIRTCHNL_OP_RELEASE_RDMA_IRQ_MAP = VIRTCHNL_OP_RELEASE_IWARP_IRQ_MAP,
133 VIRTCHNL_OP_CONFIG_RSS_KEY = 23,
134 VIRTCHNL_OP_CONFIG_RSS_LUT = 24,
135 VIRTCHNL_OP_GET_RSS_HASHCFG_CAPS = 25,
136 VIRTCHNL_OP_SET_RSS_HASHCFG = 26,
137 VIRTCHNL_OP_ENABLE_VLAN_STRIPPING = 27,
138 VIRTCHNL_OP_DISABLE_VLAN_STRIPPING = 28,
139 VIRTCHNL_OP_REQUEST_QUEUES = 29,
140 VIRTCHNL_OP_ENABLE_CHANNELS = 30,
141 VIRTCHNL_OP_DISABLE_CHANNELS = 31,
142 VIRTCHNL_OP_ADD_CLOUD_FILTER = 32,
143 VIRTCHNL_OP_DEL_CLOUD_FILTER = 33,
144
145 VIRTCHNL_OP_GET_SUPPORTED_RXDIDS = 44,
146 VIRTCHNL_OP_ADD_RSS_CFG = 45,
147 VIRTCHNL_OP_DEL_RSS_CFG = 46,
148 VIRTCHNL_OP_ADD_FDIR_FILTER = 47,
149 VIRTCHNL_OP_DEL_FDIR_FILTER = 48,
150 VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS = 51,
151 VIRTCHNL_OP_ADD_VLAN_V2 = 52,
152 VIRTCHNL_OP_DEL_VLAN_V2 = 53,
153 VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2 = 54,
154 VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2 = 55,
155 VIRTCHNL_OP_ENABLE_VLAN_INSERTION_V2 = 56,
156 VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2 = 57,
157
158 VIRTCHNL_OP_1588_PTP_GET_CAPS = 60,
159 VIRTCHNL_OP_1588_PTP_GET_TIME = 61,
160
161 VIRTCHNL_OP_GET_QOS_CAPS = 66,
162
163 VIRTCHNL_OP_CONFIG_QUEUE_BW = 112,
164 VIRTCHNL_OP_CONFIG_QUANTA = 113,
165 VIRTCHNL_OP_MAX,
166};
167
168
169
170
171
172
173#define VIRTCHNL_CHECK_STRUCT_LEN(n, X) enum virtchnl_static_assert_enum_##X \
174 { virtchnl_static_assert_##X = (n)/((sizeof(struct X) == (n)) ? 1 : 0) }
175#define VIRTCHNL_CHECK_UNION_LEN(n, X) enum virtchnl_static_asset_enum_##X \
176 { virtchnl_static_assert_##X = (n)/((sizeof(union X) == (n)) ? 1 : 0) }
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192#define VIRTCHNL_VERSION_MAJOR 1
193#define VIRTCHNL_VERSION_MINOR 1
194#define VIRTCHNL_VERSION_MINOR_NO_VF_CAPS 0
195
196struct virtchnl_version_info {
197 u32 major;
198 u32 minor;
199};
200
201VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_version_info);
202
203#define VF_IS_V10(_v) (((_v)->major == 1) && ((_v)->minor == 0))
204#define VF_IS_V11(_ver) (((_ver)->major == 1) && ((_ver)->minor == 1))
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222enum virtchnl_vsi_type {
223 VIRTCHNL_VSI_TYPE_INVALID = 0,
224 VIRTCHNL_VSI_SRIOV = 6,
225};
226
227
228
229
230
231
232
233
234
235struct virtchnl_vsi_resource {
236 u16 vsi_id;
237 u16 num_queue_pairs;
238
239
240 s32 vsi_type;
241 u16 qset_handle;
242 u8 default_mac_addr[ETH_ALEN];
243};
244
245VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vsi_resource);
246
247
248
249
250
251#define VIRTCHNL_VF_OFFLOAD_L2 BIT(0)
252#define VIRTCHNL_VF_OFFLOAD_RDMA BIT(1)
253#define VIRTCHNL_VF_CAP_RDMA VIRTCHNL_VF_OFFLOAD_RDMA
254#define VIRTCHNL_VF_OFFLOAD_RSS_AQ BIT(3)
255#define VIRTCHNL_VF_OFFLOAD_RSS_REG BIT(4)
256#define VIRTCHNL_VF_OFFLOAD_WB_ON_ITR BIT(5)
257#define VIRTCHNL_VF_OFFLOAD_REQ_QUEUES BIT(6)
258
259#define VIRTCHNL_VF_CAP_ADV_LINK_SPEED BIT(7)
260#define VIRTCHNL_VF_OFFLOAD_CRC BIT(10)
261#define VIRTCHNL_VF_OFFLOAD_TC_U32 BIT(11)
262#define VIRTCHNL_VF_OFFLOAD_VLAN_V2 BIT(15)
263#define VIRTCHNL_VF_OFFLOAD_VLAN BIT(16)
264#define VIRTCHNL_VF_OFFLOAD_RX_POLLING BIT(17)
265#define VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 BIT(18)
266#define VIRTCHNL_VF_OFFLOAD_RSS_PF BIT(19)
267#define VIRTCHNL_VF_OFFLOAD_ENCAP BIT(20)
268#define VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM BIT(21)
269#define VIRTCHNL_VF_OFFLOAD_RX_ENCAP_CSUM BIT(22)
270#define VIRTCHNL_VF_OFFLOAD_ADQ BIT(23)
271#define VIRTCHNL_VF_OFFLOAD_USO BIT(25)
272#define VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC BIT(26)
273#define VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF BIT(27)
274#define VIRTCHNL_VF_OFFLOAD_FDIR_PF BIT(28)
275#define VIRTCHNL_VF_OFFLOAD_QOS BIT(29)
276#define VIRTCHNL_VF_CAP_PTP BIT(31)
277
278#define VF_BASE_MODE_OFFLOADS (VIRTCHNL_VF_OFFLOAD_L2 | \
279 VIRTCHNL_VF_OFFLOAD_VLAN | \
280 VIRTCHNL_VF_OFFLOAD_RSS_PF)
281
282struct virtchnl_vf_resource {
283 u16 num_vsis;
284 u16 num_queue_pairs;
285 u16 max_vectors;
286 u16 max_mtu;
287
288 u32 vf_cap_flags;
289 u32 rss_key_size;
290 u32 rss_lut_size;
291
292 struct virtchnl_vsi_resource vsi_res[];
293};
294
295VIRTCHNL_CHECK_STRUCT_LEN(20, virtchnl_vf_resource);
296#define virtchnl_vf_resource_LEGACY_SIZEOF 36
297
298
299
300
301
302
303
304
305struct virtchnl_txq_info {
306 u16 vsi_id;
307 u16 queue_id;
308 u16 ring_len;
309 u16 headwb_enabled;
310 u64 dma_ring_addr;
311 u64 dma_headwb_addr;
312};
313
314VIRTCHNL_CHECK_STRUCT_LEN(24, virtchnl_txq_info);
315
316
317enum virtchnl_rx_desc_ids {
318 VIRTCHNL_RXDID_0_16B_BASE = 0,
319 VIRTCHNL_RXDID_1_32B_BASE = 1,
320 VIRTCHNL_RXDID_2_FLEX_SQ_NIC = 2,
321 VIRTCHNL_RXDID_3_FLEX_SQ_SW = 3,
322 VIRTCHNL_RXDID_4_FLEX_SQ_NIC_VEB = 4,
323 VIRTCHNL_RXDID_5_FLEX_SQ_NIC_ACL = 5,
324 VIRTCHNL_RXDID_6_FLEX_SQ_NIC_2 = 6,
325 VIRTCHNL_RXDID_7_HW_RSVD = 7,
326
327 VIRTCHNL_RXDID_16_COMMS_GENERIC = 16,
328 VIRTCHNL_RXDID_17_COMMS_AUX_VLAN = 17,
329 VIRTCHNL_RXDID_18_COMMS_AUX_IPV4 = 18,
330 VIRTCHNL_RXDID_19_COMMS_AUX_IPV6 = 19,
331 VIRTCHNL_RXDID_20_COMMS_AUX_FLOW = 20,
332 VIRTCHNL_RXDID_21_COMMS_AUX_TCP = 21,
333
334};
335
336#define VIRTCHNL_RXDID_BIT(x) BIT_ULL(VIRTCHNL_RXDID_##x)
337
338
339enum virtchnl_rx_desc_id_bitmasks {
340 VIRTCHNL_RXDID_0_16B_BASE_M = VIRTCHNL_RXDID_BIT(0_16B_BASE),
341 VIRTCHNL_RXDID_1_32B_BASE_M = VIRTCHNL_RXDID_BIT(1_32B_BASE),
342 VIRTCHNL_RXDID_2_FLEX_SQ_NIC_M = VIRTCHNL_RXDID_BIT(2_FLEX_SQ_NIC),
343 VIRTCHNL_RXDID_3_FLEX_SQ_SW_M = VIRTCHNL_RXDID_BIT(3_FLEX_SQ_SW),
344 VIRTCHNL_RXDID_4_FLEX_SQ_NIC_VEB_M = VIRTCHNL_RXDID_BIT(4_FLEX_SQ_NIC_VEB),
345 VIRTCHNL_RXDID_5_FLEX_SQ_NIC_ACL_M = VIRTCHNL_RXDID_BIT(5_FLEX_SQ_NIC_ACL),
346 VIRTCHNL_RXDID_6_FLEX_SQ_NIC_2_M = VIRTCHNL_RXDID_BIT(6_FLEX_SQ_NIC_2),
347 VIRTCHNL_RXDID_7_HW_RSVD_M = VIRTCHNL_RXDID_BIT(7_HW_RSVD),
348
349 VIRTCHNL_RXDID_16_COMMS_GENERIC_M = VIRTCHNL_RXDID_BIT(16_COMMS_GENERIC),
350 VIRTCHNL_RXDID_17_COMMS_AUX_VLAN_M = VIRTCHNL_RXDID_BIT(17_COMMS_AUX_VLAN),
351 VIRTCHNL_RXDID_18_COMMS_AUX_IPV4_M = VIRTCHNL_RXDID_BIT(18_COMMS_AUX_IPV4),
352 VIRTCHNL_RXDID_19_COMMS_AUX_IPV6_M = VIRTCHNL_RXDID_BIT(19_COMMS_AUX_IPV6),
353 VIRTCHNL_RXDID_20_COMMS_AUX_FLOW_M = VIRTCHNL_RXDID_BIT(20_COMMS_AUX_FLOW),
354 VIRTCHNL_RXDID_21_COMMS_AUX_TCP_M = VIRTCHNL_RXDID_BIT(21_COMMS_AUX_TCP),
355
356};
357
358
359
360
361
362
363
364
365
366enum virtchnl_rxq_info_flags {
367 VIRTCHNL_PTP_RX_TSTAMP = BIT(0),
368};
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383struct virtchnl_rxq_info {
384 u16 vsi_id;
385 u16 queue_id;
386 u32 ring_len;
387 u16 hdr_size;
388 u16 splithdr_enabled;
389 u32 databuffer_size;
390 u32 max_pkt_size;
391 u8 crc_disable;
392
393
394
395
396
397 enum virtchnl_rx_desc_ids rxdid:8;
398 enum virtchnl_rxq_info_flags flags:8;
399 u8 pad1;
400 u64 dma_ring_addr;
401
402
403 s32 rx_split_pos;
404 u32 pad2;
405};
406
407VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_rxq_info);
408
409
410
411
412
413
414
415
416
417
418
419struct virtchnl_queue_pair_info {
420
421 struct virtchnl_txq_info txq;
422 struct virtchnl_rxq_info rxq;
423};
424
425VIRTCHNL_CHECK_STRUCT_LEN(64, virtchnl_queue_pair_info);
426
427struct virtchnl_vsi_queue_config_info {
428 u16 vsi_id;
429 u16 num_queue_pairs;
430 u32 pad;
431 struct virtchnl_queue_pair_info qpair[];
432};
433
434VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_vsi_queue_config_info);
435#define virtchnl_vsi_queue_config_info_LEGACY_SIZEOF 72
436
437
438
439
440
441
442
443
444
445
446
447
448struct virtchnl_vf_res_request {
449 u16 num_queue_pairs;
450};
451
452
453
454
455
456
457
458
459
460
461
462
463
464struct virtchnl_vector_map {
465 u16 vsi_id;
466 u16 vector_id;
467 u16 rxq_map;
468 u16 txq_map;
469 u16 rxitr_idx;
470 u16 txitr_idx;
471};
472
473VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_vector_map);
474
475struct virtchnl_irq_map_info {
476 u16 num_vectors;
477 struct virtchnl_vector_map vecmap[];
478};
479
480VIRTCHNL_CHECK_STRUCT_LEN(2, virtchnl_irq_map_info);
481#define virtchnl_irq_map_info_LEGACY_SIZEOF 14
482
483
484
485
486
487
488
489
490
491
492
493
494struct virtchnl_queue_select {
495 u16 vsi_id;
496 u16 pad;
497 u32 rx_queues;
498 u32 tx_queues;
499};
500
501VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_queue_select);
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537struct virtchnl_ether_addr {
538 u8 addr[ETH_ALEN];
539 u8 type;
540#define VIRTCHNL_ETHER_ADDR_LEGACY 0
541#define VIRTCHNL_ETHER_ADDR_PRIMARY 1
542#define VIRTCHNL_ETHER_ADDR_EXTRA 2
543#define VIRTCHNL_ETHER_ADDR_TYPE_MASK 3
544 u8 pad;
545};
546
547VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_ether_addr);
548
549struct virtchnl_ether_addr_list {
550 u16 vsi_id;
551 u16 num_elements;
552 struct virtchnl_ether_addr list[];
553};
554
555VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_ether_addr_list);
556#define virtchnl_ether_addr_list_LEGACY_SIZEOF 12
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572struct virtchnl_vlan_filter_list {
573 u16 vsi_id;
574 u16 num_elements;
575 u16 vlan_id[];
576};
577
578VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_vlan_filter_list);
579#define virtchnl_vlan_filter_list_LEGACY_SIZEOF 6
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634enum virtchnl_vlan_support {
635 VIRTCHNL_VLAN_UNSUPPORTED = 0,
636 VIRTCHNL_VLAN_ETHERTYPE_8100 = BIT(0),
637 VIRTCHNL_VLAN_ETHERTYPE_88A8 = BIT(1),
638 VIRTCHNL_VLAN_ETHERTYPE_9100 = BIT(2),
639 VIRTCHNL_VLAN_TAG_LOCATION_L2TAG1 = BIT(8),
640 VIRTCHNL_VLAN_TAG_LOCATION_L2TAG2 = BIT(9),
641 VIRTCHNL_VLAN_TAG_LOCATION_L2TAG2_2 = BIT(10),
642 VIRTCHNL_VLAN_PRIO = BIT(24),
643 VIRTCHNL_VLAN_FILTER_MASK = BIT(28),
644 VIRTCHNL_VLAN_ETHERTYPE_AND = BIT(29),
645 VIRTCHNL_VLAN_ETHERTYPE_XOR = BIT(30),
646 VIRTCHNL_VLAN_TOGGLE = BIT(31),
647};
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669struct virtchnl_vlan_supported_caps {
670 u32 outer;
671 u32 inner;
672};
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696struct virtchnl_vlan_filtering_caps {
697 struct virtchnl_vlan_supported_caps filtering_support;
698 u32 ethertype_init;
699 u16 max_filters;
700 u8 pad[2];
701};
702
703VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vlan_filtering_caps);
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718enum virtchnl_vlan_ethertype_match {
719 VIRTCHNL_ETHERTYPE_STRIPPING_MATCHES_INSERTION = 0,
720 VIRTCHNL_ETHERTYPE_MATCH_NOT_REQUIRED = 1,
721};
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739struct virtchnl_vlan_offload_caps {
740 struct virtchnl_vlan_supported_caps stripping_support;
741 struct virtchnl_vlan_supported_caps insertion_support;
742 u32 ethertype_init;
743 u8 ethertype_match;
744 u8 pad[3];
745};
746
747VIRTCHNL_CHECK_STRUCT_LEN(24, virtchnl_vlan_offload_caps);
748
749
750
751
752
753
754
755
756
757
758
759
760
761struct virtchnl_vlan_caps {
762 struct virtchnl_vlan_filtering_caps filtering;
763 struct virtchnl_vlan_offload_caps offloads;
764};
765
766VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_vlan_caps);
767
768struct virtchnl_vlan {
769 u16 tci;
770 u16 tci_mask;
771
772
773 u16 tpid;
774
775
776
777
778 u8 pad[2];
779};
780
781VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_vlan);
782
783struct virtchnl_vlan_filter {
784 struct virtchnl_vlan inner;
785 struct virtchnl_vlan outer;
786 u8 pad[16];
787};
788
789VIRTCHNL_CHECK_STRUCT_LEN(32, virtchnl_vlan_filter);
790
791
792
793
794
795
796
797
798
799
800
801
802struct virtchnl_vlan_filter_list_v2 {
803 u16 vport_id;
804 u16 num_elements;
805 u8 pad[4];
806 struct virtchnl_vlan_filter filters[];
807};
808
809VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_vlan_filter_list_v2);
810#define virtchnl_vlan_filter_list_v2_LEGACY_SIZEOF 40
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918struct virtchnl_vlan_setting {
919 u32 outer_ethertype_setting;
920 u32 inner_ethertype_setting;
921 u16 vport_id;
922 u8 pad[6];
923};
924
925VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vlan_setting);
926
927
928
929
930
931
932struct virtchnl_promisc_info {
933 u16 vsi_id;
934 u16 flags;
935};
936
937VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_promisc_info);
938
939#define FLAG_VF_UNICAST_PROMISC 0x00000001
940#define FLAG_VF_MULTICAST_PROMISC 0x00000002
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959struct virtchnl_rss_key {
960 u16 vsi_id;
961 u16 key_len;
962 u8 key[];
963};
964
965VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_rss_key);
966#define virtchnl_rss_key_LEGACY_SIZEOF 6
967
968struct virtchnl_rss_lut {
969 u16 vsi_id;
970 u16 lut_entries;
971 u8 lut[];
972};
973
974VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_rss_lut);
975#define virtchnl_rss_lut_LEGACY_SIZEOF 6
976
977
978
979
980
981
982
983
984struct virtchnl_rss_hashcfg {
985
986 u64 hashcfg;
987};
988
989VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_rss_hashcfg);
990
991
992enum virtchnl_rss_algorithm {
993 VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC = 0,
994 VIRTCHNL_RSS_ALG_R_ASYMMETRIC = 1,
995 VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC = 2,
996 VIRTCHNL_RSS_ALG_XOR_SYMMETRIC = 3,
997};
998
999
1000
1001
1002
1003
1004
1005
1006struct virtchnl_rss_hfunc {
1007 u16 vsi_id;
1008 u16 rss_algorithm;
1009 u32 reserved;
1010};
1011
1012VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_rss_hfunc);
1013
1014
1015
1016
1017
1018
1019
1020
1021struct virtchnl_channel_info {
1022 u16 count;
1023 u16 offset;
1024 u32 pad;
1025 u64 max_tx_rate;
1026};
1027
1028VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_channel_info);
1029
1030struct virtchnl_tc_info {
1031 u32 num_tc;
1032 u32 pad;
1033 struct virtchnl_channel_info list[];
1034};
1035
1036VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_tc_info);
1037#define virtchnl_tc_info_LEGACY_SIZEOF 24
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047struct virtchnl_l4_spec {
1048 u8 src_mac[ETH_ALEN];
1049 u8 dst_mac[ETH_ALEN];
1050 __be16 vlan_id;
1051 __be16 pad;
1052 __be32 src_ip[4];
1053 __be32 dst_ip[4];
1054 __be16 src_port;
1055 __be16 dst_port;
1056};
1057
1058VIRTCHNL_CHECK_STRUCT_LEN(52, virtchnl_l4_spec);
1059
1060union virtchnl_flow_spec {
1061 struct virtchnl_l4_spec tcp_spec;
1062 u8 buffer[128];
1063};
1064
1065VIRTCHNL_CHECK_UNION_LEN(128, virtchnl_flow_spec);
1066
1067enum virtchnl_action {
1068
1069 VIRTCHNL_ACTION_DROP = 0,
1070 VIRTCHNL_ACTION_TC_REDIRECT,
1071 VIRTCHNL_ACTION_PASSTHRU,
1072 VIRTCHNL_ACTION_QUEUE,
1073 VIRTCHNL_ACTION_Q_REGION,
1074 VIRTCHNL_ACTION_MARK,
1075 VIRTCHNL_ACTION_COUNT,
1076};
1077
1078enum virtchnl_flow_type {
1079
1080 VIRTCHNL_TCP_V4_FLOW = 0,
1081 VIRTCHNL_TCP_V6_FLOW,
1082};
1083
1084struct virtchnl_filter {
1085 union virtchnl_flow_spec data;
1086 union virtchnl_flow_spec mask;
1087
1088
1089 s32 flow_type;
1090
1091
1092 s32 action;
1093 u32 action_meta;
1094 u8 field_flags;
1095 u8 pad[3];
1096};
1097
1098VIRTCHNL_CHECK_STRUCT_LEN(272, virtchnl_filter);
1099
1100
1101
1102
1103
1104
1105enum virtchnl_event_codes {
1106 VIRTCHNL_EVENT_UNKNOWN = 0,
1107 VIRTCHNL_EVENT_LINK_CHANGE,
1108 VIRTCHNL_EVENT_RESET_IMPENDING,
1109 VIRTCHNL_EVENT_PF_DRIVER_CLOSE,
1110};
1111
1112#define PF_EVENT_SEVERITY_INFO 0
1113#define PF_EVENT_SEVERITY_CERTAIN_DOOM 255
1114
1115struct virtchnl_pf_event {
1116
1117 s32 event;
1118 union {
1119
1120
1121
1122
1123
1124
1125
1126
1127 struct {
1128 enum virtchnl_link_speed link_speed;
1129 bool link_status;
1130 u8 pad[3];
1131 } link_event;
1132 struct {
1133
1134 u32 link_speed;
1135 u8 link_status;
1136 u8 pad[3];
1137 } link_event_adv;
1138 } event_data;
1139
1140 s32 severity;
1141};
1142
1143VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_pf_event);
1144
1145
1146#define VIRTCHNL_RDMA_INVALID_QUEUE_IDX 0xFFFF
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159struct virtchnl_rdma_qv_info {
1160 u32 v_idx;
1161 u16 ceq_idx;
1162 u16 aeq_idx;
1163 u8 itr_idx;
1164 u8 pad[3];
1165};
1166
1167VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_rdma_qv_info);
1168
1169struct virtchnl_rdma_qvlist_info {
1170 u32 num_vectors;
1171 struct virtchnl_rdma_qv_info qv_info[];
1172};
1173
1174VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_rdma_qvlist_info);
1175#define virtchnl_rdma_qvlist_info_LEGACY_SIZEOF 16
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188enum virtchnl_vfr_states {
1189 VIRTCHNL_VFR_INPROGRESS = 0,
1190 VIRTCHNL_VFR_COMPLETED,
1191 VIRTCHNL_VFR_VFACTIVE,
1192};
1193
1194#define VIRTCHNL_MAX_NUM_PROTO_HDRS 32
1195#define VIRTCHNL_MAX_SIZE_RAW_PACKET 1024
1196#define PROTO_HDR_SHIFT 5
1197#define PROTO_HDR_FIELD_START(proto_hdr_type) ((proto_hdr_type) << PROTO_HDR_SHIFT)
1198#define PROTO_HDR_FIELD_MASK ((1UL << PROTO_HDR_SHIFT) - 1)
1199
1200
1201
1202
1203
1204
1205
1206
1207#define VIRTCHNL_ADD_PROTO_HDR_FIELD(hdr, field) \
1208 ((hdr)->field_selector |= BIT((field) & PROTO_HDR_FIELD_MASK))
1209#define VIRTCHNL_DEL_PROTO_HDR_FIELD(hdr, field) \
1210 ((hdr)->field_selector &= ~BIT((field) & PROTO_HDR_FIELD_MASK))
1211#define VIRTCHNL_TEST_PROTO_HDR_FIELD(hdr, val) \
1212 ((hdr)->field_selector & BIT((val) & PROTO_HDR_FIELD_MASK))
1213#define VIRTCHNL_GET_PROTO_HDR_FIELD(hdr) ((hdr)->field_selector)
1214
1215#define VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr, hdr_type, field) \
1216 (VIRTCHNL_ADD_PROTO_HDR_FIELD(hdr, \
1217 VIRTCHNL_PROTO_HDR_ ## hdr_type ## _ ## field))
1218#define VIRTCHNL_DEL_PROTO_HDR_FIELD_BIT(hdr, hdr_type, field) \
1219 (VIRTCHNL_DEL_PROTO_HDR_FIELD(hdr, \
1220 VIRTCHNL_PROTO_HDR_ ## hdr_type ## _ ## field))
1221
1222#define VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, hdr_type) \
1223 ((hdr)->type = VIRTCHNL_PROTO_HDR_ ## hdr_type)
1224#define VIRTCHNL_GET_PROTO_HDR_TYPE(hdr) \
1225 (((hdr)->type) >> PROTO_HDR_SHIFT)
1226#define VIRTCHNL_TEST_PROTO_HDR_TYPE(hdr, val) \
1227 ((hdr)->type == ((s32)((val) >> PROTO_HDR_SHIFT)))
1228#define VIRTCHNL_TEST_PROTO_HDR(hdr, val) \
1229 (VIRTCHNL_TEST_PROTO_HDR_TYPE((hdr), (val)) && \
1230 VIRTCHNL_TEST_PROTO_HDR_FIELD((hdr), (val)))
1231
1232
1233
1234
1235
1236
1237enum virtchnl_proto_hdr_type {
1238 VIRTCHNL_PROTO_HDR_NONE,
1239 VIRTCHNL_PROTO_HDR_ETH,
1240 VIRTCHNL_PROTO_HDR_S_VLAN,
1241 VIRTCHNL_PROTO_HDR_C_VLAN,
1242 VIRTCHNL_PROTO_HDR_IPV4,
1243 VIRTCHNL_PROTO_HDR_IPV6,
1244 VIRTCHNL_PROTO_HDR_TCP,
1245 VIRTCHNL_PROTO_HDR_UDP,
1246 VIRTCHNL_PROTO_HDR_SCTP,
1247 VIRTCHNL_PROTO_HDR_GTPU_IP,
1248 VIRTCHNL_PROTO_HDR_GTPU_EH,
1249 VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_DWN,
1250 VIRTCHNL_PROTO_HDR_GTPU_EH_PDU_UP,
1251 VIRTCHNL_PROTO_HDR_PPPOE,
1252 VIRTCHNL_PROTO_HDR_L2TPV3,
1253 VIRTCHNL_PROTO_HDR_ESP,
1254 VIRTCHNL_PROTO_HDR_AH,
1255 VIRTCHNL_PROTO_HDR_PFCP,
1256};
1257
1258
1259enum virtchnl_proto_hdr_field {
1260
1261 VIRTCHNL_PROTO_HDR_ETH_SRC =
1262 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ETH),
1263 VIRTCHNL_PROTO_HDR_ETH_DST,
1264 VIRTCHNL_PROTO_HDR_ETH_ETHERTYPE,
1265
1266 VIRTCHNL_PROTO_HDR_S_VLAN_ID =
1267 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_S_VLAN),
1268
1269 VIRTCHNL_PROTO_HDR_C_VLAN_ID =
1270 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_C_VLAN),
1271
1272 VIRTCHNL_PROTO_HDR_IPV4_SRC =
1273 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4),
1274 VIRTCHNL_PROTO_HDR_IPV4_DST,
1275 VIRTCHNL_PROTO_HDR_IPV4_DSCP,
1276 VIRTCHNL_PROTO_HDR_IPV4_TTL,
1277 VIRTCHNL_PROTO_HDR_IPV4_PROT,
1278
1279 VIRTCHNL_PROTO_HDR_IPV6_SRC =
1280 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
1281 VIRTCHNL_PROTO_HDR_IPV6_DST,
1282 VIRTCHNL_PROTO_HDR_IPV6_TC,
1283 VIRTCHNL_PROTO_HDR_IPV6_HOP_LIMIT,
1284 VIRTCHNL_PROTO_HDR_IPV6_PROT,
1285
1286 VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
1287 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
1288 VIRTCHNL_PROTO_HDR_TCP_DST_PORT,
1289
1290 VIRTCHNL_PROTO_HDR_UDP_SRC_PORT =
1291 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_UDP),
1292 VIRTCHNL_PROTO_HDR_UDP_DST_PORT,
1293
1294 VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT =
1295 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_SCTP),
1296 VIRTCHNL_PROTO_HDR_SCTP_DST_PORT,
1297
1298 VIRTCHNL_PROTO_HDR_GTPU_IP_TEID =
1299 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GTPU_IP),
1300
1301 VIRTCHNL_PROTO_HDR_GTPU_EH_PDU =
1302 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GTPU_EH),
1303 VIRTCHNL_PROTO_HDR_GTPU_EH_QFI,
1304
1305 VIRTCHNL_PROTO_HDR_PPPOE_SESS_ID =
1306 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PPPOE),
1307
1308 VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID =
1309 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_L2TPV3),
1310
1311 VIRTCHNL_PROTO_HDR_ESP_SPI =
1312 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ESP),
1313
1314 VIRTCHNL_PROTO_HDR_AH_SPI =
1315 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_AH),
1316
1317 VIRTCHNL_PROTO_HDR_PFCP_S_FIELD =
1318 PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PFCP),
1319 VIRTCHNL_PROTO_HDR_PFCP_SEID,
1320};
1321
1322struct virtchnl_proto_hdr {
1323
1324 s32 type;
1325 u32 field_selector;
1326 u8 buffer[64];
1327
1328
1329
1330
1331
1332};
1333
1334VIRTCHNL_CHECK_STRUCT_LEN(72, virtchnl_proto_hdr);
1335
1336struct virtchnl_proto_hdrs {
1337 u8 tunnel_level;
1338 u8 pad[3];
1339
1340
1341
1342
1343
1344
1345
1346
1347 u32 count;
1348 union {
1349 struct virtchnl_proto_hdr
1350 proto_hdr[VIRTCHNL_MAX_NUM_PROTO_HDRS];
1351 struct {
1352 u16 pkt_len;
1353 u8 spec[VIRTCHNL_MAX_SIZE_RAW_PACKET];
1354 u8 mask[VIRTCHNL_MAX_SIZE_RAW_PACKET];
1355 } raw;
1356 };
1357};
1358
1359VIRTCHNL_CHECK_STRUCT_LEN(2312, virtchnl_proto_hdrs);
1360
1361struct virtchnl_rss_cfg {
1362 struct virtchnl_proto_hdrs proto_hdrs;
1363
1364
1365 s32 rss_algorithm;
1366 u8 reserved[128];
1367};
1368
1369VIRTCHNL_CHECK_STRUCT_LEN(2444, virtchnl_rss_cfg);
1370
1371
1372struct virtchnl_filter_action {
1373
1374 s32 type;
1375 union {
1376
1377 struct {
1378 u16 index;
1379 u8 region;
1380 } queue;
1381
1382 struct {
1383
1384 u8 shared;
1385 u32 id;
1386 } count;
1387
1388 u32 mark_id;
1389 u8 reserve[32];
1390 } act_conf;
1391};
1392
1393VIRTCHNL_CHECK_STRUCT_LEN(36, virtchnl_filter_action);
1394
1395#define VIRTCHNL_MAX_NUM_ACTIONS 8
1396
1397struct virtchnl_filter_action_set {
1398
1399 u32 count;
1400 struct virtchnl_filter_action actions[VIRTCHNL_MAX_NUM_ACTIONS];
1401};
1402
1403VIRTCHNL_CHECK_STRUCT_LEN(292, virtchnl_filter_action_set);
1404
1405
1406struct virtchnl_fdir_rule {
1407 struct virtchnl_proto_hdrs proto_hdrs;
1408 struct virtchnl_filter_action_set action_set;
1409};
1410
1411VIRTCHNL_CHECK_STRUCT_LEN(2604, virtchnl_fdir_rule);
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442enum virtchnl_fdir_prgm_status {
1443 VIRTCHNL_FDIR_SUCCESS = 0,
1444 VIRTCHNL_FDIR_FAILURE_RULE_NORESOURCE,
1445 VIRTCHNL_FDIR_FAILURE_RULE_EXIST,
1446 VIRTCHNL_FDIR_FAILURE_RULE_CONFLICT,
1447 VIRTCHNL_FDIR_FAILURE_RULE_NONEXIST,
1448 VIRTCHNL_FDIR_FAILURE_RULE_INVALID,
1449 VIRTCHNL_FDIR_FAILURE_RULE_TIMEOUT,
1450 VIRTCHNL_FDIR_FAILURE_QUERY_INVALID,
1451};
1452
1453
1454
1455
1456
1457
1458struct virtchnl_fdir_add {
1459 u16 vsi_id;
1460
1461
1462
1463
1464 u16 validate_only;
1465 u32 flow_id;
1466 struct virtchnl_fdir_rule rule_cfg;
1467
1468
1469 s32 status;
1470};
1471
1472VIRTCHNL_CHECK_STRUCT_LEN(2616, virtchnl_fdir_add);
1473
1474
1475
1476
1477
1478struct virtchnl_fdir_del {
1479 u16 vsi_id;
1480 u16 pad;
1481 u32 flow_id;
1482
1483
1484 s32 status;
1485};
1486
1487VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_fdir_del);
1488
1489#define VIRTCHNL_1588_PTP_CAP_RX_TSTAMP BIT(1)
1490#define VIRTCHNL_1588_PTP_CAP_READ_PHC BIT(2)
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518struct virtchnl_ptp_caps {
1519 u32 caps;
1520 u8 rsvd[44];
1521};
1522
1523VIRTCHNL_CHECK_STRUCT_LEN(48, virtchnl_ptp_caps);
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537struct virtchnl_phc_time {
1538 u64 time;
1539 u8 rsvd[8];
1540};
1541
1542VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_phc_time);
1543
1544struct virtchnl_shaper_bw {
1545
1546 u32 committed;
1547 u32 peak;
1548};
1549
1550VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_shaper_bw);
1551
1552
1553
1554
1555
1556struct virtchnl_qos_cap_elem {
1557 u8 tc_num;
1558 u8 tc_prio;
1559#define VIRTCHNL_ABITER_STRICT 0
1560#define VIRTCHNL_ABITER_ETS 2
1561 u8 arbiter;
1562#define VIRTCHNL_STRICT_WEIGHT 1
1563 u8 weight;
1564 enum virtchnl_bw_limit_type type;
1565 union {
1566 struct virtchnl_shaper_bw shaper;
1567 u8 pad2[32];
1568 };
1569};
1570
1571VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_qos_cap_elem);
1572
1573struct virtchnl_qos_cap_list {
1574 u16 vsi_id;
1575 u16 num_elem;
1576 struct virtchnl_qos_cap_elem cap[];
1577};
1578
1579VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_qos_cap_list);
1580#define virtchnl_qos_cap_list_LEGACY_SIZEOF 44
1581
1582
1583struct virtchnl_queue_bw {
1584 u16 queue_id;
1585 u8 tc;
1586 u8 pad;
1587 struct virtchnl_shaper_bw shaper;
1588};
1589
1590VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_queue_bw);
1591
1592struct virtchnl_queues_bw_cfg {
1593 u16 vsi_id;
1594 u16 num_queues;
1595 struct virtchnl_queue_bw cfg[];
1596};
1597
1598VIRTCHNL_CHECK_STRUCT_LEN(4, virtchnl_queues_bw_cfg);
1599#define virtchnl_queues_bw_cfg_LEGACY_SIZEOF 16
1600
1601enum virtchnl_queue_type {
1602 VIRTCHNL_QUEUE_TYPE_TX = 0,
1603 VIRTCHNL_QUEUE_TYPE_RX = 1,
1604};
1605
1606
1607struct virtchnl_queue_chunk {
1608
1609 s32 type;
1610 u16 start_queue_id;
1611 u16 num_queues;
1612};
1613
1614VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_queue_chunk);
1615
1616struct virtchnl_quanta_cfg {
1617 u16 quanta_size;
1618 u16 pad;
1619 struct virtchnl_queue_chunk queue_select;
1620};
1621
1622VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_quanta_cfg);
1623
1624#define __vss_byone(p, member, count, old) \
1625 (struct_size(p, member, count) + (old - 1 - struct_size(p, member, 0)))
1626
1627#define __vss_byelem(p, member, count, old) \
1628 (struct_size(p, member, count - 1) + (old - struct_size(p, member, 0)))
1629
1630#define __vss_full(p, member, count, old) \
1631 (struct_size(p, member, count) + (old - struct_size(p, member, 0)))
1632
1633#define __vss(type, func, p, member, count) \
1634 struct type: func(p, member, count, type##_LEGACY_SIZEOF)
1635
1636#define virtchnl_struct_size(p, m, c) \
1637 _Generic(*p, \
1638 __vss(virtchnl_vf_resource, __vss_full, p, m, c), \
1639 __vss(virtchnl_vsi_queue_config_info, __vss_full, p, m, c), \
1640 __vss(virtchnl_irq_map_info, __vss_full, p, m, c), \
1641 __vss(virtchnl_ether_addr_list, __vss_full, p, m, c), \
1642 __vss(virtchnl_vlan_filter_list, __vss_full, p, m, c), \
1643 __vss(virtchnl_vlan_filter_list_v2, __vss_byelem, p, m, c), \
1644 __vss(virtchnl_tc_info, __vss_byelem, p, m, c), \
1645 __vss(virtchnl_rdma_qvlist_info, __vss_byelem, p, m, c), \
1646 __vss(virtchnl_qos_cap_list, __vss_byelem, p, m, c), \
1647 __vss(virtchnl_queues_bw_cfg, __vss_byelem, p, m, c), \
1648 __vss(virtchnl_rss_key, __vss_byone, p, m, c), \
1649 __vss(virtchnl_rss_lut, __vss_byone, p, m, c))
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660static inline int
1661virtchnl_vc_validate_vf_msg(struct virtchnl_version_info *ver, u32 v_opcode,
1662 u8 *msg, u16 msglen)
1663{
1664 bool err_msg_format = false;
1665 u32 valid_len = 0;
1666
1667
1668 switch (v_opcode) {
1669 case VIRTCHNL_OP_VERSION:
1670 valid_len = sizeof(struct virtchnl_version_info);
1671 break;
1672 case VIRTCHNL_OP_RESET_VF:
1673 break;
1674 case VIRTCHNL_OP_GET_VF_RESOURCES:
1675 if (VF_IS_V11(ver))
1676 valid_len = sizeof(u32);
1677 break;
1678 case VIRTCHNL_OP_CONFIG_TX_QUEUE:
1679 valid_len = sizeof(struct virtchnl_txq_info);
1680 break;
1681 case VIRTCHNL_OP_CONFIG_RX_QUEUE:
1682 valid_len = sizeof(struct virtchnl_rxq_info);
1683 break;
1684 case VIRTCHNL_OP_CONFIG_VSI_QUEUES:
1685 valid_len = virtchnl_vsi_queue_config_info_LEGACY_SIZEOF;
1686 if (msglen >= valid_len) {
1687 struct virtchnl_vsi_queue_config_info *vqc =
1688 (struct virtchnl_vsi_queue_config_info *)msg;
1689 valid_len = virtchnl_struct_size(vqc, qpair,
1690 vqc->num_queue_pairs);
1691 if (vqc->num_queue_pairs == 0)
1692 err_msg_format = true;
1693 }
1694 break;
1695 case VIRTCHNL_OP_CONFIG_IRQ_MAP:
1696 valid_len = virtchnl_irq_map_info_LEGACY_SIZEOF;
1697 if (msglen >= valid_len) {
1698 struct virtchnl_irq_map_info *vimi =
1699 (struct virtchnl_irq_map_info *)msg;
1700 valid_len = virtchnl_struct_size(vimi, vecmap,
1701 vimi->num_vectors);
1702 if (vimi->num_vectors == 0)
1703 err_msg_format = true;
1704 }
1705 break;
1706 case VIRTCHNL_OP_ENABLE_QUEUES:
1707 case VIRTCHNL_OP_DISABLE_QUEUES:
1708 valid_len = sizeof(struct virtchnl_queue_select);
1709 break;
1710 case VIRTCHNL_OP_ADD_ETH_ADDR:
1711 case VIRTCHNL_OP_DEL_ETH_ADDR:
1712 valid_len = virtchnl_ether_addr_list_LEGACY_SIZEOF;
1713 if (msglen >= valid_len) {
1714 struct virtchnl_ether_addr_list *veal =
1715 (struct virtchnl_ether_addr_list *)msg;
1716 valid_len = virtchnl_struct_size(veal, list,
1717 veal->num_elements);
1718 if (veal->num_elements == 0)
1719 err_msg_format = true;
1720 }
1721 break;
1722 case VIRTCHNL_OP_ADD_VLAN:
1723 case VIRTCHNL_OP_DEL_VLAN:
1724 valid_len = virtchnl_vlan_filter_list_LEGACY_SIZEOF;
1725 if (msglen >= valid_len) {
1726 struct virtchnl_vlan_filter_list *vfl =
1727 (struct virtchnl_vlan_filter_list *)msg;
1728 valid_len = virtchnl_struct_size(vfl, vlan_id,
1729 vfl->num_elements);
1730 if (vfl->num_elements == 0)
1731 err_msg_format = true;
1732 }
1733 break;
1734 case VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE:
1735 valid_len = sizeof(struct virtchnl_promisc_info);
1736 break;
1737 case VIRTCHNL_OP_GET_STATS:
1738 valid_len = sizeof(struct virtchnl_queue_select);
1739 break;
1740 case VIRTCHNL_OP_RDMA:
1741
1742
1743
1744
1745 if (msglen)
1746 valid_len = msglen;
1747 else
1748 err_msg_format = true;
1749 break;
1750 case VIRTCHNL_OP_RELEASE_RDMA_IRQ_MAP:
1751 break;
1752 case VIRTCHNL_OP_CONFIG_RDMA_IRQ_MAP:
1753 valid_len = virtchnl_rdma_qvlist_info_LEGACY_SIZEOF;
1754 if (msglen >= valid_len) {
1755 struct virtchnl_rdma_qvlist_info *qv =
1756 (struct virtchnl_rdma_qvlist_info *)msg;
1757
1758 valid_len = virtchnl_struct_size(qv, qv_info,
1759 qv->num_vectors);
1760 }
1761 break;
1762 case VIRTCHNL_OP_CONFIG_RSS_KEY:
1763 valid_len = virtchnl_rss_key_LEGACY_SIZEOF;
1764 if (msglen >= valid_len) {
1765 struct virtchnl_rss_key *vrk =
1766 (struct virtchnl_rss_key *)msg;
1767 valid_len = virtchnl_struct_size(vrk, key,
1768 vrk->key_len);
1769 }
1770 break;
1771 case VIRTCHNL_OP_CONFIG_RSS_LUT:
1772 valid_len = virtchnl_rss_lut_LEGACY_SIZEOF;
1773 if (msglen >= valid_len) {
1774 struct virtchnl_rss_lut *vrl =
1775 (struct virtchnl_rss_lut *)msg;
1776 valid_len = virtchnl_struct_size(vrl, lut,
1777 vrl->lut_entries);
1778 }
1779 break;
1780 case VIRTCHNL_OP_CONFIG_RSS_HFUNC:
1781 valid_len = sizeof(struct virtchnl_rss_hfunc);
1782 break;
1783 case VIRTCHNL_OP_GET_RSS_HASHCFG_CAPS:
1784 break;
1785 case VIRTCHNL_OP_SET_RSS_HASHCFG:
1786 valid_len = sizeof(struct virtchnl_rss_hashcfg);
1787 break;
1788 case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING:
1789 case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING:
1790 break;
1791 case VIRTCHNL_OP_REQUEST_QUEUES:
1792 valid_len = sizeof(struct virtchnl_vf_res_request);
1793 break;
1794 case VIRTCHNL_OP_ENABLE_CHANNELS:
1795 valid_len = virtchnl_tc_info_LEGACY_SIZEOF;
1796 if (msglen >= valid_len) {
1797 struct virtchnl_tc_info *vti =
1798 (struct virtchnl_tc_info *)msg;
1799 valid_len = virtchnl_struct_size(vti, list,
1800 vti->num_tc);
1801 if (vti->num_tc == 0)
1802 err_msg_format = true;
1803 }
1804 break;
1805 case VIRTCHNL_OP_DISABLE_CHANNELS:
1806 break;
1807 case VIRTCHNL_OP_ADD_CLOUD_FILTER:
1808 case VIRTCHNL_OP_DEL_CLOUD_FILTER:
1809 valid_len = sizeof(struct virtchnl_filter);
1810 break;
1811 case VIRTCHNL_OP_GET_SUPPORTED_RXDIDS:
1812 break;
1813 case VIRTCHNL_OP_ADD_RSS_CFG:
1814 case VIRTCHNL_OP_DEL_RSS_CFG:
1815 valid_len = sizeof(struct virtchnl_rss_cfg);
1816 break;
1817 case VIRTCHNL_OP_ADD_FDIR_FILTER:
1818 valid_len = sizeof(struct virtchnl_fdir_add);
1819 break;
1820 case VIRTCHNL_OP_DEL_FDIR_FILTER:
1821 valid_len = sizeof(struct virtchnl_fdir_del);
1822 break;
1823 case VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS:
1824 break;
1825 case VIRTCHNL_OP_ADD_VLAN_V2:
1826 case VIRTCHNL_OP_DEL_VLAN_V2:
1827 valid_len = virtchnl_vlan_filter_list_v2_LEGACY_SIZEOF;
1828 if (msglen >= valid_len) {
1829 struct virtchnl_vlan_filter_list_v2 *vfl =
1830 (struct virtchnl_vlan_filter_list_v2 *)msg;
1831
1832 valid_len = virtchnl_struct_size(vfl, filters,
1833 vfl->num_elements);
1834
1835 if (vfl->num_elements == 0) {
1836 err_msg_format = true;
1837 break;
1838 }
1839 }
1840 break;
1841 case VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2:
1842 case VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2:
1843 case VIRTCHNL_OP_ENABLE_VLAN_INSERTION_V2:
1844 case VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2:
1845 valid_len = sizeof(struct virtchnl_vlan_setting);
1846 break;
1847 case VIRTCHNL_OP_GET_QOS_CAPS:
1848 break;
1849 case VIRTCHNL_OP_CONFIG_QUEUE_BW:
1850 valid_len = virtchnl_queues_bw_cfg_LEGACY_SIZEOF;
1851 if (msglen >= valid_len) {
1852 struct virtchnl_queues_bw_cfg *q_bw =
1853 (struct virtchnl_queues_bw_cfg *)msg;
1854
1855 valid_len = virtchnl_struct_size(q_bw, cfg,
1856 q_bw->num_queues);
1857 if (q_bw->num_queues == 0) {
1858 err_msg_format = true;
1859 break;
1860 }
1861 }
1862 break;
1863 case VIRTCHNL_OP_CONFIG_QUANTA:
1864 valid_len = sizeof(struct virtchnl_quanta_cfg);
1865 if (msglen >= valid_len) {
1866 struct virtchnl_quanta_cfg *q_quanta =
1867 (struct virtchnl_quanta_cfg *)msg;
1868
1869 if (q_quanta->quanta_size == 0 ||
1870 q_quanta->queue_select.num_queues == 0) {
1871 err_msg_format = true;
1872 break;
1873 }
1874 }
1875 break;
1876 case VIRTCHNL_OP_1588_PTP_GET_CAPS:
1877 valid_len = sizeof(struct virtchnl_ptp_caps);
1878 break;
1879 case VIRTCHNL_OP_1588_PTP_GET_TIME:
1880 valid_len = sizeof(struct virtchnl_phc_time);
1881 break;
1882
1883 case VIRTCHNL_OP_EVENT:
1884 case VIRTCHNL_OP_UNKNOWN:
1885 default:
1886 return VIRTCHNL_STATUS_ERR_PARAM;
1887 }
1888
1889 if (err_msg_format || valid_len != msglen)
1890 return VIRTCHNL_STATUS_ERR_OPCODE_MISMATCH;
1891
1892 return 0;
1893}
1894#endif
1895