From patchwork Sat Aug 24 09:27:16 2024
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Mikhail Kshevetskiy
X-Patchwork-Id: 1976367
X-Patchwork-Delegate: pbrobinson@gmail.com
Return-Path:
X-Original-To: incoming@patchwork.ozlabs.org
Delivered-To: patchwork-incoming@legolas.ozlabs.org
Authentication-Results: legolas.ozlabs.org;
dkim=pass (2048-bit key;
unprotected) header.d=iopsys.eu header.i=@iopsys.eu header.a=rsa-sha256
header.s=selector2 header.b=uOwipLEj;
dkim-atps=neutral
Authentication-Results: legolas.ozlabs.org;
spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de
(client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;
envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)
Received: from phobos.denx.de (phobos.denx.de
[IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
key-exchange X25519 server-signature ECDSA (secp384r1))
(No client certificate requested)
by legolas.ozlabs.org (Postfix) with ESMTPS id 4WrWq44P8Qz1yXd
for ; Sat, 24 Aug 2024 19:29:20 +1000 (AEST)
Received: from h2850616.stratoserver.net (localhost [IPv6:::1])
by phobos.denx.de (Postfix) with ESMTP id 8D0A0888D5;
Sat, 24 Aug 2024 11:27:46 +0200 (CEST)
Authentication-Results: phobos.denx.de;
dmarc=pass (p=reject dis=none) header.from=iopsys.eu
Authentication-Results: phobos.denx.de;
spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de
Authentication-Results: phobos.denx.de;
dkim=pass (2048-bit key;
unprotected) header.d=iopsys.eu header.i=@iopsys.eu header.b="uOwipLEj";
dkim-atps=neutral
Received: by phobos.denx.de (Postfix, from userid 109)
id 2A3CB888C1; Sat, 24 Aug 2024 11:27:44 +0200 (CEST)
X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de
X-Spam-Level:
X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00, CONTENT_AFTER_HTML,
DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU,
HEADER_FROM_DIFFERENT_DOMAINS,
SPF_HELO_PASS,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=no
autolearn_force=no version=3.4.2
Received: from EUR05-DB8-obe.outbound.protection.outlook.com
(mail-db8eur05on20702.outbound.protection.outlook.com
[IPv6:2a01:111:f400:7e1a::702])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by phobos.denx.de (Postfix) with ESMTPS id 4B1D688C97
for ; Sat, 24 Aug 2024 11:27:41 +0200 (CEST)
Authentication-Results: phobos.denx.de;
dmarc=pass (p=reject dis=none) header.from=iopsys.eu
Authentication-Results: phobos.denx.de;
spf=pass smtp.mailfrom=mikhail.kshevetskiy@genexis.eu
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
b=Hh7+MYLBX+PfV1dNwt2O4aAiuSOUjvI6LrmQXDObZiYlJdB18JngcfTtwvcs7YEAixdNE4DrC/DQcXeV17/bsW+hNwo9Xjjhqc8kF4bYfBv6BRL+CPmvzvxbFMJ8QYZPvmzxuVjAzKdGxMLUOeyo47hu6WvAGM44VfJ7xGuxZiV2Em2ABQoO0F1m0T3K0/8IAEw8ujYImp9cNyTxy1+ihwcJzKDzQcD5UeHx+FnoKDzkCdMcDoBkfVzox4JGddV+oJbq1uw6TRDWsx5zFnfWHLeIr9wBAo53cTvHYN/OpjKu5GGszbBM6qdlX+Sc/QRe577jcjlcLVxImnE2FeeKCA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;
s=arcselector10001;
h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;
bh=YoFt4UFdyzHMIDNWxqwgCs1uTETlcZJ+xknUX5ebXiA=;
b=LiZLb+KfwoHULspEczm1Qjmxikce/rwNTrdJEF+RS+VSriYfgYW8I6hRvf+acw/7rawApxRLBEKA2lTTjxyoI1wIBGhOnjNObfLcT08h0OT3/SHEYDj1+r1sXIxE0VmMoeTAzaxdaDpJ86QGsYQklloaFnRPI1FJitrRcxu3vzuOhvng0jIxZZyG2qWOG7ooGk4bgJdOZAPJ4/trk0Jnps78jAr6Rj6ukCMikc9IV6szMoVvhzg2SMZcA5DKgpGrTNq/8r1nR9xH2yiEsiokbOSn7824kW1pG00jS4NCGsBep+d9q10xs7q6+72slqW1ANn37XtxsDn92BAhQB0s1w==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
smtp.mailfrom=genexis.eu; dmarc=pass action=none header.from=iopsys.eu;
dkim=pass header.d=iopsys.eu; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iopsys.eu;
s=selector2;
h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
bh=YoFt4UFdyzHMIDNWxqwgCs1uTETlcZJ+xknUX5ebXiA=;
b=uOwipLEjSS7p4PLXfQA55vQOW1zR5ooWCPP7mRUhjyHPppssIRYLbYsOL5DOaGs7leTJoyyXH5wyiQ2WuLhPV69wRBGvg/Tspn8SXijQK7yd1m4OHJzrVEzCj0eb8T+VSfDVPoQ12HXLPy9WkhICB/+U7HD5vvWzssNtkk+3sDDriLQMjAykgM2aZD283nSeuNb9XwHD3mpLnlmBlMaDkkw5Ew3lRZx+/wVJF0J+2AjWO/QQhhsXDJUqbHIGVHlMZML0A4DEET19oMjR3mqKJBxjf0GwYH/JY8oy/e0pTBt3bpnDFIVNpWbV6MXEISQb4rEeppyKC5sDS5qu72LQhA==
Authentication-Results: dkim=none (message not signed)
header.d=none;dmarc=none action=none header.from=iopsys.eu;
Received: from GV2PR08MB8121.eurprd08.prod.outlook.com (2603:10a6:150:7d::22)
by DB9PR08MB7445.eurprd08.prod.outlook.com (2603:10a6:10:36f::11)
with Microsoft SMTP Server (version=TLS1_2,
cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7897.13; Sat, 24 Aug
2024 09:27:39 +0000
Received: from GV2PR08MB8121.eurprd08.prod.outlook.com
([fe80::4cd3:da80:2532:daa0]) by GV2PR08MB8121.eurprd08.prod.outlook.com
([fe80::4cd3:da80:2532:daa0%2]) with mapi id 15.20.7918.011; Sat, 24 Aug 2024
09:27:39 +0000
From: Mikhail Kshevetskiy
To: Tom Rini , Joe Hershberger ,
Ramon Fried ,
Mattijs Korpershoek ,
Simon Glass , Heinrich Schuchardt ,
AKASHI Takahiro ,
Michal Simek ,
Francis Laniel ,
Anand Moon ,
Mikhail Kshevetskiy ,
Marek Vasut ,
Ilias Apalodimas ,
Masahisa Kojima ,
Sean Anderson , Baruch Siach ,
Yasuharu Shibata , u-boot@lists.denx.de
Subject: [PATCH v5 11/11] net/httpd-upload: an example web-server
implementation for file uploading
Date: Sat, 24 Aug 2024 12:27:16 +0300
Message-ID: <20240824092716.1042696-12-mikhail.kshevetskiy@iopsys.eu>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <20240824092716.1042696-1-mikhail.kshevetskiy@iopsys.eu>
References: <20240824092716.1042696-1-mikhail.kshevetskiy@iopsys.eu>
X-ClientProxiedBy: GV3P280CA0011.SWEP280.PROD.OUTLOOK.COM (2603:10a6:150:b::7)
To GV2PR08MB8121.eurprd08.prod.outlook.com
(2603:10a6:150:7d::22)
MIME-Version: 1.0
X-MS-PublicTrafficType: Email
X-MS-TrafficTypeDiagnostic: GV2PR08MB8121:EE_|DB9PR08MB7445:EE_
X-MS-Office365-Filtering-Correlation-Id: 58e413c2-570f-47f3-f978-08dcc41eff9d
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
ARA:13230040|1800799024|366016|376014|52116014|7416014|921020|38350700014;
X-Microsoft-Antispam-Message-Info:
ahw7kD18J8VB7HSZIzSw77EmLqMPzPkA/NTuHLz+2pTdEPSEOhSPSNEk04UtegV+lF+LCi12l3btO7bTW8lor5mNMgh8tQG4+4mDtIIaSRQdtbwyX8yjfSInHGRO+Ql82XrTuybSd7bsF09VZYlOQ13Vonrjy1WMVcsKnqTZJe0/YDoq18OrPq0yTOMuDaklRjxsAfP/qBkgUjvQugBXOFIPLbIOXlR1WVMprCK+Btfmc4Y/gy/WGHFborjrQ1WwouWed7cEqUjZQEOlzJaPXGzrgFmOPthsEkwLWZVO9zJmppeAHzCO1BKlCcmT1ZmAZlK7AIuJ9pLGd5VK0S6hVXxBputKFePbMr6C9JuAdDZvhXXV7jc/QiEqzT2OxfTChrXR4JlTDqy8NoKPgWsmwMKZqpmR3s9EBjNQ2DtYYwY7/YV8Tza+gVOs8Q8GEfhARR/Slx9PBqzIA9y1WMeLzKstzbtI4DAq3FiEj4mp8uN7pjVz9X/5gdfxl0ki4TG6nGhwVXBUawQxwxA6beqfVx7gNLKaATPCIE+9x5pc9pvrbmQIi2fsSKubU3/3Rt6Xqn+7op4PCHrlOWD1WDF768UHy5GeNQNBz81LkjjdBuvs9x7aPswNT7VLhS65UuUl14SQH589kp/yagncdVM8UQ+c4Enat3MqEoxc5iXFw9WES+3PnsJPcdge4POEaAJ51MbVEr1q9txwt+8tIq5ib9QxGxJjVdfR9U1ANh5mo+7F8JabRv+XRq0/D6vopQSWqQfstDEjDsAYx2wxPDsHYJnvZdVN9fUN+l6+bxd854UTtvhojY6efWnpUcGkkljxmZyzFqmJ+Z2aSa32YiH4Us1aAPEqPFXcDlQd1frZfOzqW63hTSrAdWNJr+VvKozeEUoFhI5A35Wz8DA70qASDoMMo3d8vgudTbi9yi2sNCsFNgLvWgsTrYjIsk1aFvBqU7e6VvPVtQcW97bN+Df9NA3FTLfsqo88XL0OylhkL/XikqEZzJAs3+ZQJT/+BCazZwL1WQoC6hLR9Los70B+Wjjvil5InvTA6SKbZfigsdaQNc49NDxG3yk7IBw+jum1yJ6qO/tJjuamu+cIRqN+84UmVMtGuQpU+FTVMpFL5ErUg3vSWfLVQu97+YEE5xwCVZH1H6dljk1l/NDO885fzw57uGlIgZZA+L/RjWaNppHyUTeV7rQQvZKESRyAcnU0rJa61Q9SXGy3FCh4yo9bS+gpVe+WUgqbVRSdaCTkT1auRuxDpbo2UcxJn0vcu+EHQH9dNneb7oDE9d/rU5+odiZ0rZgfmphivctwOIYiLpIBD/PG2rLJqzY4a6vvYsqvLkOKc385NpZ6Ey80Bu4AoVnTHie32ulCY91OuymIIhGbpLug5mVgR8yJcgLeny7q6a/5RcrWqld6JXJd6FrIP/l2U+yVxPPLr7ADm4m9sRc=
X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;
IPV:NLI; SFV:NSPM; H:GV2PR08MB8121.eurprd08.prod.outlook.com; PTR:; CAT:NONE;
SFS:(13230040)(1800799024)(366016)(376014)(52116014)(7416014)(921020)(38350700014);
DIR:OUT; SFP:1102;
X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-MessageData-0:
LRetwjxj4A+vV57WhD7ph1TTlc+oeobl6hhOJYQoflxVqNmVZMoBoQsNVuUYJmmuru54zaFfHkiGstJwYLDT5V/BsW2D0lHacwnrBw6ghlsvLwFP6Jh7nSsEIcqyQNkwdTtI8yPIEsPKM7Bw3RuXDP6gjk+QiEWKqF5oBBXfjZATD6rdiWb4wMjsgmoRjFK2TDznm1RKH70cKWE8BoqqJGs+4l17/BFxUjos5htCrmm6Gk421whNbDQrDrwapUvdPkgvfmBpMK2XLCmjfIozG3A414d0w7iMWZmGeTiBqV+X+xMi0GrWM48BmqYzFAKF+baxhFdatUBnsqtbYrAaN4CSb9PHpVy+5v/PaUOil/doQycqA+jw3F0eV65m7+oSB5OScN3qqHndfaN6C64Q9yJHWjXWLA8M6EdONO4Uph/5CXjJ4A4K2jqslBDfbqiSx3/5MxH2IvFMrK/RmKz7BoNKvFm+0Vjue3UCTCPPHcG5C3PbLbzc01uBIgXMvwATGNPQJha3LblyyfIUigmj39V3nCY9wJcUsOukNvvULdnEte3wQgA/jBvjfpkyqI2PDvFcEEF5h6cat/BgPD8vl+C2lp8u9gP7QJDWXkJllpLs7dCpiiOlVWcyrJ5Q4PvCGHogGlwYpFUNW/YVdewYS5Ugw2/KEsciYa8VfXrTVkZmYJGhUhCbNRnnnuW5inL0n4R2sKM7ipPXWbDZ/59IcbT36JO0jChnCRz0NCWc9pHKtRUkv4+0GR8Vq+X11kZuY6SyBZ3pOn01bQd/evbqcRKQYc7eQREwztPyoVmbc7rwkLyEnvERr9753PyRWfHCLa6gJz8MZklaj4JVwGERTXZlrVy6fbJRnNRQZLLdYAEuz9GDBEkiiLwp57/1FwNbmr8EWctARzTadV58sySsiMhklIUzbe1RliMXfmJUJ37unfSqjkr2eLHsW+pxTNgYyZkXfM0oU8Jly2agpDxe9j04u0J0e3pg5lqxHa6vc/dBf78/7q4hZi4mYsgXLp8Qi/jiQ2RHmQD/LhR6IT4yZA+eQZ6Iy6RncAJ24+Jg/yXwHLt4+bxVBSN2YiDijydsDs6z/j6Q/bGifkAlI/cmureD9afFplfGnKiw5KlO6jF+yI3Gv5Ms7CbWMiuci3Bl/HiQS52MJdX2H3H9efux0w8yEd/cWy/Q85qotW7oKRiJwKl45ASspnXBni+RiSwLlrgV16kA+Cf2F9fW3wpHYX0tX+PWg/TilVa9kkxHL5YgfcYT/2f4opTqX5Q9Wc2Jz8QNZfrinCXBsaQrljOYMNTMJHrXpHAgBdh+9aqvWad2pDp7wLerfsexLZHfGS1uZhQol796/3U8cA9TlSfUYQ/WaPSByWCnghdVVlzjxEIPZWWa9lEAMxMxPEZZKRPYmkCqur1qX3m9mP8w86Ra9irDurMqH0lAtYZcml8CuBdWn+v5U/sTSmPHcblZIeJi4jbyWJkECopeuLfVMayVfOfiTiMHdx0eOyy3RHfcK0ZnAubGfB25wwJj/lGcu86qLdlKENbSgpAxGjXIYgCNnvoQR714OJws2VfowsgfGQEpjzq5YqJrJTdmF0C3aWryjlhkCq1ArBlqW/5EskaXyVHyDEh25EN+lk3QKAJQftw=
X-OriginatorOrg: iopsys.eu
X-MS-Exchange-CrossTenant-Network-Message-Id:
58e413c2-570f-47f3-f978-08dcc41eff9d
X-MS-Exchange-CrossTenant-AuthSource: GV2PR08MB8121.eurprd08.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2024 09:27:39.7670 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 8d891be1-7bce-4216-9a99-bee9de02ba58
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName:
RWzXfVGSVRZbL4q3MgetRnIXG0gxjHv3n2X73nLuGXfg5+QFj66BjSNRrjGPPkfrBN8eNdQVk/ixiw+Pk71qiRAywFHbYGmZkwXawv7r41Q=
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR08MB7445
X-BeenThere: u-boot@lists.denx.de
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: U-Boot discussion
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Errors-To: u-boot-bounces@lists.denx.de
Sender: "U-Boot"
X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de
X-Virus-Status: Clean
This is an example web-server implementation. It can be used for files
uploading to u-boot using a web-browser. It acts much like tftpget, but no
special servers needs to be installed by the user.
This code can be used as a base for other implementations like firmware
upgrade web-server used by some vendors.
Usage:
u-boot: start the we-server using the "httpd_upload" command
PC: open the "http://your_uboot_ip" link in the browser
Signed-off-by: Mikhail Kshevetskiy
Reviewed-by: Simon Glass
---
cmd/Kconfig | 14 ++++
cmd/net.c | 20 ++++++
include/net/httpd-upload.h | 12 ++++
net/Makefile | 19 +++++
net/httpd-upload.c | 123 ++++++++++++++++++++++++++++++++
net/httpd_upload/error_400.html | 9 +++
net/httpd_upload/error_404.html | 10 +++
net/httpd_upload/index.html | 14 ++++
net/httpd_upload/upload_ok.html | 7 ++
9 files changed, 228 insertions(+)
create mode 100644 include/net/httpd-upload.h
create mode 100644 net/httpd-upload.c
create mode 100644 net/httpd_upload/error_400.html
create mode 100644 net/httpd_upload/error_404.html
create mode 100644 net/httpd_upload/index.html
create mode 100644 net/httpd_upload/upload_ok.html
diff --git a/cmd/Kconfig b/cmd/Kconfig
index abcd003f7f1..55b9d04f2fa 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2014,6 +2014,20 @@ config CMD_NETCAT
netcat is a simple command to load/store kernel, or other files,
using netcat like manner over TCP.
+config CMD_HTTPD_UPLOAD
+ bool "an example HTTP server for file uploading"
+ depends on HTTPD_COMMON
+ help
+ HTTP/1.1 compatible server for file uploading.
+
+config CMD_HTTPD_UPLOAD_MAX_SIZE
+ int "Maximum uploading size"
+ depends on CMD_HTTPD_UPLOAD
+ default 209715200
+ help
+ This sets maximum size of uploaded file. Real transfer will be
+ slightly more than this limit.
+
config CMD_MII
bool "mii"
imply CMD_MDIO
diff --git a/cmd/net.c b/cmd/net.c
index 364139ec5b9..e5fddc8c7c5 100644
--- a/cmd/net.c
+++ b/cmd/net.c
@@ -21,6 +21,9 @@
#include
#include
#include
+#if defined(CONFIG_CMD_HTTPD_UPLOAD)
+#include
+#endif
static int netboot_common(enum proto_t, struct cmd_tbl *, int, char * const []);
@@ -228,6 +231,23 @@ U_BOOT_CMD(
);
#endif
+#if defined(CONFIG_CMD_HTTPD_UPLOAD)
+static int do_httpd_upload(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+ if (argc < 2)
+ return 1;
+
+ httpd_upload_prepare();
+ return netboot_common(HTTPD, cmdtp, argc, argv);
+}
+
+U_BOOT_CMD(
+ httpd_upload, 2, 1, do_httpd_upload,
+ "starts httpd server for file uploading",
+ "[loadAddress]\n"
+);
+#endif
+
static void netboot_update_env(void)
{
char tmp[46];
diff --git a/include/net/httpd-upload.h b/include/net/httpd-upload.h
new file mode 100644
index 00000000000..a80df214668
--- /dev/null
+++ b/include/net/httpd-upload.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: BSD-2-Clause
+ *
+ * httpd-upload include file
+ * Copyright (C) 2024 IOPSYS Software Solutions AB
+ * Author: Mikhail Kshevetskiy
+ */
+#ifndef __NET_HTTPD_UPLOAD_TCP_H__
+#define __NET_HTTPD_UPLOAD_TCP_H__
+
+void httpd_upload_prepare(void);
+
+#endif /* __NET_HTTPD_UPLOAD_TCP_H__ */
diff --git a/net/Makefile b/net/Makefile
index c1f491fad02..e7cbbc2248e 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -35,8 +35,27 @@ obj-$(CONFIG_PROT_TCP) += tcp.o
obj-$(CONFIG_CMD_WGET) += wget.o
obj-$(CONFIG_CMD_NETCAT) += netcat.o
obj-$(CONFIG_HTTPD_COMMON) += httpd.o
+obj-$(CONFIG_CMD_HTTPD_UPLOAD) += httpd-upload.o
# Disable this warning as it is triggered by:
# sprintf(buf, index ? "foo%d" : "foo", index)
# and this is intentional usage.
CFLAGS_eth_common.o += -Wno-format-extra-args
+
+STATIC_SUBST := 's/^\(unsigned char \)/static \1/'
+SIZE_REMOVE_SUBST := 's/^unsigned int .*//'
+
+httpd_upload_generated:
+ rm -rf $(src)/httpd_upload_generated
+ mkdir -p $(src)/httpd_upload_generated
+ cd $(src)/httpd_upload && find . -type f | while read fname; do \
+ name="$${fname##*/}" && \
+ name="$${name%%.*}" && \
+ set -o pipefail && xxd -i "$${fname##./}" | \
+ sed $(STATIC_SUBST) | \
+ sed $(SIZE_REMOVE_SUBST) > ../httpd_upload_generated/$${name}.h; \
+ done
+
+.PHONY: httpd_upload_generated
+
+net/httpd-upload.o: httpd_upload_generated
diff --git a/net/httpd-upload.c b/net/httpd-upload.c
new file mode 100644
index 00000000000..1e1e0b1cf75
--- /dev/null
+++ b/net/httpd-upload.c
@@ -0,0 +1,123 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * httpd-upload support driver
+ * Copyright (C) 2024 IOPSYS Software Solutions AB
+ * Author: Mikhail Kshevetskiy
+ */
+
+#include
+#include
+#include
+#include
+
+#define MAX_FILE_SIZE CONFIG_CMD_HTTPD_UPLOAD_MAX_SIZE
+
+static enum net_loop_state httpd_on_stop(void);
+
+static enum httpd_req_check httpd_pre_post(void *req_id, const char *url,
+ struct httpd_post_data *post);
+static struct http_reply *httpd_get(void *req_id, const char *url);
+static struct http_reply *httpd_post(void *req_id, const char *url,
+ struct httpd_post_data *post);
+static void httpd_on_req_end(void *req_id);
+
+#include "httpd_upload_generated/error_400.h"
+#include "httpd_upload_generated/error_404.h"
+#include "httpd_upload_generated/index.h"
+#include "httpd_upload_generated/upload_ok.h"
+
+static struct http_reply error_400 = {
+ .code = 400,
+ .code_msg = "Bad Request",
+ .data_type = "text/html; charset=utf-8",
+ .data = error_400_html,
+ .len = sizeof(error_400_html)
+};
+
+static struct http_reply error_404 = {
+ .code = 404,
+ .code_msg = "Not Found",
+ .data_type = "text/html; charset=utf-8",
+ .data = error_404_html,
+ .len = sizeof(error_404_html)
+};
+
+static struct http_reply index = {
+ .code = 200,
+ .code_msg = "OK",
+ .data_type = "text/html; charset=utf-8",
+ .data = index_html,
+ .len = sizeof(index_html)
+};
+
+static struct http_reply upload_ok = {
+ .code = 200,
+ .code_msg = "OK",
+ .data_type = "text/html; charset=utf-8",
+ .data = upload_ok_html,
+ .len = sizeof(upload_ok_html)
+};
+
+static struct httpd_config cfg = {
+ .on_stop = httpd_on_stop,
+ .on_req_end = httpd_on_req_end,
+ .get = httpd_get,
+ .post = httpd_post,
+ .pre_post = httpd_pre_post,
+ .error_400 = &error_400,
+ .error_404 = &error_404,
+};
+
+static enum net_loop_state httpd_loop_state;
+static void *post_req_id;
+
+void httpd_upload_prepare(void)
+{
+ httpd_setup(&cfg);
+ httpd_loop_state = NETLOOP_FAIL;
+}
+
+static enum httpd_req_check httpd_pre_post(void *req_id, const char *url,
+ struct httpd_post_data *post)
+{
+ if (post->size > MAX_FILE_SIZE) {
+ printf("HTTPD: reset connection, upload file is too large\n");
+ return HTTPD_CLNT_RST;
+ }
+
+ post_req_id = req_id;
+ return HTTPD_REQ_OK;
+}
+
+static struct http_reply *httpd_post(void *req_id, const char *url,
+ struct httpd_post_data *post)
+{
+ if (strcmp(url, "/file_upload"))
+ return &error_404;
+
+ httpd_loop_state = NETLOOP_SUCCESS;
+ printf("HTTPD: upload OK\n");
+ return &upload_ok;
+}
+
+static struct http_reply *httpd_get(void *req_id, const char *url)
+{
+ if (!strcmp(url, "/"))
+ return &index;
+ if (!strcmp(url, "/index.html"))
+ return &index;
+ return &error_404;
+}
+
+static void httpd_on_req_end(void *req_id)
+{
+ if (req_id == post_req_id) {
+ post_req_id = NULL;
+ httpd_stop();
+ }
+}
+
+static enum net_loop_state httpd_on_stop(void)
+{
+ return httpd_loop_state;
+}
diff --git a/net/httpd_upload/error_400.html b/net/httpd_upload/error_400.html
new file mode 100644
index 00000000000..de654364edf
--- /dev/null
+++ b/net/httpd_upload/error_400.html
@@ -0,0 +1,9 @@
+
+ 400
+
+ 400 - Bad Request
+
+ Sorry, the request you are trying to do is wrong.
+
+
+
diff --git a/net/httpd_upload/error_404.html b/net/httpd_upload/error_404.html
new file mode 100644
index 00000000000..9dac22d497d
--- /dev/null
+++ b/net/httpd_upload/error_404.html
@@ -0,0 +1,10 @@
+
+ 404
+
+ 404 - Page not found
+
+ Sorry, the page you are requesting was not found on this
+ server.
+
+
+
diff --git a/net/httpd_upload/index.html b/net/httpd_upload/index.html
new file mode 100644
index 00000000000..e7d5ac943b6
--- /dev/null
+++ b/net/httpd_upload/index.html
@@ -0,0 +1,14 @@
+
+ Upload File
+
+ Upload File.
+ This will write the uploaded file to the memory arear pointed by ${loadaddr}.
+
+
+
+
diff --git a/net/httpd_upload/upload_ok.html b/net/httpd_upload/upload_ok.html
new file mode 100644
index 00000000000..8d2e561982f
--- /dev/null
+++ b/net/httpd_upload/upload_ok.html
@@ -0,0 +1,7 @@
+
+ OK
+
+ Upload OK
+ The file was uploaded.
+
+