From 5d4c99f27ee89a823d993853fe6b52e12c9e6c58 Mon Sep 17 00:00:00 2001 From: Jakub Grajciar Date: Thu, 26 Sep 2019 10:21:59 +0200 Subject: [PATCH] devices: vhost API cleanup Use consistent API types. Type: fix Change-Id: I2dec594cb834a45004edc9ca58ad7c7b4bd7ff06 Signed-off-by: Jakub Grajciar --- src/vat/api_format.c | 15 ++++++-- src/vnet/CMakeLists.txt | 3 ++ src/vnet/devices/virtio/vhost_user.api | 57 ++++++++++++++++++------------ src/vnet/devices/virtio/vhost_user_api.c | 22 ++++++++++-- src/vnet/devices/virtio/virtio_types.api | 47 ++++++++++++++++++++++++ src/vnet/devices/virtio/virtio_types_api.c | 33 +++++++++++++++++ src/vnet/devices/virtio/virtio_types_api.h | 38 ++++++++++++++++++++ test/test_vhost.py | 6 ++-- 8 files changed, 189 insertions(+), 32 deletions(-) create mode 100644 src/vnet/devices/virtio/virtio_types.api create mode 100644 src/vnet/devices/virtio/virtio_types_api.c create mode 100644 src/vnet/devices/virtio/virtio_types_api.h diff --git a/src/vat/api_format.c b/src/vat/api_format.c index 6e1ebf988b5..e4ef0b4916b 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -13116,11 +13116,18 @@ static void vl_api_sw_interface_vhost_user_details_t_handler (vl_api_sw_interface_vhost_user_details_t * mp) { vat_main_t *vam = &vat_main; + u64 features; + + features = + clib_net_to_host_u32 (mp->features_first_32) | ((u64) + clib_net_to_host_u32 + (mp->features_last_32) << + 32); print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s", (char *) mp->interface_name, ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz), - clib_net_to_host_u64 (mp->features), mp->is_server, + features, mp->is_server, ntohl (mp->num_regions), (char *) mp->sock_filename); print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno))); } @@ -13144,8 +13151,10 @@ static void vl_api_sw_interface_vhost_user_details_t_handler_json mp->interface_name); vat_json_object_add_uint (node, "virtio_net_hdr_sz", ntohl (mp->virtio_net_hdr_sz)); - vat_json_object_add_uint (node, "features", - clib_net_to_host_u64 (mp->features)); + vat_json_object_add_uint (node, "features_first_32", + clib_net_to_host_u32 (mp->features_first_32)); + vat_json_object_add_uint (node, "features_last_32", + clib_net_to_host_u32 (mp->features_last_32)); vat_json_object_add_uint (node, "is_server", mp->is_server); vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename); vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions)); diff --git a/src/vnet/CMakeLists.txt b/src/vnet/CMakeLists.txt index 21653ab7c7a..dcba3c725db 100644 --- a/src/vnet/CMakeLists.txt +++ b/src/vnet/CMakeLists.txt @@ -1051,12 +1051,14 @@ list(APPEND VNET_SOURCES devices/virtio/vhost_user_api.c devices/virtio/virtio.c devices/virtio/virtio_api.c + devices/virtio/virtio_types_api.c ) list(APPEND VNET_HEADERS devices/virtio/pci.h devices/virtio/virtio.h devices/virtio/vhost_user.h + devices/virtio/virtio_types_api.h ) list(APPEND VNET_MULTIARCH_SOURCES @@ -1071,6 +1073,7 @@ list(APPEND VNET_MULTIARCH_SOURCES list(APPEND VNET_API_FILES devices/virtio/vhost_user.api devices/virtio/virtio.api + devices/virtio/virtio_types.api ) ############################################################################## diff --git a/src/vnet/devices/virtio/vhost_user.api b/src/vnet/devices/virtio/vhost_user.api index e08c7351ddf..9b057552c00 100644 --- a/src/vnet/devices/virtio/vhost_user.api +++ b/src/vnet/devices/virtio/vhost_user.api @@ -13,7 +13,11 @@ * limitations under the License. */ -option version = "3.0.0"; +option version = "4.0.0"; + +import "vnet/interface_types.api"; +import "vnet/ethernet/ethernet_types.api"; +import "vnet/devices/virtio/virtio_types.api"; /** \brief vhost-user interface create request @param client_index - opaque cookie to identify the sender @@ -29,16 +33,16 @@ define create_vhost_user_if { u32 client_index; u32 context; - u8 is_server; - u8 sock_filename[256]; - u8 renumber; - u8 disable_mrg_rxbuf; - u8 disable_indirect_desc; - u8 enable_gso; + bool is_server; + string sock_filename[256]; + bool renumber; + bool disable_mrg_rxbuf; + bool disable_indirect_desc; + bool enable_gso; u32 custom_dev_instance; - u8 use_custom_mac; - u8 mac_address[6]; - u8 tag[64]; + bool use_custom_mac; + vl_api_mac_address_t mac_address; + string tag[64]; }; /** \brief vhost-user interface create response @@ -50,7 +54,7 @@ define create_vhost_user_if_reply { u32 context; i32 retval; - u32 sw_if_index; + vl_api_interface_index_t sw_if_index; }; /** \brief vhost-user interface modify request @@ -63,11 +67,11 @@ autoreply define modify_vhost_user_if { u32 client_index; u32 context; - u32 sw_if_index; - u8 is_server; - u8 sock_filename[256]; - u8 renumber; - u8 enable_gso; + vl_api_interface_index_t sw_if_index; + bool is_server; + string sock_filename[256]; + bool renumber; + bool enable_gso; u32 custom_dev_instance; }; @@ -78,35 +82,42 @@ autoreply define delete_vhost_user_if { u32 client_index; u32 context; - u32 sw_if_index; + vl_api_interface_index_t sw_if_index; }; /** \brief Vhost-user interface details structure (fix this) @param sw_if_index - index of the interface @param interface_name - name of interface @param virtio_net_hdr_sz - net header size - @param features - interface features + @param features_first_32 - interface features, first 32 bits + @param features_last_32 - interface features, last 32 bits @param is_server - vhost-user server socket @param sock_filename - socket filename @param num_regions - number of used memory regions + @param sock_errno - socket errno */ define sw_interface_vhost_user_details { u32 context; - u32 sw_if_index; - u8 interface_name[64]; + vl_api_interface_index_t sw_if_index; + string interface_name[64]; u32 virtio_net_hdr_sz; - u64 features; - u8 is_server; - u8 sock_filename[256]; + vl_api_virtio_net_features_first_32_t features_first_32; + vl_api_virtio_net_features_last_32_t features_last_32; + bool is_server; + string sock_filename[256]; u32 num_regions; i32 sock_errno; }; +/** \brief Vhost-user interface dump request + @param sw_if_index - filter by sw_if_index UNIMPLEMENTED +*/ define sw_interface_vhost_user_dump { u32 client_index; u32 context; + vl_api_interface_index_t sw_if_index [default=0xffffffff]; }; /* * Local Variables: diff --git a/src/vnet/devices/virtio/vhost_user_api.c b/src/vnet/devices/virtio/vhost_user_api.c index c8c9b59dcc0..2ab87a65690 100644 --- a/src/vnet/devices/virtio/vhost_user_api.c +++ b/src/vnet/devices/virtio/vhost_user_api.c @@ -23,6 +23,9 @@ #include #include #include +#include +#include +#include #include @@ -58,6 +61,8 @@ vl_api_create_vhost_user_if_t_handler (vl_api_create_vhost_user_if_t * mp) vlib_main_t *vm = vlib_get_main (); u64 features = (u64) ~ (0ULL); u64 disabled_features = (u64) (0ULL); + mac_address_t mac; + u8 *mac_p = NULL; if (mp->disable_mrg_rxbuf) disabled_features = (1ULL << FEAT_VIRTIO_NET_F_MRG_RXBUF); @@ -72,11 +77,16 @@ vl_api_create_vhost_user_if_t_handler (vl_api_create_vhost_user_if_t * mp) disabled_features |= FEATURE_VIRTIO_NET_F_HOST_GUEST_TSO_FEATURE_BITS; features &= ~disabled_features; + if (mp->use_custom_mac) + { + mac_address_decode (mp->mac_address, &mac); + mac_p = (u8 *) & mac; + } + rv = vhost_user_create_if (vnm, vm, (char *) mp->sock_filename, mp->is_server, &sw_if_index, features, mp->renumber, ntohl (mp->custom_dev_instance), - (mp->use_custom_mac) ? mp->mac_address : NULL, - mp->enable_gso); + mac_p, mp->enable_gso); /* Remember an interface tag for the new interface */ if (rv == 0) @@ -163,7 +173,8 @@ send_sw_interface_vhost_user_details (vpe_api_main_t * am, mp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_VHOST_USER_DETAILS); mp->sw_if_index = ntohl (vui->sw_if_index); mp->virtio_net_hdr_sz = ntohl (vui->virtio_net_hdr_sz); - mp->features = clib_net_to_host_u64 (vui->features); + virtio_features_encode (vui->features, (u32 *) & mp->features_first_32, + (u32 *) & mp->features_last_32); mp->is_server = vui->is_server; mp->num_regions = ntohl (vui->num_regions); mp->sock_errno = ntohl (vui->sock_errno); @@ -188,11 +199,16 @@ static void vhost_user_intf_details_t *ifaces = NULL; vhost_user_intf_details_t *vuid = NULL; vl_api_registration_t *reg; + u32 filter_sw_if_index; reg = vl_api_client_index_to_registration (mp->client_index); if (!reg) return; + filter_sw_if_index = htonl (mp->sw_if_index); + if (filter_sw_if_index != ~0) + return; /* UNIMPLEMENTED */ + rv = vhost_user_dump_ifs (vnm, vm, &ifaces); if (rv) return; diff --git a/src/vnet/devices/virtio/virtio_types.api b/src/vnet/devices/virtio/virtio_types.api new file mode 100644 index 00000000000..4ed43cb45e8 --- /dev/null +++ b/src/vnet/devices/virtio/virtio_types.api @@ -0,0 +1,47 @@ +/* + * 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"; + +enum virtio_net_features_first_32 +{ + VIRTIO_NET_F_API_CSUM = 0x0001, /* 0 */ + VIRTIO_NET_F_API_GUEST_CSUM = 0x0002, /* 1 */ + VIRTIO_NET_F_API_GUEST_TSO4 = 0x0080, /* 7 */ + VIRTIO_NET_F_API_GUEST_TSO6 = 0x0100, /* 8 */ + VIRTIO_NET_F_API_GUEST_UFO = 0x0400, /* 10 */ + VIRTIO_NET_F_API_HOST_TSO4 = 0x0800, /* 11 */ + VIRTIO_NET_F_API_HOST_TSO6 = 0x1000, /* 12 */ + VIRTIO_NET_F_API_HOST_UFO = 0x4000, /* 14 */ + VIRTIO_NET_F_API_MRG_RXBUF = 0x8000, /* 15 */ + VIRTIO_NET_F_API_CTRL_VQ = 0x00020000, /* 17 */ + VIRTIO_NET_F_API_GUEST_ANNOUNCE = 0x00200000, /* 21 */ + VIRTIO_NET_F_API_MQ = 0x00400000, /* 22 */ + VHOST_F_API_LOG_ALL = 0x04000000, /* 26 */ + VIRTIO_F_API_ANY_LAYOUT = 0x08000000, /* 27 */ + VIRTIO_F_API_INDIRECT_DESC = 0x10000000, /* 28*/ + VHOST_USER_F_API_PROTOCOL_FEATURES = 0x40000000, /* 30 */ +}; + +enum virtio_net_features_last_32 +{ + VIRTIO_F_API_VERSION_1 = 0x0001, /* 32 */ +}; + +/* + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/src/vnet/devices/virtio/virtio_types_api.c b/src/vnet/devices/virtio/virtio_types_api.c new file mode 100644 index 00000000000..48e0ab93dbf --- /dev/null +++ b/src/vnet/devices/virtio/virtio_types_api.c @@ -0,0 +1,33 @@ +/* + * 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 +#include + + +u64 +virtio_features_decode (u32 first, u32 last) +{ + return clib_net_to_host_u32 (first) | ((u64)clib_net_to_host_u32 (last) << 32); +} + +void +virtio_features_encode (u64 features, u32 *first, u32 *last) +{ + *first = clib_net_to_host_u32 (features); + *last = clib_net_to_host_u32 (features >> 32); +} diff --git a/src/vnet/devices/virtio/virtio_types_api.h b/src/vnet/devices/virtio/virtio_types_api.h new file mode 100644 index 00000000000..ff35fa3450f --- /dev/null +++ b/src/vnet/devices/virtio/virtio_types_api.h @@ -0,0 +1,38 @@ +/* + * 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 __VIRTIO_TYPES_API_H__ +#define __VIRTIO_TYPES_API_H__ + +/** + * Conversion functions to/from (decode/encode) API types to VPP internal types + */ + +/** + * These enum decode/encodes use 'u32' as the type for the enum because + * one cannot forward declare an enum + */ +extern u64 virtio_features_decode (u32 first, u32 last); +extern void virtio_features_encode (u64 features, u32 * first, u32 * last); + +#endif /* __VIRTIO_TYPES_API_H__ */ + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ diff --git a/test/test_vhost.py b/test/test_vhost.py index b9cc1102d5d..e8cb27d6ed4 100644 --- a/test/test_vhost.py +++ b/test/test_vhost.py @@ -31,12 +31,12 @@ class TesVhostInterface(VppTestCase): self.logger.info("Vhost User add interfaces") # create interface 1 (VirtualEthernet0/0/0) - vhost_if1 = VppVhostInterface(self, sock_filename=b'/tmp/sock1') + vhost_if1 = VppVhostInterface(self, sock_filename='/tmp/sock1') vhost_if1.add_vpp_config() vhost_if1.admin_up() # create interface 2 (VirtualEthernet0/0/1) - vhost_if2 = VppVhostInterface(self, sock_filename=b'/tmp/sock2') + vhost_if2 = VppVhostInterface(self, sock_filename='/tmp/sock2') vhost_if2.add_vpp_config() vhost_if2.admin_up() @@ -93,7 +93,7 @@ class TesVhostInterface(VppTestCase): # (like delete interface events from other tests) self.vapi.collect_events() - vhost_if = VppVhostInterface(self, sock_filename=b'/tmp/sock1') + vhost_if = VppVhostInterface(self, sock_filename='/tmp/sock1') # create vhost interface vhost_if.add_vpp_config() -- 2.16.6