The normal use case for ifup -a is to get *some* interface working and not really wait for all interfaces to come up and then timeout waiting for those without link up to get their DHCP lease. Thus repurpose ifup -a to mean bring up all interfaces until first success with the new ifup -A restoring the old behavior. The optimal action would be to make dhcp() non-blocking, but that would be somewhat more involved. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- include/net.h | 1 + net/ifup.c | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/include/net.h b/include/net.h index fdd21481dbf5..1046d1bf3681 100644 --- a/include/net.h +++ b/include/net.h @@ -512,6 +512,7 @@ int net_icmp_send(struct net_connection *con, int len); void led_trigger_network(enum led_trigger trigger); #define IFUP_FLAG_FORCE (1 << 0) +#define IFUP_FLAG_UNTIL_FIRST (1 << 1) int ifup_edev(struct eth_device *edev, unsigned flags); int ifup(const char *name, unsigned flags); diff --git a/net/ifup.c b/net/ifup.c index a0167eeb8a82..1ae7dad76b87 100644 --- a/net/ifup.c +++ b/net/ifup.c @@ -291,11 +291,17 @@ int ifup_all(unsigned flags) continue; ifup_edev(edev, flags); + if ((flags & IFUP_FLAG_UNTIL_FIRST) && edev->ifup) + return 0; } - for_each_netdev(edev) + for_each_netdev(edev) { ifup_edev(edev, flags); + if ((flags & IFUP_FLAG_UNTIL_FIRST) && edev->ifup) + return 0; + } + return 0; } @@ -326,12 +332,15 @@ static int do_ifup(int argc, char *argv[]) unsigned flags = 0; int all = 0; - while ((opt = getopt(argc, argv, "af")) > 0) { + while ((opt = getopt(argc, argv, "aAf")) > 0) { switch (opt) { case 'f': flags |= IFUP_FLAG_FORCE; break; case 'a': + flags |= IFUP_FLAG_UNTIL_FIRST; + fallthrough; + case 'A': all = 1; break; } @@ -353,14 +362,15 @@ BAREBOX_CMD_HELP_TEXT("Network interfaces are configured with a NV variables or BAREBOX_CMD_HELP_TEXT("/env/network/<intf> file. See Documentation/user/networking.rst") BAREBOX_CMD_HELP_TEXT("") BAREBOX_CMD_HELP_TEXT("Options:") -BAREBOX_CMD_HELP_OPT ("-a", "bring up all interfaces") +BAREBOX_CMD_HELP_OPT ("-A", "bring up all interfaces") +BAREBOX_CMD_HELP_OPT ("-a", "bring up all interfaces until first successful one") BAREBOX_CMD_HELP_OPT ("-f", "Force. Configure even if ip already set") BAREBOX_CMD_HELP_END BAREBOX_CMD_START(ifup) .cmd = do_ifup, BAREBOX_CMD_DESC("bring a network interface up") - BAREBOX_CMD_OPTS("[-af] [INTF]") + BAREBOX_CMD_OPTS("[-aAf] [INTF]") BAREBOX_CMD_GROUP(CMD_GRP_NET) BAREBOX_CMD_COMPLETE(eth_complete) BAREBOX_CMD_HELP(cmd_ifup_help) @@ -371,8 +381,9 @@ static int do_ifdown(int argc, char *argv[]) int opt; int all = 0; - while ((opt = getopt(argc, argv, "a")) > 0) { + while ((opt = getopt(argc, argv, "aA")) > 0) { switch (opt) { + case 'A': case 'a': all = 1; break; -- 2.30.2