diff mbox series

net: lwip: dhcp: support arguments for TFTP file download

Message ID 20241114171002.2073594-1-jerome.forissier@linaro.org
State New
Headers show
Series net: lwip: dhcp: support arguments for TFTP file download | expand

Commit Message

Jerome Forissier Nov. 14, 2024, 5:10 p.m. UTC
The dhcp command is supposed to have the following syntax as per
"help dhcp":

  dhcp [loadAddress] [[hostIPaddr:]bootfilename]

In other words, any arguments should be passed to an implicit
tftpboot command after the DHCP exchange has occurred.

Add the missing code to the lwIP version of do_dhcp().

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 net/lwip/dhcp.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

Comments

Heinrich Schuchardt Nov. 14, 2024, 5:15 p.m. UTC | #1
Jerome Forissier <jerome.forissier@linaro.org> schrieb am Do., 14. Nov.
2024, 18:10:

> The dhcp command is supposed to have the following syntax as per
> "help dhcp":
>
>   dhcp [loadAddress] [[hostIPaddr:]bootfilename]
>
> In other words, any arguments should be passed to an implicit
> tftpboot command after the DHCP exchange has occurred.
>
> Add the missing code to the lwIP version of do_dhcp().
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  net/lwip/dhcp.c | 27 ++++++++++++++++++++++++++-
>  1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
> index 23b56226921..6f987e469d6 100644
> --- a/net/lwip/dhcp.c
> +++ b/net/lwip/dhcp.c
> @@ -111,9 +111,34 @@ static int dhcp_loop(struct udevice *udev)
>
>  int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>  {
> +       int ret;
> +
>         eth_set_current();
>
> -       return dhcp_loop(eth_get_dev());
> +       ret = dhcp_loop(eth_get_dev());
> +       if (ret)
> +               return ret;
> +
> +       if (argc > 1) {
> +               int i;
> +               char **tftp_argv;
> +               struct cmd_tbl cmdtp = {};
> +
> +               /* Invoke tftpboot with the arguments passed to dhcp */
> +               if (argc > 3)
> +                       return CMD_RET_FAILURE;
> +               tftp_argv = malloc(argc * sizeof(char *));
> +               if (!tftp_argv)
> +                       return CMD_RET_FAILURE;
> +               tftp_argv[0] = "tftpboot";
> +               for (i = 1; i < argc; i++)
> +                       tftp_argv[i] = argv[i];
>

Couldn't you just pass the original argv and argc if argc > 1.

Best regards

Heinrich


+               ret = do_tftpb(&cmdtp, 0, argc, tftp_argv);
> +               free(tftp_argv);
> +               return ret;
> +       }
> +
> +       return CMD_RET_SUCCESS;
>  }
>
>  int dhcp_run(ulong addr, const char *fname, bool autoload)
> --
> 2.40.1
>
>
Jerome Forissier Nov. 14, 2024, 5:19 p.m. UTC | #2
On 11/14/24 18:15, Heinrich Schuchardt wrote:
> Jerome Forissier <jerome.forissier@linaro.org> schrieb am Do., 14. Nov.
> 2024, 18:10:
> 
>> The dhcp command is supposed to have the following syntax as per
>> "help dhcp":
>>
>>   dhcp [loadAddress] [[hostIPaddr:]bootfilename]
>>
>> In other words, any arguments should be passed to an implicit
>> tftpboot command after the DHCP exchange has occurred.
>>
>> Add the missing code to the lwIP version of do_dhcp().
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  net/lwip/dhcp.c | 27 ++++++++++++++++++++++++++-
>>  1 file changed, 26 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
>> index 23b56226921..6f987e469d6 100644
>> --- a/net/lwip/dhcp.c
>> +++ b/net/lwip/dhcp.c
>> @@ -111,9 +111,34 @@ static int dhcp_loop(struct udevice *udev)
>>
>>  int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>>  {
>> +       int ret;
>> +
>>         eth_set_current();
>>
>> -       return dhcp_loop(eth_get_dev());
>> +       ret = dhcp_loop(eth_get_dev());
>> +       if (ret)
>> +               return ret;
>> +
>> +       if (argc > 1) {
>> +               int i;
>> +               char **tftp_argv;
>> +               struct cmd_tbl cmdtp = {};
>> +
>> +               /* Invoke tftpboot with the arguments passed to dhcp */
>> +               if (argc > 3)
>> +                       return CMD_RET_FAILURE;
>> +               tftp_argv = malloc(argc * sizeof(char *));
>> +               if (!tftp_argv)
>> +                       return CMD_RET_FAILURE;
>> +               tftp_argv[0] = "tftpboot";
>> +               for (i = 1; i < argc; i++)
>> +                       tftp_argv[i] = argv[i];
>>
> 
> Couldn't you just pass the original argv and argc if argc > 1.

Ha! Yes. I don't know why I thought tftpboot might be confused by
the content of argv[0]. It is of course not the case. v2 coming
shortly, thanks!
diff mbox series

Patch

diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
index 23b56226921..6f987e469d6 100644
--- a/net/lwip/dhcp.c
+++ b/net/lwip/dhcp.c
@@ -111,9 +111,34 @@  static int dhcp_loop(struct udevice *udev)
 
 int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
+	int ret;
+
 	eth_set_current();
 
-	return dhcp_loop(eth_get_dev());
+	ret = dhcp_loop(eth_get_dev());
+	if (ret)
+		return ret;
+
+	if (argc > 1) {
+		int i;
+		char **tftp_argv;
+		struct cmd_tbl cmdtp = {};
+
+		/* Invoke tftpboot with the arguments passed to dhcp */
+		if (argc > 3)
+			return CMD_RET_FAILURE;
+		tftp_argv = malloc(argc * sizeof(char *));
+		if (!tftp_argv)
+			return CMD_RET_FAILURE;
+		tftp_argv[0] = "tftpboot";
+		for (i = 1; i < argc; i++)
+			tftp_argv[i] = argv[i];
+		ret = do_tftpb(&cmdtp, 0, argc, tftp_argv);
+		free(tftp_argv);
+		return ret;
+	}
+
+	return CMD_RET_SUCCESS;
 }
 
 int dhcp_run(ulong addr, const char *fname, bool autoload)