From 2c504f89c662629be5548d26d65e09e35726927e Mon Sep 17 00:00:00 2001 From: Jakub Grajciar Date: Thu, 26 Sep 2019 10:34:41 +0200 Subject: [PATCH] devices: virtio API cleanup Use consistent API types. Type: fix Signed-off-by: Jakub Grajciar Change-Id: I38a409af770c88c1eb2c68b24abef2a5a91e1b9a --- src/vat/api_format.c | 21 +++++++++++-- src/vnet/CMakeLists.txt | 14 +++++++++ src/vnet/devices/virtio/virtio.api | 31 +++++++++++--------- src/vnet/devices/virtio/virtio_api.c | 6 ++-- src/vnet/pci/pci_types.api | 24 +++++++++++++++ src/vnet/pci/pci_types_api.c | 57 ++++++++++++++++++++++++++++++++++++ src/vnet/pci/pci_types_api.h | 27 +++++++++++++++++ 7 files changed, 161 insertions(+), 19 deletions(-) create mode 100644 src/vnet/pci/pci_types.api create mode 100644 src/vnet/pci/pci_types_api.c create mode 100644 src/vnet/pci/pci_types_api.h diff --git a/src/vat/api_format.c b/src/vat/api_format.c index 98081ee6fb9..ac04abe96e6 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -7541,7 +7541,11 @@ api_virtio_pci_create (vat_main_t * vam) mp->use_random_mac = random_mac; - mp->pci_addr = htonl (pci_addr); + mp->pci_addr.domain = htons (((vlib_pci_addr_t) pci_addr).domain); + mp->pci_addr.bus = ((vlib_pci_addr_t) pci_addr).bus; + mp->pci_addr.slot = ((vlib_pci_addr_t) pci_addr).slot; + mp->pci_addr.function = ((vlib_pci_addr_t) pci_addr).function; + mp->features = clib_host_to_net_u64 (features); mp->gso_enabled = gso_enabled; @@ -11401,7 +11405,12 @@ static void vl_api_sw_interface_virtio_pci_details_t_handler u32 as_u32; } pci_addr_t; pci_addr_t addr; - addr.as_u32 = ntohl (mp->pci_addr); + + addr.domain = ntohs (mp->pci_addr.domain); + addr.bus = mp->pci_addr.bus; + addr.slot = mp->pci_addr.slot; + addr.function = mp->pci_addr.function; + u8 *pci_addr = format (0, "%04x:%02x:%02x.%x", addr.domain, addr.bus, addr.slot, addr.function); @@ -11419,6 +11428,7 @@ static void vl_api_sw_interface_virtio_pci_details_t_handler_json { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; + vlib_pci_addr_t pci_addr; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -11427,8 +11437,13 @@ static void vl_api_sw_interface_virtio_pci_details_t_handler_json } node = vat_json_array_add (&vam->json_tree); + pci_addr.domain = ntohs (mp->pci_addr.domain); + pci_addr.bus = mp->pci_addr.bus; + pci_addr.slot = mp->pci_addr.slot; + pci_addr.function = mp->pci_addr.function; + vat_json_init_object (node); - vat_json_object_add_uint (node, "pci-addr", ntohl (mp->pci_addr)); + vat_json_object_add_uint (node, "pci-addr", pci_addr.as_u32); vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz)); vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz)); diff --git a/src/vnet/CMakeLists.txt b/src/vnet/CMakeLists.txt index 37f7810e229..56db74265cc 100644 --- a/src/vnet/CMakeLists.txt +++ b/src/vnet/CMakeLists.txt @@ -1508,6 +1508,20 @@ list(APPEND VNET_HEADERS list(APPEND VNET_API_FILES syslog/syslog.api) +############################################################################## +# PCI +############################################################################## + +list (APPEND VNET_SOURCES + pci/pci_types_api.c +) + +list(APPEND VNET_HEADERS + pci/pci_types_api.h +) + +list(APPEND VNET_API_FILES pci/pci_types.api) + ############################################################################## # NHRP ############################################################################## diff --git a/src/vnet/devices/virtio/virtio.api b/src/vnet/devices/virtio/virtio.api index f2a3a412126..b191810d71b 100644 --- a/src/vnet/devices/virtio/virtio.api +++ b/src/vnet/devices/virtio/virtio.api @@ -13,13 +13,17 @@ * limitations under the License. */ -option version = "1.0.0"; +option version = "2.0.0"; + +import "vnet/interface_types.api"; +import "vnet/ethernet/ethernet_types.api"; +import "vnet/pci/pci_types.api"; + /** \brief Initialize a new virtio pci interface with the given parameters @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request - @param pci_addr - pci address as unsigned 32bit integer: - 0-15 domain, 16-23 bus, 24-28 slot, 29-31 function + @param pci_addr - pci address @param use_random_mac - let the system generate a unique mac address @param mac_address - mac addr to assign to the interface if use_random not set @param gso_enabled - enable gso feature if available, 1 to enable @@ -29,10 +33,10 @@ define virtio_pci_create { u32 client_index; u32 context; - u32 pci_addr; - u8 use_random_mac; - u8 mac_address[6]; - u8 gso_enabled; + vl_api_pci_address_t pci_addr; + bool use_random_mac; + vl_api_mac_address_t mac_address; + bool gso_enabled; u64 features; }; @@ -45,7 +49,7 @@ define virtio_pci_create_reply { u32 context; i32 retval; - u32 sw_if_index; + vl_api_interface_index_t sw_if_index; }; /** \brief Delete virtio pci interface @@ -57,7 +61,7 @@ autoreply define virtio_pci_delete { u32 client_index; u32 context; - u32 sw_if_index; + vl_api_interface_index_t sw_if_index; }; /** \brief Dump virtio pci interfaces request */ @@ -69,8 +73,7 @@ define sw_interface_virtio_pci_dump /** \brief Reply for virtio pci interface dump request @param sw_if_index - software index of virtio pci interface - @param pci_addr - pci address as unsigned 32bit integer: - 0-15 domain, 16-23 bus, 24-28 slot, 29-31 function + @param pci_addr - pci address @param mac_addr - native virtio device mac address @param tx_ring_sz - the number of entries of TX ring @param rx_ring_sz - the number of entries of RX ring @@ -79,9 +82,9 @@ define sw_interface_virtio_pci_dump define sw_interface_virtio_pci_details { u32 context; - u32 sw_if_index; - u32 pci_addr; - u8 mac_addr[6]; + vl_api_interface_index_t sw_if_index; + vl_api_pci_address_t pci_addr; + vl_api_mac_address_t mac_addr; u16 tx_ring_sz; u16 rx_ring_sz; u64 features; diff --git a/src/vnet/devices/virtio/virtio_api.c b/src/vnet/devices/virtio/virtio_api.c index 9d009f37a38..ac167e827c6 100644 --- a/src/vnet/devices/virtio/virtio_api.c +++ b/src/vnet/devices/virtio/virtio_api.c @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -59,7 +60,7 @@ vl_api_virtio_pci_create_t_handler (vl_api_virtio_pci_create_t * mp) clib_memset (ap, 0, sizeof (*ap)); - ap->addr = ntohl (mp->pci_addr); + pci_address_decode (&mp->pci_addr, (vlib_pci_addr_t *) & ap->addr); if (!mp->use_random_mac) { clib_memcpy (ap->mac_addr, mp->mac_address, 6); @@ -136,7 +137,8 @@ virtio_pci_send_sw_interface_details (vpe_api_main_t * am, clib_memset (mp, 0, sizeof (*mp)); mp->_vl_msg_id = htons (VL_API_SW_INTERFACE_VIRTIO_PCI_DETAILS); - mp->pci_addr = htonl (vif->pci_addr.as_u32); + pci_address_encode ((vlib_pci_addr_t *) & vif->pci_addr.as_u32, + &mp->pci_addr); mp->sw_if_index = htonl (vif->sw_if_index); virtio_vring_t *vring = vec_elt_at_index (vif->rxq_vrings, 0); mp->rx_ring_sz = htons (vring->size); diff --git a/src/vnet/pci/pci_types.api b/src/vnet/pci/pci_types.api new file mode 100644 index 00000000000..d3654af536c --- /dev/null +++ b/src/vnet/pci/pci_types.api @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2019 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +option version = "1.0.0"; + +typedef pci_address +{ + u16 domain; + u8 bus; + u8 slot; + u8 function; +}; diff --git a/src/vnet/pci/pci_types_api.c b/src/vnet/pci/pci_types_api.c new file mode 100644 index 00000000000..5d1abec5af8 --- /dev/null +++ b/src/vnet/pci/pci_types_api.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#define vl_typedefs /* define message structures */ +#include +#undef vl_typedefs + +#define vl_endianfun /* define message structures */ +#include +#undef vl_endianfun + +/* instantiate all the print functions we know about */ +#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) +#define vl_printfun +#include +#undef vl_printfun + +void +pci_address_decode (const vl_api_pci_address_t * in, vlib_pci_addr_t * out) +{ + out->domain = in->domain; + out->bus = in->bus; + out->slot = in->slot; + out->function = in->function; +} + +void +pci_address_encode (const vlib_pci_addr_t * in, vl_api_pci_address_t * out) +{ + out->domain = in->domain; + out->bus = in->bus; + out->slot = in->slot; + out->function = in->function; +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/src/vnet/pci/pci_types_api.h b/src/vnet/pci/pci_types_api.h new file mode 100644 index 00000000000..16e126d5c99 --- /dev/null +++ b/src/vnet/pci/pci_types_api.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __PCI_TYPES_API_H__ +#define __PCI_TYPES_API_H__ + +#include +#include + +struct _vl_api_pci_address; + +extern void pci_address_decode (const struct _vl_api_pci_address * in, vlib_pci_addr_t * out); +extern void pci_address_encode (const vlib_pci_addr_t * in, struct _vl_api_pci_address * out); + +#endif /* PCI_TYPES_API_H */ -- 2.16.6