net/failsafe: add plug-in support
[dpdk.git] / drivers / net / failsafe / failsafe_args.c
index bde8f2d..733344e 100644 (file)
@@ -32,6 +32,7 @@
  */
 
 #include <string.h>
+#include <errno.h>
 
 #include <rte_devargs.h>
 #include <rte_malloc.h>
 typedef int (parse_cb)(struct rte_eth_dev *dev, const char *params,
                uint8_t head);
 
+uint64_t hotplug_poll = FAILSAFE_HOTPLUG_DEFAULT_TIMEOUT_MS;
 int mac_from_arg = 0;
 
 const char *pmd_failsafe_init_parameters[] = {
+       PMD_FAILSAFE_HOTPLUG_POLL_KVARG,
        PMD_FAILSAFE_MAC_KVARG,
        NULL,
 };
@@ -220,6 +223,24 @@ out:
        return 0;
 }
 
+static int
+fs_get_u64_arg(const char *key __rte_unused,
+               const char *value, void *out)
+{
+       uint64_t *u64 = out;
+       char *endptr = NULL;
+
+       if ((value == NULL) || (out == NULL))
+               return -EINVAL;
+       errno = 0;
+       *u64 = strtoull(value, &endptr, 0);
+       if (errno != 0)
+               return -errno;
+       if (endptr == value)
+               return -1;
+       return 0;
+}
+
 static int
 fs_get_mac_addr_arg(const char *key __rte_unused,
                const char *value, void *out)
@@ -271,6 +292,16 @@ failsafe_args_parse(struct rte_eth_dev *dev, const char *params)
                                PMD_FAILSAFE_PARAM_STRING);
                        return -1;
                }
+               /* PLUG_IN event poll timer */
+               arg_count = rte_kvargs_count(kvlist,
+                               PMD_FAILSAFE_HOTPLUG_POLL_KVARG);
+               if (arg_count == 1) {
+                       ret = rte_kvargs_process(kvlist,
+                                       PMD_FAILSAFE_HOTPLUG_POLL_KVARG,
+                                       &fs_get_u64_arg, &hotplug_poll);
+                       if (ret < 0)
+                               goto free_kvlist;
+               }
                /* MAC addr */
                arg_count = rte_kvargs_count(kvlist,
                                PMD_FAILSAFE_MAC_KVARG);
@@ -284,6 +315,7 @@ failsafe_args_parse(struct rte_eth_dev *dev, const char *params)
                        mac_from_arg = 1;
                }
        }
+       PRIV(dev)->state = DEV_PARSED;
 free_kvlist:
        rte_kvargs_free(kvlist);
        return ret;