]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: Add a function to run dhcp
authorSimon Glass <sjg@chromium.org>
Tue, 17 Jan 2023 17:47:39 +0000 (10:47 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 23 Jan 2023 23:11:40 +0000 (18:11 -0500)
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@chromium.org>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
cmd/net.c
include/net.h

index dd50930a362b9071638d07188014106db0d0528b..4227321871c1d1d3c286620a81ba045c75451a52 100644 (file)
--- a/cmd/net.c
+++ b/cmd/net.c
@@ -4,6 +4,8 @@
  * Wolfgang Denk, DENX Software Engineering, wd@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)
index 759d4669df103ec81d62009a595fd209bb88c743..399af5e0645f820b4e4b1a4f28bdadbe48c9e99a 100644 (file)
@@ -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