#define HTTP_PORT 80
-static void http_close_file(struct inode *inode)
-{
- struct pxe_pvt_inode *socket = PVT(inode);
- if (socket->buf) {
- netbuf_delete(socket->buf);
- socket->buf = NULL;
- }
- if (socket->conn) {
- netconn_delete(socket->conn);
- socket->conn = NULL;
- }
-}
-
-static void http_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->buf) {
- if (netbuf_next(socket->buf) < 0) {
- netbuf_delete(socket->buf);
- socket->buf = NULL;
- }
- }
- /* If needed get a new netbuf */
- if (!socket->buf) {
- socket->buf = netconn_recv(socket->conn);
- if (!socket->buf) {
- socket->tftp_goteof = 1;
- if (inode->size == -1)
- inode->size = socket->tftp_filepos;
- http_close_file(inode);
- return;
- }
- }
- /* Report the current fragment of the netbuf */
- err = netbuf_data(socket->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;
-}
-
static bool is_tspecial(int ch)
{
bool tspecial = false;
case '/': case '[': case ']': case '?': case '=':
case '{': case '}': case ' ': case '\t':
tspecial = true;
- break;
+ break;
}
return tspecial;
}
bool success = true;
if ((*pos + 1) >= size) {
*pos = 0;
- success = false;
+ success = false;
} else {
str[*pos] = ch;
str[*pos + 1] = '\0';
int pos;
int redirect_count;
- socket->fill_buffer = http_fill_buffer;
- socket->close = http_close_file;
+ socket->fill_buffer = tcp_fill_buffer;
+ socket->close = tcp_close_file;
redirect_count = 0;
restart:
/* Bogus cases try to recover */
else if (ch == '\n')
state = st_fieldfirst;
- else
+ else
state = st_skipline;
break;
if (ch == '\n')
state = st_fieldfirst;
break;
-
+
case st_eoh:
break; /* Should never happen */
}
strlcpy(new_url, location, sizeof new_url);
parse_url(url, new_url);
url_set_ip(url);
- http_close_file(inode);
+ tcp_close_file(inode);
/* XXX: This needs to go all the way back to scheme selection */
goto restart;
break;
return;
fail:
inode->size = 0;
- http_close_file(inode);
+ tcp_close_file(inode);
return;
}
#define DNS_MAX_SERVERS 4 /* Max no of DNS servers */
/*
- * structures
+ * structures
*/
struct pxenv_t {
uint8_t signature[6]; /* PXENV+ */
}
/*
- * functions
+ * functions
*/
/* pxeisr.inc */
/* http.c */
void http_open(struct url_info *url, struct inode *inode);
+/* tcp.c */
+void tcp_close_file(struct inode *inode);
+void tcp_fill_buffer(struct inode *inode);
+
#endif /* pxe.h */
--- /dev/null
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 2011 Intel Corporation; author: H. Peter Anvin
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston MA 02110-1301, USA; either version 2 of the License, or
+ * (at your option) any later version; incorporated herein by reference.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * tcp.c
+ *
+ * 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->buf) {
+ netbuf_delete(socket->buf);
+ socket->buf = NULL;
+ }
+ if (socket->conn) {
+ netconn_delete(socket->conn);
+ socket->conn = 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->buf) {
+ if (netbuf_next(socket->buf) < 0) {
+ netbuf_delete(socket->buf);
+ socket->buf = NULL;
+ }
+ }
+ /* If needed get a new netbuf */
+ if (!socket->buf) {
+ socket->buf = netconn_recv(socket->conn);
+ if (!socket->buf) {
+ socket->tftp_goteof = 1;
+ if (inode->size == -1)
+ inode->size = socket->tftp_filepos;
+ tcp_close_file(inode);
+ return;
+ }
+ }
+ /* Report the current fragment of the netbuf */
+ err = netbuf_data(socket->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;
+}