From 0341d6bf0c20a8f0dc592dfefa4d78d372a66ffa Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Thu, 27 Feb 2025 18:01:33 +0200 Subject: [PATCH] net: shell: iface: Allow user to set the default interface It is useful in testing to allow user to change the default network interface by "net iface default ". Also print out the default interface for "net iface" and "net iface default" commands. Signed-off-by: Jukka Rissanen --- subsys/net/lib/shell/iface.c | 43 +++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/subsys/net/lib/shell/iface.c b/subsys/net/lib/shell/iface.c index 6f19a743689..c3efdebe3a9 100644 --- a/subsys/net/lib/shell/iface.c +++ b/subsys/net/lib/shell/iface.c @@ -724,8 +724,10 @@ static int cmd_net_iface(const struct shell *sh, size_t argc, char *argv[]) } #if defined(CONFIG_NET_HOSTNAME_ENABLE) - PR("Hostname: %s\n\n", net_hostname_get()); + PR("Hostname: %s\n", net_hostname_get()); #endif + PR("Default interface: %d\n\n", + net_if_get_by_iface(net_if_get_default())); user_data.sh = sh; user_data.user_data = iface; @@ -735,6 +737,42 @@ static int cmd_net_iface(const struct shell *sh, size_t argc, char *argv[]) return 0; } +static int cmd_net_default_iface(const struct shell *sh, size_t argc, char *argv[]) +{ + struct net_if *iface = NULL; + int idx; + + if (argc < 2) { + iface = net_if_get_default(); + if (!iface) { + PR_WARNING("No default interface\n"); + return -ENOEXEC; + } + + idx = net_if_get_by_iface(iface); + PR("Default interface: %d\n", idx); + } else { + int new_idx; + + idx = get_iface_idx(sh, argv[1]); + if (idx < 0) { + return -ENOEXEC; + } + + net_if_set_default(net_if_get_by_index(idx)); + + new_idx = net_if_get_by_iface(net_if_get_default()); + if (new_idx != idx) { + PR_WARNING("Failed to set default interface to %d\n", idx); + return -ENOEXEC; + } + + PR("Default interface: %d\n", new_idx); + } + + return 0; +} + #if defined(CONFIG_NET_SHELL_DYN_CMD_COMPLETION) #include "iface_dynamic.h" @@ -756,6 +794,9 @@ SHELL_STATIC_SUBCMD_SET_CREATE(net_cmd_iface, SHELL_CMD(set_mac, IFACE_DYN_CMD, "'net iface set_mac ' sets MAC address for the network interface.", cmd_net_set_mac), + SHELL_CMD(default, IFACE_DYN_CMD, + "'net iface default []' displays or sets the default network interface.", + cmd_net_default_iface), SHELL_SUBCMD_SET_END );