
[...]
+static struct netif *new_netif(bool with_ip) +{
- unsigned char enetaddr[ARP_HLEN];
- char hwstr[MAC_ADDR_STRLEN];
- ip4_addr_t ip, mask, gw;
- struct udevice *dev;
- struct netif *netif;
This does not fit into the driver model.
In the EFI subsystem we want to implement network protocols like the EFI_DHCP4_PROTOCOL.
Please, carve out functions to which we can pass a UCLASS_ETH udevice to execute DHCP.
v6 will have:
static struct netif *new_netif(struct udevice *udev, bool with_ip) struct netif *net_lwip_new_netif(struct udevice *udev) struct netif *net_lwip_new_netif_noip(struct udevice *udev)
Heinrich, any other EFI protocols you have in mind that would require similar tweaking? e.g the EFI_TCP4 and HTTP protocols?
static int dhcp_loop(struct udevice *udev)
- int ret;
- static bool first_call = true;
- eth_init_rings();
- if (first_call) {
if (eth_init()) {
printf("eth_init() error\n");
return NULL;
}
first_call = false;
- }
- netif_remove(net_lwip_get_netif());
- eth_set_current();
- dev = eth_get_dev();
- if (!dev)
return NULL;
- ip4_addr_set_zero(&ip);
- ip4_addr_set_zero(&mask);
- ip4_addr_set_zero(&gw);
- if (with_ip)
if (get_udev_ipv4_info(dev, &ip, &mask, &gw) < 0)
return NULL;
- eth_env_get_enetaddr_by_index("eth", dev_seq(dev), enetaddr);
- ret = snprintf(hwstr, MAC_ADDR_STRLEN, "%pM", enetaddr);
- if (ret < 0 || ret >= MAC_ADDR_STRLEN)
return NULL;
- netif = calloc(1, sizeof(struct netif));
- if (!netif)
return NULL;
- netif->name[0] = 'e';
- netif->name[1] = 't';
- string_to_enetaddr(hwstr, netif->hwaddr);
- netif->hwaddr_len = ETHARP_HWADDR_LEN;
- if (!netif_add(netif, &ip, &mask, &gw, netif, net_lwip_if_init,
netif_input)) {
printf("error: netif_add() failed\n");
free(netif);
return NULL;
- }
- netif_set_up(netif);
- netif_set_link_up(netif);
- /* Routing: use this interface to reach the default gateway */
- netif_set_default(netif);
- return netif;
+}
+/* Configure lwIP to use the currently active network device */ +struct netif *net_lwip_new_netif() +{
- return new_netif(true);
+}
+struct netif *net_lwip_new_netif_noip() +{
- return new_netif(false);
+}
+void net_lwip_remove_netif(struct netif *netif) +{
- netif_remove(netif);
- free(netif);
+}
+int net_init(void) +{
- net_lwip_new_netif();
- return 0;
+}
+static struct pbuf *alloc_pbuf_and_copy(uchar *data, int len) +{
struct pbuf *p, *q;
/* We allocate a pbuf chain of pbufs from the pool. */
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
if (!p) {
LINK_STATS_INC(link.memerr);
LINK_STATS_INC(link.drop);
return NULL;
}
for (q = p; q != NULL; q = q->next) {
memcpy(q->payload, data, q->len);
data += q->len;
}
LINK_STATS_INC(link.recv);
return p;
+}
+void net_process_received_packet(uchar *in_packet, int len)
Library functions should take a udevice as an argument. Please, do not use the concept of "active device" in these library functions.
OK, I have unified the naming in v6 and all functions will take a udevice:
static int dhcp_loop(struct udevice *udev) static int dns_loop(struct udevice *udev, const char *name, const char *var) static int ping_loop(struct udevice *udev, const ip_addr_t* addr) static int tftp_loop(struct udevice *udev, ulong addr, char *fname, ip_addr_t srvip) static int wget_loop(struct udevice *udev, ulong dst_addr, char *uri)
The command line interface may implement such a concept for backwards compatibility.
Sure.
Thanks,
Jerome
Best regards
Heinrich
+{
- struct netif *netif;
- struct pbuf *pbuf;
- if (len < ETHER_HDR_SIZE)
return;
+#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
- if (push_packet) {
(*push_packet)(in_packet, len);
return;
- }
+#endif
- netif = net_lwip_get_netif();
- if (!netif)
return;
- pbuf = alloc_pbuf_and_copy(in_packet, len);
- if (!pbuf)
return;
- netif->input(pbuf, netif);
+}
+u32_t sys_now(void) +{
- return get_timer(0);
+} diff --git a/net-lwip/tftp.c b/net-lwip/tftp.c new file mode 100644 index 00000000000..1fa246f55d9 --- /dev/null +++ b/net-lwip/tftp.c @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* Copyright (C) 2024 Linaro Ltd. */
+#include <command.h> +#include <net-lwip.h>
+int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{
- /* Not implemented */
- return CMD_RET_FAILURE;
+}