| /* |
| * Copyright (c) 2016 Intel Corporation |
| * Copyright (c) 2023 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /* Dynamic shell command completion for network interface. |
| * This is be used by multiple commands. |
| */ |
| |
| #define MAX_IFACE_HELP_STR_LEN sizeof("longbearername (0xabcd0123)") |
| #define MAX_IFACE_STR_LEN sizeof("xxx") |
| |
| static char iface_help_buffer[MAX_IFACE_COUNT][MAX_IFACE_HELP_STR_LEN]; |
| static char iface_index_buffer[MAX_IFACE_COUNT][MAX_IFACE_STR_LEN]; |
| |
| static void iface_index_get(size_t idx, struct shell_static_entry *entry); |
| |
| SHELL_DYNAMIC_CMD_CREATE(iface_index, iface_index_get); |
| |
| static char *set_iface_index_buffer(size_t idx) |
| { |
| struct net_if *iface = net_if_get_by_index(idx); |
| |
| /* Network interfaces start at 1 */ |
| if (idx == 0) { |
| return ""; |
| } |
| |
| if (!iface) { |
| return NULL; |
| } |
| |
| snprintk(iface_index_buffer[idx - 1], MAX_IFACE_STR_LEN, "%d", (uint8_t)idx); |
| |
| return iface_index_buffer[idx - 1]; |
| } |
| |
| static char *set_iface_index_help(size_t idx) |
| { |
| struct net_if *iface = net_if_get_by_index(idx); |
| |
| /* Network interfaces start at 1 */ |
| if (idx == 0) { |
| return ""; |
| } |
| |
| if (!iface) { |
| return NULL; |
| } |
| |
| #if defined(CONFIG_NET_INTERFACE_NAME) |
| char name[CONFIG_NET_INTERFACE_NAME_LEN + 1]; |
| |
| net_if_get_name(iface, name, CONFIG_NET_INTERFACE_NAME_LEN); |
| name[CONFIG_NET_INTERFACE_NAME_LEN] = '\0'; |
| |
| snprintk(iface_help_buffer[idx - 1], MAX_IFACE_HELP_STR_LEN, |
| "%s [%s] (%p)", name, iface2str(iface, NULL), iface); |
| #else |
| snprintk(iface_help_buffer[idx - 1], MAX_IFACE_HELP_STR_LEN, |
| "[%s] (%p)", iface2str(iface, NULL), iface); |
| #endif |
| |
| return iface_help_buffer[idx - 1]; |
| } |
| |
| static void iface_index_get(size_t idx, struct shell_static_entry *entry) |
| { |
| entry->handler = NULL; |
| entry->help = set_iface_index_help(idx); |
| entry->subcmd = &iface_index; |
| entry->syntax = set_iface_index_buffer(idx); |
| } |