1 /* SPDX-License-Identifier: BSD-3-Clause 2 * 3 * Copyright (c) 2016-2018 Solarflare Communications Inc. 4 * All rights reserved. 5 * 6 * This software was jointly developed between OKTET Labs (under contract 7 * for Solarflare) and Solarflare Communications, Inc. 8 */ 9 10 #include <stdbool.h> 11 #include <strings.h> 12 13 #include <rte_devargs.h> 14 #include <rte_kvargs.h> 15 16 #include "sfc.h" 17 #include "sfc_kvargs.h" 18 19 int 20 sfc_kvargs_parse(struct sfc_adapter *sa) 21 { 22 struct rte_eth_dev *eth_dev = (sa)->eth_dev; 23 struct rte_devargs *devargs = eth_dev->device->devargs; 24 const char **params = (const char *[]){ 25 SFC_KVARG_STATS_UPDATE_PERIOD_MS, 26 SFC_KVARG_PERF_PROFILE, 27 SFC_KVARG_RX_DATAPATH, 28 SFC_KVARG_TX_DATAPATH, 29 SFC_KVARG_FW_VARIANT, 30 NULL, 31 }; 32 33 if (devargs == NULL) 34 return 0; 35 36 sa->kvargs = rte_kvargs_parse(devargs->args, params); 37 if (sa->kvargs == NULL) 38 return EINVAL; 39 40 return 0; 41 } 42 43 void 44 sfc_kvargs_cleanup(struct sfc_adapter *sa) 45 { 46 rte_kvargs_free(sa->kvargs); 47 } 48 49 static int 50 sfc_kvarg_match_value(const char *value, const char * const *values, 51 unsigned int n_values) 52 { 53 unsigned int i; 54 55 for (i = 0; i < n_values; ++i) 56 if (strcasecmp(value, values[i]) == 0) 57 return 1; 58 59 return 0; 60 } 61 62 int 63 sfc_kvargs_process(struct sfc_adapter *sa, const char *key_match, 64 arg_handler_t handler, void *opaque_arg) 65 { 66 if (sa->kvargs == NULL) 67 return 0; 68 69 return -rte_kvargs_process(sa->kvargs, key_match, handler, opaque_arg); 70 } 71 72 int 73 sfc_kvarg_bool_handler(__rte_unused const char *key, 74 const char *value_str, void *opaque) 75 { 76 const char * const true_strs[] = { 77 "1", "y", "yes", "on", "true" 78 }; 79 const char * const false_strs[] = { 80 "0", "n", "no", "off", "false" 81 }; 82 bool *value = opaque; 83 84 if (sfc_kvarg_match_value(value_str, true_strs, 85 RTE_DIM(true_strs))) 86 *value = true; 87 else if (sfc_kvarg_match_value(value_str, false_strs, 88 RTE_DIM(false_strs))) 89 *value = false; 90 else 91 return -EINVAL; 92 93 return 0; 94 } 95 96 int 97 sfc_kvarg_long_handler(__rte_unused const char *key, 98 const char *value_str, void *opaque) 99 { 100 long value; 101 char *endptr; 102 103 if (!value_str || !opaque) 104 return -EINVAL; 105 106 value = strtol(value_str, &endptr, 0); 107 if (endptr == value_str) 108 return -EINVAL; 109 110 *(long *)opaque = value; 111 112 return 0; 113 } 114 115 int 116 sfc_kvarg_string_handler(__rte_unused const char *key, 117 const char *value_str, void *opaque) 118 { 119 *(const char **)opaque = value_str; 120 121 return 0; 122 } 123