[RFC 03/12] net: add initial picotcp support
Antony Pavlov
antonynpavlov at gmail.com
Wed Jul 15 13:13:41 PDT 2015
This commit adds initial picotcp support:
* build stuff (Kbuild fixes and fake stdint.h);
* "pico_adapter" code for connecting barebox ethernet interfaces
to picotcp;
* picotcp start initialization and necessary poller.
Signed-off-by: Antony Pavlov <antonynpavlov at gmail.com>
Signed-off-by: Daniele Lacamera <daniele.lacamera at tass.be>
---
Makefile | 1 +
commands/Kconfig | 4 +++
include/net.h | 3 +++
include/pico_defines.h | 0
include/stdint.h | 1 +
net/Kconfig | 17 ++++++++++++
net/Makefile | 3 +++
net/eth.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++
net/net.c | 10 +++++++
net/picotcp.c | 20 ++++++++++++++
10 files changed, 130 insertions(+)
diff --git a/Makefile b/Makefile
index 0fe9274..8724d08 100644
--- a/Makefile
+++ b/Makefile
@@ -292,6 +292,7 @@ export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_ve
# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
LINUXINCLUDE := -Iinclude -I$(srctree)/dts/include \
+ -I$(srctree)/net/picotcp/include -I$(srctree)/net/picotcp/modules \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-I$(srctree)/arch/$(ARCH)/include \
-I$(objtree)/arch/$(ARCH)/include \
diff --git a/commands/Kconfig b/commands/Kconfig
index 5571902..77193cb 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -1184,6 +1184,7 @@ menu "Network"
config CMD_DHCP
bool
select NET_DHCP
+ depends on NET_LEGACY
prompt "dhcp"
help
DHCP client to obtain IP or boot params
@@ -1210,6 +1211,7 @@ config CMD_HOST
config NET_CMD_IFUP
bool
prompt "ifup"
+ depends on NET_LEGACY
help
Bring up network interfaces based on config files.
@@ -1237,6 +1239,7 @@ config CMD_MIITOOL
config CMD_PING
tristate
+ depends on NET_LEGACY
prompt "ping"
help
Send ICMP echo requests.
@@ -1245,6 +1248,7 @@ config CMD_PING
config CMD_TFTP
depends on FS_TFTP
+ depends on NET_LEGACY
tristate
prompt "tftp"
help
diff --git a/include/net.h b/include/net.h
index b93e264..c48eceb 100644
--- a/include/net.h
+++ b/include/net.h
@@ -32,6 +32,8 @@
struct device_d;
+#include <pico_stack.h>
+
struct eth_device {
int active;
@@ -44,6 +46,7 @@ struct eth_device {
int (*get_ethaddr) (struct eth_device*, u8 adr[6]);
int (*set_ethaddr) (struct eth_device*, const unsigned char *adr);
+ struct pico_device *picodev;
struct eth_device *next;
void *priv;
diff --git a/include/pico_defines.h b/include/pico_defines.h
new file mode 100644
index 0000000..e69de29
diff --git a/include/stdint.h b/include/stdint.h
new file mode 100644
index 0000000..029276e
--- /dev/null
+++ b/include/stdint.h
@@ -0,0 +1 @@
+/* fake stdint.h for picotcp */
diff --git a/net/Kconfig b/net/Kconfig
index a890492..0099e6f 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -3,6 +3,18 @@ menuconfig NET
if NET
+choice
+ prompt "network stack implementation"
+
+config NET_LEGACY
+ bool "legacy U-Boot network stack"
+
+config NET_PICOTCP
+ bool "picotcp network stack"
+ select POLLER
+
+endchoice
+
config NET_NFS
bool
prompt "nfs support"
@@ -10,6 +22,7 @@ config NET_NFS
config NET_NETCONSOLE
bool
depends on !CONSOLE_NONE
+ depends on NET_LEGACY
prompt "network console support"
help
This option adds support for a simple udp based network console.
@@ -20,10 +33,14 @@ config NET_RESOLV
config NET_IFUP
default y
+ depends on NET_LEGACY
bool
config NET_DHCP
bool
+ depends on NET_LEGACY
prompt "dhcp support"
+source "net/picotcp/Kconfig"
+
endif
diff --git a/net/Makefile b/net/Makefile
index 8d564e7..7a4597d 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -7,3 +7,6 @@ obj-$(CONFIG_CMD_PING) += ping.o
obj-$(CONFIG_NET_RESOLV)+= dns.o
obj-$(CONFIG_NET_NETCONSOLE) += netconsole.o
obj-$(CONFIG_NET_IFUP) += ifup.o
+
+obj-$(CONFIG_NET_PICOTCP) += picotcp/
+obj-$(CONFIG_NET_PICOTCP) += picotcp.o
diff --git a/net/eth.c b/net/eth.c
index a090961..34358f6 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -328,6 +328,73 @@ static int eth_register_of_fixup(void)
late_initcall(eth_register_of_fixup);
#endif
+#ifdef CONFIG_NET_PICO_SUPPORT_ETH
+
+#include <pico_stack.h>
+#include <pico_ipv4.h>
+
+struct pico_device_barebox_eth {
+ struct pico_device dev;
+ struct eth_device *edev;
+};
+
+static int pico_adapter_send(struct pico_device *dev, void *buf, int len)
+{
+ struct pico_device_barebox_eth *t = (struct pico_device_barebox_eth *)dev;
+ struct eth_device *edev = t->edev;
+
+ pr_debug("pico_adapter_send barebox eth (len=%d)\n", len);
+ edev->send(edev, buf, len);
+
+ return len;
+}
+
+static int pico_adapter_poll(struct pico_device *dev, int loop_score)
+{
+ struct pico_device_barebox_eth *t = (struct pico_device_barebox_eth *)dev;
+ struct eth_device *edev = t->edev;
+
+ /* pico_stack_recv(dev, buf, len) will be called from net_receive */
+
+ edev->recv(edev);
+
+ return loop_score;
+}
+
+static void pico_adapter_destroy(struct pico_device *dev)
+{
+ printf("pico_adapter_destroy barebox eth\n");
+}
+
+static void pico_adapter_init(struct eth_device *edev)
+{
+ /* FIXME: get macaddr for edev */
+ static unsigned char macaddr0[6] = { 0, 0, 0, 0xa, 0xb, 0xc };
+
+ struct pico_device_barebox_eth *pif = PICO_ZALLOC(sizeof(struct pico_device_barebox_eth));
+
+ struct pico_device *picodev;
+
+ char *name = strdup(edev->dev.name);
+
+ picodev = &pif->dev;
+ if (0 != pico_device_init(picodev, name, macaddr0)) {
+ pr_info("pico_adapter_init failed.\n");
+ pico_adapter_destroy(picodev);
+ return;
+ }
+
+ picodev->send = pico_adapter_send;
+ picodev->poll = pico_adapter_poll;
+ picodev->destroy = pico_adapter_destroy;
+
+ pif->edev = edev;
+ edev->picodev = picodev;
+
+ pr_info("Device %s created.\n", picodev->name);
+}
+#endif /* CONFIG_NET_PICO_SUPPORT_ETH */
+
int eth_register(struct eth_device *edev)
{
struct device_d *dev = &edev->dev;
@@ -388,6 +455,10 @@ int eth_register(struct eth_device *edev)
if (!eth_current)
eth_current = edev;
+#ifdef CONFIG_NET_PICO_SUPPORT_ETH
+ pico_adapter_init(edev);
+#endif
+
return 0;
}
diff --git a/net/net.c b/net/net.c
index e5bd9bb..dfa916c 100644
--- a/net/net.c
+++ b/net/net.c
@@ -540,12 +540,22 @@ bad:
return 0;
}
+#include <pico_stack.h>
+
int net_receive(struct eth_device *edev, unsigned char *pkt, int len)
{
struct ethernet *et = (struct ethernet *)pkt;
int et_protlen = ntohs(et->et_protlen);
int ret;
+ if (IS_ENABLED(CONFIG_NET_PICOTCP)) {
+ pico_stack_recv(edev->picodev, pkt, len);
+
+ led_trigger_network(LED_TRIGGER_NET_RX);
+
+ return 0;
+ }
+
led_trigger_network(LED_TRIGGER_NET_RX);
if (len < ETHER_HDR_SIZE) {
diff --git a/net/picotcp.c b/net/picotcp.c
new file mode 100644
index 0000000..ee16a68
--- /dev/null
+++ b/net/picotcp.c
@@ -0,0 +1,20 @@
+#include <init.h>
+#include <poller.h>
+#include <pico_stack.h>
+
+static struct poller_struct picotcp_poller;
+
+static void picotcp_poller_cb(struct poller_struct *poller)
+{
+ pico_stack_tick();
+}
+
+static int picotcp_net_init(void)
+{
+ pico_stack_init();
+
+ picotcp_poller.func = picotcp_poller_cb;
+
+ return poller_register(&picotcp_poller);
+}
+postcore_initcall(picotcp_net_init);
--
2.1.4
More information about the barebox
mailing list