[PATCH v2 30/71] net: Add a function to run dhcp
Ramon Fried
rfried.dev at gmail.com
Tue Jan 10 18:03:28 CET 2023
On Sun, Jan 8, 2023 at 4:58 AM Simon Glass <sjg at chromium.org> wrote:
>
> At present this must be done by executing the command. Also it involves
> fiddling with the environment to determine the correct autoload behaviour.
>
> Ideally it should be possible to run network operations without even
> having the command line present (CONFIG_CMDLINE).
>
> For now, add a function to handle DHCP, so it can be called from a bootdev
> more easily.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> (no changes since v1)
>
> cmd/net.c | 35 +++++++++++++++++++++++++++++++++++
> include/net.h | 15 +++++++++++++++
> 2 files changed, 50 insertions(+)
>
> diff --git a/cmd/net.c b/cmd/net.c
> index 0e9f200ca97..6b3774bfe7c 100644
> --- a/cmd/net.c
> +++ b/cmd/net.c
> @@ -4,6 +4,8 @@
> * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> */
>
> +#define LOG_CATEGORY UCLASS_ETH
> +
> /*
> * Boot support
> */
> @@ -13,6 +15,7 @@
> #include <dm.h>
> #include <env.h>
> #include <image.h>
> +#include <log.h>
> #include <net.h>
> #include <net6.h>
> #include <net/udp.h>
> @@ -120,6 +123,38 @@ U_BOOT_CMD(
> "boot image via network using DHCP/TFTP protocol",
> "[loadAddress] [[hostIPaddr:]bootfilename]"
> );
> +
> +int dhcp_run(ulong addr, const char *fname, bool autoload)
> +{
> + char *dhcp_argv[] = {"dhcp", NULL, (char *)fname, NULL};
> + struct cmd_tbl cmdtp = {}; /* dummy */
> + char file_addr[17];
> + int old_autoload;
> + int ret, result;
> +
> + log_debug("addr=%lx, fname=%s, autoload=%d\n", addr, fname, autoload);
> + old_autoload = env_get_yesno("autoload");
> + ret = env_set("autoload", autoload ? "y" : "n");
> + if (ret)
> + return log_msg_ret("en1", -EINVAL);
> +
> + if (autoload) {
> + sprintf(file_addr, "%lx", addr);
> + dhcp_argv[1] = file_addr;
> + }
> +
> + result = do_dhcp(&cmdtp, 0, !autoload ? 1 : fname ? 3 : 2, dhcp_argv);
> +
> + ret = env_set("autoload", old_autoload == -1 ? NULL :
> + old_autoload ? "y" : "n");
> + if (ret)
> + return log_msg_ret("en2", -EINVAL);
> +
> + if (result)
> + return log_msg_ret("res", -ENOENT);
> +
> + return 0;
> +}
> #endif
>
> #if defined(CONFIG_CMD_NFS)
> diff --git a/include/net.h b/include/net.h
> index 749f20fa967..c296d06c266 100644
> --- a/include/net.h
> +++ b/include/net.h
> @@ -65,6 +65,21 @@ struct in_addr {
> */
> int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
>
> +/**
> + * dhcp_run() - Run DHCP on the current ethernet device
> + *
> + * This sets the autoload variable, then puts it back to similar to its original
> + * state (y, n or unset).
> + *
> + * @addr: Address to load the file into (0 if @autoload is false)
> + * @fname: Filename of file to load (NULL if @autoload is false or to use the
> + * default filename)
> + * @autoload: true to load the file, false to just get the network IP
> + * @return 0 if OK, -EINVAL if the environment failed, -ENOENT if ant file was
> + * not found
> + */
> +int dhcp_run(ulong addr, const char *fname, bool autoload);
> +
> /**
> * An incoming packet handler.
> * @param pkt pointer to the application packet
> --
> 2.39.0.314.g84b9a713c41-goog
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>
More information about the U-Boot
mailing list