net: add a generic udp protocol
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@softathome.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
cafaa301c9
commit
b43ea1bf18
35
doc/README.udp
Normal file
35
doc/README.udp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
Udp framework
|
||||||
|
|
||||||
|
The udp framework is build on top of network framework and is designed
|
||||||
|
to define new protocol or new command based on udp without modifying
|
||||||
|
the network framework.
|
||||||
|
|
||||||
|
The udp framework define a function udp_loop that take as argument
|
||||||
|
a structure udp_ops (defined in include/net/udp.h) :
|
||||||
|
|
||||||
|
struct udp_ops {
|
||||||
|
int (*prereq)(void *data);
|
||||||
|
int (*start)(void *data);
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
The callback prereq define if all the requirements are
|
||||||
|
valid before running the network/udp loop.
|
||||||
|
|
||||||
|
The callback start define the first step in the network/udp loop,
|
||||||
|
and it may also be used to configure a timemout and udp handler.
|
||||||
|
|
||||||
|
The pointer data is used to store private data that
|
||||||
|
could be used by both callback.
|
||||||
|
|
||||||
|
A simple example to use this framework:
|
||||||
|
|
||||||
|
static struct udp_ops udp_ops = {
|
||||||
|
.prereq = wmp_prereq,
|
||||||
|
.start = wmp_start,
|
||||||
|
.data = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
err = udp_loop(&udp_ops);
|
@ -551,7 +551,7 @@ extern int net_restart_wrap; /* Tried all network devices */
|
|||||||
|
|
||||||
enum proto_t {
|
enum proto_t {
|
||||||
BOOTP, RARP, ARP, TFTPGET, DHCP, PING, DNS, NFS, CDP, NETCONS, SNTP,
|
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 */
|
extern char net_boot_file_name[1024];/* Boot File name */
|
||||||
|
41
include/net/udp.h
Normal file
41
include/net/udp.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Philippe Reynes <philippe.reynes@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);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* udp_loop() - network loop for udp protocol
|
||||||
|
*
|
||||||
|
* Launch a network loop for udp protocol and use callbacks
|
||||||
|
* provided in parameter @ops to initialize the loop, and then
|
||||||
|
* to handle udp packet.
|
||||||
|
*
|
||||||
|
* @ops: udp callback
|
||||||
|
* @return: 0 if success, otherwise < 0 on error
|
||||||
|
*/
|
||||||
|
int udp_loop(struct udp_ops *ops);
|
||||||
|
|
||||||
|
#endif
|
@ -8,6 +8,12 @@ menuconfig NET
|
|||||||
|
|
||||||
if NET
|
if NET
|
||||||
|
|
||||||
|
config PROT_UDP
|
||||||
|
bool "Enable generic udp framework"
|
||||||
|
help
|
||||||
|
Enable a generic udp framework that allows defining a custom
|
||||||
|
handler for udp protocol.
|
||||||
|
|
||||||
config BOOTP_SEND_HOSTNAME
|
config BOOTP_SEND_HOSTNAME
|
||||||
bool "Send hostname to DNS server"
|
bool "Send hostname to DNS server"
|
||||||
help
|
help
|
||||||
|
@ -27,6 +27,7 @@ obj-$(CONFIG_CMD_SNTP) += sntp.o
|
|||||||
obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
|
obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
|
||||||
obj-$(CONFIG_UDP_FUNCTION_FASTBOOT) += fastboot.o
|
obj-$(CONFIG_UDP_FUNCTION_FASTBOOT) += fastboot.o
|
||||||
obj-$(CONFIG_CMD_WOL) += wol.o
|
obj-$(CONFIG_CMD_WOL) += wol.o
|
||||||
|
obj-$(CONFIG_PROT_UDP) += udp.o
|
||||||
|
|
||||||
# Disable this warning as it is triggered by:
|
# Disable this warning as it is triggered by:
|
||||||
# sprintf(buf, index ? "foo%d" : "foo", index)
|
# sprintf(buf, index ? "foo%d" : "foo", index)
|
||||||
|
13
net/net.c
13
net/net.c
@ -102,6 +102,7 @@
|
|||||||
#if defined(CONFIG_CMD_PCAP)
|
#if defined(CONFIG_CMD_PCAP)
|
||||||
#include <net/pcap.h>
|
#include <net/pcap.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <net/udp.h>
|
||||||
#if defined(CONFIG_LED_STATUS)
|
#if defined(CONFIG_LED_STATUS)
|
||||||
#include <miiphy.h>
|
#include <miiphy.h>
|
||||||
#include <status_led.h>
|
#include <status_led.h>
|
||||||
@ -544,6 +545,9 @@ restart:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_PROT_UDP) && protocol == UDP)
|
||||||
|
udp_start();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1364,6 +1368,13 @@ static int net_check_prereq(enum proto_t protocol)
|
|||||||
}
|
}
|
||||||
goto common;
|
goto common;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(CONFIG_PROT_UDP)
|
||||||
|
case UDP:
|
||||||
|
if (udp_prereq())
|
||||||
|
return 1;
|
||||||
|
goto common;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_CMD_NFS)
|
#if defined(CONFIG_CMD_NFS)
|
||||||
case NFS:
|
case NFS:
|
||||||
#endif
|
#endif
|
||||||
@ -1375,7 +1386,7 @@ static int net_check_prereq(enum proto_t protocol)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#if defined(CONFIG_CMD_PING) || defined(CONFIG_CMD_SNTP) || \
|
#if defined(CONFIG_CMD_PING) || defined(CONFIG_CMD_SNTP) || \
|
||||||
defined(CONFIG_CMD_DNS)
|
defined(CONFIG_CMD_DNS) || defined(CONFIG_PROT_UDP)
|
||||||
common:
|
common:
|
||||||
#endif
|
#endif
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
|
46
net/udp.c
Normal file
46
net/udp.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Philippe Reynes <philippe.reynes@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->prereq)
|
||||||
|
ret = udp_ops->prereq(udp_ops->data);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int udp_start(void)
|
||||||
|
{
|
||||||
|
return udp_ops->start(udp_ops->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int udp_loop(struct udp_ops *ops)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (!ops) {
|
||||||
|
printf("%s: ops should not be null\n", __func__);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ops->start) {
|
||||||
|
printf("%s: no start function defined\n", __func__);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
udp_ops = ops;
|
||||||
|
ret = net_loop(UDP);
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user