diff options
Diffstat (limited to 'src/vnet/error.c')
-rw-r--r-- | src/vnet/error.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/vnet/error.c b/src/vnet/error.c new file mode 100644 index 00000000000..473d11135f1 --- /dev/null +++ b/src/vnet/error.c @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: Apache-2.0 + * Copyright(c) 2022 Cisco Systems, Inc. + */ + +#include <vppinfra/error.h> +#include <vnet/api_errno.h> + +static char *error_strings[] = { +#define _(a, b, c) [-(b)] = c, + foreach_vnet_error +#undef _ +}; + +clib_error_t * +vnet_error (vnet_error_t rv, char *fmt, ...) +{ + clib_error_t *e, *err = 0; + va_list va; + vec_add2 (err, e, 1); + e->what = format (e->what, "%s", error_strings[-rv]); + + if (fmt) + { + vec_add1 (e->what, ' '); + vec_add1 (e->what, '('); + va_start (va, fmt); + e->what = va_format (e->what, fmt, &va); + vec_add1 (e->what, ')'); + va_end (va); + } + + e->code = rv; + return err; +} + +u8 * +format_vnet_api_errno (u8 *s, va_list *args) +{ + vnet_api_error_t api_error = va_arg (*args, vnet_api_error_t); +#ifdef _ +#undef _ +#endif +#define _(a, b, c) \ + case b: \ + s = format (s, "%s", c); \ + break; + switch (api_error) + { + foreach_vnet_error default : s = format (s, "UNKNOWN"); + break; + } + return s; +#undef _ +} |