summaryrefslogtreecommitdiff
path: root/net/tftp.c
diff options
context:
space:
mode:
authorAlexander Sverdlin <alexander.sverdlin@siemens.com>2024-05-13 08:26:35 +0200
committerTom Rini <trini@konsulko.com>2025-05-23 11:33:18 -0600
commit44340456475da953a30c5cc4fbe8a9bc013c8c0f (patch)
treecaf8508b8540731fccfc4e61186f6ba72ebd58ca /net/tftp.c
parentda24eb55327978410f5559f44ce1434ae8d8932d (diff)
net: tftp: don't call stop callback from UDP handler
Contrary to doc/develop/driver-model/ethernet.rst contract, eth_ops .free_pkt can be called after .stop, there are several error paths in TFTP, for instance: eth_halt() <= tftp_handler() <= net_process_received_packet() <= eth_rx() ... am65_cpsw_free_pkt() <= eth_rx() Which results in (deliberately "tftpboot"ing non-existing file): TFTP error: 'File not found' (1) Not retrying... am65_cpsw_nuss_port ethernet@8000000port@1: RX dma free_pkt failed -22 Avoid the DMA error message (and follow the documentation) by deferring eth_halt() until net_loop() calls net_start_again() and only do eth_halt_state_only() instead. Fixes: aafda38fb266 ("Add error codes/handling for TFTP-server") Signed-off-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Diffstat (limited to 'net/tftp.c')
-rw-r--r--net/tftp.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/tftp.c b/net/tftp.c
index fd9c9492929..1ca9a5ea7cf 100644
--- a/net/tftp.c
+++ b/net/tftp.c
@@ -655,7 +655,7 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
net_set_timeout_handler(timeout_ms, tftp_timeout_handler);
if (store_block(tftp_cur_block, pkt + 2, len)) {
- eth_halt();
+ eth_halt_state_only();
net_set_state(NETLOOP_FAIL);
break;
}
@@ -685,7 +685,7 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip,
case TFTP_ERR_FILE_NOT_FOUND:
case TFTP_ERR_ACCESS_DENIED:
puts("Not retrying...\n");
- eth_halt();
+ eth_halt_state_only();
net_set_state(NETLOOP_FAIL);
break;
case TFTP_ERR_UNDEFINED: