aboutsummaryrefslogtreecommitdiffstats
path: root/core/fs/pxe/tcp.c
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2013-03-22 14:54:09 +0000
committerMatt Fleming <matt.fleming@intel.com>2013-04-23 15:30:17 +0100
commitfe283b78c973268f2d1f0309826ceeb5c9e8978d (patch)
treede90b141427ab9222bb3e82afef6f880778b3cf2 /core/fs/pxe/tcp.c
parentbb229372b2c3f9fbb0cdd0a7221a6cc4aba5d2ed (diff)
downloadsyslinux-fe283b78c973268f2d1f0309826ceeb5c9e8978d.tar.gz
syslinux-fe283b78c973268f2d1f0309826ceeb5c9e8978d.tar.xz
syslinux-fe283b78c973268f2d1f0309826ceeb5c9e8978d.zip
efi: Add network supportsyslinux-6.00-pre5
Add TCP and UDP support to the EFI firmware backend. This necessitated moving all tcp functions to a core_tcp_* prefix so that they could be implemented differently for BIOS+lwip and EFI. Unfortunately, the tcp_* prefix is already in use by the lwip code. To maintain symmetry, the UDP functions were also moved from net_core_* to core_udp_*. The net_core API was introduced in 5.x to allow the legacy PXE and lwip stacks to live side by side, and the intention was that net_core_init() would take a protocol argument to build a protocol-specific object. It turned out to be easier to call either udp or tcp functions directly because the semantics of read/write differ between protocols. Booting an IPv4 EFI PXE stack using tftp and http has been tested. There are a couple of TODO items left, o dns resolve code is missing o ftp hasn't been tested Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'core/fs/pxe/tcp.c')
-rw-r--r--core/fs/pxe/tcp.c59
1 files changed, 3 insertions, 56 deletions
diff --git a/core/fs/pxe/tcp.c b/core/fs/pxe/tcp.c
index 576aa293..0fb6efd0 100644
--- a/core/fs/pxe/tcp.c
+++ b/core/fs/pxe/tcp.c
@@ -16,63 +16,10 @@
* Common operations for TCP-based network protocols
*/
-#include <lwip/api.h>
#include "pxe.h"
-#include "version.h"
-#include "url.h"
-
-void tcp_close_file(struct inode *inode)
-{
- struct pxe_pvt_inode *socket = PVT(inode);
-
- if (socket->net.lwip.conn) {
- netconn_delete(socket->net.lwip.conn);
- socket->net.lwip.conn = NULL;
- }
- if (socket->net.lwip.buf) {
- netbuf_delete(socket->net.lwip.buf);
- socket->net.lwip.buf = NULL;
- }
-}
-
-void tcp_fill_buffer(struct inode *inode)
-{
- struct pxe_pvt_inode *socket = PVT(inode);
- void *data;
- u16_t len;
- err_t err;
-
- /* Clean up or advance an inuse netbuf */
- if (socket->net.lwip.buf) {
- if (netbuf_next(socket->net.lwip.buf) < 0) {
- netbuf_delete(socket->net.lwip.buf);
- socket->net.lwip.buf = NULL;
- }
- }
- /* If needed get a new netbuf */
- if (!socket->net.lwip.buf) {
- err = netconn_recv(socket->net.lwip.conn, &(socket->net.lwip.buf));
- if (!socket->net.lwip.buf || err) {
- socket->tftp_goteof = 1;
- if (inode->size == -1)
- inode->size = socket->tftp_filepos;
- socket->ops->close(inode);
- return;
- }
- }
- /* Report the current fragment of the netbuf */
- err = netbuf_data(socket->net.lwip.buf, &data, &len);
- if (err) {
- printf("netbuf_data err: %d\n", err);
- kaboom();
- }
- socket->tftp_dataptr = data;
- socket->tftp_filepos += len;
- socket->tftp_bytesleft = len;
- return;
-}
+#include "net.h"
const struct pxe_conn_ops tcp_conn_ops = {
- .fill_buffer = tcp_fill_buffer,
- .close = tcp_close_file,
+ .fill_buffer = core_tcp_fill_buffer,
+ .close = core_tcp_close_file,
};