1 /* SPDX-License-Identifier: Apache-2.0
2 * Copyright (c) 2023 Cisco Systems, Inc.
5 #ifndef _IIAVF_VIRTCHNL_FUNCS_H_
6 #define _IIAVF_VIRTCHNL_FUNCS_H_
8 #include <vppinfra/clib.h>
9 #include <vnet/dev/dev.h>
10 #include <dev_iavf/iavf.h>
12 #define VIRTCHNL_MSG_SZ(s, e, n) STRUCT_OFFSET_OF (s, e[(n) + 1])
20 virtchnl_status_t status;
23 } iavf_virtchnl_req_t;
25 vnet_dev_rv_t iavf_virtchnl_req (vlib_main_t *, vnet_dev_t *,
26 iavf_virtchnl_req_t *);
28 static_always_inline vnet_dev_rv_t
29 iavf_vc_op_version (vlib_main_t *vm, vnet_dev_t *dev,
30 const virtchnl_version_info_t *req,
31 virtchnl_version_info_t *resp)
33 iavf_virtchnl_req_t vr = {
34 .op = VIRTCHNL_OP_VERSION,
36 .req_sz = sizeof (*req),
38 .resp_sz = sizeof (*resp),
41 return iavf_virtchnl_req (vm, dev, &vr);
44 static_always_inline vnet_dev_rv_t
45 iavf_vc_op_reset_vf (vlib_main_t *vm, vnet_dev_t *dev)
47 iavf_virtchnl_req_t vr = {
48 .op = VIRTCHNL_OP_RESET_VF,
52 return iavf_virtchnl_req (vm, dev, &vr);
55 static_always_inline vnet_dev_rv_t
56 iavf_vc_op_get_vf_resources (vlib_main_t *vm, vnet_dev_t *dev, const u32 *req,
57 virtchnl_vf_resource_t *resp)
59 iavf_virtchnl_req_t vr = {
60 .op = VIRTCHNL_OP_GET_VF_RESOURCES,
62 .req_sz = sizeof (*req),
64 .resp_sz = sizeof (*resp),
67 return iavf_virtchnl_req (vm, dev, &vr);
70 static_always_inline vnet_dev_rv_t
71 iavf_vc_op_enable_queues (vlib_main_t *vm, vnet_dev_t *dev,
72 const virtchnl_queue_select_t *req)
74 iavf_virtchnl_req_t vr = {
75 .op = VIRTCHNL_OP_ENABLE_QUEUES,
77 .req_sz = sizeof (*req),
79 return iavf_virtchnl_req (vm, dev, &vr);
82 static_always_inline vnet_dev_rv_t
83 iavf_vc_op_disable_queues (vlib_main_t *vm, vnet_dev_t *dev,
84 const virtchnl_queue_select_t *req)
86 iavf_virtchnl_req_t vr = {
87 .op = VIRTCHNL_OP_DISABLE_QUEUES,
89 .req_sz = sizeof (*req),
91 return iavf_virtchnl_req (vm, dev, &vr);
94 static_always_inline vnet_dev_rv_t
95 iavf_vc_op_config_vsi_queues (vlib_main_t *vm, vnet_dev_t *dev,
96 const virtchnl_vsi_queue_config_info_t *req)
98 iavf_virtchnl_req_t vr = {
99 .op = VIRTCHNL_OP_CONFIG_VSI_QUEUES,
101 .req_sz = VIRTCHNL_MSG_SZ (virtchnl_vsi_queue_config_info_t, qpair,
102 req->num_queue_pairs),
105 return iavf_virtchnl_req (vm, dev, &vr);
108 static_always_inline vnet_dev_rv_t
109 iavf_vc_op_config_irq_map (vlib_main_t *vm, vnet_dev_t *dev,
110 const virtchnl_irq_map_info_t *req)
112 iavf_virtchnl_req_t vr = {
113 .op = VIRTCHNL_OP_CONFIG_IRQ_MAP,
116 VIRTCHNL_MSG_SZ (virtchnl_irq_map_info_t, vecmap, req->num_vectors),
119 return iavf_virtchnl_req (vm, dev, &vr);
122 static_always_inline vnet_dev_rv_t
123 iavf_vc_op_config_rss_lut (vlib_main_t *vm, vnet_dev_t *dev,
124 const virtchnl_rss_lut_t *req)
126 iavf_virtchnl_req_t vr = {
127 .op = VIRTCHNL_OP_CONFIG_RSS_LUT,
129 .req_sz = VIRTCHNL_MSG_SZ (virtchnl_rss_lut_t, lut, req->lut_entries),
132 return iavf_virtchnl_req (vm, dev, &vr);
135 static_always_inline vnet_dev_rv_t
136 iavf_vc_op_config_rss_key (vlib_main_t *vm, vnet_dev_t *dev,
137 const virtchnl_rss_key_t *req)
139 iavf_virtchnl_req_t vr = {
140 .op = VIRTCHNL_OP_CONFIG_RSS_KEY,
142 .req_sz = VIRTCHNL_MSG_SZ (virtchnl_rss_key_t, key, req->key_len),
145 return iavf_virtchnl_req (vm, dev, &vr);
148 static_always_inline vnet_dev_rv_t
149 iavf_vc_op_config_promisc_mode (vlib_main_t *vm, vnet_dev_t *dev,
150 const virtchnl_promisc_info_t *req)
152 iavf_virtchnl_req_t vr = {
153 .op = VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE,
155 .req_sz = sizeof (*req),
158 return iavf_virtchnl_req (vm, dev, &vr);
161 static_always_inline vnet_dev_rv_t
162 iavf_vc_op_disable_vlan_stripping (vlib_main_t *vm, vnet_dev_t *dev)
164 iavf_virtchnl_req_t vr = {
165 .op = VIRTCHNL_OP_DISABLE_VLAN_STRIPPING,
168 return iavf_virtchnl_req (vm, dev, &vr);
171 static_always_inline vnet_dev_rv_t
172 iavf_vc_op_add_eth_addr (vlib_main_t *vm, vnet_dev_t *dev,
173 const virtchnl_ether_addr_list_t *req)
175 iavf_virtchnl_req_t vr = {
176 .op = VIRTCHNL_OP_ADD_ETH_ADDR,
179 VIRTCHNL_MSG_SZ (virtchnl_ether_addr_list_t, list, req->num_elements),
182 return iavf_virtchnl_req (vm, dev, &vr);
185 static_always_inline vnet_dev_rv_t
186 iavf_vc_op_del_eth_addr (vlib_main_t *vm, vnet_dev_t *dev,
187 const virtchnl_ether_addr_list_t *req)
189 iavf_virtchnl_req_t vr = {
190 .op = VIRTCHNL_OP_DEL_ETH_ADDR,
193 VIRTCHNL_MSG_SZ (virtchnl_ether_addr_list_t, list, req->num_elements),
196 return iavf_virtchnl_req (vm, dev, &vr);
199 static_always_inline vnet_dev_rv_t
200 iavf_vc_op_get_offload_vlan_v2_caps (vlib_main_t *vm, vnet_dev_t *dev,
201 virtchnl_vlan_caps_t *resp)
203 iavf_virtchnl_req_t vr = {
204 .op = VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS,
206 .resp_sz = sizeof (*resp),
209 return iavf_virtchnl_req (vm, dev, &vr);
212 static_always_inline vnet_dev_rv_t
213 iavf_vc_op_get_stats (vlib_main_t *vm, vnet_dev_t *dev,
214 const virtchnl_queue_select_t *req,
215 virtchnl_eth_stats_t *resp)
217 iavf_virtchnl_req_t vr = {
218 .op = VIRTCHNL_OP_GET_STATS,
220 .req_sz = sizeof (*req),
222 .resp_sz = sizeof (*resp),
225 return iavf_virtchnl_req (vm, dev, &vr);
228 static_always_inline vnet_dev_rv_t
229 iavf_vc_op_disable_vlan_stripping_v2 (vlib_main_t *vm, vnet_dev_t *dev,
230 const virtchnl_vlan_setting_t *req)
232 iavf_virtchnl_req_t vr = {
233 .op = VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2,
235 .req_sz = sizeof (*req),
238 return iavf_virtchnl_req (vm, dev, &vr);
241 #endif /* _IIAVF_VIRTCHNL_FUNCS_H_ */