From 6c5e4a4bcfc991a6e578f65976891bcde31d0c56 Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Sat, 23 Apr 2011 20:48:42 -0700 Subject: [PATCH] pxe: move operations common to TCP-based protocols to a common file Move operations that are common to all TCP-based protocols into a common file, tcp.c. Signed-off-by: H. Peter Anvin --- core/fs/pxe/http.c | 66 ++++++------------------------------------------- core/fs/pxe/pxe.h | 8 ++++-- core/fs/pxe/tcp.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 60 deletions(-) create mode 100644 core/fs/pxe/tcp.c diff --git a/core/fs/pxe/http.c b/core/fs/pxe/http.c index 2f5a645..8d19755 100644 --- a/core/fs/pxe/http.c +++ b/core/fs/pxe/http.c @@ -6,56 +6,6 @@ #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; @@ -65,7 +15,7 @@ static bool is_tspecial(int ch) case '/': case '[': case ']': case '?': case '=': case '{': case '}': case ' ': case '\t': tspecial = true; - break; + break; } return tspecial; } @@ -86,7 +36,7 @@ static bool append_ch(char *str, size_t size, size_t *pos, int ch) bool success = true; if ((*pos + 1) >= size) { *pos = 0; - success = false; + success = false; } else { str[*pos] = ch; str[*pos + 1] = '\0'; @@ -124,8 +74,8 @@ void http_open(struct url_info *url, struct inode *inode) 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: @@ -268,7 +218,7 @@ restart: /* Bogus cases try to recover */ else if (ch == '\n') state = st_fieldfirst; - else + else state = st_skipline; break; @@ -300,7 +250,7 @@ restart: if (ch == '\n') state = st_fieldfirst; break; - + case st_eoh: break; /* Should never happen */ } @@ -331,7 +281,7 @@ restart: 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; @@ -342,6 +292,6 @@ restart: return; fail: inode->size = 0; - http_close_file(inode); + tcp_close_file(inode); return; } diff --git a/core/fs/pxe/pxe.h b/core/fs/pxe/pxe.h index bb833d6..7d5c43e 100644 --- a/core/fs/pxe/pxe.h +++ b/core/fs/pxe/pxe.h @@ -52,7 +52,7 @@ static inline int hexval(char c) #define DNS_MAX_SERVERS 4 /* Max no of DNS servers */ /* - * structures + * structures */ struct pxenv_t { uint8_t signature[6]; /* PXENV+ */ @@ -205,7 +205,7 @@ static inline uint32_t gateway(uint32_t ip) } /* - * functions + * functions */ /* pxeisr.inc */ @@ -254,4 +254,8 @@ void gpxe_open(struct inode *inode, const char *url); /* 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 */ diff --git a/core/fs/pxe/tcp.c b/core/fs/pxe/tcp.c new file mode 100644 index 0000000..af0cffc --- /dev/null +++ b/core/fs/pxe/tcp.c @@ -0,0 +1,72 @@ +/* ----------------------------------------------------------------------- * + * + * 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 +#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; +} -- 2.7.4