diff options
| author | Jerome Forissier <jerome.forissier@linaro.org> | 2025-06-25 15:19:11 +0200 | 
|---|---|---|
| committer | Jerome Forissier <jerome.forissier@linaro.org> | 2025-07-08 11:07:37 +0200 | 
| commit | d63c4434bfa2727b1ecb8162ba49e8a7e69e24b2 (patch) | |
| tree | e23154fa367adeb47946bfa0550cf506927d4598 /net | |
| parent | 1c55e0370b2fbde433daa3035ca0976858effd6d (diff) | |
lwip: move net/lwip/ping.c to cmd/lwip
Prepare to split the ping command from cmd/net-lwip.c by moving the
implementation from net/lwip/dns.c to cmd/lwip.
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Diffstat (limited to 'net')
| -rw-r--r-- | net/lwip/Makefile | 1 | ||||
| -rw-r--r-- | net/lwip/ping.c | 179 | 
2 files changed, 0 insertions, 180 deletions
| diff --git a/net/lwip/Makefile b/net/lwip/Makefile index 255c7d018b0..97299d9b542 100644 --- a/net/lwip/Makefile +++ b/net/lwip/Makefile @@ -2,7 +2,6 @@ ccflags-y += -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot  obj-$(CONFIG_$(PHASE_)DM_ETH) += net-lwip.o  obj-$(CONFIG_CMD_DHCP) += dhcp.o -obj-$(CONFIG_CMD_PING) += ping.o  obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o  obj-$(CONFIG_WGET) += wget.o diff --git a/net/lwip/ping.c b/net/lwip/ping.c deleted file mode 100644 index 1390b914f7d..00000000000 --- a/net/lwip/ping.c +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* Copyright (C) 2024 Linaro Ltd. */ - -#include <command.h> -#include <console.h> -#include <dm/device.h> -#include <linux/delay.h> -#include <linux/errno.h> -#include <lwip/icmp.h> -#include <lwip/inet_chksum.h> -#include <lwip/raw.h> -#include <lwip/timeouts.h> -#include <net.h> -#include <time.h> - -#define PING_DELAY_MS 1000 -#define PING_COUNT 5 -/* Ping identifier - must fit on a u16_t */ -#define PING_ID 0xAFAF - -struct ping_ctx { -	ip_addr_t target; -	struct raw_pcb *pcb; -	struct icmp_echo_hdr *iecho; -	uint16_t seq_num; -	bool alive; -}; - -static u8_t ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, -		      const ip_addr_t *addr) -{ -	struct ping_ctx *ctx = arg; -	struct icmp_echo_hdr *iecho = ctx->iecho; - -	if (addr->addr != ctx->target.addr) -		return 0; - -	if ((p->tot_len >= (IP_HLEN + sizeof(struct icmp_echo_hdr))) && -	    pbuf_remove_header(p, IP_HLEN) == 0) { -		iecho = (struct icmp_echo_hdr *)p->payload; - -		if (iecho->id == PING_ID && -		    iecho->seqno == lwip_htons(ctx->seq_num)) { -			ctx->alive = true; -			printf("host %s is alive\n", ipaddr_ntoa(addr)); -			pbuf_free(p); -			return 1; /* eat the packet */ -		} -		/* not eaten, restore original packet */ -		pbuf_add_header(p, IP_HLEN); -	} - -	return 0; /* don't eat the packet */ -} - -static int ping_raw_init(struct ping_ctx *ctx) -{ -	ctx->pcb = raw_new(IP_PROTO_ICMP); -	if (!ctx->pcb) -		return -ENOMEM; - -	raw_recv(ctx->pcb, ping_recv, ctx); -	raw_bind(ctx->pcb, IP_ADDR_ANY); - -	return 0; -} - -static void ping_raw_stop(struct ping_ctx *ctx) -{ -	if (ctx->pcb) -		raw_remove(ctx->pcb); -} - -static void ping_prepare_echo(struct ping_ctx *ctx) -{ -	struct icmp_echo_hdr *iecho = ctx->iecho; - -	ICMPH_TYPE_SET(iecho, ICMP_ECHO); -	ICMPH_CODE_SET(iecho, 0); -	iecho->chksum = 0; -	iecho->id = PING_ID; -	iecho->seqno = lwip_htons(ctx->seq_num); - -	iecho->chksum = inet_chksum(iecho, sizeof(*iecho)); -} - -static void ping_send_icmp(struct ping_ctx *ctx) -{ -	struct pbuf *p; -	size_t ping_size = sizeof(struct icmp_echo_hdr); - -	p = pbuf_alloc(PBUF_IP, (u16_t)ping_size, PBUF_RAM); -	if (!p) -		return; - -	if (p->len == p->tot_len && !p->next) { -		ctx->iecho = (struct icmp_echo_hdr *)p->payload; -		ping_prepare_echo(ctx); -		raw_sendto(ctx->pcb, p, &ctx->target); -	} - -	pbuf_free(p); -} - -static void ping_send(void *arg) -{ -	struct ping_ctx *ctx = arg; - -	ctx->seq_num++; -	if (ctx->seq_num <= PING_COUNT) { -		ping_send_icmp(ctx); -		sys_timeout(PING_DELAY_MS, ping_send, ctx); -	} -} - -static int ping_loop(struct udevice *udev, const ip_addr_t *addr) -{ -	struct ping_ctx ctx = {}; -	struct netif *netif; -	int ret; - -	netif = net_lwip_new_netif(udev); -	if (!netif) -		return -ENODEV; - -	printf("Using %s device\n", udev->name); - -	ret = ping_raw_init(&ctx); -	if (ret < 0) { -		net_lwip_remove_netif(netif); -		return ret; -	} - -	ctx.target = *addr; - -	ping_send(&ctx); - -	do { -		net_lwip_rx(udev, netif); -		if (ctx.alive) -			break; -		if (ctrlc()) { -			printf("\nAbort\n"); -			break; -		} -	} while (ctx.seq_num <= PING_COUNT); - -	sys_untimeout(ping_send, &ctx); -	ping_raw_stop(&ctx); - -	net_lwip_remove_netif(netif); - -	if (ctx.alive) -		return 0; - -	printf("ping failed; host %s is not alive\n", ipaddr_ntoa(addr)); -	return -1; -} - -int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) -{ -	ip_addr_t addr; - -	if (argc < 2) -		return CMD_RET_USAGE; - -	if (!ipaddr_aton(argv[1], &addr)) -		return CMD_RET_USAGE; - -restart: -	if (net_lwip_eth_start() < 0 || ping_loop(eth_get_dev(), &addr) < 0) { -		if (net_start_again() == 0) -			goto restart; -		else -			return CMD_RET_FAILURE; -	} - -	return CMD_RET_SUCCESS; -} | 
