From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jC2LJ-0004Mg-HB for barebox@lists.infradead.org; Wed, 11 Mar 2020 14:28:19 +0000 From: Sascha Hauer Date: Wed, 11 Mar 2020 15:27:57 +0100 Message-Id: <20200311142757.25263-17-s.hauer@pengutronix.de> In-Reply-To: <20200311142757.25263-1-s.hauer@pengutronix.de> References: <20200311142757.25263-1-s.hauer@pengutronix.de> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 16/16] net: Add ifdown support and command To: Barebox List Cc: Edmund Henniges , =?UTF-8?q?Daniel=20Gl=C3=B6ckner?= ifdown is the counterpart to ifup and disables one or all ethernet interfaces. Signed-off-by: Sascha Hauer --- include/net.h | 4 +++ net/ifup.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/include/net.h b/include/net.h index 23e3759905..583dc14ed5 100644 --- a/include/net.h +++ b/include/net.h @@ -488,6 +488,10 @@ int ifup_edev(struct eth_device *edev, unsigned flags); int ifup(const char *name, unsigned flags); int ifup_all(unsigned flags); +void ifdown_edev(struct eth_device *edev); +int ifdown(const char *name); +void ifdown_all(void); + extern struct list_head netdev_list; #define for_each_netdev(netdev) list_for_each_entry(netdev, &netdev_list, list) diff --git a/net/ifup.c b/net/ifup.c index fa2c52ff8b..b76b4bc44c 100644 --- a/net/ifup.c +++ b/net/ifup.c @@ -237,6 +237,12 @@ int ifup_edev(struct eth_device *edev, unsigned flags) return 0; } +void ifdown_edev(struct eth_device *edev) +{ + eth_close(edev); + edev->ifup = false; +} + int ifup(const char *ethname, unsigned flags) { struct eth_device *edev; @@ -253,6 +259,19 @@ int ifup(const char *ethname, unsigned flags) return ifup_edev(edev, flags); } +int ifdown(const char *ethname) +{ + struct eth_device *edev; + + edev = eth_get_byname(ethname); + if (!edev) + return -ENODEV; + + ifdown_edev(edev); + + return 0; +} + static int net_ifup_force_detect; int ifup_all(unsigned flags) @@ -286,6 +305,14 @@ int ifup_all(unsigned flags) return 0; } +void ifdown_all(void) +{ + struct eth_device *edev; + + for_each_netdev(edev) + ifdown_edev(edev); +} + static int ifup_all_init(void) { globalvar_add_simple_bool("net.ifup_force_detect", &net_ifup_force_detect); @@ -346,4 +373,46 @@ BAREBOX_CMD_START(ifup) BAREBOX_CMD_HELP(cmd_ifup_help) BAREBOX_CMD_END +static int do_ifdown(int argc, char *argv[]) +{ + int opt; + int all = 0; + + while ((opt = getopt(argc, argv, "a")) > 0) { + switch (opt) { + case 'a': + all = 1; + break; + } + } + + if (all) { + ifdown_all(); + return 0; + } + + if (argc == optind) + return COMMAND_ERROR_USAGE; + + return ifdown(argv[optind]); +} + + + +BAREBOX_CMD_HELP_START(ifdown) +BAREBOX_CMD_HELP_TEXT("Disable a network interface") +BAREBOX_CMD_HELP_TEXT("") +BAREBOX_CMD_HELP_TEXT("Options:") +BAREBOX_CMD_HELP_OPT ("-a", "disable all interfaces") +BAREBOX_CMD_HELP_END + +BAREBOX_CMD_START(ifdown) + .cmd = do_ifdown, + BAREBOX_CMD_DESC("disable a network interface") + BAREBOX_CMD_OPTS("[-a] [INTF]") + BAREBOX_CMD_GROUP(CMD_GRP_NET) + BAREBOX_CMD_COMPLETE(eth_complete) + BAREBOX_CMD_HELP(cmd_ifdown_help) +BAREBOX_CMD_END + #endif -- 2.25.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox