[PATCH v2 1/2] net: add a generic udp protocol
Simon Glass
sjg at chromium.org
Sat Sep 5 21:15:32 CEST 2020
On Mon, 31 Aug 2020 at 11:27, Philippe Reynes
<philippe.reynes at softathome.com> wrote:
>
> This commit adds a generic udp protocol framework in the
> network loop. So protocol based on udp may be implemented
> without modifying the network loop (for example custom
> wait magic packet).
>
> Signed-off-by: Philippe Reynes <philippe.reynes at softathome.com>
> ---
>
> Changelog:
> v2:
> - no change
>
> include/net.h | 2 +-
> include/net/udp.h | 31 +++++++++++++++++++++++++++++++
> net/Kconfig | 6 ++++++
> net/Makefile | 1 +
> net/net.c | 15 ++++++++++++++-
> net/udp.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 101 insertions(+), 2 deletions(-)
> create mode 100644 include/net/udp.h
> create mode 100644 net/udp.c
>
Reviewed-by: Simon Glass <sjg at chromium.org>
Needs a mention in docs somewhere.
nits below
> diff --git a/include/net.h b/include/net.h
> index 1bf9867..2191071 100644
> --- a/include/net.h
> +++ b/include/net.h
> @@ -551,7 +551,7 @@ extern int net_restart_wrap; /* Tried all network devices */
>
> enum proto_t {
> BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP,
> - TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT, WOL
> + TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT, WOL, UDP
> };
>
> extern char net_boot_file_name[1024];/* Boot File name */
> diff --git a/include/net/udp.h b/include/net/udp.h
> new file mode 100644
> index 0000000..f97df8d
> --- /dev/null
> +++ b/include/net/udp.h
> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2020 Philippe Reynes <philippe.reynes at softathome.com>
> + */
> +
> +#ifndef __UDP
> +#define __UDP
> +
> +/**
> + * struct udp_ops - function to handle udp packet
> + *
> + * This structure provides the function to handle udp packet in
> + * the network loop.
> + *
> + * @prereq: callback called to check the requirement
> + * @start: callback called to start the protocol/feature
> + * @data: pointer to store private data (used by prereq and start)
> + */
> +struct udp_ops {
> + int (*prereq)(void *data);
> + int (*start)(void *data);
> + void *data;
> +};
> +
> +int udp_prereq(void);
> +
> +int udp_start(void);
> +
> +int udp_loop(struct udp_ops *h);
Need function comments for these. Also how about 'ops' instead of 'h'?
> +
> +#endif
> diff --git a/net/Kconfig b/net/Kconfig
> index 6874b55..db8d796 100644
> --- a/net/Kconfig
> +++ b/net/Kconfig
> @@ -8,6 +8,12 @@ menuconfig NET
>
> if NET
>
> +config PROT_UDP
> + bool "Enable generic udp framework"
> + help
> + Enable a generic udp framework that allow to define custom
that allows defining a custom
> + handler for udp protocol.
> +
> config BOOTP_SEND_HOSTNAME
> bool "Send hostname to DNS server"
> help
> diff --git a/net/Makefile b/net/Makefile
> index fef71b9..76527f7 100644
> --- a/net/Makefile
> +++ b/net/Makefile
> @@ -27,6 +27,7 @@ obj-$(CONFIG_CMD_SNTP) += sntp.o
> obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
> obj-$(CONFIG_UDP_FUNCTION_FASTBOOT) += fastboot.o
> obj-$(CONFIG_CMD_WOL) += wol.o
> +obj-$(CONFIG_PROT_UDP) += udp.o
>
> # Disable this warning as it is triggered by:
> # sprintf(buf, index ? "foo%d" : "foo", index)
> diff --git a/net/net.c b/net/net.c
> index 28d9eeb..f6ae814 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -102,6 +102,7 @@
> #if defined(CONFIG_CMD_PCAP)
> #include <net/pcap.h>
> #endif
> +#include <net/udp.h>
> #if defined(CONFIG_LED_STATUS)
> #include <miiphy.h>
> #include <status_led.h>
> @@ -540,6 +541,11 @@ restart:
> wol_start();
> break;
> #endif
> +#if defined(CONFIG_PROT_UDP)
I think you can get the same effect by putting if() after the case
> + case UDP:
> + udp_start();
> + break;
> +#endif
> default:
> break;
> }
> @@ -1364,6 +1370,13 @@ static int net_check_prereq(enum proto_t protocol)
> }
> goto common;
> #endif
> +#if defined(CONFIG_PROT_UDP)
Same here
> + case UDP:
> + if (udp_prereq())
> + return 1;
> + goto common;
> +#endif
> +
> #if defined(CONFIG_CMD_NFS)
> case NFS:
> #endif
> @@ -1375,7 +1388,7 @@ static int net_check_prereq(enum proto_t protocol)
> return 1;
> }
> #if defined(CONFIG_CMD_PING) || defined(CONFIG_CMD_SNTP) || \
> - defined(CONFIG_CMD_DNS)
> + defined(CONFIG_CMD_DNS) || defined(CONFIG_PROT_UDP)
> common:
> #endif
> /* Fall through */
> diff --git a/net/udp.c b/net/udp.c
> new file mode 100644
> index 0000000..2409ce4
> --- /dev/null
> +++ b/net/udp.c
> @@ -0,0 +1,48 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2020 Philippe Reynes <philippe.reynes at softathome.com>
> + */
> +
> +#include <common.h>
> +#include <net.h>
> +#include <net/udp.h>
> +
> +static struct udp_ops *udp_ops;
> +
> +int udp_prereq(void)
> +{
> + int ret = 0;
> +
> + if (udp_ops && udp_ops->prereq)
You already check udp_ops is non-NULL below.
> + ret = udp_ops->prereq(udp_ops->data);
> +
> + return ret;
> +}
> +
> +int udp_start(void)
> +{
> + int ret = -1;
> +
> + if (udp_ops && udp_ops->start)
> + ret = udp_ops->start(udp_ops->data);
> + else
> + printf("%s: no start function defined\n", __func__);
Should return this error so the caller can print it.
> +
> + return ret;
> +}
> +
> +int udp_loop(struct udp_ops *ops)
> +{
> + int ret = -1;
> +
> + if (!ops) {
> + printf("%s: ops should not be null\n", __func__);
> + goto out;
> + }
> +
> + udp_ops = ops;
> + ret = net_loop(UDP);
> +
> + out:
> + return ret;
> +}
> --
> 2.7.4
>
Regards,
Simon
More information about the U-Boot
mailing list