From 04d262d1eba969538950da7183cfa77ff3d70dff Mon Sep 17 00:00:00 2001 From: Vratko Polak Date: Thu, 14 Dec 2023 17:11:38 +0100 Subject: rdma: add rdma_create_v4 that handles flags properly The _v3 was not handling endianness on flags (e.g. mode). Marking _v3 as deprecated, but keeping it as there might be users who learned to preprocess their flag values. + Also, format PCI product_name as a vector, not a string. Type: fix Change-Id: I50c4b44f3570f02518dbd9a43239c1a37612d24a Signed-off-by: Vratko Polak --- src/plugins/rdma/api.c | 31 ++++++++++++++++++++++++++ src/plugins/rdma/format.c | 4 ++-- src/plugins/rdma/rdma.api | 50 ++++++++++++++++++++++++++++++++++++++++++ src/plugins/rdma/test_api.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 2 deletions(-) diff --git a/src/plugins/rdma/api.c b/src/plugins/rdma/api.c index 8455cc456aa..b4695cf3a7a 100644 --- a/src/plugins/rdma/api.c +++ b/src/plugins/rdma/api.c @@ -42,6 +42,8 @@ rdma_api_mode (vl_api_rdma_mode_t mode) case RDMA_API_MODE_DV: return RDMA_MODE_DV; } + /* Fail the debug build. Useful for investigating endian issues. */ + ASSERT (0); return RDMA_MODE_AUTO; } @@ -79,6 +81,35 @@ rdma_api_rss6 (const vl_api_rdma_rss6_t rss6) return RDMA_RSS6_AUTO; } +static void +vl_api_rdma_create_v4_t_handler (vl_api_rdma_create_v4_t *mp) +{ + vlib_main_t *vm = vlib_get_main (); + rdma_main_t *rm = &rdma_main; + vl_api_rdma_create_v4_reply_t *rmp; + rdma_create_if_args_t args; + int rv; + + clib_memset (&args, 0, sizeof (rdma_create_if_args_t)); + + args.ifname = mp->host_if; + args.name = mp->name; + args.rxq_num = mp->rxq_num; + args.rxq_size = mp->rxq_size; + args.txq_size = mp->txq_size; + args.mode = rdma_api_mode (mp->mode); + args.disable_striding_rq = 0; + args.no_multi_seg = mp->no_multi_seg; + args.max_pktlen = mp->max_pktlen; + args.rss4 = rdma_api_rss4 (mp->rss4); + args.rss6 = rdma_api_rss6 (mp->rss6); + rdma_create_if (vm, &args); + rv = args.rv; + + REPLY_MACRO2_END (VL_API_RDMA_CREATE_V4_REPLY, + ({ rmp->sw_if_index = args.sw_if_index; })); +} + static void vl_api_rdma_create_v3_t_handler (vl_api_rdma_create_v3_t *mp) { diff --git a/src/plugins/rdma/format.c b/src/plugins/rdma/format.c index 78187e9cf17..a999460bd55 100644 --- a/src/plugins/rdma/format.c +++ b/src/plugins/rdma/format.c @@ -122,8 +122,8 @@ format_rdma_device (u8 * s, va_list * args) format_vlib_pci_addr, &rd->pci->addr); if ((d = vlib_pci_get_device_info (vm, &rd->pci->addr, 0))) { - s = format (s, "%Uproduct name: %s\n", format_white_space, indent, - d->product_name ? (char *) d->product_name : ""); + s = format (s, "%Uproduct name: %v\n", format_white_space, indent, + d->product_name); s = format (s, "%Upart number: %U\n", format_white_space, indent, format_vlib_pci_vpd, d->vpd_r, "PN"); s = format (s, "%Urevision: %U\n", format_white_space, indent, diff --git a/src/plugins/rdma/rdma.api b/src/plugins/rdma/rdma.api index b83e8ee4148..4c06d8c6658 100644 --- a/src/plugins/rdma/rdma.api +++ b/src/plugins/rdma/rdma.api @@ -98,6 +98,8 @@ enum rdma_rss6 }; /** \brief + Same as v4, just not an autoendian (expect buggy handling of flag values). + @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @param host_if - Linux netdev interface name @@ -114,6 +116,9 @@ enum rdma_rss6 define rdma_create_v3 { + option deprecated; + option replaced_by="rdma_create_v4"; + u32 client_index; u32 context; @@ -130,6 +135,38 @@ define rdma_create_v3 option vat_help = " [name ] [rx-queue-size ] [tx-queue-size ] [num-rx-queues ] [mode ] [no-multi-seg] [max-pktlen ] [rss ] [rss ]"; }; +/** \brief + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param host_if - Linux netdev interface name + @param name - new rdma interface name + @param rxq_num - number of receive queues (optional) + @param rxq_size - receive queue size (optional) + @param txq_size - transmit queue size (optional) + @param mode - operation mode (optional) + @param no_multi_seg (optional) - disable chained buffer RX + @param max_pktlen (optional) - maximal RX packet size. + @param rss4 (optional) - IPv4 RSS + @param rss6 (optional) - IPv6 RSS +*/ + +autoendian define rdma_create_v4 +{ + u32 client_index; + u32 context; + + string host_if[64]; + string name[64]; + u16 rxq_num [default=1]; + u16 rxq_size [default=1024]; + u16 txq_size [default=1024]; + vl_api_rdma_mode_t mode [default=0]; + bool no_multi_seg [default=0]; + u16 max_pktlen [default=0]; + vl_api_rdma_rss4_t rss4 [default=0]; + vl_api_rdma_rss6_t rss6 [default=0]; + option vat_help = " [name ] [rx-queue-size ] [tx-queue-size ] [num-rx-queues ] [mode ] [no-multi-seg] [max-pktlen ] [rss ] [rss ]"; +}; /** \brief @param context - sender context, to match reply w/ request @@ -180,6 +217,19 @@ define rdma_create_v3_reply @param sw_if_index - interface index */ +autoendian define rdma_create_v4_reply +{ + u32 context; + i32 retval; + vl_api_interface_index_t sw_if_index; +}; + +/** \brief + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param sw_if_index - interface index +*/ + autoreply define rdma_delete { u32 client_index; diff --git a/src/plugins/rdma/test_api.c b/src/plugins/rdma/test_api.c index e9d5fcaad98..4ec4d3bf345 100644 --- a/src/plugins/rdma/test_api.c +++ b/src/plugins/rdma/test_api.c @@ -189,6 +189,41 @@ api_rdma_create_v3 (vat_main_t *vam) return ret; } +static int +api_rdma_create_v4 (vat_main_t *vam) +{ + vl_api_rdma_create_v4_t *mp; + rdma_create_if_args_t args; + int ret; + + if (!unformat_user (vam->input, unformat_rdma_create_if_args, &args)) + { + clib_warning ("unknown input `%U'", format_unformat_error, vam->input); + return -99; + } + + M (RDMA_CREATE_V4, mp); + + snprintf ((char *) mp->host_if, sizeof (mp->host_if), "%s", args.ifname); + if (args.name) + snprintf ((char *) mp->name, sizeof (mp->name), "%s", args.name); + else + mp->name[0] = 0; + mp->rxq_num = args.rxq_num; + mp->rxq_size = args.rxq_size; + mp->txq_size = args.txq_size; + mp->mode = api_rdma_mode (args.mode); + mp->no_multi_seg = args.no_multi_seg; + mp->max_pktlen = args.max_pktlen; + mp->rss4 = api_rdma_rss4 (args.rss4); + mp->rss6 = api_rdma_rss6 (args.rss6); + + S (mp); + W (ret); + + return ret; +} + /* rdma-create reply handler */ static void vl_api_rdma_create_reply_t_handler (vl_api_rdma_create_reply_t * mp) @@ -243,6 +278,24 @@ vl_api_rdma_create_v3_reply_t_handler (vl_api_rdma_create_v3_reply_t *mp) vam->regenerate_interface_table = 1; } +/* rdma-create reply handler v4 */ +static void +vl_api_rdma_create_v4_reply_t_handler (vl_api_rdma_create_v4_reply_t *mp) +{ + vat_main_t *vam = rdma_test_main.vat_main; + i32 retval = mp->retval; + + if (retval == 0) + { + fformat (vam->ofp, "created rdma with sw_if_index %d\n", + ntohl (mp->sw_if_index)); + } + + vam->retval = retval; + vam->result_ready = 1; + vam->regenerate_interface_table = 1; +} + /* rdma delete API */ static int api_rdma_delete (vat_main_t * vam) -- cgit 1.2.3-korg