summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/efi_loader/Kconfig2
-rw-r--r--lib/lwip/lwip/src/apps/tftp/tftp.c74
-rw-r--r--lib/lwip/lwip/src/core/ipv4/icmp.c17
-rw-r--r--lib/lwip/u-boot/arch/cc.h7
-rw-r--r--lib/lwip/u-boot/lwipopts.h4
5 files changed, 98 insertions, 6 deletions
diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
index c2aa88f59fb..900113ca3e9 100644
--- a/lib/efi_loader/Kconfig
+++ b/lib/efi_loader/Kconfig
@@ -195,6 +195,7 @@ endchoice
config EFI_VARIABLES_PRESEED
bool "Initial values for UEFI variables"
+ depends on !COMPILE_TEST
depends on !EFI_MM_COMM_TEE
help
Include a file with the initial values for non-volatile UEFI variables
@@ -564,6 +565,7 @@ config EFI_HTTP_BOOT
bool "EFI HTTP Boot support"
depends on NET || NET_LWIP
select CMD_NET
+ select CMD_DHCP
select CMD_DNS
select CMD_WGET
select BLKMAP
diff --git a/lib/lwip/lwip/src/apps/tftp/tftp.c b/lib/lwip/lwip/src/apps/tftp/tftp.c
index 63b1e0e0e20..ecb6c55ae11 100644
--- a/lib/lwip/lwip/src/apps/tftp/tftp.c
+++ b/lib/lwip/lwip/src/apps/tftp/tftp.c
@@ -79,6 +79,14 @@ enum tftp_error {
#include <string.h>
+struct tftp_req {
+ ip_addr_t addr;
+ u16_t port;
+ u16_t opcode;
+ enum tftp_transfer_mode mode;
+ char* fname;
+};
+
struct tftp_state {
const struct tftp_context *ctx;
void *handle;
@@ -97,14 +105,33 @@ struct tftp_state {
};
static struct tftp_state tftp_state;
+static struct tftp_req tftp_req;
static void tftp_tmr(void *arg);
+static void tftp_req_tmr(void *arg);
+static const char *mode_to_string(enum tftp_transfer_mode mode);
+
+static void
+clear_req(void)
+{
+ ip_addr_set_any(0, &tftp_req.addr);
+ tftp_req.port = 0;
+ tftp_req.opcode = 0;
+ free(tftp_req.fname);
+ tftp_req.fname = NULL;
+ tftp_req.mode = 0;
+
+ sys_untimeout(tftp_req_tmr, NULL);
+}
static void
close_handle(void)
{
+ clear_req();
+
tftp_state.port = 0;
ip_addr_set_any(0, &tftp_state.addr);
+ tftp_state.retries = 0;
if (tftp_state.last_data != NULL) {
pbuf_free(tftp_state.last_data);
@@ -210,6 +237,12 @@ send_ack(const ip_addr_t *addr, u16_t port, u16_t blknum)
}
static err_t
+resend_request(void)
+{
+ return send_request(&tftp_req.addr, tftp_req.port, tftp_req.opcode, tftp_req.fname, mode_to_string(tftp_req.mode));
+}
+
+static err_t
resend_data(const ip_addr_t *addr, u16_t port)
{
err_t ret;
@@ -336,6 +369,9 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
tftp_state.last_pkt = tftp_state.timer;
tftp_state.retries = 0;
+ if (tftp_req.fname)
+ clear_req();
+
switch (opcode) {
case PP_HTONS(TFTP_RRQ): /* fall through */
case PP_HTONS(TFTP_WRQ): {
@@ -542,6 +578,26 @@ tftp_tmr(void *arg)
}
}
+static void
+tftp_req_tmr(void *arg)
+{
+ if (tftp_state.handle == NULL) {
+ return;
+ }
+
+ sys_timeout(TFTP_TIMER_MSECS, tftp_req_tmr, NULL);
+
+ if (tftp_state.retries < TFTP_MAX_RETRIES) {
+ LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, ("tftp: req timeout, retrying\n"));
+ resend_request();
+ tftp_state.retries++;
+ } else {
+ LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, ("tftp: req timeout\n"));
+ tftp_state.ctx->error(tftp_state.handle, -1, "Request timeout", strlen("Request timeout"));
+ close_handle();
+ }
+}
+
/**
* Initialize TFTP client/server.
* @param mode TFTP mode (client/server)
@@ -638,6 +694,20 @@ mode_to_string(enum tftp_transfer_mode mode)
}
err_t
+start_send_requests(const ip_addr_t *addr, u16_t port, u16_t opcode, const char* fname, enum tftp_transfer_mode mode)
+{
+ tftp_req.addr = *addr;
+ tftp_req.port = port;
+ tftp_req.opcode = opcode;
+ tftp_req.fname = strdup(fname);
+ tftp_req.mode = mode;
+ if (!tftp_req.fname)
+ return ERR_MEM;
+ sys_timeout(TFTP_TIMER_MSECS, tftp_req_tmr, NULL);
+ return resend_request();
+}
+
+err_t
tftp_get(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode)
{
LWIP_ERROR("TFTP client is not enabled (tftp_init)", (tftp_state.tftp_mode & LWIP_TFTP_MODE_CLIENT) != 0, return ERR_VAL);
@@ -647,7 +717,7 @@ tftp_get(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enu
tftp_state.handle = handle;
tftp_state.blknum = 1;
tftp_state.mode_write = 1; /* We want to receive data */
- return send_request(addr, port, TFTP_RRQ, fname, mode_to_string(mode));
+ return start_send_requests(addr, port, TFTP_RRQ, fname, mode);
}
err_t
@@ -660,7 +730,7 @@ tftp_put(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enu
tftp_state.handle = handle;
tftp_state.blknum = 1;
tftp_state.mode_write = 0; /* We want to send data */
- return send_request(addr, port, TFTP_WRQ, fname, mode_to_string(mode));
+ return start_send_requests(addr, port, TFTP_WRQ, fname, mode);
}
#endif /* LWIP_UDP */
diff --git a/lib/lwip/lwip/src/core/ipv4/icmp.c b/lib/lwip/lwip/src/core/ipv4/icmp.c
index 9a82a67aa93..6d588349c4a 100644
--- a/lib/lwip/lwip/src/core/ipv4/icmp.c
+++ b/lib/lwip/lwip/src/core/ipv4/icmp.c
@@ -80,9 +80,9 @@ void
icmp_input(struct pbuf *p, struct netif *inp)
{
u8_t type;
-#ifdef LWIP_DEBUG
+#if defined(LWIP_DEBUG) || defined(ICMP_DEST_UNREACH_CB)
u8_t code;
-#endif /* LWIP_DEBUG */
+#endif
struct icmp_echo_hdr *iecho;
const struct ip_hdr *iphdr_in;
u16_t hlen;
@@ -103,11 +103,11 @@ icmp_input(struct pbuf *p, struct netif *inp)
}
type = *((u8_t *)p->payload);
-#ifdef LWIP_DEBUG
+#if defined(LWIP_DEBUG) || defined(ICMP_DEST_UNREACH_CB)
code = *(((u8_t *)p->payload) + 1);
/* if debug is enabled but debug statement below is somehow disabled: */
LWIP_UNUSED_ARG(code);
-#endif /* LWIP_DEBUG */
+#endif
switch (type) {
case ICMP_ER:
/* This is OK, echo reply might have been parsed by a raw PCB
@@ -257,6 +257,15 @@ icmp_input(struct pbuf *p, struct netif *inp)
default:
if (type == ICMP_DUR) {
MIB2_STATS_INC(mib2.icmpindestunreachs);
+#ifdef ICMP_DEST_UNREACH_CB
+ /*
+ * The callback receives the IP packet (not the ICMP message) so that
+ * it can extract the source address for example
+ */
+ pbuf_add_header(p, IP_HLEN);
+ ICMP_DEST_UNREACH_CB(code, p);
+ pbuf_remove_header(p, IP_HLEN);
+#endif
} else if (type == ICMP_TE) {
MIB2_STATS_INC(mib2.icmpintimeexcds);
} else if (type == ICMP_PP) {
diff --git a/lib/lwip/u-boot/arch/cc.h b/lib/lwip/u-boot/arch/cc.h
index 04ab94d6b70..849c79c5a8d 100644
--- a/lib/lwip/u-boot/arch/cc.h
+++ b/lib/lwip/u-boot/arch/cc.h
@@ -56,4 +56,11 @@ static inline const char *sntp_format_time(time_t t)
}
#define sntp_format_time sntp_format_time
+
+#ifdef CONFIG_LWIP_ICMP_SHOW_UNREACH
+struct pbuf;
+void net_lwip_icmp_dest_unreach(int code, struct pbuf *p);
+
+#define ICMP_DEST_UNREACH_CB(_c, _p) net_lwip_icmp_dest_unreach(_c, _p)
+#endif
#endif /* LWIP_ARCH_CC_H */
diff --git a/lib/lwip/u-boot/lwipopts.h b/lib/lwip/u-boot/lwipopts.h
index 46af91f9410..80b93ea172d 100644
--- a/lib/lwip/u-boot/lwipopts.h
+++ b/lib/lwip/u-boot/lwipopts.h
@@ -80,7 +80,11 @@
#define IP_DEFAULT_TTL 255
+#if defined(CONFIG_PROT_ICMP_LWIP)
+#define LWIP_ICMP 1
+#else
#define LWIP_ICMP 0
+#endif
#if defined(CONFIG_PROT_RAW_LWIP)
#define LWIP_RAW 1